/ Hex Artifact Content
Login

Artifact cf8a54641eea01f1af5d09529ad69166db92f658:


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 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  ents..**.** $Id:
01f0: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 31 31 31   where.c,v 1.111
0200: 20 32 30 30 34 2f 30 37 2f 32 30 20 31 38 3a 32   2004/07/20 18:2
0210: 33 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a 2a  3:15 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0240: 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72 61  The query genera
0250: 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72 61  tor uses an arra
0260: 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  y of instances o
0270: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0280: 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61   to.** help it a
0290: 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65 78  nalyze the subex
02a0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
02b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
02c0: 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c  Each WHERE.** cl
02d0: 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73 69  ause subexpressi
02e0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
02f0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
0300: 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
0310: 6f 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  or..*/.typedef s
0320: 74 72 75 63 74 20 45 78 70 72 49 6e 66 6f 20 45  truct ExprInfo E
0330: 78 70 72 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  xprInfo;.struct 
0340: 45 78 70 72 49 6e 66 6f 20 7b 0a 20 20 45 78 70  ExprInfo {.  Exp
0350: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
0360: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0370: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
0380: 73 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 6e 64  sion */.  u8 ind
0390: 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  exable;         
03a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
03b0: 73 20 73 75 62 65 78 70 72 73 73 69 6f 6e 20 69  s subexprssion i
03c0: 73 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  s usable by an i
03d0: 6e 64 65 78 20 2a 2f 0a 20 20 73 68 6f 72 74 20  ndex */.  short 
03e0: 69 6e 74 20 69 64 78 4c 65 66 74 3b 20 20 20 20  int idxLeft;    
03f0: 20 20 2f 2a 20 70 2d 3e 70 4c 65 66 74 20 69 73    /* p->pLeft is
0400: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 69   a column in thi
0410: 73 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 2e 20  s table number. 
0420: 2d 31 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  -1 if.          
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 2a 2a 20 70 2d 3e 70 4c 65 66 74 20 69 73 20 6e  ** p->pLeft is n
0450: 6f 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  ot the column of
0460: 20 61 6e 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20   any table */.  
0470: 73 68 6f 72 74 20 69 6e 74 20 69 64 78 52 69 67  short int idxRig
0480: 68 74 3b 20 20 20 20 20 2f 2a 20 70 2d 3e 70 52  ht;     /* p->pR
0490: 69 67 68 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ight is a column
04a0: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 6e   in this table n
04b0: 75 6d 62 65 72 2e 20 2d 31 20 69 66 0a 20 20 20  umber. -1 if.   
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 70 52 69         ** p->pRi
04e0: 67 68 74 20 69 73 20 6e 6f 74 20 74 68 65 20 63  ght is not the c
04f0: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 79 20 74 61 62  olumn of any tab
0500: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
0510: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
0520: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0530: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0540: 62 79 20 70 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20  by p->pLeft */. 
0550: 20 75 6e 73 69 67 6e 65 64 20 70 72 65 72 65 71   unsigned prereq
0560: 52 69 67 68 74 3b 20 20 20 2f 2a 20 42 69 74 6d  Right;   /* Bitm
0570: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
0580: 66 65 72 65 6e 63 65 64 20 62 79 20 70 2d 3e 70  ferenced by p->p
0590: 52 69 67 68 74 20 2a 2f 0a 20 20 75 6e 73 69 67  Right */.  unsig
05a0: 6e 65 64 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ned prereqAll;  
05b0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
05c0: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
05d0: 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ed by p */.};../
05e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
05f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0600: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
0610: 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70  s track of a map
0620: 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ping.** between 
0630: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0640: 65 72 73 20 61 6e 64 20 62 69 74 6d 61 73 6b 73  ers and bitmasks
0650: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
0660: 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 61 72  or numbers.** ar
0670: 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73  e small integers
0680: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 53 72   contained in Sr
0690: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
06a0: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
06b0: 6c 65 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 46  le.** fields.  F
06c0: 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45  or any given WHE
06d0: 52 45 20 63 6c 61 75 73 65 2c 20 77 65 20 77 61  RE clause, we wa
06e0: 6e 74 20 74 6f 20 74 72 61 63 6b 20 77 68 69 63  nt to track whic
06f0: 68 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 72 65  h cursors.** are
0700: 20 62 65 69 6e 67 20 75 73 65 64 2c 20 73 6f 20   being used, so 
0710: 77 65 20 61 73 73 69 67 6e 20 61 20 73 69 6e 67  we assign a sing
0720: 6c 65 20 62 69 74 20 69 6e 20 61 20 33 32 2d 62  le bit in a 32-b
0730: 69 74 20 77 6f 72 64 20 74 6f 20 74 72 61 63 6b  it word to track
0740: 0a 2a 2a 20 74 68 61 74 20 63 75 72 73 6f 72 2e  .** that cursor.
0750: 20 20 54 68 65 6e 20 61 20 33 32 2d 62 69 74 20    Then a 32-bit 
0760: 69 6e 74 65 67 65 72 20 69 73 20 61 62 6c 65 20  integer is able 
0770: 74 6f 20 73 68 6f 77 20 74 68 65 20 73 65 74 20  to show the set 
0780: 6f 66 20 61 6c 6c 0a 2a 2a 20 63 75 72 73 6f 72  of all.** cursor
0790: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 2a 2f  s being used..*/
07a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
07b0: 45 78 70 72 4d 61 73 6b 53 65 74 20 45 78 70 72  ExprMaskSet Expr
07c0: 4d 61 73 6b 53 65 74 3b 0a 73 74 72 75 63 74 20  MaskSet;.struct 
07d0: 45 78 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20  ExprMaskSet {.  
07e0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
07f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73  /* Number of ass
0800: 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c  igned cursor val
0810: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b  ues */.  int ix[
0820: 33 31 5d 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  31];     /* Curs
0830: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
0840: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
0850: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
0860: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
0870: 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61  ments in an arra
0880: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52  y..*/.#define AR
0890: 52 41 59 53 49 5a 45 28 58 29 20 20 28 73 69 7a  RAYSIZE(X)  (siz
08a0: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
08b0: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0]))../*.** This
08c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
08d0: 20 74 6f 20 64 69 76 69 64 65 20 74 68 65 20 57   to divide the W
08e0: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
08f0: 69 6e 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  into subexpressi
0900: 6f 6e 73 0a 2a 2a 20 73 65 70 61 72 61 74 65 64  ons.** separated
0910: 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72   by the AND oper
0920: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 61 53 6c 6f  ator..**.** aSlo
0930: 74 5b 5d 20 69 73 20 61 6e 20 61 72 72 61 79 20  t[] is an array 
0940: 6f 66 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  of subexpression
0950: 73 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  s structures..**
0960: 20 54 68 65 72 65 20 61 72 65 20 6e 53 6c 6f 74   There are nSlot
0970: 20 73 70 61 63 65 73 20 6c 65 66 74 20 69 6e 20   spaces left in 
0980: 74 68 69 73 20 61 72 72 61 79 2e 20 20 54 68 69  this array.  Thi
0990: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
09a0: 74 73 20 74 6f 0a 2a 2a 20 73 70 6c 69 74 20 70  ts to.** split p
09b0: 45 78 70 72 20 69 6e 74 6f 20 73 75 62 65 78 70  Expr into subexp
09c0: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 66 69 6c  ressions and fil
09d0: 6c 73 20 61 53 6c 6f 74 5b 5d 20 77 69 74 68 20  ls aSlot[] with 
09e0: 74 68 6f 73 65 20 73 75 62 65 78 70 72 65 73 73  those subexpress
09f0: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ions..** The ret
0a00: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
0a10: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
0a20: 20 66 69 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   filled..*/.stat
0a30: 69 63 20 69 6e 74 20 65 78 70 72 53 70 6c 69 74  ic int exprSplit
0a40: 28 69 6e 74 20 6e 53 6c 6f 74 2c 20 45 78 70 72  (int nSlot, Expr
0a50: 49 6e 66 6f 20 2a 61 53 6c 6f 74 2c 20 45 78 70  Info *aSlot, Exp
0a60: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0a70: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
0a80: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 6e 53 6c 6f  pExpr==0 || nSlo
0a90: 74 3c 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  t<1 ) return 0;.
0aa0: 20 20 69 66 28 20 6e 53 6c 6f 74 3d 3d 31 20 7c    if( nSlot==1 |
0ab0: 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  | pExpr->op!=TK_
0ac0: 41 4e 44 20 29 7b 0a 20 20 20 20 61 53 6c 6f 74  AND ){.    aSlot
0ad0: 5b 30 5d 2e 70 20 3d 20 70 45 78 70 72 3b 0a 20  [0].p = pExpr;. 
0ae0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0af0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  .  if( pExpr->pL
0b00: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20  eft->op!=TK_AND 
0b10: 29 7b 0a 20 20 20 20 61 53 6c 6f 74 5b 30 5d 2e  ){.    aSlot[0].
0b20: 70 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  p = pExpr->pLeft
0b30: 3b 0a 20 20 20 20 63 6e 74 20 3d 20 31 20 2b 20  ;.    cnt = 1 + 
0b40: 65 78 70 72 53 70 6c 69 74 28 6e 53 6c 6f 74 2d  exprSplit(nSlot-
0b50: 31 2c 20 26 61 53 6c 6f 74 5b 31 5d 2c 20 70 45  1, &aSlot[1], pE
0b60: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
0b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6e 74 20 3d  }else{.    cnt =
0b80: 20 65 78 70 72 53 70 6c 69 74 28 6e 53 6c 6f 74   exprSplit(nSlot
0b90: 2c 20 61 53 6c 6f 74 2c 20 70 45 78 70 72 2d 3e  , aSlot, pExpr->
0ba0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 63 6e 74 20  pLeft);.    cnt 
0bb0: 2b 3d 20 65 78 70 72 53 70 6c 69 74 28 6e 53 6c  += exprSplit(nSl
0bc0: 6f 74 2d 63 6e 74 2c 20 26 61 53 6c 6f 74 5b 63  ot-cnt, &aSlot[c
0bd0: 6e 74 5d 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  nt], pExpr->pRig
0be0: 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ht);.  }.  retur
0bf0: 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n cnt;.}../*.** 
0c00: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
0c10: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
0c20: 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69  t.*/.#define ini
0c30: 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d  tMaskSet(P)  mem
0c40: 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66  set(P, 0, sizeof
0c50: 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  (*P))../*.** Ret
0c60: 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20  urn the bitmask 
0c70: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
0c80: 72 73 6f 72 2e 20 20 41 73 73 69 67 6e 20 61 20  rsor.  Assign a 
0c90: 6e 65 77 20 62 69 74 6d 61 73 6b 0a 2a 2a 20 69  new bitmask.** i
0ca0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
0cb0: 72 73 74 20 74 69 6d 65 20 74 68 65 20 63 75 72  rst time the cur
0cc0: 73 6f 72 20 68 61 73 20 62 65 65 6e 20 73 65 65  sor has been see
0cd0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
0ce0: 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61 73   getMask(ExprMas
0cf0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
0d00: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
0d10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
0d20: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
0d30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
0d40: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
0d50: 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
0d60: 20 31 3c 3c 69 3b 0a 20 20 7d 0a 20 20 69 66 28   1<<i;.  }.  if(
0d70: 20 69 3d 3d 70 4d 61 73 6b 53 65 74 2d 3e 6e 20   i==pMaskSet->n 
0d80: 26 26 20 69 3c 41 52 52 41 59 53 49 5a 45 28 70  && i<ARRAYSIZE(p
0d90: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 7b 0a  MaskSet->ix) ){.
0da0: 20 20 20 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b      pMaskSet->n+
0db0: 2b 3b 0a 20 20 20 20 70 4d 61 73 6b 53 65 74 2d  +;.    pMaskSet-
0dc0: 3e 69 78 5b 69 5d 20 3d 20 69 43 75 72 73 6f 72  >ix[i] = iCursor
0dd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3c 3c  ;.    return 1<<
0de0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
0df0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  0;.}../*.** Dest
0e00: 72 6f 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  roy an expressio
0e10: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
0e20: 65 66 69 6e 65 20 66 72 65 65 4d 61 73 6b 53 65  efine freeMaskSe
0e30: 74 28 50 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20  t(P)   /* NO-OP 
0e40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
0e50: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65  outine walks (re
0e60: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
0e70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
0e80: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
0e90: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
0ea0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
0eb0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
0ec0: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
0ed0: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  tree..**.** In o
0ee0: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f  rder for this ro
0ef0: 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74  utine to work, t
0f00: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
0f10: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  ion must have.**
0f20: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f   previously invo
0f30: 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72 52  ked sqlite3ExprR
0f40: 65 73 6f 6c 76 65 49 64 73 28 29 20 6f 6e 20 74  esolveIds() on t
0f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
0f60: 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65  See.** the heade
0f70: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
0f80: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
0f90: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
0fa0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  tion..** The sql
0fb0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
0fc0: 64 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f  ds() routines lo
0fd0: 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  oks for column n
0fe0: 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73  ames and.** sets
0ff0: 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74   their opcodes t
1000: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
1010: 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c  their Expr.iTabl
1020: 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74  e fields to.** t
1030: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
1040: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62  umber of the tab
1050: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1060: 74 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  t exprTableUsage
1070: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
1080: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
1090: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
10a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
10b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
10c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
10d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
10e0: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
10f0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
1100: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 6d 61 73  le);.    if( mas
1110: 6b 3d 3d 30 20 29 20 6d 61 73 6b 20 3d 20 2d 31  k==0 ) mask = -1
1120: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73  ;.    return mas
1130: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  k;.  }.  if( p->
1140: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 6d 61  pRight ){.    ma
1150: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
1160: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
1170: 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
1180: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a  if( p->pLeft ){.
1190: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
11a0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
11b0: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
11c0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
11d0: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  st ){.    int i;
11e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11f0: 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  p->pList->nExpr;
1200: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
1210: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
1220: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
1230: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
1240: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
1250: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
1260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1270: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
1280: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
1290: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
12a0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
12b0: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
12c0: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
12d0: 65 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  e.  The allowed 
12e0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
12f0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
1300: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20  "<=", ">=", and 
1310: 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "IN"..*/.static 
1320: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
1330: 74 20 6f 70 29 7b 0a 20 20 73 77 69 74 63 68 28  t op){.  switch(
1340: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1350: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1360: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1370: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1380: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1390: 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
13a0: 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 72 65 74  TK_IN:.      ret
13b0: 75 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75  urn 1;.    defau
13c0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
13d0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
13e0: 20 53 77 61 70 20 74 77 6f 20 69 6e 74 65 67 65   Swap two intege
13f0: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  rs..*/.#define S
1400: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
1410: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
1420: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  t;}../*.** Retur
1430: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  n the index in t
1440: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1450: 75 73 65 73 20 63 75 72 73 6f 72 20 69 43 75 72  uses cursor iCur
1460: 2e 20 20 49 66 20 69 43 75 72 20 69 73 0a 2a 2a  .  If iCur is.**
1470: 20 75 73 65 64 20 62 79 20 74 68 65 20 66 69 72   used by the fir
1480: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 72 63 4c  st entry in SrcL
1490: 69 73 74 20 72 65 74 75 72 6e 20 30 2e 20 20 49  ist return 0.  I
14a0: 66 20 69 43 75 72 20 69 73 20 75 73 65 64 20 62  f iCur is used b
14b0: 79 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  y.** the second 
14c0: 65 6e 74 72 79 20 72 65 74 75 72 6e 20 31 2e 20  entry return 1. 
14d0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
14e0: 2a 0a 2a 2a 20 53 72 63 4c 69 73 74 20 69 73 20  *.** SrcList is 
14f0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
1500: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1510: 61 75 73 65 20 69 6e 20 74 68 65 20 6f 72 64 65  ause in the orde
1520: 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 77  r that.** they w
1530: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
1540: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
1550: 75 72 6e 65 64 20 68 65 72 65 20 67 69 76 65 73  urned here gives
1560: 20 75 73 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   us an index.** 
1570: 6f 66 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  of which tables 
1580: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
1590: 64 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  d first..*/.stat
15a0: 69 63 20 69 6e 74 20 74 61 62 6c 65 4f 72 64 65  ic int tableOrde
15b0: 72 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  r(SrcList *pList
15c0: 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 69  , int iCur){.  i
15d0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
15e0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
15f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  i++){.    if( pL
1600: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
1610: 72 3d 3d 69 43 75 72 20 29 20 72 65 74 75 72 6e  r==iCur ) return
1620: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1630: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
1640: 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  e input to this 
1650: 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 45 78  routine is an Ex
1660: 70 72 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  prInfo structure
1670: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
1680: 2a 20 22 70 22 20 66 69 65 6c 64 20 66 69 6c 6c  * "p" field fill
1690: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
16a0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
16b0: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
16c0: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
16d0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
16e0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
16f0: 65 6c 64 73 20 6f 66 20 74 68 65 20 45 78 70 72  elds of the Expr
1700: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
1710: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1720: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
1730: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 45 78 70  cList *pSrc, Exp
1740: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
1750: 65 74 2c 20 45 78 70 72 49 6e 66 6f 20 2a 70 49  et, ExprInfo *pI
1760: 6e 66 6f 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  nfo){.  Expr *pE
1770: 78 70 72 20 3d 20 70 49 6e 66 6f 2d 3e 70 3b 0a  xpr = pInfo->p;.
1780: 20 20 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71 4c    pInfo->prereqL
1790: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  eft = exprTableU
17a0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
17b0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
17c0: 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71 52 69 67  pInfo->prereqRig
17d0: 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ht = exprTableUs
17e0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
17f0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1800: 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71 41 6c 6c  pInfo->prereqAll
1810: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
1820: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
1830: 72 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 6e 64  r);.  pInfo->ind
1840: 65 78 61 62 6c 65 20 3d 20 30 3b 0a 20 20 70 49  exable = 0;.  pI
1850: 6e 66 6f 2d 3e 69 64 78 4c 65 66 74 20 3d 20 2d  nfo->idxLeft = -
1860: 31 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78 52  1;.  pInfo->idxR
1870: 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ight = -1;.  if(
1880: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
1890: 2d 3e 6f 70 29 20 26 26 20 28 70 49 6e 66 6f 2d  ->op) && (pInfo-
18a0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
18b0: 49 6e 66 6f 2d 3e 70 72 65 72 65 71 4c 65 66 74  Info->prereqLeft
18c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
18d0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 26 26  pExpr->pRight &&
18e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
18f0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
1900: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64  .      pInfo->id
1910: 78 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  xRight = pExpr->
1920: 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 3b 0a  pRight->iTable;.
1930: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 6e 64        pInfo->ind
1940: 65 78 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  exable = 1;.    
1950: 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  }.    if( pExpr-
1960: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
1970: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
1980: 49 6e 66 6f 2d 3e 69 64 78 4c 65 66 74 20 3d 20  Info->idxLeft = 
1990: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
19a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 49 6e 66  able;.      pInf
19b0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 31  o->indexable = 1
19c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
19d0: 28 20 70 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  ( pInfo->indexab
19e0: 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  le ){.    assert
19f0: 28 20 70 49 6e 66 6f 2d 3e 69 64 78 4c 65 66 74  ( pInfo->idxLeft
1a00: 21 3d 70 49 6e 66 6f 2d 3e 69 64 78 52 69 67 68  !=pInfo->idxRigh
1a10: 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 65 20  t );..    /* We 
1a20: 77 61 6e 74 20 74 68 65 20 65 78 70 72 65 73 73  want the express
1a30: 69 6f 6e 20 74 6f 20 62 65 20 6f 66 20 74 68 65  ion to be of the
1a40: 20 66 6f 72 6d 20 22 58 20 3d 20 65 78 70 72 22   form "X = expr"
1a50: 2c 20 6e 6f 74 20 22 65 78 70 72 20 3d 20 58 22  , not "expr = X"
1a60: 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 66 6c 69 70  ..    ** So flip
1a70: 20 69 74 20 6f 76 65 72 20 69 66 20 6e 65 63 65   it over if nece
1a80: 73 73 61 72 79 2e 20 20 49 66 20 74 68 65 20 65  ssary.  If the e
1a90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 58 20  xpression is "X 
1aa0: 3d 20 59 22 2c 20 74 68 65 6e 0a 20 20 20 20 2a  = Y", then.    *
1ab0: 2a 20 77 65 20 77 61 6e 74 20 59 20 74 6f 20 63  * we want Y to c
1ac0: 6f 6d 65 20 66 72 6f 6d 20 61 6e 20 65 61 72 6c  ome from an earl
1ad0: 69 65 72 20 74 61 62 6c 65 20 74 68 61 6e 20 58  ier table than X
1ae0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1af0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
1b00: 71 75 65 6e 63 65 20 72 75 6c 65 20 69 73 20 74  quence rule is t
1b10: 6f 20 61 6c 77 61 79 73 20 63 68 6f 6f 73 65 20  o always choose 
1b20: 74 68 65 20 6c 65 66 74 20 65 78 70 72 65 73 73  the left express
1b30: 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 69  ion..    ** So i
1b40: 66 20 77 65 20 64 6f 20 61 20 66 6c 69 70 2c 20  f we do a flip, 
1b50: 77 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20  we also have to 
1b60: 6d 6f 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  move the collati
1b70: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20  ng sequence..   
1b80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 74 61 62 6c   */.    if( tabl
1b90: 65 4f 72 64 65 72 28 70 53 72 63 2c 70 49 6e 66  eOrder(pSrc,pInf
1ba0: 6f 2d 3e 69 64 78 4c 65 66 74 29 3c 74 61 62 6c  o->idxLeft)<tabl
1bb0: 65 4f 72 64 65 72 28 70 53 72 63 2c 70 49 6e 66  eOrder(pSrc,pInf
1bc0: 6f 2d 3e 69 64 78 52 69 67 68 74 29 20 29 7b 0a  o->idxRight) ){.
1bd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1be0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
1bf0: 3b 0a 20 20 20 20 20 20 53 57 41 50 28 43 6f 6c  ;.      SWAP(Col
1c00: 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69  lSeq*,pExpr->pRi
1c10: 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72  ght->pColl,pExpr
1c20: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b  ->pLeft->pColl);
1c30: 0a 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72  .      SWAP(Expr
1c40: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
1c50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c60: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78       switch( pEx
1c70: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20  pr->op ){.      
1c80: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
1c90: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 47  pExpr->op = TK_G
1ca0: 54 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T;  break;.     
1cb0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
1cc0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1cd0: 47 45 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  GE;  break;.    
1ce0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
1cf0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1d00: 5f 4c 54 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  _LT;  break;.   
1d10: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a       case TK_GE:
1d20: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1d30: 4b 5f 4c 45 3b 20 20 62 72 65 61 6b 3b 0a 20 20  K_LE;  break;.  
1d40: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
1d50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d60: 20 7d 0a 20 20 20 20 20 20 53 57 41 50 28 75 6e   }.      SWAP(un
1d70: 73 69 67 6e 65 64 2c 20 70 49 6e 66 6f 2d 3e 70  signed, pInfo->p
1d80: 72 65 72 65 71 4c 65 66 74 2c 20 70 49 6e 66 6f  rereqLeft, pInfo
1d90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 3b 0a  ->prereqRight);.
1da0: 20 20 20 20 20 20 53 57 41 50 28 73 68 6f 72 74        SWAP(short
1db0: 20 69 6e 74 2c 20 70 49 6e 66 6f 2d 3e 69 64 78   int, pInfo->idx
1dc0: 4c 65 66 74 2c 20 70 49 6e 66 6f 2d 3e 69 64 78  Left, pInfo->idx
1dd0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
1de0: 7d 20 20 20 20 20 20 0a 0a 7d 0a 0a 2f 2a 0a 2a  }      ..}../*.*
1df0: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
1e00: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e10: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
1e20: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
1e30: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
1e40: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
1e50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e60: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
1e70: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
1e80: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
1e90: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
1ea0: 6f 66 20 22 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a  of "base"..**.**
1eb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1ec0: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
1ed0: 6e 20 69 6e 64 65 78 20 66 6f 72 20 70 54 61 62  n index for pTab
1ee0: 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20   that generates 
1ef0: 74 68 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 72  the.** correct r
1f00: 65 63 6f 72 64 20 73 65 71 75 65 6e 63 65 20 66  ecord sequence f
1f10: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 4f 52 44  or the given ORD
1f20: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1f30: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
1f40: 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ** is a pointer 
1f50: 74 6f 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  to an index that
1f60: 20 64 6f 65 73 20 74 68 65 20 6a 6f 62 2e 20 20   does the job.  
1f70: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1f80: 20 69 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   if the.** table
1f90: 20 68 61 73 20 6e 6f 20 69 6e 64 65 78 20 74 68   has no index th
1fa0: 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  at will generate
1fb0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 6f 72   the correct sor
1fc0: 74 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  t order..**.** I
1fd0: 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
1fe0: 6f 72 20 6d 6f 72 65 20 69 6e 64 69 63 65 73 20  or more indices 
1ff0: 74 68 61 74 20 67 65 6e 65 72 61 74 65 20 74 68  that generate th
2000: 65 20 63 6f 72 72 65 63 74 20 73 6f 72 74 20 6f  e correct sort o
2010: 72 64 65 72 0a 2a 2a 20 61 6e 64 20 70 50 72 65  rder.** and pPre
2020: 66 65 72 72 65 64 49 64 78 20 69 73 20 6f 6e 65  ferredIdx is one
2030: 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 69 63 65   of those indice
2040: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 70  s, then return p
2050: 50 72 65 66 65 72 72 65 64 49 64 78 2e 0a 2a 2a  PreferredIdx..**
2060: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
2070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
2080: 6d 6e 73 20 6f 66 20 70 50 72 65 66 65 72 72 65  mns of pPreferre
2090: 64 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73  dIdx that are us
20a0: 65 64 20 61 73 0a 2a 2a 20 65 71 75 61 6c 69 74  ed as.** equalit
20b0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
20c0: 41 6e 79 20 69 6e 64 65 78 20 72 65 74 75 72 6e  Any index return
20d0: 65 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  ed must have exa
20e0: 63 74 6c 79 20 74 68 69 73 20 73 61 6d 65 0a 2a  ctly this same.*
20f0: 2a 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  * set of columns
2100: 2e 20 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  .  The ORDER BY 
2110: 63 6c 61 75 73 65 20 6f 6e 6c 79 20 6d 61 74 63  clause only matc
2120: 68 65 73 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  hes index column
2130: 73 20 62 65 79 6f 6e 64 20 74 68 65 0a 2a 2a 20  s beyond the.** 
2140: 74 68 65 20 66 69 72 73 74 20 6e 45 71 43 6f 6c  the first nEqCol
2150: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
2160: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
2170: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2180: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2190: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 54 68  ASC or DESC.  Th
21a0: 65 0a 2a 2a 20 2a 70 62 52 65 76 20 76 61 6c 75  e.** *pbRev valu
21b0: 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66  e is set to 1 if
21c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
21d0: 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43  ause is all DESC
21e0: 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 73 65   and it is.** se
21f0: 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 4f 52  t to 0 if the OR
2200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
2210: 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61   all ASC..*/.sta
2220: 74 69 63 20 49 6e 64 65 78 20 2a 66 69 6e 64 53  tic Index *findS
2230: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
2240: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
2250: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2260: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2270: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
2280: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  d */.  int base,
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
22b0: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 45 78  for pTab */.  Ex
22c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
22d0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
22e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
22f0: 20 20 49 6e 64 65 78 20 2a 70 50 72 65 66 65 72    Index *pPrefer
2300: 72 65 64 49 64 78 2c 20 20 20 2f 2a 20 55 73 65  redIdx,   /* Use
2310: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
2320: 70 6f 73 73 69 62 6c 65 20 61 6e 64 20 6e 6f 74  possible and not
2330: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e   NULL */.  int n
2340: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
2350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2360: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 75 73  index columns us
2370: 65 64 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74  ed with == const
2380: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
2390: 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20  *pbRev          
23a0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
23b0: 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44  if ORDER BY is D
23c0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ESC */.){.  int 
23d0: 69 2c 20 6a 3b 0a 20 20 49 6e 64 65 78 20 2a 70  i, j;.  Index *p
23e0: 4d 61 74 63 68 3b 0a 20 20 49 6e 64 65 78 20 2a  Match;.  Index *
23f0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 73 6f 72 74  pIdx;.  int sort
2400: 4f 72 64 65 72 3b 0a 20 20 73 71 6c 69 74 65 20  Order;.  sqlite 
2410: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2420: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ;..  assert( pOr
2430: 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
2440: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
2450: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 73 6f 72  nExpr>0 );.  sor
2460: 74 4f 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42  tOrder = pOrderB
2470: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
2480: 72 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  r;.  for(i=0; i<
2490: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
24b0: 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  *p;.    if( pOrd
24c0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
24d0: 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20  rder!=sortOrder 
24e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  ){.      /* Indi
24f0: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
2500: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
2510: 52 20 42 59 20 74 65 72 6d 73 20 61 72 65 20 65  R BY terms are e
2520: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 44  ither.      ** D
2530: 45 53 43 20 6f 72 20 41 53 43 2e 20 20 49 6e 64  ESC or ASC.  Ind
2540: 69 63 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 75  ices cannot be u
2550: 73 65 64 20 6f 6e 20 61 20 6d 69 78 74 75 72 65  sed on a mixture
2560: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
2570: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
2580: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
2590: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
25a0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
25b0: 4e 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d  N || p->iTable!=
25c0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  base ){.      /*
25d0: 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20   Can not use an 
25e0: 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e  index sort on an
25f0: 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e  ything that is n
2600: 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ot a column in t
2610: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74  he.      ** left
2620: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74  -most table of t
2630: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2640: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
2650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2660: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
2670: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
2680: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2690: 73 65 20 63 6f 6e 73 69 73 74 73 20 6f 6e 6c 79  se consists only
26a0: 20 6f 66 0a 20 20 2a 2a 20 61 73 63 65 6e 64 69   of.  ** ascendi
26b0: 6e 67 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ng columns in th
26c0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  e left-most tabl
26d0: 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e of the FROM cl
26e0: 61 75 73 65 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20  ause.  Now.  ** 
26f0: 63 68 65 63 6b 20 66 6f 72 20 61 20 6d 61 74 63  check for a matc
2700: 68 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  hing index..  */
2710: 0a 20 20 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20  .  pMatch = 0;. 
2720: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2730: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2740: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2750: 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
2760: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2770: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
2780: 6e 43 6f 6c 75 6d 6e 20 3c 20 6e 45 71 43 6f 6c  nColumn < nEqCol
2790: 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
27a0: 6e 20 3c 20 6e 45 78 70 72 20 29 20 63 6f 6e 74  n < nExpr ) cont
27b0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
27c0: 6a 3d 30 3b 20 69 3c 6e 45 71 43 6f 6c 3b 20 69  j=0; i<nEqCol; i
27d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
27e0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
27f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2800: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2810: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
2820: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2830: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2840: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  ltColl;.      if
2850: 28 20 70 50 72 65 66 65 72 72 65 64 49 64 78 2d  ( pPreferredIdx-
2860: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d 70 49  >aiColumn[i]!=pI
2870: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  dx->aiColumn[i] 
2880: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
2890: 66 28 20 70 50 72 65 66 65 72 72 65 64 49 64 78  f( pPreferredIdx
28a0: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
28b0: 69 5d 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i]!=pIdx->keyInf
28c0: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 20 62 72 65  o.aColl[i] ) bre
28d0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c  ak;.      if( j<
28e0: 6e 45 78 70 72 20 26 26 20 0a 20 20 20 20 20 20  nExpr && .      
28f0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
2900: 6a 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  j].pExpr->iColum
2910: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
2920: 6e 5b 69 5d 20 26 26 0a 20 20 20 20 20 20 20 20  n[i] &&.        
2930: 20 20 70 43 6f 6c 6c 3d 3d 70 49 64 78 2d 3e 6b    pColl==pIdx->k
2940: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 0a  eyInfo.aColl[i].
2950: 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20        ){ .      
2960: 20 20 6a 2b 2b 3b 20 0a 20 20 20 20 20 20 7d 0a    j++; .      }.
2970: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2980: 6e 45 71 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  nEqCol ) continu
2990: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
29a0: 69 2b 6a 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  i+j<nExpr; i++){
29b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
29c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
29d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
29e0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
29f0: 2b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +j].pExpr);.    
2a00: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2a10: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2a20: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
2a30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 2b 6a 5d  pOrderBy->a[i+j]
2a40: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  .pExpr->iColumn!
2a50: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
2a60: 69 2b 6e 45 71 43 6f 6c 5d 20 7c 7c 0a 20 20 20  i+nEqCol] ||.   
2a70: 20 20 20 20 20 20 20 70 43 6f 6c 6c 21 3d 70 49         pColl!=pI
2a80: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
2a90: 6c 5b 69 2b 6e 45 71 43 6f 6c 5d 20 29 20 62 72  l[i+nEqCol] ) br
2aa0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2ab0: 66 28 20 69 2b 6a 3e 3d 6e 45 78 70 72 20 29 7b  f( i+j>=nExpr ){
2ac0: 0a 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20  .      pMatch = 
2ad0: 70 49 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20  pIdx;.      if( 
2ae0: 70 49 64 78 3d 3d 70 50 72 65 66 65 72 72 65 64  pIdx==pPreferred
2af0: 49 64 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Idx ) break;.   
2b00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 61   }.  }.  if( pMa
2b10: 74 63 68 20 26 26 20 70 62 52 65 76 20 29 7b 0a  tch && pbRev ){.
2b20: 20 20 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72      *pbRev = sor
2b30: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
2b40: 4f 5f 44 45 53 43 3b 0a 20 20 7d 0a 20 20 72 65  O_DESC;.  }.  re
2b50: 74 75 72 6e 20 70 4d 61 74 63 68 3b 0a 7d 0a 0a  turn pMatch;.}..
2b60: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
2b70: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
2b80: 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
2b90: 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
2ba0: 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
2bb0: 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
2bc0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
2bd0: 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
2be0: 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
2bf0: 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
2c00: 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
2c10: 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
2c20: 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
2c30: 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
2c40: 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
2c50: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
2c60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2c70: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2c80: 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
2c90: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
2ca0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2cb0: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2cc0: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
2cd0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
2ce0: 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
2cf0: 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
2d00: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
2d10: 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
2d20: 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
2d30: 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
2d40: 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
2d50: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
2d60: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  e.** in the ON c
2d70: 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
2d80: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
2d90: 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
2da0: 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
2db0: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2dc0: 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
2dd0: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
2de0: 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
2df0: 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
2e00: 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
2e10: 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
2e20: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
2e30: 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
2e40: 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
2e50: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2e60: 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
2e70: 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 72 65  he correct.** re
2e80: 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
2e90: 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
2ea0: 6c 65 64 2c 20 62 75 74 20 6a 6f 69 6e 73 20 6d  led, but joins m
2eb0: 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
2ec0: 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e 20 20 54 68  e.** slower.  Th
2ed0: 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
2ee0: 73 61 62 6c 65 20 61 73 20 6d 75 63 68 20 61 73  sable as much as
2ef0: 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
2f00: 64 69 73 61 62 6c 69 6e 67 0a 2a 2a 20 74 6f 6f  disabling.** too
2f10: 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
2f20: 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
2f30: 65 27 64 20 67 65 74 20 74 68 65 20 77 72 6f 6e  e'd get the wron
2f40: 67 20 61 6e 73 77 65 72 2e 0a 2a 2a 20 53 65 65  g answer..** See
2f50: 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f   ticket #813..*/
2f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
2f70: 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
2f80: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 45 78 70  vel *pLevel, Exp
2f90: 72 20 2a 2a 70 70 45 78 70 72 29 7b 0a 20 20 45  r **ppExpr){.  E
2fa0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 2a 70 70  xpr *pExpr = *pp
2fb0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 76  Expr;.  if( pLev
2fc0: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
2fd0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
2fe0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2ff0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a  omJoin) ){.    *
3000: 70 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 0a  ppExpr = 0;.  }.
3010: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
3020: 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
3030: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
3040: 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
3050: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
3060: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
3070: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
3080: 6f 20 61 6e 20 28 6f 70 61 71 75 65 29 20 73 74  o an (opaque) st
3090: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
30a0: 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
30b0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
30c0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
30d0: 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
30e0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
30f0: 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
3100: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
3110: 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
3120: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
3130: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
3140: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
3150: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3160: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
3170: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
3180: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
3190: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
31a0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
31b0: 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
31c0: 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
31d0: 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
31e0: 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
31f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3200: 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
3210: 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
3220: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
3230: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
3240: 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
3250: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
3260: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3270: 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
3280: 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
3290: 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
32a0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
32b0: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
32c0: 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
32d0: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
32e0: 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
32f0: 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
3300: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
3310: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
3320: 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
3330: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
3340: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
3350: 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
3360: 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
3370: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
3380: 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
3390: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
33a0: 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
33b0: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
33c0: 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
33f0: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
3400: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
3410: 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
3420: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
3430: 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
3460: 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
3470: 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
3480: 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
3490: 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
34a0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
34b0: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
34c0: 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
34d0: 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
34e0: 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
34f0: 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
3500: 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
3510: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
3520: 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
3530: 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
3540: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
3550: 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
3560: 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
3570: 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  them..**.** If t
3580: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3590: 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
35a0: 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
35b0: 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
35c0: 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
35d0: 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
35e0: 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
35f0: 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
3600: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
3610: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
3620: 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
3630: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
3640: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
3650: 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
3660: 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
3670: 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
3680: 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
3690: 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
36a0: 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
36b0: 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
36c0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
36d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
36e0: 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
36f0: 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
3700: 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
3710: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
3720: 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
3730: 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
3740: 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
3750: 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
3760: 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
3770: 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
3780: 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
3790: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
37a0: 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
37b0: 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
37c0: 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
37d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
37e0: 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
37f0: 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
3800: 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
3810: 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
3820: 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
3830: 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
3840: 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
3850: 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
3860: 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
3870: 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
3880: 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
3890: 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
38a0: 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
38b0: 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
38c0: 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
38d0: 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
38e0: 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
38f0: 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
3900: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
3910: 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
3920: 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
3930: 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
3940: 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
3950: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
3960: 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
3970: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
3980: 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
3990: 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
39a0: 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
39b0: 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
39c0: 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
39d0: 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
39e0: 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
39f0: 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
3a00: 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
3a10: 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
3a20: 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64  ING.**.** *ppOrd
3a30: 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
3a40: 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
3a50: 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
3a60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
3a70: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
3a80: 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
3a90: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
3aa0: 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
3ab0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
3ac0: 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
3ad0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
3ae0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f  tement, then ppO
3af0: 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
3b00: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65  **.** If an inde
3b10: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f  x can be used so
3b20: 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61   that the natura
3b30: 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f  l output order o
3b40: 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73  f the table.** s
3b50: 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66  can is correct f
3b60: 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
3b70: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61  clause, then tha
3b80: 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  t index is used 
3b90: 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  and.** *ppOrderB
3ba0: 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  y is set to NULL
3bb0: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
3bc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
3bd0: 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75  prevents an.** u
3be0: 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20  nnecessary sort 
3bf0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
3c00: 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70  t if an index ap
3c10: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
3c20: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
3c30: 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69  ause already exi
3c40: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sts..**.** If th
3c50: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c  e where clause l
3c60: 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61  oops cannot be a
3c70: 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69  rranged to provi
3c80: 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  de the correct.*
3c90: 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20  * output order, 
3ca0: 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65  then the *ppOrde
3cb0: 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64  rBy is unchanged
3cc0: 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
3cd0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
3ce0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
3cf0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
3d00: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
3d10: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
3d20: 61 62 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  abList,   /* A l
3d30: 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
3d40: 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
3d50: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
3d60: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
3d70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
3d80: 0a 20 20 69 6e 74 20 70 75 73 68 4b 65 79 2c 20  .  int pushKey, 
3d90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
3da0: 55 45 2c 20 6c 65 61 76 65 20 74 68 65 20 74 61  UE, leave the ta
3db0: 62 6c 65 20 6b 65 79 20 6f 6e 20 74 68 65 20 73  ble key on the s
3dc0: 74 61 63 6b 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tack */.  ExprLi
3dd0: 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 2f  st **ppOrderBy /
3de0: 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
3df0: 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
3e00: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3e30: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
3e40: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
3e50: 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
3e60: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
3e70: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
3e80: 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
3e90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
3ea0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
3eb0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
3ec0: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63   */.  int brk, c
3ed0: 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ont = 0;        
3ee0: 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73   /* Addresses us
3ef0: 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ed during code g
3f00: 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  eneration */.  i
3f10: 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
3f20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3f30: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
3f40: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3f50: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  use */.  int loo
3f60: 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 2f 2a  pMask;        /*
3f70: 20 4f 6e 65 20 62 69 74 20 73 65 74 20 66 6f 72   One bit set for
3f80: 20 65 61 63 68 20 6f 75 74 65 72 20 6c 6f 6f 70   each outer loop
3f90: 20 2a 2f 0a 20 20 69 6e 74 20 68 61 76 65 4b 65   */.  int haveKe
3fa0: 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  y = 0;     /* Tr
3fb0: 75 65 20 69 66 20 4b 45 59 20 69 73 20 6f 6e 20  ue if KEY is on 
3fc0: 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 45  the stack */.  E
3fd0: 78 70 72 49 6e 66 6f 20 2a 70 54 65 72 6d 3b 20  xprInfo *pTerm; 
3fe0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
3ff0: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
4000: 45 20 63 6c 61 75 73 65 3b 20 70 74 72 20 74 6f  E clause; ptr to
4010: 20 61 45 78 70 72 5b 5d 20 2a 2f 0a 20 20 45 78   aExpr[] */.  Ex
4020: 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
4030: 74 3b 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  t; /* The expres
4040: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
4050: 0a 20 20 69 6e 74 20 69 44 69 72 65 63 74 45 71  .  int iDirectEq
4060: 5b 33 32 5d 3b 20 20 20 2f 2a 20 54 65 72 6d 20  [32];   /* Term 
4070: 6f 66 20 74 68 65 20 66 6f 72 6d 20 52 4f 57 49  of the form ROWI
4080: 44 3d 3d 58 20 66 6f 72 20 74 68 65 20 4e 2d 74  D==X for the N-t
4090: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  h table */.  int
40a0: 20 69 44 69 72 65 63 74 4c 74 5b 33 32 5d 3b 20   iDirectLt[32]; 
40b0: 20 20 2f 2a 20 54 65 72 6d 20 6f 66 20 74 68 65    /* Term of the
40c0: 20 66 6f 72 6d 20 52 4f 57 49 44 3c 58 20 6f 72   form ROWID<X or
40d0: 20 52 4f 57 49 44 3c 3d 58 20 2a 2f 0a 20 20 69   ROWID<=X */.  i
40e0: 6e 74 20 69 44 69 72 65 63 74 47 74 5b 33 32 5d  nt iDirectGt[32]
40f0: 3b 20 20 20 2f 2a 20 54 65 72 6d 20 6f 66 20 74  ;   /* Term of t
4100: 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3e 58 20  he form ROWID>X 
4110: 6f 72 20 52 4f 57 49 44 3e 3d 58 20 2a 2f 0a 20  or ROWID>=X */. 
4120: 20 45 78 70 72 49 6e 66 6f 20 61 45 78 70 72 5b   ExprInfo aExpr[
4130: 31 30 31 5d 3b 20 2f 2a 20 54 68 65 20 57 48 45  101]; /* The WHE
4140: 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76  RE clause is div
4150: 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20  ided into these 
4160: 74 65 72 6d 73 20 2a 2f 0a 0a 20 20 2f 2a 20 70  terms */..  /* p
4170: 75 73 68 4b 65 79 20 69 73 20 6f 6e 6c 79 20 61  ushKey is only a
4180: 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 72 65 20  llowed if there 
4190: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  is a single tabl
41a0: 65 20 28 61 73 20 69 6e 20 61 6e 20 49 4e 53 45  e (as in an INSE
41b0: 52 54 20 6f 72 0a 20 20 2a 2a 20 55 50 44 41 54  RT or.  ** UPDAT
41c0: 45 20 73 74 61 74 65 6d 65 6e 74 29 0a 20 20 2a  E statement).  *
41d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 75 73 68  /.  assert( push
41e0: 4b 65 79 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69  Key==0 || pTabLi
41f0: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a  st->nSrc==1 );..
4200: 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
4210: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
4220: 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
4230: 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
4240: 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
4250: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
4260: 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
4270: 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68 65 20  erator.  If the 
4280: 61 45 78 70 72 5b 5d 0a 20 20 2a 2a 20 61 72 72  aExpr[].  ** arr
4290: 61 79 20 66 69 6c 6c 73 20 75 70 2c 20 74 68 65  ay fills up, the
42a0: 20 6c 61 73 74 20 65 6e 74 72 79 20 6d 69 67 68   last entry migh
42b0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 78  t point to an ex
42c0: 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 0a 20  pression which. 
42d0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 64 64   ** contains add
42e0: 69 74 69 6f 6e 61 6c 20 75 6e 66 61 63 74 6f 72  itional unfactor
42f0: 65 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 73  ed AND operators
4300: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
4310: 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a  kSet(&maskSet);.
4320: 20 20 6d 65 6d 73 65 74 28 61 45 78 70 72 2c 20    memset(aExpr, 
4330: 30 2c 20 73 69 7a 65 6f 66 28 61 45 78 70 72 29  0, sizeof(aExpr)
4340: 29 3b 0a 20 20 6e 45 78 70 72 20 3d 20 65 78 70  );.  nExpr = exp
4350: 72 53 70 6c 69 74 28 41 52 52 41 59 53 49 5a 45  rSplit(ARRAYSIZE
4360: 28 61 45 78 70 72 29 2c 20 61 45 78 70 72 2c 20  (aExpr), aExpr, 
4370: 70 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 6e  pWhere);.  if( n
4380: 45 78 70 72 3d 3d 41 52 52 41 59 53 49 5a 45 28  Expr==ARRAYSIZE(
4390: 61 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  aExpr) ){.    sq
43a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
43b0: 61 72 73 65 2c 20 22 57 48 45 52 45 20 63 6c 61  arse, "WHERE cla
43c0: 75 73 65 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 20  use too complex 
43d0: 2d 20 6e 6f 20 6d 6f 72 65 20 22 0a 20 20 20 20  - no more ".    
43e0: 20 20 20 22 74 68 61 6e 20 25 64 20 74 65 72 6d     "than %d term
43f0: 73 20 61 6c 6c 6f 77 65 64 22 2c 20 28 69 6e 74  s allowed", (int
4400: 29 41 52 52 41 59 53 49 5a 45 28 61 45 78 70 72  )ARRAYSIZE(aExpr
4410: 29 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )-1);.    return
4420: 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   0;.  }.  .  /* 
4430: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
4440: 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
4450: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
4460: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
4470: 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
4480: 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70   value..  */.  p
4490: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  WInfo = sqliteMa
44a0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65  lloc( sizeof(Whe
44b0: 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69  reInfo) + pTabLi
44c0: 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28  st->nSrc*sizeof(
44d0: 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
44e0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
44f0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
4500: 20 2f 2a 20 73 71 6c 69 74 65 46 72 65 65 28 70   /* sqliteFree(p
4510: 57 49 6e 66 6f 29 3b 20 2f 2f 20 4c 65 61 6b 20  WInfo); // Leak 
4520: 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c  memory when mall
4530: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
4540: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4550: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
4560: 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
4570: 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
4580: 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
4590: 2d 3e 70 65 61 6b 4e 54 61 62 20 3d 20 70 57 49  ->peakNTab = pWI
45a0: 6e 66 6f 2d 3e 73 61 76 65 64 4e 54 61 62 20 3d  nfo->savedNTab =
45b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
45c0: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
45d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
45e0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
45f0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
4600: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
4610: 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
4620: 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
4630: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
4640: 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
4650: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
4660: 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
4670: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
4680: 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  re && (pTabList-
4690: 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nSrc==0 || sqli
46a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
46b0: 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  t(pWhere)) ){.  
46c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
46d0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
46e0: 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
46f0: 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68  eak, 1);.    pWh
4700: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
4710: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
4720: 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
4730: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
4740: 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 69 3d  (pTerm=aExpr, i=
4750: 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  0; i<nExpr; i++,
4760: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 54   pTerm++){.    T
4770: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 53 74  riggerStack *pSt
4780: 61 63 6b 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  ack;.    exprAna
4790: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26  lyze(pTabList, &
47a0: 6d 61 73 6b 53 65 74 2c 20 70 54 65 72 6d 29 3b  maskSet, pTerm);
47b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
47c0: 72 65 20 65 78 65 63 75 74 69 6e 67 20 61 20 74  re executing a t
47d0: 72 69 67 67 65 72 20 62 6f 64 79 2c 20 72 65 6d  rigger body, rem
47e0: 6f 76 65 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ove all referenc
47f0: 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6e 65 77  es to.    ** new
4800: 2e 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 74 61 62  .* and old.* tab
4810: 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 70 72 65  les from the pre
4820: 72 65 71 75 69 73 69 74 65 20 6d 61 73 6b 73 2e  requisite masks.
4830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4840: 28 70 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  (pStack = pParse
4850: 2d 3e 74 72 69 67 53 74 61 63 6b 29 21 3d 30 20  ->trigStack)!=0 
4860: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
4870: 20 20 20 20 20 20 69 66 28 20 28 78 3d 70 53 74        if( (x=pSt
4880: 61 63 6b 2d 3e 6e 65 77 49 64 78 29 20 3e 3d 20  ack->newIdx) >= 
4890: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
48a0: 20 6d 61 73 6b 20 3d 20 7e 67 65 74 4d 61 73 6b   mask = ~getMask
48b0: 28 26 6d 61 73 6b 53 65 74 2c 20 78 29 3b 0a 20  (&maskSet, x);. 
48c0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72         pTerm->pr
48d0: 65 72 65 71 52 69 67 68 74 20 26 3d 20 6d 61 73  ereqRight &= mas
48e0: 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  k;.        pTerm
48f0: 2d 3e 70 72 65 72 65 71 4c 65 66 74 20 26 3d 20  ->prereqLeft &= 
4900: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  mask;.        pT
4910: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
4920: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
4930: 20 20 20 20 20 20 69 66 28 20 28 78 3d 70 53 74        if( (x=pSt
4940: 61 63 6b 2d 3e 6f 6c 64 49 64 78 29 20 3e 3d 20  ack->oldIdx) >= 
4950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
4960: 20 6d 61 73 6b 20 3d 20 7e 67 65 74 4d 61 73 6b   mask = ~getMask
4970: 28 26 6d 61 73 6b 53 65 74 2c 20 78 29 3b 0a 20  (&maskSet, x);. 
4980: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72         pTerm->pr
4990: 65 72 65 71 52 69 67 68 74 20 26 3d 20 6d 61 73  ereqRight &= mas
49a0: 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  k;.        pTerm
49b0: 2d 3e 70 72 65 72 65 71 4c 65 66 74 20 26 3d 20  ->prereqLeft &= 
49c0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  mask;.        pT
49d0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
49e0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
49f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4a00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
4a10: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 28 69 66  index to use (if
4a20: 20 61 6e 79 29 20 66 6f 72 20 65 61 63 68 20 6e   any) for each n
4a30: 65 73 74 65 64 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  ested loop..  **
4a40: 20 4d 61 6b 65 20 70 57 49 6e 66 6f 2d 3e 61 5b   Make pWInfo->a[
4a50: 69 5d 2e 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  i].pIdx point to
4a60: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   the index to us
4a70: 65 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 6e  e for the i-th n
4a80: 65 73 74 65 64 0a 20 20 2a 2a 20 6c 6f 6f 70 20  ested.  ** loop 
4a90: 77 68 65 72 65 20 69 3d 3d 30 20 69 73 20 74 68  where i==0 is th
4aa0: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64  e outer loop and
4ab0: 20 69 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53   i==pTabList->nS
4ac0: 72 63 2d 31 20 69 73 20 74 68 65 20 69 6e 6e 65  rc-1 is the inne
4ad0: 72 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 20 0a 20 20  r.  ** loop. .  
4ae0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 65 72 6d 73  **.  ** If terms
4af0: 20 65 78 69 73 74 20 74 68 61 74 20 75 73 65 20   exist that use 
4b00: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 61 6e 79  the ROWID of any
4b10: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 73 65 74   table, then set
4b20: 20 74 68 65 0a 20 20 2a 2a 20 69 44 69 72 65 63   the.  ** iDirec
4b30: 74 45 71 5b 5d 2c 20 69 44 69 72 65 63 74 4c 74  tEq[], iDirectLt
4b40: 5b 5d 2c 20 6f 72 20 69 44 69 72 65 63 74 47 74  [], or iDirectGt
4b50: 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 66 6f 72 20  [] elements for 
4b60: 74 68 61 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  that table.  ** 
4b70: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
4b80: 74 68 65 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e  the term contain
4b90: 69 6e 67 20 74 68 65 20 52 4f 57 49 44 2e 20 20  ing the ROWID.  
4ba0: 57 65 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  We always prefer
4bb0: 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 52  .  ** to use a R
4bc0: 4f 57 49 44 20 77 68 69 63 68 20 63 61 6e 20 64  OWID which can d
4bd0: 69 72 65 63 74 6c 79 20 61 63 63 65 73 73 20 61  irectly access a
4be0: 20 74 61 62 6c 65 20 72 61 74 68 65 72 20 74 68   table rather th
4bf0: 61 6e 20 61 6e 0a 20 20 2a 2a 20 69 6e 64 65 78  an an.  ** index
4c00: 20 77 68 69 63 68 20 72 65 71 75 69 72 65 73 20   which requires 
4c10: 72 65 61 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  reading an index
4c20: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
4c30: 65 20 72 6f 77 69 64 20 74 68 65 6e 0a 20 20 2a  e rowid then.  *
4c40: 2a 20 64 6f 69 6e 67 20 61 20 73 65 63 6f 6e 64  * doing a second
4c50: 20 72 65 61 64 20 6f 66 20 74 68 65 20 61 63 74   read of the act
4c60: 75 61 6c 20 64 61 74 61 62 61 73 65 20 74 61 62  ual database tab
4c70: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  le..  **.  ** Ac
4c80: 74 75 61 6c 6c 79 2c 20 69 66 20 74 68 65 72 65  tually, if there
4c90: 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 33   are more than 3
4ca0: 32 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  2 tables in the 
4cb0: 6a 6f 69 6e 2c 20 6f 6e 6c 79 20 74 68 65 0a 20  join, only the. 
4cc0: 20 2a 2a 20 66 69 72 73 74 20 33 32 20 74 61 62   ** first 32 tab
4cd0: 6c 65 73 20 61 72 65 20 63 61 6e 64 69 64 61 74  les are candidat
4ce0: 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  es for indices. 
4cf0: 20 54 68 69 73 20 69 73 20 28 61 67 61 69 6e 29   This is (again)
4d00: 20 64 75 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65   due.  ** to the
4d10: 20 6c 69 6d 69 74 20 6f 66 20 33 32 20 62 69 74   limit of 32 bit
4d20: 73 20 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  s in an integer 
4d30: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
4d40: 6c 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  loopMask = 0;.  
4d50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
4d60: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 69 3c 41  ist->nSrc && i<A
4d70: 52 52 41 59 53 49 5a 45 28 69 44 69 72 65 63 74  RRAYSIZE(iDirect
4d80: 45 71 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Eq); i++){.    i
4d90: 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  nt j;.    int iC
4da0: 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ur = pTabList->a
4db0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20  [i].iCursor;    
4dc0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f  /* The cursor fo
4dd0: 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  r this table */.
4de0: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 67      int mask = g
4df0: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
4e00: 20 69 43 75 72 29 3b 20 20 20 2f 2a 20 43 75 72   iCur);   /* Cur
4e10: 73 6f 72 20 6d 61 73 6b 20 66 6f 72 20 74 68 69  sor mask for thi
4e20: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 54  s table */.    T
4e30: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
4e40: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
4e50: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
4e60: 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42  x;.    Index *pB
4e70: 65 73 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  estIdx = 0;.    
4e80: 69 6e 74 20 62 65 73 74 53 63 6f 72 65 20 3d 20  int bestScore = 
4e90: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  0;..    /* Check
4ea0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
4eb0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
4ec0: 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
4ed0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   the.    ** ROWI
4ee0: 44 20 66 69 65 6c 64 20 6f 66 20 74 68 69 73 20  D field of this 
4ef0: 74 61 62 6c 65 2e 20 20 46 6f 72 20 74 65 72 6d  table.  For term
4f00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 52 4f  s of the form RO
4f10: 57 49 44 3d 3d 65 78 70 72 0a 20 20 20 20 2a 2a  WID==expr.    **
4f20: 20 73 65 74 20 69 44 69 72 65 63 74 45 71 5b 69   set iDirectEq[i
4f30: 5d 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  ] to the index o
4f40: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 46 6f 72  f the term.  For
4f50: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 20 20   terms of the.  
4f60: 20 20 2a 2a 20 66 6f 72 6d 20 52 4f 57 49 44 3c    ** form ROWID<
4f70: 65 78 70 72 20 6f 72 20 52 4f 57 49 44 3c 3d 65  expr or ROWID<=e
4f80: 78 70 72 20 73 65 74 20 69 44 69 72 65 63 74 4c  xpr set iDirectL
4f90: 74 5b 69 5d 20 74 6f 20 74 68 65 20 74 65 72 6d  t[i] to the term
4fa0: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 46   index..    ** F
4fb0: 6f 72 20 74 65 72 6d 73 20 6c 69 6b 65 20 52 4f  or terms like RO
4fc0: 57 49 44 3e 65 78 70 72 20 6f 72 20 52 4f 57 49  WID>expr or ROWI
4fd0: 44 3e 3d 65 78 70 72 20 73 65 74 20 69 44 69 72  D>=expr set iDir
4fe0: 65 63 74 47 74 5b 69 5d 2e 0a 20 20 20 20 2a 2a  ectGt[i]..    **
4ff0: 0a 20 20 20 20 2a 2a 20 28 41 64 64 65 64 3a 29  .    ** (Added:)
5000: 20 54 72 65 61 74 20 52 4f 57 49 44 20 49 4e 20   Treat ROWID IN 
5010: 65 78 70 72 20 6c 69 6b 65 20 52 4f 57 49 44 3d  expr like ROWID=
5020: 65 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  expr..    */.   
5030: 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 69 43   pWInfo->a[i].iC
5040: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 69 44 69  ur = -1;.    iDi
5050: 72 65 63 74 45 71 5b 69 5d 20 3d 20 2d 31 3b 0a  rectEq[i] = -1;.
5060: 20 20 20 20 69 44 69 72 65 63 74 4c 74 5b 69 5d      iDirectLt[i]
5070: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 44 69 72 65   = -1;.    iDire
5080: 63 74 47 74 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  ctGt[i] = -1;.  
5090: 20 20 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70    for(pTerm=aExp
50a0: 72 2c 20 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  r, j=0; j<nExpr;
50b0: 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
50c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
50d0: 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20   pTerm->p;.     
50e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c   if( pTerm->idxL
50f0: 65 66 74 3d 3d 69 43 75 72 20 26 26 20 70 58 2d  eft==iCur && pX-
5100: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
5110: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  0.            &&
5120: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
5130: 69 67 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29  ight & loopMask)
5140: 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ==pTerm->prereqR
5150: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
5160: 73 77 69 74 63 68 28 20 70 58 2d 3e 6f 70 20 29  switch( pX->op )
5170: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
5180: 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 20 20   TK_IN:.        
5190: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 69 44    case TK_EQ: iD
51a0: 69 72 65 63 74 45 71 5b 69 5d 20 3d 20 6a 3b 20  irectEq[i] = j; 
51b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
51c0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
51d0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c         case TK_L
51e0: 54 3a 20 69 44 69 72 65 63 74 4c 74 5b 69 5d 20  T: iDirectLt[i] 
51f0: 3d 20 6a 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  = j; break;.    
5200: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45        case TK_GE
5210: 3a 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  :.          case
5220: 20 54 4b 5f 47 54 3a 20 69 44 69 72 65 63 74 47   TK_GT: iDirectG
5230: 74 5b 69 5d 20 3d 20 6a 3b 20 20 62 72 65 61 6b  t[i] = j;  break
5240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5250: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5260: 28 20 69 44 69 72 65 63 74 45 71 5b 69 5d 3e 3d  ( iDirectEq[i]>=
5270: 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 6f 70 4d  0 ){.      loopM
5280: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
5290: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e     pWInfo->a[i].
52a0: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
52b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
52c0: 0a 20 20 20 20 2f 2a 20 44 6f 20 61 20 73 65 61  .    /* Do a sea
52d0: 72 63 68 20 66 6f 72 20 75 73 61 62 6c 65 20 69  rch for usable i
52e0: 6e 64 69 63 65 73 2e 20 20 4c 65 61 76 65 20 70  ndices.  Leave p
52f0: 42 65 73 74 49 64 78 20 70 6f 69 6e 74 69 6e 67  BestIdx pointing
5300: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   to.    ** the "
5310: 62 65 73 74 22 20 69 6e 64 65 78 2e 20 20 70 42  best" index.  pB
5320: 65 73 74 49 64 78 20 69 73 20 6c 65 66 74 20 73  estIdx is left s
5330: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 6e 6f  et to NULL if no
5340: 20 69 6e 64 69 63 65 73 0a 20 20 20 20 2a 2a 20   indices.    ** 
5350: 61 72 65 20 75 73 61 62 6c 65 2e 0a 20 20 20 20  are usable..    
5360: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65  **.    ** The be
5370: 73 74 20 69 6e 64 65 78 20 69 73 20 64 65 74 65  st index is dete
5380: 72 6d 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77  rmined as follow
5390: 73 2e 20 20 46 6f 72 20 65 61 63 68 20 6f 66 20  s.  For each of 
53a0: 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
53b0: 6d 6f 73 74 20 74 65 72 6d 73 20 74 68 61 74 20  most terms that 
53c0: 69 73 20 66 69 78 65 64 20 62 79 20 61 6e 20 65  is fixed by an e
53d0: 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
53e0: 2c 20 61 64 64 0a 20 20 20 20 2a 2a 20 38 20 74  , add.    ** 8 t
53f0: 6f 20 74 68 65 20 73 63 6f 72 65 2e 20 20 54 68  o the score.  Th
5400: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65 72  e right-most ter
5410: 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d  m of the index m
5420: 61 79 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  ay be.    ** con
5430: 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 69  strained by an i
5440: 6e 65 71 75 61 6c 69 74 79 2e 20 20 41 64 64 20  nequality.  Add 
5450: 31 20 69 66 20 66 6f 72 20 61 6e 20 22 78 3c 2e  1 if for an "x<.
5460: 2e 2e 22 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  .." constraint. 
5470: 20 20 20 2a 2a 20 61 6e 64 20 61 64 64 20 32 20     ** and add 2 
5480: 66 6f 72 20 61 6e 20 22 78 3e 2e 2e 2e 22 20 63  for an "x>..." c
5490: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 43 68 6f 73  onstraint.  Chos
54a0: 65 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  e the index that
54b0: 0a 20 20 20 20 2a 2a 20 67 69 76 65 73 20 74 68  .    ** gives th
54c0: 65 20 62 65 73 74 20 73 63 6f 72 65 2e 0a 20 20  e best score..  
54d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
54e0: 20 73 63 6f 72 69 6e 67 20 73 79 73 74 65 6d 20   scoring system 
54f0: 69 73 20 64 65 73 69 67 6e 65 64 20 73 6f 20 74  is designed so t
5500: 68 61 74 20 74 68 65 20 73 63 6f 72 65 20 63 61  hat the score ca
5510: 6e 20 6c 61 74 65 72 20 62 65 0a 20 20 20 20 2a  n later be.    *
5520: 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  * used to determ
5530: 69 6e 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65  ine how the inde
5540: 78 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 74  x is used.  If t
5550: 68 65 20 73 63 6f 72 65 26 37 20 69 73 20 30 0a  he score&7 is 0.
5560: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6c 6c 20      ** then all 
5570: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
5580: 65 71 75 61 6c 69 74 69 65 73 2e 20 20 49 66 20  equalities.  If 
5590: 73 63 6f 72 65 26 31 20 69 73 20 6e 6f 74 20 30  score&1 is not 0
55a0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
55b0: 72 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  re is an inequal
55c0: 69 74 79 20 75 73 65 64 20 61 73 20 61 20 74 65  ity used as a te
55d0: 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20  rmination key.  
55e0: 28 65 78 3a 20 22 78 3c 2e 2e 2e 22 29 0a 20 20  (ex: "x<...").  
55f0: 20 20 2a 2a 20 49 66 20 73 63 6f 72 65 26 32 20    ** If score&2 
5600: 69 73 20 6e 6f 74 20 30 20 74 68 65 6e 20 74 68  is not 0 then th
5610: 65 72 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  ere is an inequa
5620: 6c 69 74 79 20 75 73 65 64 20 61 73 20 74 68 65  lity used as the
5630: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65  .    ** start ke
5640: 79 2e 20 20 28 65 78 3a 20 22 78 3e 2e 2e 2e 22  y.  (ex: "x>..."
5650: 29 2e 20 20 41 20 73 63 6f 72 65 20 6f 72 20 34  ).  A score or 4
5660: 20 69 73 20 74 68 65 20 73 70 65 63 69 61 6c 20   is the special 
5670: 63 61 73 65 0a 20 20 20 20 2a 2a 20 6f 66 20 61  case.    ** of a
5680: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 6f  n IN operator co
5690: 6e 73 74 72 61 69 6e 74 2e 20 20 28 65 78 3a 20  nstraint.  (ex: 
56a0: 20 22 78 20 49 4e 20 2e 2e 2e 22 29 2e 0a 20 20   "x IN ...")..  
56b0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
56c0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 28 61 73 20  IN operator (as 
56d0: 69 6e 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  in "<expr> IN (.
56e0: 2e 2e 29 22 29 20 69 73 20 74 72 65 61 74 65 64  ..)") is treated
56f0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 20   the same as.   
5700: 20 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20   ** an equality 
5710: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 63 65 70  comparison excep
5720: 74 20 74 68 61 74 20 69 74 20 63 61 6e 20 6f 6e  t that it can on
5730: 6c 79 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68  ly be used on th
5740: 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f  e.    ** left-mo
5750: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  st column of an 
5760: 69 6e 64 65 78 20 61 6e 64 20 6f 74 68 65 72 20  index and other 
5770: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
5780: 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  RE clause.    **
5790: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
57a0: 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77  in conjunction w
57b0: 69 74 68 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ith the IN opera
57c0: 74 6f 72 20 74 6f 20 68 65 6c 70 20 73 61 74 69  tor to help sati
57d0: 73 66 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  sfy.    ** other
57e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
57f0: 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
5800: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
5810: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
5820: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
5830: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 71 4d 61  {.      int eqMa
5840: 73 6b 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65  sk = 0;  /* Inde
5850: 78 20 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65  x columns covere
5860: 64 20 62 79 20 61 6e 20 78 3d 2e 2e 2e 20 74 65  d by an x=... te
5870: 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
5880: 6c 74 4d 61 73 6b 20 3d 20 30 3b 20 20 2f 2a 20  ltMask = 0;  /* 
5890: 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 63 6f  Index columns co
58a0: 76 65 72 65 64 20 62 79 20 61 6e 20 78 3c 2e 2e  vered by an x<..
58b0: 2e 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  . term */.      
58c0: 69 6e 74 20 67 74 4d 61 73 6b 20 3d 20 30 3b 20  int gtMask = 0; 
58d0: 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e   /* Index column
58e0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20  s covered by an 
58f0: 78 3e 2e 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20  x>... term */.  
5900: 20 20 20 20 69 6e 74 20 69 6e 4d 61 73 6b 20 3d      int inMask =
5910: 20 30 3b 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f   0;  /* Index co
5920: 6c 75 6d 6e 73 20 63 6f 76 65 72 65 64 20 62 79  lumns covered by
5930: 20 61 6e 20 78 20 49 4e 20 2e 2e 20 74 65 72 6d   an x IN .. term
5940: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
5950: 71 2c 20 6d 2c 20 73 63 6f 72 65 3b 0a 0a 20 20  q, m, score;..  
5960: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
5970: 6f 6c 75 6d 6e 3e 33 32 20 29 20 63 6f 6e 74 69  olumn>32 ) conti
5980: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
5990: 69 6e 64 69 63 65 73 20 74 6f 6f 20 6d 61 6e 79  indices too many
59a0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
59b0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70    for(pTerm=aExp
59c0: 72 2c 20 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  r, j=0; j<nExpr;
59d0: 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
59e0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
59f0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
5a00: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5a10: 73 65 2c 20 70 54 65 72 6d 2d 3e 70 2d 3e 70 4c  se, pTerm->p->pL
5a20: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 45 78  eft);.        Ex
5a30: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
5a40: 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  p;.        if( !
5a50: 70 43 6f 6c 6c 20 26 26 20 70 58 2d 3e 70 52 69  pColl && pX->pRi
5a60: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ght ){.         
5a70: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
5a80: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5a90: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
5aa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ab0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
5ac0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
5ad0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
5ae0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
5af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5b00: 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d  pTerm->idxLeft==
5b10: 69 43 75 72 20 0a 20 20 20 20 20 20 20 20 20 20  iCur .          
5b20: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
5b30: 65 72 65 71 52 69 67 68 74 20 26 20 6c 6f 6f 70  ereqRight & loop
5b40: 4d 61 73 6b 29 3d 3d 70 54 65 72 6d 2d 3e 70 72  Mask)==pTerm->pr
5b50: 65 72 65 71 52 69 67 68 74 20 29 7b 0a 20 20 20  ereqRight ){.   
5b60: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 75         int iColu
5b70: 6d 6e 20 3d 20 70 58 2d 3e 70 4c 65 66 74 2d 3e  mn = pX->pLeft->
5b80: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
5b90: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
5ba0: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
5bb0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
5bc0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
5bd0: 66 69 6e 69 74 79 3b 20 0a 20 20 20 20 20 20 20  finity; .       
5be0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
5bf0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
5c00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
5c10: 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  * If the collati
5c20: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
5c30: 61 66 66 69 6e 69 74 69 65 73 20 64 6f 6e 27 74  affinities don't
5c40: 20 6d 61 74 63 68 2c 20 0a 20 20 20 20 20 20 20   match, .       
5c50: 20 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74       ** ignore t
5c60: 68 69 73 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20  his index.  */. 
5c70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
5c80: 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49  Coll!=pIdx->keyI
5c90: 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 63  nfo.aColl[k] ) c
5ca0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
5cb0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
5cc0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
5cd0: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
5ce0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
5cf0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
5d00: 69 43 6f 6c 75 6d 6e 5b 6b 5d 3d 3d 69 43 6f 6c  iColumn[k]==iCol
5d10: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
5d20: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 58 2d       switch( pX-
5d30: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
5d40: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49         case TK_I
5d50: 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N: {.           
5d60: 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
5d70: 29 20 69 6e 4d 61 73 6b 20 7c 3d 20 31 3b 0a 20  ) inMask |= 1;. 
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5db0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
5dc0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 20 20  K_EQ: {.        
5dd0: 20 20 20 20 20 20 20 20 20 20 65 71 4d 61 73 6b            eqMask
5de0: 20 7c 3d 20 31 3c 3c 6b 3b 0a 20 20 20 20 20 20   |= 1<<k;.      
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5e00: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
5e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5e20: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a       case TK_LE:
5e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5e40: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 7b 0a 20   case TK_LT: {. 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 6c 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 6b 3b   ltMask |= 1<<k;
5e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5e80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5e90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
5eb0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 20 20   TK_GE:.        
5ec0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
5ed0: 47 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  GT: {.          
5ee0: 20 20 20 20 20 20 20 20 67 74 4d 61 73 6b 20 7c          gtMask |
5ef0: 3d 20 31 3c 3c 6b 3b 0a 20 20 20 20 20 20 20 20  = 1<<k;.        
5f00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
5f30: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 2f 2a 20 43 41 4e 54 5f 48 41 50 50 45 4e 20 2a  /* CANT_HAPPEN *
5f60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
5f70: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5fa0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5fb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5fc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5ff0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6000: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
6010: 77 69 6e 67 20 6c 6f 6f 70 20 65 6e 64 73 20 77  wing loop ends w
6020: 69 74 68 20 6e 45 71 20 73 65 74 20 74 6f 20 74  ith nEq set to t
6030: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
6040: 75 6d 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  umns.      ** on
6050: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
6060: 20 69 6e 64 65 78 20 77 69 74 68 20 3d 3d 20 63   index with == c
6070: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
6080: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
6090: 45 71 3d 30 3b 20 6e 45 71 3c 70 49 64 78 2d 3e  Eq=0; nEq<pIdx->
60a0: 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b  nColumn; nEq++){
60b0: 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 28 31 3c  .        m = (1<
60c0: 3c 28 6e 45 71 2b 31 29 29 2d 31 3b 0a 20 20 20  <(nEq+1))-1;.   
60d0: 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 65 71       if( (m & eq
60e0: 4d 61 73 6b 29 21 3d 6d 20 29 20 62 72 65 61 6b  Mask)!=m ) break
60f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6100: 73 63 6f 72 65 20 3d 20 6e 45 71 2a 38 3b 20 20  score = nEq*8;  
6110: 20 2f 2a 20 42 61 73 65 20 73 63 6f 72 65 20 69   /* Base score i
6120: 73 20 38 20 74 69 6d 65 73 20 6e 75 6d 62 65 72  s 8 times number
6130: 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e   of == constrain
6140: 74 73 20 2a 2f 0a 20 20 20 20 20 20 6d 20 3d 20  ts */.      m = 
6150: 31 3c 3c 6e 45 71 3b 0a 20 20 20 20 20 20 69 66  1<<nEq;.      if
6160: 28 20 6d 20 26 20 6c 74 4d 61 73 6b 20 29 20 73  ( m & ltMask ) s
6170: 63 6f 72 65 2b 2b 3b 20 20 20 20 2f 2a 20 49 6e  core++;    /* In
6180: 63 72 65 61 73 65 20 73 63 6f 72 65 20 66 6f 72  crease score for
6190: 20 61 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 20   a < constraint 
61a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 20 26  */.      if( m &
61b0: 20 67 74 4d 61 73 6b 20 29 20 73 63 6f 72 65 2b   gtMask ) score+
61c0: 3d 32 3b 20 20 20 2f 2a 20 49 6e 63 72 65 61 73  =2;   /* Increas
61d0: 65 20 73 63 6f 72 65 20 66 6f 72 20 61 20 3e 20  e score for a > 
61e0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
61f0: 20 20 20 20 69 66 28 20 73 63 6f 72 65 3d 3d 30      if( score==0
6200: 20 26 26 20 69 6e 4d 61 73 6b 20 29 20 73 63 6f   && inMask ) sco
6210: 72 65 20 3d 20 34 3b 20 20 2f 2a 20 44 65 66 61  re = 4;  /* Defa
6220: 75 6c 74 20 73 63 6f 72 65 20 66 6f 72 20 49 4e  ult score for IN
6230: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
6240: 20 20 20 20 20 69 66 28 20 73 63 6f 72 65 3e 62       if( score>b
6250: 65 73 74 53 63 6f 72 65 20 29 7b 0a 20 20 20 20  estScore ){.    
6260: 20 20 20 20 70 42 65 73 74 49 64 78 20 3d 20 70      pBestIdx = p
6270: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
6280: 74 53 63 6f 72 65 20 3d 20 73 63 6f 72 65 3b 0a  tScore = score;.
6290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
62a0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70    pWInfo->a[i].p
62b0: 49 64 78 20 3d 20 70 42 65 73 74 49 64 78 3b 0a  Idx = pBestIdx;.
62c0: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d      pWInfo->a[i]
62d0: 2e 73 63 6f 72 65 20 3d 20 62 65 73 74 53 63 6f  .score = bestSco
62e0: 72 65 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  re;.    pWInfo->
62f0: 61 5b 69 5d 2e 62 52 65 76 20 3d 20 30 3b 0a 20  a[i].bRev = 0;. 
6300: 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c 3d 20 6d     loopMask |= m
6310: 61 73 6b 3b 0a 20 20 20 20 69 66 28 20 70 42 65  ask;.    if( pBe
6320: 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 70  stIdx ){.      p
6330: 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 69 43 75 72  WInfo->a[i].iCur
6340: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6350: 2b 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  +;.      pWInfo-
6360: 3e 70 65 61 6b 4e 54 61 62 20 3d 20 70 50 61 72  >peakNTab = pPar
6370: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 7d 0a  se->nTab;.    }.
6380: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
6390: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52  to see if the OR
63a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
63b0: 20 6f 72 20 63 61 6e 20 62 65 20 73 61 74 69 73   or can be satis
63c0: 66 69 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a  fied by the.  **
63d0: 20 75 73 65 20 6f 66 20 61 6e 20 69 6e 64 65 78   use of an index
63e0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 61   on the first ta
63f0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6400: 70 70 4f 72 64 65 72 42 79 20 26 26 20 2a 70 70  ppOrderBy && *pp
6410: 4f 72 64 65 72 42 79 20 26 26 20 70 54 61 62 4c  OrderBy && pTabL
6420: 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
6430: 20 20 20 20 49 6e 64 65 78 20 2a 70 53 6f 72 74      Index *pSort
6440: 49 64 78 3b 0a 20 20 20 20 20 49 6e 64 65 78 20  Idx;.     Index 
6450: 2a 70 49 64 78 3b 0a 20 20 20 20 20 54 61 62 6c  *pIdx;.     Tabl
6460: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 69 6e  e *pTab;.     in
6470: 74 20 62 52 65 76 20 3d 20 30 3b 0a 0a 20 20 20  t bRev = 0;..   
6480: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
6490: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  t->a[0].pTab;.  
64a0: 20 20 20 70 49 64 78 20 3d 20 70 57 49 6e 66 6f     pIdx = pWInfo
64b0: 2d 3e 61 5b 30 5d 2e 70 49 64 78 3b 0a 20 20 20  ->a[0].pIdx;.   
64c0: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 70 57    if( pIdx && pW
64d0: 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 73 63 6f 72 65  Info->a[0].score
64e0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a  ==4 ){.       /*
64f0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
6500: 65 61 64 79 20 61 6e 20 49 4e 20 69 6e 64 65 78  eady an IN index
6510: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   on the left-mos
6520: 74 20 74 61 62 6c 65 2c 0a 20 20 20 20 20 20 20  t table,.       
6530: 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 67  ** it will not g
6540: 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
6550: 73 6f 72 74 20 6f 72 64 65 72 2e 0a 20 20 20 20  sort order..    
6560: 20 20 20 2a 2a 20 53 6f 2c 20 70 72 65 74 65 6e     ** So, preten
6570: 64 20 74 68 61 74 20 6e 6f 20 73 75 69 74 61 62  d that no suitab
6580: 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
6590: 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
65a0: 20 20 20 20 70 53 6f 72 74 49 64 78 20 3d 20 30      pSortIdx = 0
65b0: 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ;.     }else if(
65c0: 20 69 44 69 72 65 63 74 45 71 5b 30 5d 3e 3d 30   iDirectEq[0]>=0
65d0: 20 7c 7c 20 69 44 69 72 65 63 74 4c 74 5b 30 5d   || iDirectLt[0]
65e0: 3e 3d 30 20 7c 7c 20 69 44 69 72 65 63 74 47 74  >=0 || iDirectGt
65f0: 5b 30 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]>=0 ){.      
6600: 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 66 74 2d   /* If the left-
6610: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 61  most column is a
6620: 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 69 74  ccessed using it
6630: 73 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 64 6f  s ROWID, then do
6640: 0a 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74  .       ** not t
6650: 72 79 20 74 6f 20 73 6f 72 74 20 62 79 20 69 6e  ry to sort by in
6660: 64 65 78 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  dex..       */. 
6670: 20 20 20 20 20 20 70 53 6f 72 74 49 64 78 20 3d        pSortIdx =
6680: 20 30 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a   0;.     }else{.
6690: 20 20 20 20 20 20 20 69 6e 74 20 6e 45 71 43 6f         int nEqCo
66a0: 6c 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30  l = (pWInfo->a[0
66b0: 5d 2e 73 63 6f 72 65 2b 34 29 2f 38 3b 0a 20 20  ].score+4)/8;.  
66c0: 20 20 20 20 20 70 53 6f 72 74 49 64 78 20 3d 20       pSortIdx = 
66d0: 66 69 6e 64 53 6f 72 74 69 6e 67 49 6e 64 65 78  findSortingIndex
66e0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
66f0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
6700: 75 72 73 6f 72 2c 20 0a 20 20 20 20 20 20 20 20  ursor, .        
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 4f 72             *ppOr
6730: 64 65 72 42 79 2c 20 70 49 64 78 2c 20 6e 45 71  derBy, pIdx, nEq
6740: 43 6f 6c 2c 20 26 62 52 65 76 29 3b 0a 20 20 20  Col, &bRev);.   
6750: 20 20 7d 0a 20 20 20 20 20 69 66 28 20 70 53 6f    }.     if( pSo
6760: 72 74 49 64 78 20 26 26 20 28 70 49 64 78 3d 3d  rtIdx && (pIdx==
6770: 30 20 7c 7c 20 70 49 64 78 3d 3d 70 53 6f 72 74  0 || pIdx==pSort
6780: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 69  Idx) ){.       i
6790: 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
67a0: 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
67b0: 5b 30 5d 2e 70 49 64 78 20 3d 20 70 53 6f 72 74  [0].pIdx = pSort
67c0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 70 57  Idx;.         pW
67d0: 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 43 75 72 20  Info->a[0].iCur 
67e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
67f0: 3b 0a 20 20 20 20 20 20 20 20 20 70 57 49 6e 66  ;.         pWInf
6800: 6f 2d 3e 70 65 61 6b 4e 54 61 62 20 3d 20 70 50  o->peakNTab = pP
6810: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
6820: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 57 49 6e     }.       pWIn
6830: 66 6f 2d 3e 61 5b 30 5d 2e 62 52 65 76 20 3d 20  fo->a[0].bRev = 
6840: 62 52 65 76 3b 0a 20 20 20 20 20 20 20 2a 70 70  bRev;.       *pp
6850: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
6860: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
6870: 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
6880: 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
6890: 64 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 75 73  d all indices us
68a0: 65 64 20 62 79 20 74 68 6f 73 65 20 74 61 62 6c  ed by those tabl
68b0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
68c0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
68d0: 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
68e0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
68f0: 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
6900: 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  to */.  for(i=0;
6910: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
6920: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62  c; i++){.    Tab
6930: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e  le *pTab;.    In
6940: 64 65 78 20 2a 70 49 78 3b 0a 0a 20 20 20 20 70  dex *pIx;..    p
6950: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
6960: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69  a[i].pTab;.    i
6970: 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  f( pTab->isTrans
6980: 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53  ient || pTab->pS
6990: 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
69a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
69b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
69c0: 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
69d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
69e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
69f0: 4f 70 65 6e 52 65 61 64 2c 20 70 54 61 62 4c 69  OpenRead, pTabLi
6a00: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
6a10: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
6a20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a30: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
6a40: 43 6f 6c 75 6d 6e 73 2c 20 70 54 61 62 4c 69 73  Columns, pTabLis
6a50: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c  t->a[i].iCursor,
6a60: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
6a70: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
6a80: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
6a90: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
6aa0: 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 57 49    if( (pIx = pWI
6ab0: 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 29 21  nfo->a[i].pIdx)!
6ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6ae0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 78 2d  OP_Integer, pIx-
6af0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
6b00: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
6b10: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 70  , OP_OpenRead, p
6b20: 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 69 43 75 72  WInfo->a[i].iCur
6b30: 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20  , pIx->tnum,.   
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 28 63 68 61 72 2a 29 26 70 49 78 2d 3e 6b    (char*)&pIx->k
6b60: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
6b70: 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  FO);.    }.  }..
6b80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
6b90: 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
6ba0: 20 73 65 61 72 63 68 0a 20 20 2a 2f 0a 20 20 6c   search.  */.  l
6bb0: 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 66  oopMask = 0;.  f
6bc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
6bd0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
6be0: 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20      int j, k;.  
6bf0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
6c00: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
6c10: 73 6f 72 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  sor;.    Index *
6c20: 70 49 64 78 3b 0a 20 20 20 20 57 68 65 72 65 4c  pIdx;.    WhereL
6c30: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
6c40: 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 0a 20  pWInfo->a[i];.. 
6c50: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
6c60: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
6c70: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
6c80: 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
6c90: 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69  and.    ** initi
6ca0: 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
6cb0: 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
6cc0: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
6cd0: 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a  atches any.    *
6ce0: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
6cf0: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
6d00: 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oin..    */.    
6d10: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
6d20: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
6d30: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
6d40: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
6d50: 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29   !pParse->nMem )
6d60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
6d70: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
6d80: 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73  LeftJoin = pPars
6d90: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
6da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6db0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
6dc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
6dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6de0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
6df0: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
6e00: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 1);.    }..   
6e10: 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
6e20: 70 49 64 78 3b 0a 20 20 20 20 70 4c 65 76 65 6c  pIdx;.    pLevel
6e30: 2d 3e 69 6e 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  ->inOp = OP_Noop
6e40: 3b 0a 20 20 20 20 69 66 28 20 69 3c 41 52 52 41  ;.    if( i<ARRA
6e50: 59 53 49 5a 45 28 69 44 69 72 65 63 74 45 71 29  YSIZE(iDirectEq)
6e60: 20 26 26 20 69 44 69 72 65 63 74 45 71 5b 69 5d   && iDirectEq[i]
6e70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
6e80: 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
6e90: 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
6ea0: 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
6eb0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
6ec0: 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
6ed0: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
6ee0: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
6ef0: 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
6f00: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
6f10: 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
6f20: 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
6f30: 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
6f40: 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
6f50: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
6f60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
6f70: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 6b 20  pr *pX;.      k 
6f80: 3d 20 69 44 69 72 65 63 74 45 71 5b 69 5d 3b 0a  = iDirectEq[i];.
6f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
6fa0: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 70  nExpr );.      p
6fb0: 54 65 72 6d 20 3d 20 26 61 45 78 70 72 5b 6b 5d  Term = &aExpr[k]
6fc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6fd0: 70 54 65 72 6d 2d 3e 70 21 3d 30 20 29 3b 0a 20  pTerm->p!=0 );. 
6fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
6ff0: 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75  rm->idxLeft==iCu
7000: 72 20 7c 7c 20 70 54 65 72 6d 2d 3e 69 64 78 52  r || pTerm->idxR
7010: 69 67 68 74 3d 3d 69 43 75 72 20 29 3b 0a 20 20  ight==iCur );.  
7020: 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c      brk = pLevel
7030: 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  ->brk = sqlite3V
7040: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
7050: 0a 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72  .      pX = pTer
7060: 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 61 73 73 65  m->p;.      asse
7070: 72 74 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65  rt( pTerm->idxLe
7080: 66 74 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  ft==iCur );.    
7090: 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b    if( pX->op!=TK
70a0: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _IN ){.        s
70b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
70c0: 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 2d  Parse, pTerm->p-
70d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
70e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
70f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7100: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 58  v, OP_Rewind, pX
7110: 2d 3e 69 54 61 62 6c 65 2c 20 62 72 6b 29 3b 0a  ->iTable, brk);.
7120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
7140: 65 79 41 73 44 61 74 61 2c 20 70 58 2d 3e 69 54  eyAsData, pX->iT
7150: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
7160: 20 20 70 4c 65 76 65 6c 2d 3e 69 6e 50 32 20 3d    pLevel->inP2 =
7170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7180: 70 28 76 2c 20 4f 50 5f 49 64 78 43 6f 6c 75 6d  p(v, OP_IdxColum
7190: 6e 2c 20 70 58 2d 3e 69 54 61 62 6c 65 2c 20 30  n, pX->iTable, 0
71a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
71b0: 6c 2d 3e 69 6e 4f 70 20 3d 20 4f 50 5f 4e 65 78  l->inOp = OP_Nex
71c0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  t;.        pLeve
71d0: 6c 2d 3e 69 6e 50 31 20 3d 20 70 58 2d 3e 69 54  l->inP1 = pX->iT
71e0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  able;.      }.  
71f0: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
7200: 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d 3e  pLevel, &pTerm->
7210: 70 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 20 3d  p);.      cont =
7220: 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20   pLevel->cont = 
7230: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
7240: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
7250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7260: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
7270: 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   1, brk);.      
7280: 68 61 76 65 4b 65 79 20 3d 20 30 3b 0a 20 20 20  haveKey = 0;.   
7290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
72a0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  dOp(v, OP_NotExi
72b0: 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  sts, iCur, brk);
72c0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
72d0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
72e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 64 78 21   }else if( pIdx!
72f0: 3d 30 20 26 26 20 70 4c 65 76 65 6c 2d 3e 73 63  =0 && pLevel->sc
7300: 6f 72 65 3e 30 20 26 26 20 70 4c 65 76 65 6c 2d  ore>0 && pLevel-
7310: 3e 73 63 6f 72 65 25 34 3d 3d 30 20 29 7b 0a 20  >score%4==0 ){. 
7320: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
7330: 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   There is an ind
7340: 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73  ex and all terms
7350: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
7360: 61 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20  ause that.      
7370: 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65 66 65  **          refe
7380: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75  r to the index u
7390: 73 65 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22  se the "==" or "
73a0: 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20  IN" operators.. 
73b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
73c0: 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
73d0: 6e 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 28 70 4c  nt nColumn = (pL
73e0: 65 76 65 6c 2d 3e 73 63 6f 72 65 2b 34 29 2f 38  evel->score+4)/8
73f0: 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c  ;.      brk = pL
7400: 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69  evel->brk = sqli
7410: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7420: 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  (v);..      /* F
7430: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
7440: 66 20 74 68 65 20 69 6e 64 65 78 2c 20 66 69 6e  f the index, fin
7450: 64 20 74 68 65 20 74 65 72 6d 20 6f 66 20 74 68  d the term of th
7460: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
7470: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  hat.      ** con
7480: 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  straints that co
7490: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 20 57 48  lumn.  If the WH
74a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
74b0: 69 73 20 58 3d 65 78 70 72 2c 20 74 68 65 6e 0a  is X=expr, then.
74c0: 20 20 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74        ** evaluat
74d0: 69 6f 6e 20 65 78 70 72 20 61 6e 64 20 6c 65 61  ion expr and lea
74e0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
74f0: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20   the stack */.  
7500: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
7510: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
7520: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
7530: 61 45 78 70 72 2c 20 6b 3d 30 3b 20 6b 3c 6e 45  aExpr, k=0; k<nE
7540: 78 70 72 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  xpr; k++, pTerm+
7550: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
7560: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
7570: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
7580: 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75   pX==0 ) continu
7590: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
75a0: 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d   pTerm->idxLeft=
75b0: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 20  =iCur.          
75c0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
75d0: 65 72 65 71 52 69 67 68 74 20 26 20 6c 6f 6f 70  ereqRight & loop
75e0: 4d 61 73 6b 29 3d 3d 70 54 65 72 6d 2d 3e 70 72  Mask)==pTerm->pr
75f0: 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20  ereqRight .     
7600: 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 70          && pX->p
7610: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Left->iColumn==p
7620: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
7630: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
7640: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 69            char i
7650: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
7660: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 58 2d 3e 70  able->aCol[pX->p
7670: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Left->iColumn].a
7680: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
7690: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
76a0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
76b0: 70 54 65 72 6d 2d 3e 70 2c 20 69 64 78 61 66 66  pTerm->p, idxaff
76c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
76d0: 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54     if( pX->op==T
76e0: 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  K_EQ ){.        
76f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7700: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
7710: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
7730: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
7740: 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 20 20 20   &pTerm->p);.   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
7760: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7770: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7780: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
7790: 3d 3d 54 4b 5f 49 4e 20 26 26 20 6e 43 6f 6c 75  ==TK_IN && nColu
77a0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  mn==1 );.       
77b0: 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f         if( pX->o
77c0: 70 3d 3d 54 4b 5f 49 4e 20 26 26 20 6e 43 6f 6c  p==TK_IN && nCol
77d0: 75 6d 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  umn==1 ){.      
77e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
77f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7800: 5f 52 65 77 69 6e 64 2c 20 70 58 2d 3e 69 54 61  _Rewind, pX->iTa
7810: 62 6c 65 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  ble, brk);.     
7820: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7830: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
7840: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 70 58 2d  P_KeyAsData, pX-
7850: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  >iTable, 1);.   
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
7870: 76 65 6c 2d 3e 69 6e 50 32 20 3d 20 73 71 6c 69  vel->inP2 = sqli
7880: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
7890: 4f 50 5f 49 64 78 43 6f 6c 75 6d 6e 2c 20 70 58  OP_IdxColumn, pX
78a0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
78c0: 65 76 65 6c 2d 3e 69 6e 4f 70 20 3d 20 4f 50 5f  evel->inOp = OP_
78d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
78e0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 6e        pLevel->in
78f0: 50 31 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  P1 = pX->iTable;
7900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7910: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
7920: 76 65 6c 2c 20 26 70 54 65 72 6d 2d 3e 70 29 3b  vel, &pTerm->p);
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7960: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7970: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7980: 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
7990: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
79a0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 63  >nMem++;.      c
79b0: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
79c0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
79d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
79e0: 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
79f0: 70 6f 69 6e 74 2c 20 74 68 65 20 74 6f 70 20 6e  point, the top n
7a00: 43 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74 73 20  Column elements 
7a10: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 61 72 65  of the stack are
7a20: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
7a30: 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  lues of columns 
7a40: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 77 65 20  in the index we 
7a50: 61 72 65 20 75 73 69 6e 67 2e 20 20 43 68 65 63  are using.  Chec
7a60: 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  k to see if.    
7a70: 20 20 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 73    ** any of thes
7a80: 65 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55 4c  e values are NUL
7a90: 4c 2e 20 20 49 66 20 74 68 65 79 20 61 72 65 2c  L.  If they are,
7aa0: 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 6d   they will not m
7ab0: 61 74 63 68 20 61 6e 79 0a 20 20 20 20 20 20 2a  atch any.      *
7ac0: 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2c  * index entries,
7ad0: 20 73 6f 20 73 6b 69 70 20 69 6d 6d 65 64 69 61   so skip immedia
7ae0: 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
7af0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
7b00: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
7b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7b20: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
7b30: 2d 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65  -nColumn, sqlite
7b40: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
7b50: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
7b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
7b70: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d  , OP_Pop, nColum
7b80: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
7b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7ba0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b   OP_Goto, 0, brk
7bb0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
7bc0: 65 72 61 74 65 20 61 6e 20 69 6e 64 65 78 20 6b  erate an index k
7bd0: 65 79 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20  ey from the top 
7be0: 6e 43 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74 73  nColumn elements
7bf0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 2a 2f   of the stack */
7c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7c10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
7c20: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
7c30: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
7c40: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
7c50: 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20  yStr(v, pIdx);. 
7c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7c70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
7c80: 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
7c90: 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  em, 0);..      /
7ca0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
7cb0: 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74  (1) to move to t
7cc0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
7cd0: 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
7ce0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a   table..      **
7cf0: 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63   Then generate c
7d00: 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d  ode (2) that jum
7d10: 70 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65  ps to "brk" afte
7d20: 72 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  r the cursor is 
7d30: 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  past.      ** th
7d40: 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20  e last matching 
7d50: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
7d60: 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20  able.  The code 
7d70: 28 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a  (1) is executed.
7d80: 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f        ** once to
7d90: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
7da0: 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65  search, the code
7db0: 20 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64   (2) is executed
7dc0: 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20   before each.   
7dd0: 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20     ** iteration 
7de0: 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73  of the scan to s
7df0: 65 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68  ee if the scan h
7e00: 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a  as finished. */.
7e10: 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
7e20: 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
7e30: 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76    /* Scan in rev
7e40: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
7e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
7e70: 65 4c 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 43 75  eLe, pLevel->iCu
7e80: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
7e90: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
7ea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7eb0: 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
7ec0: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
7ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ee0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c  dOp(v, OP_IdxLT,
7ef0: 20 70 4c 65 76 65 6c 2d 3e 69 43 75 72 2c 20 62   pLevel->iCur, b
7f00: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  rk);.        pLe
7f10: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
7f20: 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
7f30: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
7f40: 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f  in the forward o
7f50: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
7f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f70: 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 70  (v, OP_MoveGe, p
7f80: 4c 65 76 65 6c 2d 3e 69 43 75 72 2c 20 62 72 6b  Level->iCur, brk
7f90: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
7fa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7fb0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
7fc0: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
7fd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
7fe0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
7ff0: 50 5f 49 64 78 47 45 2c 20 70 4c 65 76 65 6c 2d  P_IdxGE, pLevel-
8000: 3e 69 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c  >iCur, brk, "+",
8010: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
8020: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
8030: 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
8040: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8050: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8060: 52 6f 77 4b 65 79 2c 20 70 4c 65 76 65 6c 2d 3e  RowKey, pLevel->
8070: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
8080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8090: 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c  (v, OP_IdxIsNull
80a0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 63 6f 6e 74 29  , nColumn, cont)
80b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
80c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
80d0: 64 78 52 65 63 6e 6f 2c 20 70 4c 65 76 65 6c 2d  dxRecno, pLevel-
80e0: 3e 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  >iCur, 0);.     
80f0: 20 69 66 28 20 69 3d 3d 70 54 61 62 4c 69 73 74   if( i==pTabList
8100: 2d 3e 6e 53 72 63 2d 31 20 26 26 20 70 75 73 68  ->nSrc-1 && push
8110: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 68  Key ){.        h
8120: 61 76 65 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  aveKey = 1;.    
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8150: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
8160: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
8170: 20 20 68 61 76 65 4b 65 79 20 3d 20 30 3b 0a 20    haveKey = 0;. 
8180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
8190: 76 65 6c 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  vel->p1 = pLevel
81a0: 2d 3e 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  ->iCur;.      pL
81b0: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
81c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
81d0: 69 3c 41 52 52 41 59 53 49 5a 45 28 69 44 69 72  i<ARRAYSIZE(iDir
81e0: 65 63 74 4c 74 29 20 26 26 20 28 69 44 69 72 65  ectLt) && (iDire
81f0: 63 74 4c 74 5b 69 5d 3e 3d 30 20 7c 7c 20 69 44  ctLt[i]>=0 || iD
8200: 69 72 65 63 74 47 74 5b 69 5d 3e 3d 30 29 20 29  irectGt[i]>=0) )
8210: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
8220: 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  3:  We have an i
8230: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
8240: 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
8250: 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
8260: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
8270: 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
8280: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  p;.      int sta
8290: 72 74 3b 0a 0a 20 20 20 20 20 20 62 72 6b 20 3d  rt;..      brk =
82a0: 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73   pLevel->brk = s
82b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
82c0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
82d0: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
82e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
82f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
8300: 20 20 20 69 66 28 20 69 44 69 72 65 63 74 47 74     if( iDirectGt
8310: 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]>=0 ){.      
8320: 20 20 6b 20 3d 20 69 44 69 72 65 63 74 47 74 5b    k = iDirectGt[
8330: 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  i];.        asse
8340: 72 74 28 20 6b 3c 6e 45 78 70 72 20 29 3b 0a 20  rt( k<nExpr );. 
8350: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
8360: 61 45 78 70 72 5b 6b 5d 3b 0a 20 20 20 20 20 20  aExpr[k];.      
8370: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8380: 3e 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >p!=0 );.       
8390: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
83a0: 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 20 29 3b  idxLeft==iCur );
83b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
83c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
83d0: 20 70 54 65 72 6d 2d 3e 70 2d 3e 70 52 69 67 68   pTerm->p->pRigh
83e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
83f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8400: 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 0a 20 20 20  OP_ForceInt,.   
8410: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 2d         pTerm->p-
8420: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 54  >op==TK_LT || pT
8430: 65 72 6d 2d 3e 70 2d 3e 6f 70 3d 3d 54 4b 5f 47  erm->p->op==TK_G
8440: 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  T, brk);.       
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
8470: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
8480: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
8490: 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d 3e  pLevel, &pTerm->
84a0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
84b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
84c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
84d0: 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
84e0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
84f0: 20 20 69 66 28 20 69 44 69 72 65 63 74 4c 74 5b    if( iDirectLt[
8500: 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]>=0 ){.       
8510: 20 6b 20 3d 20 69 44 69 72 65 63 74 4c 74 5b 69   k = iDirectLt[i
8520: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
8530: 74 28 20 6b 3c 6e 45 78 70 72 20 29 3b 0a 20 20  t( k<nExpr );.  
8540: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 61        pTerm = &a
8550: 45 78 70 72 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Expr[k];.       
8560: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8570: 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p!=0 );.        
8580: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 69  assert( pTerm->i
8590: 64 78 4c 65 66 74 3d 3d 69 43 75 72 20 29 3b 0a  dxLeft==iCur );.
85a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
85b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
85c0: 70 54 65 72 6d 2d 3e 70 2d 3e 70 52 69 67 68 74  pTerm->p->pRight
85d0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  );.        /* sq
85e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
85f0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
8600: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
8610: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b  rrentAddr(v)+1);
8620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 65 76   */.        pLev
8630: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
8640: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
8650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8660: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
8670: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
8680: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
8690: 28 20 70 54 65 72 6d 2d 3e 70 2d 3e 6f 70 3d 3d  ( pTerm->p->op==
86a0: 54 4b 5f 4c 54 20 7c 7c 20 70 54 65 72 6d 2d 3e  TK_LT || pTerm->
86b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  p->op==TK_GT ){.
86c0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
86d0: 20 3d 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   = OP_Ge;.      
86e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
86f0: 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 47     testOp = OP_G
8700: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8710: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
8720: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
8730: 3e 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >p);.      }.   
8740: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
8750: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8760: 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  r(v);.      pLev
8770: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
8780: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
8790: 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
87a0: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
87b0: 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74  art;.      if( t
87c0: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
87d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
87e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
87f0: 5f 52 65 63 6e 6f 2c 20 69 43 75 72 2c 20 30 29  _Recno, iCur, 0)
8800: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8810: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8820: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
8830: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
8840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8850: 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20  ddOp(v, testOp, 
8860: 30 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  0, brk);.      }
8870: 0a 20 20 20 20 20 20 68 61 76 65 4b 65 79 20 3d  .      haveKey =
8880: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
8890: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
88a0: 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
88b0: 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
88c0: 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
88d0: 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
88e0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
88f0: 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
8900: 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61  tire database ta
8910: 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ble..      */.  
8920: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 0a      int start;..
8930: 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76        brk = pLev
8940: 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65  el->brk = sqlite
8950: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8960: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 20 3d 20  );.      cont = 
8970: 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73  pLevel->cont = s
8980: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8990: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
89a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
89b0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
89c0: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73  r, brk);.      s
89d0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
89e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
89f0: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
8a00: 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
8a10: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
8a20: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
8a30: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
8a40: 0a 20 20 20 20 20 20 68 61 76 65 4b 65 79 20 3d  .      haveKey =
8a50: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8a60: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20       /* Case 5: 
8a70: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
8a80: 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65 72   term that refer
8a90: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
8aa0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ost.      **    
8ab0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74       column of t
8ac0: 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  he index is an i
8ad0: 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72 20  nequality.  For 
8ae0: 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20  example, if.    
8af0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
8b00: 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
8b10: 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48 45  y,z) and the WHE
8b20: 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  RE clause is of 
8b30: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
8b40: 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20 41       form "x=5 A
8b50: 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74 68  ND y<10" then th
8b60: 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64 2e  is case is used.
8b70: 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20    Only the.     
8b80: 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67 68   **         righ
8b90: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
8ba0: 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
8bb0: 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
8bc0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
8bd0: 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
8be0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
8bf0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
8c00: 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
8c10: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
8c20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
8c30: 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ERE clause.     
8c40: 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
8c50: 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
8c60: 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
8c70: 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
8c80: 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
8c90: 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
8ca0: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
8cb0: 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
8cc0: 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f  DER BY..      */
8cd0: 0a 20 20 20 20 20 20 69 6e 74 20 73 63 6f 72 65  .      int score
8ce0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65   = pLevel->score
8cf0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 43  ;.      int nEqC
8d00: 6f 6c 75 6d 6e 20 3d 20 73 63 6f 72 65 2f 38 3b  olumn = score/8;
8d10: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
8d20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 46 6c  ;.      int leFl
8d30: 61 67 3d 30 2c 20 67 65 46 6c 61 67 3d 30 3b 0a  ag=0, geFlag=0;.
8d40: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
8d50: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  ;..      /* Eval
8d60: 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
8d70: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
8d80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
8d90: 28 6a 3d 30 3b 20 6a 3c 6e 45 71 43 6f 6c 75 6d  (j=0; j<nEqColum
8da0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
8db0: 20 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72   for(pTerm=aExpr
8dc0: 2c 20 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20  , k=0; k<nExpr; 
8dd0: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
8de0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
8df0: 72 6d 2d 3e 70 3d 3d 30 20 29 20 63 6f 6e 74 69  rm->p==0 ) conti
8e00: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
8e10: 66 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66  f( pTerm->idxLef
8e20: 74 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  t==iCur.        
8e30: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 70       && pTerm->p
8e40: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
8e50: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
8e60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
8e70: 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65  & loopMask)==pTe
8e80: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
8e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8ea0: 20 70 54 65 72 6d 2d 3e 70 2d 3e 70 4c 65 66 74   pTerm->p->pLeft
8eb0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
8ec0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20  >aiColumn[j].   
8ed0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
8ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8ef0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54  rCode(pParse, pT
8f00: 65 72 6d 2d 3e 70 2d 3e 70 52 69 67 68 74 29 3b  erm->p->pRight);
8f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
8f20: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
8f30: 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 20 20 20   &pTerm->p);.   
8f40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8f50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
8f70: 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74       /* Duplicat
8f80: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  e the equality t
8f90: 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75  erm values becau
8fa0: 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  se they will all
8fb0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   be.      ** use
8fc0: 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f  d twice: once to
8fd0: 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e   make the termin
8fe0: 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e  ation key and on
8ff0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20  ce to make the. 
9000: 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65       ** start ke
9010: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
9020: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
9030: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
9040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
9060: 2c 20 6e 45 71 43 6f 6c 75 6d 6e 2d 31 2c 20 30  , nEqColumn-1, 0
9070: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
9080: 20 20 2f 2a 20 4c 61 62 65 6c 73 20 66 6f 72 20    /* Labels for 
9090: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  the beginning an
90a0: 64 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  d end of the loo
90b0: 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
90c0: 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
90d0: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
90e0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
90f0: 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76        brk = pLev
9100: 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65  el->brk = sqlite
9110: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
9120: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
9130: 65 72 61 74 65 20 74 68 65 20 74 65 72 6d 69 6e  erate the termin
9140: 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73  ation key.  This
9150: 20 69 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75   is the key valu
9160: 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
9170: 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73 65 61  will end the sea
9180: 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e  rch.  There is n
9190: 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  o termination ke
91a0: 79 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  y if there.     
91b0: 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75 61 6c   ** are no equal
91c0: 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f  ity terms and no
91d0: 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20   "X<..." term.. 
91e0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
91f0: 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e   2002-Dec-04: On
9200: 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72   a reverse-order
9210: 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61   scan, the so-ca
9220: 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74 69 6f  lled "terminatio
9230: 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  n".      ** key 
9240: 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20 72 65  computed here re
9250: 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69  ally ends up bei
9260: 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b 65 79  ng the start key
9270: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9280: 20 69 66 28 20 28 73 63 6f 72 65 20 26 20 31 29   if( (score & 1)
9290: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  !=0 ){.        f
92a0: 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20  or(pTerm=aExpr, 
92b0: 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b  k=0; k<nExpr; k+
92c0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
92d0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
92e0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20  pr = pTerm->p;. 
92f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
9300: 70 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pr==0 ) continue
9310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9320: 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d  pTerm->idxLeft==
9330: 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 20 20  iCur.           
9340: 20 20 26 26 20 28 70 45 78 70 72 2d 3e 6f 70 3d    && (pExpr->op=
9350: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_LT || pExpr-
9360: 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 0a 20 20 20 20  >op==TK_LE).    
9370: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
9380: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9390: 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65  & loopMask)==pTe
93a0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
93b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
93c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
93d0: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
93e0: 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20  Column[j].      
93f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
9400: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9410: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9420: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
9430: 20 20 20 20 20 20 20 6c 65 46 6c 61 67 20 3d 20         leFlag = 
9440: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
9450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
9460: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
9470: 2c 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 20 20  , &pTerm->p);.  
9480: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
94b0: 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45  estOp = OP_IdxGE
94c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
94d0: 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
94e0: 6e 45 71 43 6f 6c 75 6d 6e 3e 30 20 3f 20 4f 50  nEqColumn>0 ? OP
94f0: 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70  _IdxGE : OP_Noop
9500: 3b 0a 20 20 20 20 20 20 20 20 6c 65 46 6c 61 67  ;.        leFlag
9510: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9520: 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
9530: 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
9540: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
9550: 71 43 6f 6c 75 6d 6e 20 2b 20 28 73 63 6f 72 65  qColumn + (score
9560: 20 26 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70   & 1);.        p
9570: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50  Level->iMem = pP
9580: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
9590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
95a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
95b0: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 2c 20 73 71 6c  Null, -nCol, sql
95c0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
95d0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
95e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
95f0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
9600: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
9610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9620: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
9630: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
9640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9650: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9660: 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , nCol, 0);.    
9670: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
9680: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
9690: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
96a0: 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29  ( pLevel->bRev )
96b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
96c0: 6f 70 20 3d 20 6c 65 46 6c 61 67 20 3f 20 4f 50  op = leFlag ? OP
96d0: 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveLe : OP_Mov
96e0: 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eLt;.          s
96f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9700: 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  v, op, pLevel->i
9710: 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
9720: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9740: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9750: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
9760: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  m, 1);.        }
9770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9780: 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29 7b   pLevel->bRev ){
9790: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
97a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
97b0: 4c 61 73 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 43  Last, pLevel->iC
97c0: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
97d0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
97e0: 72 61 74 65 20 74 68 65 20 73 74 61 72 74 20 6b  rate the start k
97f0: 65 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ey.  This is the
9800: 20 6b 65 79 20 74 68 61 74 20 64 65 66 69 6e 65   key that define
9810: 73 20 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20  s the lower.    
9820: 20 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68    ** bound on th
9830: 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
9840: 20 69 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79   is no start key
9850: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
9860: 0a 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69  .      ** equali
9870: 74 79 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20  ty terms and if 
9880: 74 68 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e  there is no "X>.
9890: 2e 2e 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20  .." term.  In.  
98a0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
98b0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 22 52 65  , generate a "Re
98c0: 77 69 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f  wind" instructio
98d0: 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  n in place of th
98e0: 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74  e.      ** start
98f0: 20 6b 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20   key search..   
9900: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
9910: 30 30 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74  002-Dec-04: In t
9920: 68 65 20 63 61 73 65 20 6f 66 20 61 20 72 65 76  he case of a rev
9930: 65 72 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63  erse-order searc
9940: 68 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64  h, the so-called
9950: 0a 20 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74  .      ** "start
9960: 22 20 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64  " key really end
9970: 73 20 75 70 20 62 65 69 6e 67 20 75 73 65 64 20  s up being used 
9980: 61 73 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  as the terminati
9990: 6f 6e 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  on key..      */
99a0: 0a 20 20 20 20 20 20 69 66 28 20 28 73 63 6f 72  .      if( (scor
99b0: 65 20 26 20 32 29 21 3d 30 20 29 7b 0a 20 20 20  e & 2)!=0 ){.   
99c0: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 61       for(pTerm=a
99d0: 45 78 70 72 2c 20 6b 3d 30 3b 20 6b 3c 6e 45 78  Expr, k=0; k<nEx
99e0: 70 72 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  pr; k++, pTerm++
99f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
9a00: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
9a10: 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ->p;.          i
9a20: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 63 6f  f( pExpr==0 ) co
9a30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9a40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64 78    if( pTerm->idx
9a50: 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20 20 20 20  Left==iCur.     
9a60: 20 20 20 20 20 20 20 20 26 26 20 28 70 45 78 70          && (pExp
9a70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  r->op==TK_GT || 
9a80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  pExpr->op==TK_GE
9a90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
9aa0: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
9ab0: 52 69 67 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b  Right & loopMask
9ac0: 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  )==pTerm->prereq
9ad0: 52 69 67 68 74 20 0a 20 20 20 20 20 20 20 20 20  Right .         
9ae0: 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c      && pExpr->pL
9af0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  eft->iColumn==pI
9b00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 0a  dx->aiColumn[j].
9b10: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
9b20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9b30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9b40: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
9b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 46  .            geF
9b60: 6c 61 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  lag = pExpr->op=
9b70: 3d 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 20 20  =TK_GE;.        
9b80: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
9b90: 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d 3e  pLevel, &pTerm->
9ba0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
9bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9bc0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9be0: 20 20 67 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20    geFlag = 1;.  
9bf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c00: 6e 45 71 43 6f 6c 75 6d 6e 3e 30 20 7c 7c 20 28  nEqColumn>0 || (
9c10: 73 63 6f 72 65 26 32 29 21 3d 30 20 29 7b 0a 20  score&2)!=0 ){. 
9c20: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20         int nCol 
9c30: 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20 2b 20 28 28  = nEqColumn + ((
9c40: 73 63 6f 72 65 26 32 29 21 3d 30 29 3b 0a 20 20  score&2)!=0);.  
9c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
9c70: 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 2c 20 73 71 6c  Null, -nCol, sql
9c80: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9c90: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
9ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9cb0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
9cc0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
9cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ce0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
9cf0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
9d00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9d10: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9d20: 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , nCol, 0);.    
9d30: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
9d40: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
9d50: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
9d60: 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29  ( pLevel->bRev )
9d70: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76  {.          pLev
9d80: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
9d90: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
9da0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9db0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
9dc0: 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
9dd0: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
9de0: 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64    testOp = OP_Id
9df0: 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xLT;.        }el
9e00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
9e10: 74 20 6f 70 20 3d 20 67 65 46 6c 61 67 20 3f 20  t op = geFlag ? 
9e20: 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d  OP_MoveGe : OP_M
9e30: 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20  oveGt;.         
9e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9e50: 70 28 76 2c 20 6f 70 2c 20 70 4c 65 76 65 6c 2d  p(v, op, pLevel-
9e60: 3e 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  >iCur, brk);.   
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9e80: 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 62  se if( pLevel->b
9e90: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
9ea0: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
9eb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9ed0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
9ee0: 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 43 75  ind, pLevel->iCu
9ef0: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
9f00: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
9f10: 61 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20  ate the the top 
9f20: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
9f30: 20 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d   there is a term
9f40: 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
9f50: 20 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20   key we have to 
9f60: 74 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65  test for that ke
9f70: 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74  y and abort at t
9f80: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20  he top of the.  
9f90: 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
9fa0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72     */.      star
9fb0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
9fc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
9fd0: 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
9fe0: 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
9ff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a000: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
a010: 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
a020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
a030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a040: 2c 20 74 65 73 74 4f 70 2c 20 70 4c 65 76 65 6c  , testOp, pLevel
a050: 2d 3e 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  ->iCur, brk);.  
a060: 20 20 20 20 20 20 69 66 28 20 28 6c 65 46 6c 61        if( (leFla
a070: 67 20 26 26 20 21 70 4c 65 76 65 6c 2d 3e 62 52  g && !pLevel->bR
a080: 65 76 29 20 7c 7c 20 28 21 67 65 46 6c 61 67 20  ev) || (!geFlag 
a090: 26 26 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 29  && pLevel->bRev)
a0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a0b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a0c0: 33 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33  3(v, -1, "+", P3
a0d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a0e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a100: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  Op(v, OP_RowKey,
a110: 20 70 4c 65 76 65 6c 2d 3e 69 43 75 72 2c 20 30   pLevel->iCur, 0
a120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a140: 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 43 6f  IdxIsNull, nEqCo
a150: 6c 75 6d 6e 20 2b 20 28 73 63 6f 72 65 20 26 20  lumn + (score & 
a160: 31 29 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  1), cont);.     
a170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a180: 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f  p(v, OP_IdxRecno
a190: 2c 20 70 4c 65 76 65 6c 2d 3e 69 43 75 72 2c 20  , pLevel->iCur, 
a1a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  0);.      if( i=
a1b0: 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d  =pTabList->nSrc-
a1c0: 31 20 26 26 20 70 75 73 68 4b 65 79 20 29 7b 0a  1 && pushKey ){.
a1d0: 20 20 20 20 20 20 20 20 68 61 76 65 4b 65 79 20          haveKey 
a1e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
a1f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a200: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a210: 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
a220: 29 3b 0a 20 20 20 20 20 20 20 20 68 61 76 65 4b  );.        haveK
a230: 65 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ey = 0;.      }.
a240: 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  .      /* Record
a250: 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
a260: 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
a270: 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  te the loop..   
a280: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76     */.      pLev
a290: 65 6c 2d 3e 6f 70 20 3d 20 70 4c 65 76 65 6c 2d  el->op = pLevel-
a2a0: 3e 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20  >bRev ? OP_Prev 
a2b0: 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
a2c0: 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 70 4c   pLevel->p1 = pL
a2d0: 65 76 65 6c 2d 3e 69 43 75 72 3b 0a 20 20 20 20  evel->iCur;.    
a2e0: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
a2f0: 74 61 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tart;.    }.    
a300: 6c 6f 6f 70 4d 61 73 6b 20 7c 3d 20 67 65 74 4d  loopMask |= getM
a310: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43  ask(&maskSet, iC
a320: 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  ur);..    /* Ins
a330: 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
a340: 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
a350: 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
a360: 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20   completely.    
a370: 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
a380: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
a390: 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20  t of tables..   
a3a0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72   */.    for(pTer
a3b0: 6d 3d 61 45 78 70 72 2c 20 6a 3d 30 3b 20 6a 3c  m=aExpr, j=0; j<
a3c0: 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20 70 54 65 72  nExpr; j++, pTer
a3d0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
a3e0: 70 54 65 72 6d 2d 3e 70 3d 3d 30 20 29 20 63 6f  pTerm->p==0 ) co
a3f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
a400: 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
a410: 41 6c 6c 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 21  All & loopMask)!
a420: 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  =pTerm->prereqAl
a430: 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
a440: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
a450: 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
a460: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
a470: 65 72 6d 2d 3e 70 2c 45 50 5f 46 72 6f 6d 4a 6f  erm->p,EP_FromJo
a480: 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
a490: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
a4a0: 0a 20 20 20 20 20 20 69 66 28 20 68 61 76 65 4b  .      if( haveK
a4b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 68 61  ey ){.        ha
a4c0: 76 65 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20  veKey = 0;.     
a4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a4e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
a4f0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
a500: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a510: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
a520: 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 2c 20 63  rse, pTerm->p, c
a530: 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ont, 1);.      p
a540: 54 65 72 6d 2d 3e 70 20 3d 20 30 3b 0a 20 20 20  Term->p = 0;.   
a550: 20 7d 0a 20 20 20 20 62 72 6b 20 3d 20 63 6f 6e   }.    brk = con
a560: 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  t;..    /* For a
a570: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
a580: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
a590: 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
a5a0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
a5b0: 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
a5c0: 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
a5d0: 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
a5e0: 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
a5f0: 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  able.  .    */. 
a600: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
a610: 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
a620: 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20    pLevel->top = 
a630: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a640: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
a650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a660: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a670: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
a680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a690: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
a6a0: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
a6b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 1);.      for(
a6c0: 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a 3d 30  pTerm=aExpr, j=0
a6d0: 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20  ; j<nExpr; j++, 
a6e0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
a6f0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 3d 3d    if( pTerm->p==
a700: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a710: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
a720: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6c 6f  ->prereqAll & lo
a730: 6f 70 4d 61 73 6b 29 21 3d 70 54 65 72 6d 2d 3e  opMask)!=pTerm->
a740: 70 72 65 72 65 71 41 6c 6c 20 29 20 63 6f 6e 74  prereqAll ) cont
a750: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
a760: 28 20 68 61 76 65 4b 65 79 20 29 7b 0a 20 20 20  ( haveKey ){.   
a770: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74         /* Cannot
a780: 20 68 61 70 70 65 6e 2e 20 20 22 68 61 76 65 4b   happen.  "haveK
a790: 65 79 22 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ey" can only be 
a7a0: 74 72 75 65 20 69 66 20 70 75 73 68 4b 65 79 20  true if pushKey 
a7b0: 69 73 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  is true.        
a7c0: 20 20 2a 2a 20 61 6e 20 70 75 73 68 4b 65 79 20    ** an pushKey 
a7d0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  can only be true
a7e0: 20 66 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20   for DELETE and 
a7f0: 55 50 44 41 54 45 20 61 6e 64 20 74 68 65 72 65  UPDATE and there
a800: 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a   are.          *
a810: 2a 20 6e 6f 20 6f 75 74 65 72 20 6a 6f 69 6e 73  * no outer joins
a820: 20 77 69 74 68 20 44 45 4c 45 54 45 20 61 6e 64   with DELETE and
a830: 20 55 50 44 41 54 45 2e 0a 20 20 20 20 20 20 20   UPDATE..       
a840: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
a850: 68 61 76 65 4b 65 79 20 3d 20 30 3b 0a 20 20 20  haveKey = 0;.   
a860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
a880: 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a  veGe, iCur, 0);.
a890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a8a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
a8b0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
a8c0: 72 6d 2d 3e 70 2c 20 63 6f 6e 74 2c 20 31 29 3b  rm->p, cont, 1);
a8d0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
a8e0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
a8f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
a900: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63  o->iContinue = c
a910: 6f 6e 74 3b 0a 20 20 69 66 28 20 70 75 73 68 4b  ont;.  if( pushK
a920: 65 79 20 26 26 20 21 68 61 76 65 4b 65 79 20 29  ey && !haveKey )
a930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a940: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
a950: 6e 6f 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  no, pTabList->a[
a960: 30 5d 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a  0].iCursor, 0);.
a970: 20 20 7d 0a 20 20 66 72 65 65 4d 61 73 6b 53 65    }.  freeMaskSe
a980: 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 72  t(&maskSet);.  r
a990: 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 7d 0a  eturn pWInfo;.}.
a9a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a9b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
a9c0: 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
a9d0: 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
a9e0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
a9f0: 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
aa00: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
aa10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
aa20: 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
aa30: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
aa40: 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
aa50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
aa60: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
aa70: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
aa80: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
aa90: 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
aaa0: 4c 69 73 74 3b 0a 0a 20 20 66 6f 72 28 69 3d 70  List;..  for(i=p
aab0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b  TabList->nSrc-1;
aac0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
aad0: 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
aae0: 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
aaf0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ab00: 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
ab10: 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  cont);.    if( p
ab20: 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
ab30: 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
ab40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ab50: 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
ab60: 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
ab70: 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  p2);.    }.    s
ab80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ab90: 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
aba0: 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  ->brk);.    if( 
abb0: 70 4c 65 76 65 6c 2d 3e 69 6e 4f 70 21 3d 4f 50  pLevel->inOp!=OP
abc0: 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
abd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
abe0: 76 2c 20 70 4c 65 76 65 6c 2d 3e 69 6e 4f 70 2c  v, pLevel->inOp,
abf0: 20 70 4c 65 76 65 6c 2d 3e 69 6e 50 31 2c 20 70   pLevel->inP1, p
ac00: 4c 65 76 65 6c 2d 3e 69 6e 50 32 29 3b 0a 20 20  Level->inP2);.  
ac10: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
ac20: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
ac30: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
ac40: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
ac50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ac60: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
ac70: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c  evel->iLeftJoin,
ac80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ac90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aca0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 61 64  P_NotNull, 1, ad
acb0: 64 72 2b 34 20 2b 20 28 70 4c 65 76 65 6c 2d 3e  dr+4 + (pLevel->
acc0: 69 43 75 72 3e 3d 30 29 29 3b 0a 20 20 20 20 20  iCur>=0));.     
acd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ace0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  p(v, OP_NullRow,
acf0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
ad00: 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  iCursor, 0);.   
ad10: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
ad20: 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
ad30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad40: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
ad50: 2c 20 70 4c 65 76 65 6c 2d 3e 69 43 75 72 2c 20  , pLevel->iCur, 
ad60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ad70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad80: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
ad90: 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a  , pLevel->top);.
ada0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
adb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
adc0: 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
add0: 42 72 65 61 6b 29 3b 0a 20 20 66 6f 72 28 69 3d  Break);.  for(i=
ade0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
adf0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  Src; i++){.    T
ae00: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
ae10: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
ae20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
ae30: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
ae40: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
ae50: 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  nt || pTab->pSel
ae60: 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
ae70: 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
ae80: 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
ae90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aea0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
aeb0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
aec0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  rsor, 0);.    if
aed0: 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d  ( pLevel->pIdx!=
aee0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
aef0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
af00: 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
af10: 3e 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  >iCur, 0);.    }
af20: 0a 20 20 7d 0a 23 69 66 20 30 20 20 2f 2a 20 4e  .  }.#if 0  /* N
af30: 65 76 65 72 20 72 65 75 73 65 20 61 20 63 75 72  ever reuse a cur
af40: 73 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  sor */.  if( pWI
af50: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 61  nfo->pParse->nTa
af60: 62 3d 3d 70 57 49 6e 66 6f 2d 3e 70 65 61 6b 4e  b==pWInfo->peakN
af70: 54 61 62 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  Tab ){.    pWInf
af80: 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  o->pParse->nTab 
af90: 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
afa0: 54 61 62 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Tab;.  }.#endif.
afb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57 49    sqliteFree(pWI
afc0: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
afd0: 7d 0a                                            }.