/ Hex Artifact Content
Login

Artifact e8c2ece5843ea56e6c90277d421f2d628f3f7b7c976642369cc519f008e1d2b1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 36  /*.** 2015-06-06
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44  hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  BE code used to 
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57  process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53  HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77  *.** This file w
01f0: 61 73 20 73 70 6c 69 74 20 6f 66 66 20 66 72 6f  as split off fro
0200: 6d 20 77 68 65 72 65 2e 63 20 6f 6e 20 32 30 31  m where.c on 201
0210: 35 2d 30 36 2d 30 36 20 69 6e 20 6f 72 64 65 72  5-06-06 in order
0220: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 0a 2a   to reduce the.*
0230: 2a 20 73 69 7a 65 20 6f 66 20 77 68 65 72 65 2e  * size of where.
0240: 63 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 65 61  c and make it ea
0250: 73 69 65 72 20 74 6f 20 65 64 69 74 2e 20 20 54  sier to edit.  T
0260: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
0270: 73 20 74 68 65 20 72 6f 75 74 69 6e 65 73 0a 2a  s the routines.*
0280: 2a 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  * that actually 
0290: 67 65 6e 65 72 61 74 65 20 74 68 65 20 62 75 6c  generate the bul
02a0: 6b 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  k of the WHERE l
02b0: 6f 6f 70 20 63 6f 64 65 2e 20 20 54 68 65 20 6f  oop code.  The o
02c0: 72 69 67 69 6e 61 6c 20 77 68 65 72 65 2e 63 0a  riginal where.c.
02d0: 2a 2a 20 66 69 6c 65 20 72 65 74 61 69 6e 73 20  ** file retains 
02e0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 64 6f  the code that do
02f0: 65 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e  es query plannin
0300: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 2e 0a  g and analysis..
0310: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0320: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0330: 64 65 20 22 77 68 65 72 65 49 6e 74 2e 68 22 0a  de "whereInt.h".
0340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0350: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 0a 2f 2a  OMIT_EXPLAIN../*
0360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0370: 61 6d 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ame of the i-th 
0380: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 49  column of the pI
0390: 64 78 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  dx index..*/.sta
03a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
03b0: 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75  explainIndexColu
03c0: 6d 6e 4e 61 6d 65 28 49 6e 64 65 78 20 2a 70 49  mnName(Index *pI
03d0: 64 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 20  dx, int i){.  i 
03e0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
03f0: 5b 69 5d 3b 0a 20 20 69 66 28 20 69 3d 3d 58 4e  [i];.  if( i==XN
0400: 5f 45 58 50 52 20 29 20 72 65 74 75 72 6e 20 22  _EXPR ) return "
0410: 3c 65 78 70 72 3e 22 3b 0a 20 20 69 66 28 20 69  <expr>";.  if( i
0420: 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 20 72 65 74  ==XN_ROWID ) ret
0430: 75 72 6e 20 22 72 6f 77 69 64 22 3b 0a 20 20 72  urn "rowid";.  r
0440: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
0450: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
0460: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
0470: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
0480: 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
0490: 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
04a0: 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
04b0: 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
04c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
04d0: 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
04e0: 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
04f0: 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
0500: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
0510: 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
0520: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
0530: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
0540: 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
0550: 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
0560: 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
0570: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
0580: 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
0590: 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
05a0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
05b0: 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
05c0: 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
05d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
05e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
05f0: 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 49 6e  ng built */.  In
0600: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
0610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0620: 65 78 20 74 6f 20 72 65 61 64 20 63 6f 6c 75 6d  ex to read colum
0630: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 2a 2f 0a  n names from */.
0640: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0660: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
0670: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 2f 2a 20 5a 65 72 6f 2d 62 61 73 65 64 20    /* Zero-based 
06a0: 69 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  index of first t
06b0: 65 72 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 41  erm. */.  int bA
06c0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
06d0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
06e0: 6f 20 74 6f 20 61 70 70 65 6e 64 20 22 20 41 4e  o to append " AN
06f0: 44 20 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  D " */.  const c
0700: 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
0710: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0720: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
0730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  ){.  int i;..  a
0740: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 3d 31 20  ssert( nTerm>=1 
0750: 29 3b 0a 20 20 69 66 28 20 62 41 6e 64 20 29 20  );.  if( bAnd ) 
0760: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
0770: 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
0780: 44 20 22 2c 20 35 29 3b 0a 0a 20 20 69 66 28 20  D ", 5);..  if( 
0790: 6e 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65  nTerm>1 ) sqlite
07a0: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
07b0: 70 53 74 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20  pStr, "(", 1);. 
07c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
07d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
07e0: 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
07f0: 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
0800: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 73 71   ",", 1);.    sq
0810: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
0820: 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 65 78 70  endAll(pStr, exp
0830: 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e  lainIndexColumnN
0840: 61 6d 65 28 70 49 64 78 2c 20 69 54 65 72 6d 2b  ame(pIdx, iTerm+
0850: 69 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  i));.  }.  if( n
0860: 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33  Term>1 ) sqlite3
0870: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0880: 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a 0a 20  Str, ")", 1);.. 
0890: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
08a0: 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
08b0: 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 54 65  , 1);..  if( nTe
08c0: 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  rm>1 ) sqlite3St
08d0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
08e0: 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20 20 66 6f  r, "(", 1);.  fo
08f0: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
0900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
0910: 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
0920: 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 2c  mAppend(pStr, ",
0930: 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 1);.    sqlit
0940: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0950: 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
0960: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3e    }.  if( nTerm>
0970: 31 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  1 ) sqlite3StrAc
0980: 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
0990: 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ")", 1);.}../*.*
09a0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
09b0: 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
09c0: 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
09d0: 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
09e0: 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
09f0: 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20 74  n appends text t
0a00: 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73 63  o pStr that desc
0a10: 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65 74  ribes the subset
0a20: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77   of table.** row
0a30: 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
0a40: 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
0a50: 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c 20   form of an SQL 
0a60: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0a70: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
0a80: 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
0a90: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
0aa0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
0ab0: 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
0ac0: 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
0ad0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
0ae0: 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
0af0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0b00: 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
0b10: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
0b20: 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
0b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
0b40: 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
0b50: 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c  (StrAccum *pStr,
0b60: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
0b70: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  p){.  Index *pIn
0b80: 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
0b90: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
0ba0: 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
0bb0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
0bc0: 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
0bd0: 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69  ->nSkip;.  int i
0be0: 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d  , j;..  if( nEq=
0bf0: 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73  =0 && (pLoop->ws
0c00: 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  Flags&(WHERE_BTM
0c10: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
0c20: 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65  _LIMIT))==0 ) re
0c30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
0c40: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
0c50: 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  tr, " (", 2);.  
0c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
0c70: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
0c80: 63 68 61 72 20 2a 7a 20 3d 20 65 78 70 6c 61 69  char *z = explai
0c90: 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65  nIndexColumnName
0ca0: 28 70 49 6e 64 65 78 2c 20 69 29 3b 0a 20 20 20  (pIndex, i);.   
0cb0: 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
0cc0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0cd0: 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
0ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  ;.    sqlite3XPr
0cf0: 69 6e 74 66 28 70 53 74 72 2c 20 69 3e 3d 6e 53  intf(pStr, i>=nS
0d00: 6b 69 70 20 3f 20 22 25 73 3d 3f 22 20 3a 20 22  kip ? "%s=?" : "
0d10: 41 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20  ANY(%s)", z);.  
0d20: 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
0d30: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
0d40: 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
0d50: 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41   ){.    explainA
0d60: 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
0d70: 70 49 6e 64 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75  pIndex, pLoop->u
0d80: 2e 62 74 72 65 65 2e 6e 42 74 6d 2c 20 6a 2c 20  .btree.nBtm, j, 
0d90: 69 2c 20 22 3e 22 29 3b 0a 20 20 20 20 69 20 3d  i, ">");.    i =
0da0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
0db0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
0dc0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
0dd0: 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
0de0: 64 54 65 72 6d 28 70 53 74 72 2c 20 70 49 6e 64  dTerm(pStr, pInd
0df0: 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ex, pLoop->u.btr
0e00: 65 65 2e 6e 54 6f 70 2c 20 6a 2c 20 69 2c 20 22  ee.nTop, j, i, "
0e10: 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
0e20: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0e30: 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
0e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0e50: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
0e60: 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
0e70: 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
0e80: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0e90: 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
0ea0: 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
0eb0: 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
0ec0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
0ed0: 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
0ee0: 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
0ef0: 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
0f00: 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
0f10: 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
0f20: 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
0f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
0f40: 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
0f50: 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
0f60: 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
0f70: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
0f80: 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
0f90: 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
0fa0: 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
0fb0: 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
0fc0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
0fd0: 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
0fe0: 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
0ff0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1000: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nt sqlite3WhereE
1010: 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1050: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1060: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1070: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1080: 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1090: 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
10a0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
10b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10c0: 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
10d0: 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
10e0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
10f0: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1110: 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1120: 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1130: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1160: 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1170: 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1180: 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
11b0: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
11c0: 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  gin() */.){.  in
11d0: 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21  t ret = 0;.#if !
11e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11f0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
1200: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1210: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
1220: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1230: 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
1240: 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  if.  {.    struc
1250: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1260: 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
1270: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1280: 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
1290: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12a0: 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
12b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
12c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
12d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12f0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  handle */.    in
1300: 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
1310: 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
1320: 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
1330: 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
1340: 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
1350: 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
1360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1370: 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
1380: 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
1390: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
13a0: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
13b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
13c0: 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
13d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
13e0: 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1400: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
1410: 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
1420: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1450: 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1460: 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 73  /.    StrAccum s
1470: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
1480: 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75      /* EQP outpu
1490: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  t string */.    
14a0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20  char zBuf[100]; 
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c0: 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66   Initial space f
14d0: 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20 73 74  or EQP output st
14e0: 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  ring */..    pLo
14f0: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1500: 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1510: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1520: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1530: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1540: 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1550: 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
1560: 45 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  E) ) return 0;..
1570: 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1580: 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1590: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
15a0: 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
15b0: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
15c0: 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
15d0: 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
15e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
15f0: 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1600: 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1610: 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1620: 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1630: 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c  _MAX));..    sql
1640: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1650: 28 26 73 74 72 2c 20 64 62 2c 20 7a 42 75 66 2c  (&str, db, zBuf,
1660: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53   sizeof(zBuf), S
1670: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
1690: 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
16a0: 26 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f  &str, isSearch ?
16b0: 20 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41   "SEARCH" : "SCA
16c0: 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
16d0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
16e0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
16f0: 6e 74 66 28 26 73 74 72 2c 20 22 20 53 55 42 51  ntf(&str, " SUBQ
1700: 55 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d  UERY %d", pItem-
1710: 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1730: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1740: 72 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20  r, " TABLE %s", 
1750: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1760: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1770: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1780: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1790: 6e 74 66 28 26 73 74 72 2c 20 22 20 41 53 20 25  ntf(&str, " AS %
17a0: 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
17b0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
17c0: 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
17d0: 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
17e0: 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20 29 7b  UALTABLE))==0 ){
17f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1800: 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20 20 20  r *zFmt = 0;.   
1810: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1830: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1840: 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  ndex!=0 );.     
1850: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1860: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1870: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
1880: 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f  lags&WHERE_AUTO_
1890: 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73  INDEX) || (flags
18a0: 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
18b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
18c0: 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
18d0: 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
18e0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
18f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1900: 73 53 65 61 72 63 68 20 29 7b 0a 20 20 20 20 20  sSearch ){.     
1910: 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 50 52 49       zFmt = "PRI
1920: 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20 20 20 20  MARY KEY";.     
1930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1940: 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45   if( flags & WHE
1950: 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20 29 7b  RE_PARTIALIDX ){
1960: 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
1970: 22 41 55 54 4f 4d 41 54 49 43 20 50 41 52 54 49  "AUTOMATIC PARTI
1980: 41 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  AL COVERING INDE
1990: 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  X";.      }else 
19a0: 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19b0: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a  E_AUTO_INDEX ){.
19c0: 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
19d0: 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49  AUTOMATIC COVERI
19e0: 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
19f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a00: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1a10: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  Y ){.        zFm
1a20: 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20 49 4e  t = "COVERING IN
1a30: 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
1a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
1a50: 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73 22 3b  mt = "INDEX %s";
1a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a70: 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20 20 20  f( zFmt ){.     
1a80: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1a90: 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  umAppend(&str, "
1aa0: 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a 20 20   USING ", 7);.  
1ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1ac0: 69 6e 74 66 28 26 73 74 72 2c 20 7a 46 6d 74 2c  intf(&str, zFmt,
1ad0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
1ae0: 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 49 6e         explainIn
1af0: 64 65 78 52 61 6e 67 65 28 26 73 74 72 2c 20 70  dexRange(&str, p
1b00: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Loop);.      }. 
1b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1b20: 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1b30: 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1b40: 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1b50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
1b60: 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 67 65  nst char *zRange
1b70: 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  Op;.      if( fl
1b80: 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1b90: 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1ba0: 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1bb0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3d 22 3b   zRangeOp = "=";
1bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1bd0: 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
1be0: 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
1bf0: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
1c00: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1c10: 3d 20 22 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  = ">? AND rowid<
1c20: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1c30: 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1c40: 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c50: 20 20 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22      zRangeOp = "
1c60: 3e 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  >";.      }else{
1c70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c80: 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
1c90: 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20 20 20  _LIMIT);.       
1ca0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3c 22 3b   zRangeOp = "<";
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cc0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1cd0: 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e 54 45  tr, " USING INTE
1ce0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
1cf0: 28 72 6f 77 69 64 25 73 3f 29 22 2c 7a 52 61 6e  (rowid%s?)",zRan
1d00: 67 65 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 69 66  geOp);.    }.#if
1d10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d30: 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1d40: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1d50: 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1d70: 74 66 28 26 73 74 72 2c 20 22 20 56 49 52 54 55  tf(&str, " VIRTU
1d80: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1d90: 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d:%s",.         
1da0: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1db0: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1dc0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1dd0: 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1de0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1df0: 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
1e00: 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20  ED_ROWS.    if( 
1e10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20  pLoop->nOut>=10 
1e20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e30: 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 22 20  XPrintf(&str, " 
1e40: 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 20 73  (~%llu rows)", s
1e50: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
1e60: 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  t(pLoop->nOut));
1e70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e80: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1e90: 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20  mAppend(&str, " 
1ea0: 28 7e 31 20 72 6f 77 29 22 2c 20 39 29 3b 0a 20  (~1 row)", 9);. 
1eb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ec0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 53 74  zMsg = sqlite3St
1ed0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74  rAccumFinish(&st
1ee0: 72 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  r);.    ret = sq
1ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1f00: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1f10: 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1f20: 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59 4e 41 4d  m, zMsg,P4_DYNAM
1f30: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
1f40: 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  n ret;.}.#endif 
1f50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1f60: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1f70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f80: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1f90: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1fa0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1fb0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1fc0: 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1fd0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1fe0: 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1ff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2000: 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
2010: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
2020: 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
2030: 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
2040: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2050: 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
2060: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
2070: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
2080: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
2090: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
20a0: 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
20b0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
20c0: 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
20d0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
20e0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
20f0: 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
2100: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2110: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
2120: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
2150: 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
2160: 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
2170: 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
2180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
2190: 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
21a0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
21b0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
21c0: 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
21d0: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
21e0: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
21f0: 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
2200: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2230: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
2240: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
2250: 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
2260: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2270: 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
2280: 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
2290: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
22a0: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
22b0: 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
22c0: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
22d0: 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
22e0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22f0: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
2300: 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
2310: 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
2320: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
2330: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
2340: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
2350: 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
2360: 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
2370: 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
2380: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
2390: 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69  Obj.  );.}.#endi
23a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  f.../*.** Disabl
23b0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
23c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
23d0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
23e0: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
23f0: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
2400: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2410: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
2420: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2430: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
2440: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
2450: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
2460: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
2470: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
2480: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
2490: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
24a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24b0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
24c0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
24d0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
24e0: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
24f0: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2500: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
2510: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
2520: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
2530: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2540: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
2550: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
2560: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
2570: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2580: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
2590: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
25a0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
25b0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
25c0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
25d0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
25e0: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
25f0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
2600: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
2610: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
2620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
2630: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
2640: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
2650: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
2660: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2670: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2680: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
2690: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
26a0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
26b0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
26c0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
26d0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
26e0: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
26f0: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
2700: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
2710: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
2720: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
2730: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
2740: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
2750: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
2760: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
2770: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
2780: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
2790: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
27a0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
27b0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
27c0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
27d0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
27e0: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
27f0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
2800: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  3..**.** If all 
2810: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  the children of 
2820: 61 20 74 65 72 6d 20 61 72 65 20 64 69 73 61 62  a term are disab
2830: 6c 65 64 2c 20 74 68 65 6e 20 74 68 61 74 20 74  led, then that t
2840: 65 72 6d 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  erm is also.** a
2850: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 69 73  utomatically dis
2860: 61 62 6c 65 64 2e 20 20 49 6e 20 74 68 69 73 20  abled.  In this 
2870: 77 61 79 2c 20 74 65 72 6d 73 20 67 65 74 20 64  way, terms get d
2880: 69 73 61 62 6c 65 64 20 69 66 20 64 65 72 69 76  isabled if deriv
2890: 65 64 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ed.** virtual te
28a0: 72 6d 73 20 61 72 65 20 74 65 73 74 65 64 20 66  rms are tested f
28b0: 69 72 73 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  irst.  For examp
28c0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  le:.**.**      x
28d0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 41 4e 44   GLOB 'abc*' AND
28e0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
28f0: 27 61 63 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f  'acd'.**      \_
2900: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
2910: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  \______/     \__
2920: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
2930: 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  parent          
2940: 63 68 69 6c 64 31 20 20 20 20 20 20 20 63 68 69  child1       chi
2950: 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ld2.**.** Only t
2960: 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20 77  he parent term w
2970: 61 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  as in the origin
2980: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
2990: 20 20 54 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20    The child1.** 
29a0: 61 6e 64 20 63 68 69 6c 64 32 20 74 65 72 6d 73  and child2 terms
29b0: 20 77 65 72 65 20 61 64 64 65 64 20 62 79 20 74   were added by t
29c0: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
29d0: 74 69 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f  tion.  If both o
29e0: 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c  f.** the virtual
29f0: 20 63 68 69 6c 64 20 74 65 72 6d 73 20 61 72 65   child terms are
2a00: 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 65 73   valid, then tes
2a10: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 65  ting of the pare
2a20: 6e 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b  nt can be .** sk
2a30: 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  ipped..**.** Usu
2a40: 61 6c 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  ally the parent 
2a50: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 61  term is marked a
2a60: 73 20 54 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42  s TERM_CODED.  B
2a70: 75 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ut if the parent
2a80: 0a 2a 2a 20 74 65 72 6d 20 77 61 73 20 6f 72 69  .** term was ori
2a90: 67 69 6e 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b  ginally TERM_LIK
2aa0: 45 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65  E, then the pare
2ab0: 6e 74 20 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b  nt gets TERM_LIK
2ac0: 45 43 4f 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a  ECOND instead..*
2ad0: 2a 20 54 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43  * The TERM_LIKEC
2ae0: 4f 4e 44 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69  OND marking indi
2af0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
2b00: 65 72 6d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  erm should be co
2b10: 64 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20  ded inside.** a 
2b20: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 75 63 68  conditional such
2b30: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 65 76   that is only ev
2b40: 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
2b50: 65 63 6f 6e 64 20 70 61 73 73 20 6f 66 20 61 0a  econd pass of a.
2b60: 2a 2a 20 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61  ** LIKE-optimiza
2b70: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20  tion loop, when 
2b80: 73 63 61 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69  scanning BLOBs i
2b90: 6e 73 74 65 61 64 20 6f 66 20 73 74 72 69 6e 67  nstead of string
2ba0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2bb0: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
2bc0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2bd0: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
2be0: 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  rm){.  int nLoop
2bf0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 41   = 0;.  while( A
2c00: 4c 57 41 59 53 28 70 54 65 72 6d 21 3d 30 29 0a  LWAYS(pTerm!=0).
2c10: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
2c20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2c30: 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
2c40: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
2c50: 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
2c60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
2c70: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
2c80: 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
2c90: 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
2ca0: 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
2cb0: 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
2cc0: 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
2cd0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
2ce0: 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
2cf0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
2d00: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2d10: 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
2d20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
2d30: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2d40: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
2d50: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
2d60: 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
2d70: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
2d80: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
2d90: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
2da0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
2db0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2dc0: 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
2dd0: 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
2de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2df0: 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
2e00: 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
2e10: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
2e20: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
2e30: 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
2e40: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
2e50: 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
2e60: 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
2e70: 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
2e80: 42 4c 4f 42 20 65 6e 74 72 69 65 73 20 28 77 68  BLOB entries (wh
2e90: 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
2ea0: 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
2eb0: 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
2ec0: 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
2ed0: 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
2ee0: 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
2ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
2f00: 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
2f10: 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
2f20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f30: 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
2f40: 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
2f50: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
2f60: 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
2f70: 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
2f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2f90: 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
2fa0: 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
2fb0: 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
2fc0: 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
2fd0: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
2fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3000: 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
3010: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3020: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
3030: 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
3040: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3050: 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
3060: 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
3070: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
3080: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 65 6e  LITE_AFF_BLOB en
3090: 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
30a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
30b0: 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
30c0: 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
30d0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
30e0: 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
30f0: 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
3100: 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
3110: 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
3120: 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
3130: 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
3140: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
3150: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
3160: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
3170: 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
3180: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
3190: 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
31a0: 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
31b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
31d0: 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 2c 20 30  nity, base, n, 0
31e0: 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
31f0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
3200: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
3210: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
3230: 70 72 65 73 73 69 6f 6e 20 70 52 69 67 68 74 2c  pression pRight,
3240: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 48   which is the RH
3250: 53 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  S of a compariso
3260: 6e 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 73 20  n operation, is 
3270: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 76 65 63  .** either a vec
3280: 74 6f 72 20 6f 66 20 6e 20 65 6c 65 6d 65 6e 74  tor of n element
3290: 73 20 6f 72 2c 20 69 66 20 6e 3d 3d 31 2c 20 61  s or, if n==1, a
32a0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
32b0: 6f 6e 2e 0a 2a 2a 20 42 65 66 6f 72 65 20 74 68  on..** Before th
32c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
32d0: 72 61 74 69 6f 6e 2c 20 61 66 66 69 6e 69 74 79  ration, affinity
32e0: 20 7a 41 66 66 20 69 73 20 74 6f 20 62 65 20 61   zAff is to be a
32f0: 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pplied.** to the
3300: 20 70 52 69 67 68 74 20 76 61 6c 75 65 73 2e 20   pRight values. 
3310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
3320: 64 69 66 69 65 73 20 63 68 61 72 61 63 74 65 72  difies character
3330: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
3340: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
3350: 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  to SQLITE_AFF_BL
3360: 4f 42 20 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a  OB if either:.**
3370: 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63 6f 6d 70  .**   * the comp
3380: 61 72 69 73 6f 6e 20 77 69 6c 6c 20 62 65 20 70  arison will be p
3390: 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
33a0: 20 61 66 66 69 6e 69 74 79 2c 20 6f 72 0a 2a 2a   affinity, or.**
33b0: 20 20 20 2a 20 74 68 65 20 61 66 66 69 6e 69 74     * the affinit
33c0: 79 20 63 68 61 6e 67 65 20 69 6e 20 7a 41 66 66  y change in zAff
33d0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
33e0: 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ot to change the
33f0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
3400: 63 20 76 6f 69 64 20 75 70 64 61 74 65 52 61 6e  c void updateRan
3410: 67 65 41 66 66 69 6e 69 74 79 53 74 72 28 0a 20  geAffinityStr(. 
3420: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 2f 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61   /* RHS of compa
3450: 72 69 73 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  rison */.  int n
3460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3480: 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
3490: 6c 65 6d 65 6e 74 73 20 69 6e 20 63 6f 6d 70 61  lements in compa
34a0: 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  rison */.  char 
34b0: 2a 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 20  *zAff           
34c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
34d0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
34e0: 20 6d 6f 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20   modify */.){.  
34f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3500: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3510: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3520: 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
3530: 65 78 70 72 28 70 52 69 67 68 74 2c 20 69 29 3b  expr(pRight, i);
3540: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3550: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
3560: 70 2c 20 7a 41 66 66 5b 69 5d 29 3d 3d 53 51 4c  p, zAff[i])==SQL
3570: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 20 20 20  ITE_AFF_BLOB.   
3580: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
3590: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
35a0: 68 61 6e 67 65 28 70 2c 20 7a 41 66 66 5b 69 5d  hange(p, zAff[i]
35b0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 7a  ).    ){.      z
35c0: 41 66 66 5b 69 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[i] = SQLITE_
35d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
35e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
35f0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
3600: 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
3610: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
3620: 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
3630: 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
3640: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
3650: 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
3660: 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
3670: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
3680: 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
3690: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
36a0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
36b0: 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 61  int is left in a
36c0: 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 20 69   register, the i
36d0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69 63 68  ndex.** of which
36e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
36f0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
3700: 65 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  e store the resu
3710: 6c 74 20 69 6e 20 69 54 61 72 67 65 74 20 62 75  lt in iTarget bu
3720: 74 0a 2a 2a 20 74 68 69 73 20 69 73 20 6f 6e 6c  t.** this is onl
3730: 79 20 67 75 61 72 61 6e 74 65 65 64 20 66 6f 72  y guaranteed for
3740: 20 54 4b 5f 49 53 4e 55 4c 4c 20 61 6e 64 20 54   TK_ISNULL and T
3750: 4b 5f 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  K_IN constraints
3760: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e  .  If the.** con
3770: 73 74 72 61 69 6e 74 20 69 73 20 61 20 54 4b 5f  straint is a TK_
3780: 45 51 20 6f 72 20 54 4b 5f 49 53 2c 20 74 68 65  EQ or TK_IS, the
3790: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
37a0: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  lue might be lef
37b0: 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  t in.** some oth
37c0: 65 72 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  er register and 
37d0: 69 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  it is the caller
37e0: 27 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  's responsibilit
37f0: 79 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74 65 2e  y to compensate.
3800: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
3810: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
3820: 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
3830: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
3840: 61 6c 75 61 74 65 64 20 69 6e 0a 2a 2a 20 73 74  aluated in.** st
3850: 72 61 69 67 68 74 2d 6c 69 6e 65 20 63 6f 64 65  raight-line code
3860: 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
3870: 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
3880: 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
3890: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
38a0: 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
38b0: 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
38c0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
38d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
38e0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
38f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3900: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
3910: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3920: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3930: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
3940: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3950: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
3960: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
3970: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
3980: 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
3990: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
39a0: 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
39b0: 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
39c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
39d0: 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
39e0: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
39f0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
3a00: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
3a10: 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
3a20: 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
3a30: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
3a40: 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
3a50: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
3a60: 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
3a70: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
3a80: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
3a90: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
3aa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3ab0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3ac0: 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
3ad0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
3ae0: 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
3af0: 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
3b00: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
3b10: 3e 61 4c 54 65 72 6d 5b 69 45 71 5d 3d 3d 70 54  >aLTerm[iEq]==pT
3b20: 65 72 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  erm );.  assert(
3b30: 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
3b40: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
3b50: 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  Q || pX->op==TK_
3b60: 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  IS ){.    iReg =
3b70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3b80: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
3b90: 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
3ba0: 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
3bb0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
3bc0: 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
3bd0: 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
3be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bf0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
3c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
3c10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3c20: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
3c30: 69 6e 74 20 65 54 79 70 65 20 3d 20 49 4e 5f 49  int eType = IN_I
3c40: 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 20 20 69  NDEX_NOOP;.    i
3c50: 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
3c60: 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
3c70: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
3c80: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
3c90: 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  pWLoop;.    int 
3ca0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  i;.    int nEq =
3cb0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 4d   0;.    int *aiM
3cc0: 61 70 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ap = 0;..    if(
3cd0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
3ce0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
3cf0: 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
3d00: 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
3d10: 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
3d20: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
3d30: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
3d40: 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
3d50: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
3d60: 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
3d70: 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
3d80: 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
3d90: 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
3da0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3db0: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
3dc0: 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
3dd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3de0: 69 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  iEq; i++){.     
3df0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   if( pLoop->aLTe
3e00: 72 6d 5b 69 5d 20 26 26 20 70 4c 6f 6f 70 2d 3e  rm[i] && pLoop->
3e10: 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72  aLTerm[i]->pExpr
3e20: 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ==pX ){.        
3e30: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
3e40: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  el, pTerm);.    
3e50: 20 20 20 20 72 65 74 75 72 6e 20 69 54 61 72 67      return iTarg
3e60: 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
3e70: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 45 71 3b  }.    for(i=iEq;
3e80: 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  i<pLoop->nLTerm;
3e90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3ea0: 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 61   ALWAYS(pLoop->a
3eb0: 4c 54 65 72 6d 5b 69 5d 29 20 26 26 20 70 4c 6f  LTerm[i]) && pLo
3ec0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
3ed0: 45 78 70 72 3d 3d 70 58 20 29 20 6e 45 71 2b 2b  Expr==pX ) nEq++
3ee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
3ef0: 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
3f00: 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 20 7c  _xIsSelect)==0 |
3f10: 7c 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  | pX->x.pSelect-
3f20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
3f30: 31 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  1 ){.      eType
3f40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
3f50: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
3f60: 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
3f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
3f80: 65 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  e{.      Select 
3f90: 2a 70 53 65 6c 65 63 74 20 3d 20 70 58 2d 3e 78  *pSelect = pX->x
3fa0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
3fb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3fc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
3fd0: 75 31 36 20 73 61 76 65 64 44 62 4f 70 74 46 6c  u16 savedDbOptFl
3fe0: 61 67 73 20 3d 20 64 62 2d 3e 64 62 4f 70 74 46  ags = db->dbOptF
3ff0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 45 78 70 72  lags;.      Expr
4000: 4c 69 73 74 20 2a 70 4f 72 69 67 52 68 73 20 3d  List *pOrigRhs =
4010: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
4020: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
4030: 20 2a 70 4f 72 69 67 4c 68 73 20 3d 20 70 58 2d   *pOrigLhs = pX-
4040: 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 3b  >pLeft->x.pList;
4050: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
4060: 2a 70 52 68 73 20 3d 20 30 3b 20 20 20 20 20 20  *pRhs = 0;      
4070: 20 20 20 2f 2a 20 4e 65 77 20 53 65 6c 65 63 74     /* New Select
4080: 2e 70 45 4c 69 73 74 20 66 6f 72 20 52 48 53 20  .pEList for RHS 
4090: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
40a0: 74 20 2a 70 4c 68 73 20 3d 20 30 3b 20 20 20 20  t *pLhs = 0;    
40b0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 58 2d 3e       /* New pX->
40c0: 70 4c 65 66 74 20 76 65 63 74 6f 72 20 2a 2f 0a  pLeft vector */.
40d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 45 71  .      for(i=iEq
40e0: 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  ;i<pLoop->nLTerm
40f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4100: 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
4110: 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
4120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4130: 20 69 46 69 65 6c 64 20 3d 20 70 4c 6f 6f 70 2d   iField = pLoop-
4140: 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 69 46 69 65  >aLTerm[i]->iFie
4150: 6c 64 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld - 1;.        
4160: 20 20 45 78 70 72 20 2a 70 4e 65 77 52 68 73 20    Expr *pNewRhs 
4170: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4180: 28 64 62 2c 20 70 4f 72 69 67 52 68 73 2d 3e 61  (db, pOrigRhs->a
4190: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 2c 20  [iField].pExpr, 
41a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  0);.          Ex
41b0: 70 72 20 2a 70 4e 65 77 4c 68 73 20 3d 20 73 71  pr *pNewLhs = sq
41c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
41d0: 20 70 4f 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69   pOrigLhs->a[iFi
41e0: 65 6c 64 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  eld].pExpr, 0);.
41f0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 68 73 20  .          pRhs 
4200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4210: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
4220: 70 52 68 73 2c 20 70 4e 65 77 52 68 73 29 3b 0a  pRhs, pNewRhs);.
4230: 20 20 20 20 20 20 20 20 20 20 70 4c 68 73 20 3d            pLhs =
4240: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4250: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
4260: 4c 68 73 2c 20 70 4e 65 77 4c 68 73 29 3b 0a 20  Lhs, pNewLhs);. 
4270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4280: 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
4290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
42a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
42b0: 65 66 74 20 3d 20 70 58 2d 3e 70 4c 65 66 74 3b  eft = pX->pLeft;
42c0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ..        if( pS
42d0: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20  elect->pOrderBy 
42e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
42f0: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
4300: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6e 20 4f  atement has an O
4310: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
4320: 7a 65 72 6f 20 74 68 65 20 0a 20 20 20 20 20 20  zero the .      
4330: 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43      ** iOrderByC
4340: 6f 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 54 68  ol variables. Th
4350: 65 73 65 20 61 72 65 20 73 65 74 20 74 6f 20 6e  ese are set to n
4360: 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 61 6e 20  on-zero when an 
4370: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  .          ** OR
4380: 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 61 63  DER BY term exac
4390: 74 6c 79 20 6d 61 74 63 68 65 73 20 6f 6e 65 20  tly matches one 
43a0: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  of the terms of 
43b0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  the .          *
43c0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 2e 20 53 69  * result-set. Si
43d0: 6e 63 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73  nce the result-s
43e0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
43f0: 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 0a 20   statement may. 
4400: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
4410: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 6f   been modified o
4420: 72 20 72 65 6f 72 64 65 72 65 64 2c 20 74 68 65  r reordered, the
4430: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
4440: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
4450: 20 20 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72        ** set cor
4460: 72 65 63 74 6c 79 2e 20 20 53 69 6e 63 65 20 73  rectly.  Since s
4470: 65 74 74 69 6e 67 20 74 68 65 6d 20 69 73 20 6a  etting them is j
4480: 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  ust an optimizat
4490: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
44a0: 2a 2a 20 69 74 27 73 20 65 61 73 69 65 73 74 20  ** it's easiest 
44b0: 6a 75 73 74 20 74 6f 20 7a 65 72 6f 20 74 68 65  just to zero the
44c0: 6d 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20  m here.  */.    
44d0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
44e0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65  pOrderBy = pSele
44f0: 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ct->pOrderBy;.  
4500: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4510: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
4520: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4530: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
4540: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
4550: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
4560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4570: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65  .        /* Take
4580: 20 63 61 72 65 20 68 65 72 65 20 6e 6f 74 20 74   care here not t
4590: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  o generate a TK_
45a0: 56 45 43 54 4f 52 20 63 6f 6e 74 61 69 6e 69 6e  VECTOR containin
45b0: 67 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20  g only a.       
45c0: 20 2a 2a 20 73 69 6e 67 6c 65 20 76 61 6c 75 65   ** single value
45d0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 72 73  . Since the pars
45e0: 65 72 20 6e 65 76 65 72 20 63 72 65 61 74 65 73  er never creates
45f0: 20 73 75 63 68 20 61 20 76 65 63 74 6f 72 2c 20   such a vector, 
4600: 73 6f 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  some.        ** 
4610: 6f 66 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  of the subroutin
4620: 65 73 20 64 6f 20 6e 6f 74 20 68 61 6e 64 6c 65  es do not handle
4630: 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
4640: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 68 73          if( pLhs
4650: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ->nExpr==1 ){.  
4660: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
4670: 74 20 3d 20 70 4c 68 73 2d 3e 61 5b 30 5d 2e 70  t = pLhs->a[0].p
4680: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
4690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
46a0: 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  Left->x.pList = 
46b0: 70 4c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  pLhs;.          
46c0: 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
46d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
46e0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
46f0: 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 45 71 29  zeof(int) * nEq)
4700: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
4710: 63 61 73 65 28 20 61 69 4d 61 70 3d 3d 30 20 29  case( aiMap==0 )
4720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4730: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c      pSelect->pEL
4740: 69 73 74 20 3d 20 70 52 68 73 3b 0a 20 20 20 20  ist = pRhs;.    
4750: 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
4760: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 51 75 65  gs |= SQLITE_Que
4770: 72 79 46 6c 61 74 74 65 6e 65 72 3b 0a 20 20 20  ryFlattener;.   
4780: 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c       eType = sql
4790: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
47a0: 70 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49  pParse, pX, IN_I
47b0: 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c 20 61 69  NDEX_LOOP, 0, ai
47c0: 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62  Map);.        db
47d0: 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 73  ->dbOptFlags = s
47e0: 61 76 65 64 44 62 4f 70 74 46 6c 61 67 73 3b 0a  avedDbOptFlags;.
47f0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
4800: 28 20 61 69 4d 61 70 21 3d 30 20 26 26 20 61 69  ( aiMap!=0 && ai
4810: 4d 61 70 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  Map[0]!=0 );.   
4820: 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45       pSelect->pE
4830: 4c 69 73 74 20 3d 20 70 4f 72 69 67 52 68 73 3b  List = pOrigRhs;
4840: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e  .        pLeft->
4850: 78 2e 70 4c 69 73 74 20 3d 20 70 4f 72 69 67 4c  x.pList = pOrigL
4860: 68 73 3b 0a 20 20 20 20 20 20 20 20 70 58 2d 3e  hs;.        pX->
4870: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
4880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4890: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
48a0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
48b0: 4c 68 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Lhs);.      sqli
48c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
48d0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 52  e(pParse->db, pR
48e0: 68 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hs);.    }..    
48f0: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
4900: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
4910: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
4920: 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
4930: 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20  bRev = !bRev;.  
4940: 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70    }.    iTab = p
4950: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
4960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4970: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
4980: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
4990: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64  iTab, 0);.    Vd
49a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
49b0: 62 52 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43  bRev);.    VdbeC
49c0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 21 62 52  overageIf(v, !bR
49d0: 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev);.    assert(
49e0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
49f0: 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
4a00: 52 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 4c  R)==0 );..    pL
4a10: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
4a20: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
4a30: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
4a40: 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
4a50: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
4a60: 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
4a70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4a80: 20 20 20 7d 0a 0a 20 20 20 20 69 20 3d 20 70 4c     }..    i = pL
4a90: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a  evel->u.in.nIn;.
4aa0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
4ab0: 2e 6e 49 6e 20 2b 3d 20 6e 45 71 3b 0a 20 20 20  .nIn += nEq;.   
4ac0: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
4ad0: 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
4ae0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
4af0: 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
4b00: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
4b10: 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
4b40: 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
4b50: 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
4b60: 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
4b70: 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
4b80: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
4b90: 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e   pIn ){.      in
4ba0: 74 20 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  t iMap = 0;     
4bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4bc0: 65 78 20 69 6e 20 61 69 4d 61 70 5b 5d 20 2a 2f  ex in aiMap[] */
4bd0: 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 69 3b  .      pIn += i;
4be0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 45 71  .      for(i=iEq
4bf0: 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  ;i<pLoop->nLTerm
4c00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4c10: 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
4c20: 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
4c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4c40: 20 69 4f 75 74 20 3d 20 69 52 65 67 20 2b 20 69   iOut = iReg + i
4c50: 20 2d 20 69 45 71 3b 0a 20 20 20 20 20 20 20 20   - iEq;.        
4c60: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
4c70: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
4c80: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
4c90: 61 73 65 28 20 6e 45 71 3e 31 20 29 3b 20 20 2f  ase( nEq>1 );  /
4ca0: 2a 20 48 61 70 70 65 6e 73 20 77 69 74 68 20 61  * Happens with a
4cb0: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 6f 6e   UNIQUE index on
4cc0: 20 52 4f 57 49 44 20 2a 2f 0a 20 20 20 20 20 20   ROWID */.      
4cd0: 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
4ce0: 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
4cf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4d00: 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 4f 75 74  owid, iTab, iOut
4d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
4d20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4d30: 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 4d 61 70  int iCol = aiMap
4d40: 20 3f 20 61 69 4d 61 70 5b 69 4d 61 70 2b 2b 5d   ? aiMap[iMap++]
4d50: 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
4d60: 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
4d70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4d80: 64 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  dOp3(v,OP_Column
4d90: 2c 69 54 61 62 2c 20 69 43 6f 6c 2c 20 69 4f 75  ,iTab, iCol, iOu
4da0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
4db0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4dc0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4dd0: 50 5f 49 73 4e 75 6c 6c 2c 20 69 4f 75 74 29 3b  P_IsNull, iOut);
4de0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4e00: 69 3d 3d 69 45 71 20 29 7b 0a 20 20 20 20 20 20  i==iEq ){.      
4e10: 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
4e20: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = iTab;.        
4e30: 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
4e40: 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
4e50: 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f  PrevIfOpen : OP_
4e60: 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20  NextIfOpen;.    
4e70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4e80: 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 65 45           pIn->eE
4e90: 6e 64 4c 6f 6f 70 4f 70 20 3d 20 4f 50 5f 4e 6f  ndLoopOp = OP_No
4ea0: 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  op;.          }.
4eb0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2b 2b 3b            pIn++;
4ec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ed0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
4ee0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
4ef0: 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
4f00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4f10: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
4f20: 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Map);.#endif.  }
4f30: 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
4f40: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
4f50: 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
4f60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4f70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
4f80: 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
4f90: 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
4fa0: 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
4fb0: 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  x scan..**.** Fo
4fc0: 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
4fd0: 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
4fe0: 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
4ff0: 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
5000: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
5010: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
5020: 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
5030: 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
5040: 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
5050: 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
5060: 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
5070: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5080: 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
5090: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
50a0: 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
50b0: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
50c0: 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
50d0: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
50e0: 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
50f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
5100: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
5110: 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
5120: 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
5130: 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
5140: 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
5150: 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
5160: 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
5170: 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
5180: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5190: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
51a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
51b0: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
51c0: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
51d0: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
51e0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
51f0: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
5200: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
5210: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
5220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
5230: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
5240: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
5250: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
5260: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
5270: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
5280: 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
5290: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
52a0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  ng..**.** The nE
52b0: 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74 65  xtraReg paramete
52c0: 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74  r is 0 or 1.  It
52d0: 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45   is 0 if all WHE
52e0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
52f0: 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20  aints.** are == 
5300: 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f  or IN and are co
5310: 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45 71  vered by the nEq
5320: 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73 20  .  nExtraReg is 
5330: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
5340: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
5350: 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68 20  onstraint (such 
5360: 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44  as the "c>=5 AND
5370: 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78   c<10" in the ex
5380: 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f  ample) that.** o
5390: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
53a0: 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73  nEq quality cons
53b0: 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  traints..**.** T
53c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
53d0: 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66  cates a range of
53e0: 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d   nEq+nExtraReg m
53f0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
5400: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
5410: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
5420: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
5430: 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65   that range. The
5440: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
5450: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
5460: 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
5470: 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73  emory range to s
5480: 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a  tore keys for.**
5490: 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69   start and termi
54a0: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
54b0: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
54c0: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
54d0: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
54e0: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
54f0: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
5500: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
5510: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
5520: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
5530: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
5540: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
5550: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
5560: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
5570: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
5580: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
5590: 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
55a0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
55b0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
55c0: 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
55d0: 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
55e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
55f0: 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
5600: 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
5610: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
5620: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
5630: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5640: 6e 74 73 20 74 68 61 74 20 75 73 65 20 42 4c 4f  nts that use BLO
5650: 42 20 6f 72 20 4e 4f 4e 45 20 61 66 66 69 6e 69  B or NONE affini
5660: 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
5670: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
5680: 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
5690: 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
56a0: 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
56b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
56c0: 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
56d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
56e0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
56f0: 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
5700: 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
5710: 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
5720: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
5730: 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
5740: 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
5750: 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
5760: 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
5780: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
5790: 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
57a0: 42 4c 4f 42 2f 4e 4f 4e 45 20 61 66 66 69 6e 69  BLOB/NONE affini
57b0: 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
57c0: 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
57d0: 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
57e0: 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
57f0: 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
5800: 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
5810: 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
5820: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
5830: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
5840: 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
5850: 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
5860: 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
5870: 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42   to SQLITE_AFF_B
5880: 4c 4f 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOB..*/.static i
5890: 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
58a0: 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
58b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
58c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
58d0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
58e0: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
58f0: 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
5900: 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
5910: 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
5920: 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
5930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
5940: 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  rse the order of
5950: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
5960: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
5970: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
5980: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
5990: 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
59a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
59b0: 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
59c0: 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
59d0: 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
59e0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ring */.){.  u16
59f0: 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5a10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
5a20: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
5a30: 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31   to code */.  u1
5a40: 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  6 nSkip;        
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5a60: 75 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f  umber of left-mo
5a70: 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b  st columns to sk
5a80: 69 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ip */.  Vdbe *v 
5a90: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5aa0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
5ab0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5ac0: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
5ad0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
5af0: 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
5b00: 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
5b10: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
5b20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
5b30: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
5b40: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
5b50: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
5b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5b70: 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
5b80: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
5b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5bb0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5bc0: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5be0: 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
5bf0: 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
5c20: 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
5c30: 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
5c40: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5c50: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
5c60: 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
5c70: 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
5c80: 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
5c90: 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
5ca0: 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
5cb0: 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
5cc0: 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
5cd0: 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
5ce0: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
5cf0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
5d00: 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
5d10: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
5d20: 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20  ee.nEq;.  nSkip 
5d30: 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a  = pLoop->nSkip;.
5d40: 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
5d50: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
5d60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
5d70: 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
5d80: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
5d90: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
5da0: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
5db0: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
5dc0: 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
5dd0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
5de0: 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
5df0: 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
5e00: 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
5e10: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
5e20: 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
5e30: 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
5e40: 65 2d 3e 64 62 2c 73 71 6c 69 74 65 33 49 6e 64  e->db,sqlite3Ind
5e50: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 70 50  exAffinityStr(pP
5e60: 61 72 73 65 2d 3e 64 62 2c 70 49 64 78 29 29 3b  arse->db,pIdx));
5e70: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 21  .  assert( zAff!
5e80: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
5e90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5ea0: 3b 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  ;..  if( nSkip )
5eb0: 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
5ec0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
5ed0: 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
5ee0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
5ef0: 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
5f00: 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
5f10: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5f20: 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
5f30: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5f40: 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
5f50: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
5f60: 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
5f70: 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
5f80: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
5f90: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
5fa0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
5fb0: 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
5fc0: 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
5fd0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5fe0: 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
5ff0: 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a  kLT:OP_SeekGT),.
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
6020: 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
6030: 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62   nSkip);.    Vdb
6040: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
6050: 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
6060: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
6070: 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c  Rev!=0);.    sql
6080: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
6090: 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
60a0: 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
60b0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
60c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
60d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
60e0: 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
60f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6100: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
6110: 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52 20 29 3b 0a  [j]==XN_EXPR );.
6120: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
6130: 74 28 28 76 2c 20 22 25 73 22 2c 20 65 78 70 6c  t((v, "%s", expl
6140: 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61  ainIndexColumnNa
6150: 6d 65 28 70 49 64 78 2c 20 6a 29 29 29 3b 0a 20  me(pIdx, j)));. 
6160: 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20     }.  }    ..  
6170: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
6180: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6190: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
61a0: 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28  rt( zAff==0 || (
61b0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29  int)strlen(zAff)
61c0: 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
61d0: 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a  =nSkip; j<nEq; j
61e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
61f0: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
6200: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
6210: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
6220: 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
6230: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
6240: 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f 72  case is true for
6250: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
6260: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
6270: 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
6280: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
6290: 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
62a0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
62b0: 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
62c0: 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
62d0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
62e0: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
62f0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
6300: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
6310: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6320: 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
6330: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
6340: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
6350: 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67  el, j, bRev, reg
6360: 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
6370: 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
6380: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
6390: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
63a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
63b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
63c0: 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
63d0: 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
63e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6400: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
6410: 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
6420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6430: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
6440: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
6450: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
6460: 72 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73  rm->pExpr->flags
6470: 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
6480: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
6490: 20 61 66 66 69 6e 69 74 79 20 65 76 65 72 20 6e   affinity ever n
64a0: 65 65 64 73 20 74 6f 20 62 65 20 28 6f 72 20 73  eeds to be (or s
64b0: 68 6f 75 6c 64 20 62 65 29 20 61 70 70 6c 69 65  hould be) applie
64c0: 64 20 74 6f 20 61 20 76 61 6c 75 65 0a 20 20 20  d to a value.   
64d0: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
64e0: 20 52 48 53 20 6f 66 20 61 6e 20 22 3f 20 49 4e   RHS of an "? IN
64f0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 65   (SELECT ...)" e
6500: 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 65 20 0a  xpression. The .
6510: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
6520: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
6530: 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65  routine has alre
6540: 61 64 79 20 65 6e 73 75 72 65 64 20 74 68 61 74  ady ensured that
6550: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
6560: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
6570: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 68 61 73 20   comparison has 
6580: 62 65 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  been applied to 
6590: 74 68 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  the value.  */. 
65a0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20         if( zAff 
65b0: 29 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49  ) zAff[j] = SQLI
65c0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
65d0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
65e0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
65f0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
6600: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
6610: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
6620: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
6630: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  t;.      if( (pT
6640: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
6650: 45 52 4d 5f 49 53 29 3d 3d 30 20 26 26 20 73 71  ERM_IS)==0 && sq
6660: 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
6670: 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ll(pRight) ){.  
6680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6690: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
66a0: 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c  Null, regBase+j,
66b0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
66c0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
66d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
66e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41    }.      if( zA
66f0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
6700: 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
6710: 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
6720: 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
6730: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20  E_AFF_BLOB ){.  
6740: 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
6750: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
6760: 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
6770: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6780: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
6790: 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
67a0: 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
67b0: 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
67c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
67d0: 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
67e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
67f0: 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
6800: 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
6810: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
6820: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
6830: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 2f 2a 0a 2a  MATCH_BLOBS./*.*
6840: 2a 20 49 66 20 74 68 65 20 6d 6f 73 74 20 72 65  * If the most re
6850: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
6860: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  truction is a co
6870: 6e 73 74 61 6e 74 20 72 61 6e 67 65 20 63 6f 6e  nstant range con
6880: 73 74 72 61 69 6e 74 0a 2a 2a 20 28 61 20 73 74  straint.** (a st
6890: 72 69 6e 67 20 6c 69 74 65 72 61 6c 29 20 74 68  ring literal) th
68a0: 61 74 20 6f 72 69 67 69 6e 61 74 65 64 20 66 72  at originated fr
68b0: 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  om the LIKE opti
68c0: 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 0a  mization, then .
68d0: 2a 2a 20 73 65 74 20 50 33 20 61 6e 64 20 50 35  ** set P3 and P5
68e0: 20 6f 6e 20 74 68 65 20 4f 50 5f 53 74 72 69 6e   on the OP_Strin
68f0: 67 20 6f 70 63 6f 64 65 20 73 6f 20 74 68 61 74  g opcode so that
6900: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 6c 6c   the string will
6910: 20 62 65 20 63 61 73 74 0a 2a 2a 20 74 6f 20 61   be cast.** to a
6920: 20 42 4c 4f 42 20 61 74 20 61 70 70 72 6f 70 72   BLOB at appropr
6930: 69 61 74 65 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  iate times..**.*
6940: 2a 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  * The LIKE optim
6950: 69 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f 20  ization trys to 
6960: 65 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b 45  evaluate "x LIKE
6970: 20 27 61 62 63 25 27 22 20 61 73 20 61 20 72 61   'abc%'" as a ra
6980: 6e 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nge.** expressio
6990: 6e 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e 44  n: "x>='ABC' AND
69a0: 20 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74 20   x<'abd'".  But 
69b0: 74 68 69 73 20 72 65 71 75 69 72 65 73 20 74 68  this requires th
69c0: 61 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  at the range.** 
69d0: 73 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77  scan loop run tw
69e0: 69 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74  ice, once for st
69f0: 72 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63 6f  rings and a seco
6a00: 6e 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42  nd time for BLOB
6a10: 73 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72  s..** The OP_Str
6a20: 69 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  ing opcodes on t
6a30: 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63  he second pass c
6a40: 6f 6e 76 65 72 74 20 74 68 65 20 75 70 70 65 72  onvert the upper
6a50: 20 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f   and lower.** bo
6a60: 75 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  und string const
6a70: 61 6e 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20  ants to blobs.  
6a80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
6a90: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
6aa0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74   changes.** to t
6ab0: 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63  he OP_String opc
6ac0: 6f 64 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f  odes for that to
6ad0: 20 68 61 70 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45   happen..**.** E
6ae0: 78 63 65 70 74 2c 20 6f 66 20 63 6f 75 72 73 65  xcept, of course
6af0: 2c 20 69 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45  , if SQLITE_LIKE
6b00: 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c  _DOESNT_MATCH_BL
6b10: 4f 42 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20  OBS is defined, 
6b20: 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65  then.** only the
6b30: 20 6f 6e 65 20 70 61 73 73 20 74 68 72 6f 75 67   one pass throug
6b40: 68 20 74 68 65 20 73 74 72 69 6e 67 20 73 70 61  h the string spa
6b50: 63 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ce is required, 
6b60: 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  so this routine.
6b70: 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d  ** becomes a no-
6b80: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
6b90: 69 64 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69  id whereLikeOpti
6ba0: 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69  mizationStringFi
6bb0: 78 75 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  xup(.  Vdbe *v, 
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6bd0: 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  * prepared state
6be0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
6bf0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
6c00: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
6c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
6c20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6c30: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
6c40: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
6c50: 2a 70 54 65 72 6d 20 20 20 20 20 20 20 20 2f 2a  *pTerm        /*
6c60: 20 54 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   The upper or lo
6c70: 77 65 72 20 62 6f 75 6e 64 20 6a 75 73 74 20 63  wer bound just c
6c80: 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  oded */.){.  if(
6c90: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
6ca0: 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
6cb0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
6cc0: 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  p;.    assert( p
6cd0: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
6ce0: 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70  ntr>0 );.    pOp
6cf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6d00: 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  tOp(v, -1);.    
6d10: 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29  assert( pOp!=0 )
6d20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
6d30: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
6d40: 72 69 6e 67 38 20 0a 20 20 20 20 20 20 20 20 20  ring8 .         
6d50: 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 57 43     || pTerm->pWC
6d60: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
6d70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6d80: 65 64 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  ed );.    pOp->p
6d90: 33 20 3d 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  3 = (int)(pLevel
6da0: 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
6db0: 31 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72  1);  /* Register
6dc0: 20 68 6f 6c 64 69 6e 67 20 63 6f 75 6e 74 65 72   holding counter
6dd0: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 35 20   */.    pOp->p5 
6de0: 3d 20 28 75 38 29 28 70 4c 65 76 65 6c 2d 3e 69  = (u8)(pLevel->i
6df0: 4c 69 6b 65 52 65 70 43 6e 74 72 26 31 29 3b 20  LikeRepCntr&1); 
6e00: 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
6e10: 43 20 2a 2f 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  C */.  }.}.#else
6e20: 0a 23 20 64 65 66 69 6e 65 20 77 68 65 72 65 4c  .# define whereL
6e30: 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
6e40: 74 72 69 6e 67 46 69 78 75 70 28 41 2c 42 2c 43  tringFixup(A,B,C
6e50: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ).#endif..#ifdef
6e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
6e70: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
6e80: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * Information is
6e90: 20 70 61 73 73 65 64 20 66 72 6f 6d 20 63 6f 64   passed from cod
6ea0: 65 43 75 72 73 6f 72 48 69 6e 74 28 29 20 64 6f  eCursorHint() do
6eb0: 77 6e 20 74 6f 20 69 6e 64 69 76 69 64 75 61 6c  wn to individual
6ec0: 20 6e 6f 64 65 73 20 6f 66 0a 2a 2a 20 74 68 65   nodes of.** the
6ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6ee0: 20 28 62 79 20 73 71 6c 69 74 65 33 57 61 6c 6b   (by sqlite3Walk
6ef0: 45 78 70 72 28 29 29 20 75 73 69 6e 67 20 61 6e  Expr()) using an
6f00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6f10: 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  s.** structure..
6f20: 2a 2f 0a 73 74 72 75 63 74 20 43 43 75 72 48 69  */.struct CCurHi
6f30: 6e 74 20 7b 0a 20 20 69 6e 74 20 69 54 61 62 43  nt {.  int iTabC
6f40: 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur;    /* Cursor
6f50: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61   for the main ta
6f60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
6f70: 78 43 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73  xCur;    /* Curs
6f80: 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
6f90: 2c 20 69 66 20 70 49 64 78 21 3d 30 2e 20 20 55  , if pIdx!=0.  U
6fa0: 6e 75 73 65 64 20 6f 74 68 65 72 77 69 73 65 20  nused otherwise 
6fb0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
6fc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ;    /* The inde
6fd0: 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
6fe0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
6ff0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7000: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7010: 66 6f 72 20 65 76 65 72 79 20 6e 6f 64 65 20 6f  for every node o
7020: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
7030: 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
7040: 61 74 65 0a 2a 2a 20 66 6f 72 20 61 20 63 75 72  ate.** for a cur
7050: 73 6f 72 20 68 69 6e 74 20 6f 6e 20 61 6e 20 69  sor hint on an i
7060: 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 20 46 6f  ndex cursor.  Fo
7070: 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  r TK_COLUMN node
7080: 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
7090: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 43 43  .** the table CC
70a0: 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20  urHint.iTabCur, 
70b0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
70c0: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  same column can 
70d0: 62 65 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 74  be.** accessed t
70e0: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78  hrough the index
70f0: 2e 20 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 2c  .  If it cannot,
7100: 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65   then set pWalke
7110: 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 2e 0a 2a  r->eCode to 1..*
7120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
7130: 65 43 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b  eCursorHintCheck
7140: 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  Expr(Walker *pWa
7150: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
7160: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 43 43 75  r){.  struct CCu
7170: 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70  rHint *pHint = p
7180: 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48  Walker->u.pCCurH
7190: 69 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  int;.  assert( p
71a0: 48 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20 29 3b  Hint->pIdx!=0 );
71b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
71c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
71d0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
71e0: 3d 70 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 0a  =pHint->iTabCur.
71f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
7200: 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69 6e 74  umnOfIndex(pHint
7210: 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
7220: 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
7230: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
7240: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
7250: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
7260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
7270: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65  whether or not e
7280: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2c  xpression pExpr,
7290: 20 77 68 69 63 68 20 77 61 73 20 70 61 72 74 20   which was part 
72a0: 6f 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  of a WHERE claus
72b0: 65 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  e,.** should be 
72c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
72d0: 63 75 72 73 6f 72 2d 68 69 6e 74 20 66 6f 72 20  cursor-hint for 
72e0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  a table that is 
72f0: 6f 6e 20 74 68 65 20 72 68 73 0a 2a 2a 20 6f 66  on the rhs.** of
7300: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 65   a LEFT JOIN. Se
7310: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 74  t Walker.eCode t
7320: 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 62 65 66 6f 72  o non-zero befor
7330: 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74  e returning if t
7340: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
7350: 6e 20 69 73 20 6e 6f 74 20 73 75 69 74 61 62 6c  n is not suitabl
7360: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 72  e..**.** An expr
7370: 65 73 73 69 6f 6e 20 69 73 20 75 6e 73 75 69 74  ession is unsuit
7380: 61 62 6c 65 20 69 66 20 69 74 20 6d 69 67 68 74  able if it might
7390: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 6e 6f 6e   evaluate to non
73a0: 20 4e 55 4c 4c 20 65 76 65 6e 20 69 66 0a 2a 2a   NULL even if.**
73b0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64   a TK_COLUMN nod
73c0: 65 20 74 68 61 74 20 64 6f 65 73 20 61 66 66 65  e that does affe
73d0: 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
73e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
73f0: 73 20 73 65 74 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  s set.** to NULL
7400: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
7410: 2a 0a 2a 2a 20 20 20 63 6f 6c 20 49 53 20 4e 55  *.**   col IS NU
7420: 4c 4c 0a 2a 2a 20 20 20 63 6f 6c 20 49 53 20 4e  LL.**   col IS N
7430: 4f 54 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f 61  OT NULL.**   coa
7440: 6c 65 73 63 65 28 63 6f 6c 2c 20 31 29 0a 2a 2a  lesce(col, 1).**
7450: 20 20 20 43 41 53 45 20 57 48 45 4e 20 63 6f 6c     CASE WHEN col
7460: 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20 45   THEN 0 ELSE 1 E
7470: 4e 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ND.*/.static int
7480: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49   codeCursorHintI
7490: 73 4f 72 46 75 6e 63 74 69 6f 6e 28 57 61 6c 6b  sOrFunction(Walk
74a0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
74b0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
74c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
74d0: 53 20 0a 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e  S .   || pExpr->
74e0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op==TK_ISNULL ||
74f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
7500: 53 4e 4f 54 20 0a 20 20 20 7c 7c 20 70 45 78 70  SNOT .   || pExp
7510: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
7520: 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  L || pExpr->op==
7530: 54 4b 5f 43 41 53 45 20 0a 20 20 29 7b 0a 20 20  TK_CASE .  ){.  
7540: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
7550: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
7560: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7570: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
7580: 69 6e 74 20 64 31 3b 0a 20 20 20 20 63 68 61 72  int d1;.    char
7590: 20 64 32 5b 34 5d 3b 0a 20 20 20 20 69 66 28 20   d2[4];.    if( 
75a0: 30 3d 3d 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  0==sqlite3IsLike
75b0: 46 75 6e 63 74 69 6f 6e 28 70 57 61 6c 6b 65 72  Function(pWalker
75c0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  ->pParse->db, pE
75d0: 78 70 72 2c 20 26 64 31 2c 20 64 32 29 20 29 7b  xpr, &d1, d2) ){
75e0: 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  .      pWalker->
75f0: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 7d  eCode = 1;.    }
7600: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57  .  }..  return W
7610: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
7620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7630: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
7640: 6e 20 65 76 65 72 79 20 6e 6f 64 65 20 6f 66 20  n every node of 
7650: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
7660: 65 65 20 75 73 65 64 20 61 73 20 61 6e 0a 2a 2a  ee used as an.**
7670: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
7680: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 69   OP_CursorHint i
7690: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 49 66 20 74  nstruction. If t
76a0: 68 65 20 6e 6f 64 65 20 69 73 20 61 20 54 4b 5f  he node is a TK_
76b0: 43 4f 4c 55 4d 4e 0a 2a 2a 20 74 68 61 74 20 61  COLUMN.** that a
76c0: 63 63 65 73 73 65 73 20 61 6e 79 20 74 61 62 6c  ccesses any tabl
76d0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  e other than the
76e0: 20 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 64 20   one identified 
76f0: 62 79 0a 2a 2a 20 43 43 75 72 48 69 6e 74 2e 69  by.** CCurHint.i
7700: 54 61 62 43 75 72 2c 20 74 68 65 6e 20 64 6f 20  TabCur, then do 
7710: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
7720: 2a 0a 2a 2a 20 20 20 31 29 20 61 6c 6c 6f 63 61  *.**   1) alloca
7730: 74 65 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  te a register an
7740: 64 20 63 6f 64 65 20 61 6e 20 4f 50 5f 43 6f 6c  d code an OP_Col
7750: 75 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  umn instruction 
7760: 74 6f 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  to read .**     
7770: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
7780: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 74 68 65 20 6e  olumn into the n
7790: 65 77 20 72 65 67 69 73 74 65 72 2c 20 61 6e 64  ew register, and
77a0: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 74 72 61 6e  .**.**   2) tran
77b0: 73 66 6f 72 6d 20 74 68 65 20 65 78 70 72 65 73  sform the expres
77c0: 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
77d0: 4b 5f 52 45 47 49 53 54 45 52 20 6e 6f 64 65 20  K_REGISTER node 
77e0: 74 68 61 74 20 72 65 61 64 73 20 0a 2a 2a 20 20  that reads .**  
77f0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 6e 65 77      from the new
7800: 6c 79 20 70 6f 70 75 6c 61 74 65 64 20 72 65 67  ly populated reg
7810: 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ister..**.** Als
7820: 6f 2c 20 69 66 20 74 68 65 20 6e 6f 64 65 20 69  o, if the node i
7830: 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  s a TK_COLUMN th
7840: 61 74 20 64 6f 65 73 20 61 63 63 65 73 73 20 74  at does access t
7850: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 69 66 69  he table idenifi
7860: 65 64 0a 2a 2a 20 62 79 20 70 43 43 75 72 48 69  ed.** by pCCurHi
7870: 6e 74 2e 69 54 61 62 43 75 72 2c 20 61 6e 64 20  nt.iTabCur, and 
7880: 61 6e 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  an index is bein
7890: 67 20 75 73 65 64 20 28 77 68 69 63 68 20 77 65  g used (which we
78a0: 20 77 69 6c 6c 0a 2a 2a 20 6b 6e 6f 77 20 62 65   will.** know be
78b0: 63 61 75 73 65 20 43 43 75 72 48 69 6e 74 2e 70  cause CCurHint.p
78c0: 49 64 78 21 3d 30 29 20 74 68 65 6e 20 74 72 61  Idx!=0) then tra
78d0: 6e 73 66 6f 72 6d 20 74 68 65 20 54 4b 5f 43 4f  nsform the TK_CO
78e0: 4c 55 4d 4e 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  LUMN into.** an 
78f0: 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 69 6e  access of the in
7900: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20  dex rather than 
7910: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62  the original tab
7920: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7930: 74 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  t codeCursorHint
7940: 46 69 78 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  FixExpr(Walker *
7950: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
7960: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  Expr){.  int rc 
7970: 3d 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  = WRC_Continue;.
7980: 20 20 73 74 72 75 63 74 20 43 43 75 72 48 69 6e    struct CCurHin
7990: 74 20 2a 70 48 69 6e 74 20 3d 20 70 57 61 6c 6b  t *pHint = pWalk
79a0: 65 72 2d 3e 75 2e 70 43 43 75 72 48 69 6e 74 3b  er->u.pCCurHint;
79b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
79c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
79d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
79e0: 61 62 6c 65 21 3d 70 48 69 6e 74 2d 3e 69 54 61  able!=pHint->iTa
79f0: 62 43 75 72 20 29 7b 0a 20 20 20 20 20 20 56 64  bCur ){.      Vd
7a00: 62 65 20 2a 76 20 3d 20 70 57 61 6c 6b 65 72 2d  be *v = pWalker-
7a10: 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
7a20: 20 20 20 20 20 20 69 6e 74 20 72 65 67 20 3d 20        int reg = 
7a30: 2b 2b 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  ++pWalker->pPars
7a40: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f 2a 20 52 65  e->nMem;   /* Re
7a50: 67 69 73 74 65 72 20 66 6f 72 20 63 6f 6c 75 6d  gister for colum
7a60: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  n value */.     
7a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7a80: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
7a90: 28 0a 20 20 20 20 20 20 20 20 20 20 76 2c 20 70  (.          v, p
7aa0: 45 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78 70  Expr->pTab, pExp
7ab0: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
7ac0: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72 65 67 0a 20  ->iColumn, reg. 
7ad0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 45       );.      pE
7ae0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
7af0: 49 53 54 45 52 3b 0a 20 20 20 20 20 20 70 45 78  ISTER;.      pEx
7b00: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 65 67  pr->iTable = reg
7b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7b20: 70 48 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20 29  pHint->pIdx!=0 )
7b30: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
7b40: 54 61 62 6c 65 20 3d 20 70 48 69 6e 74 2d 3e 69  Table = pHint->i
7b50: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 45  IdxCur;.      pE
7b60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 73  xpr->iColumn = s
7b70: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
7b80: 64 65 78 28 70 48 69 6e 74 2d 3e 70 49 64 78 2c  dex(pHint->pIdx,
7b90: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
7ba0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7bb0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7bc0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
7bd0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
7be0: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
7bf0: 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 61  N ){.    /* An a
7c00: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7c10: 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  n in the WHERE c
7c20: 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79  lause of a query
7c30: 20 6d 65 61 6e 73 20 74 68 69 73 20 6d 75 73 74   means this must
7c40: 0a 20 20 20 20 2a 2a 20 62 65 20 61 20 63 6f 72  .    ** be a cor
7c50: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
7c60: 79 2c 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  y, and expressio
7c70: 6e 20 70 45 78 70 72 20 69 73 20 61 6e 20 61 67  n pExpr is an ag
7c80: 67 72 65 67 61 74 65 20 66 72 6f 6d 0a 20 20 20  gregate from.   
7c90: 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 63   ** the parent c
7ca0: 6f 6e 74 65 78 74 2e 20 44 6f 20 6e 6f 74 20 77  ontext. Do not w
7cb0: 61 6c 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  alk the function
7cc0: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68   arguments in th
7cd0: 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
7ce0: 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 49 74 20      ** todo: It 
7cf0: 73 68 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62  should be possib
7d00: 6c 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  le to replace th
7d10: 69 73 20 6e 6f 64 65 20 77 69 74 68 20 61 20 54  is node with a T
7d20: 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 20 2a  K_REGISTER.    *
7d30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 61 73  * expression, as
7d40: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
7d50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  he expression mu
7d60: 73 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  st be stored in 
7d70: 61 20 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  a .    ** regist
7d80: 65 72 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  er at this point
7d90: 2e 20 54 68 65 20 73 61 6d 65 20 68 6f 6c 64 73  . The same holds
7da0: 20 66 6f 72 20 54 4b 5f 41 47 47 5f 43 4f 4c 55   for TK_AGG_COLU
7db0: 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f 0a 20 20 20  MN nodes. */.   
7dc0: 20 72 63 20 3d 20 57 52 43 5f 50 72 75 6e 65 3b   rc = WRC_Prune;
7dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
7df0: 74 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  t an OP_CursorHi
7e00: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
7e10: 66 20 69 74 20 69 73 20 61 70 70 72 6f 70 72 69  f it is appropri
7e20: 61 74 65 20 74 6f 20 64 6f 20 73 6f 2e 0a 2a 2f  ate to do so..*/
7e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
7e40: 65 43 75 72 73 6f 72 48 69 6e 74 28 0a 20 20 73  eCursorHint(.  s
7e50: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7e60: 65 6d 20 2a 70 54 61 62 49 74 65 6d 2c 20 20 2f  em *pTabItem,  /
7e70: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 74  * FROM clause it
7e80: 65 6d 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  em */.  WhereInf
7e90: 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
7ea0: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
7eb0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
7ec0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
7ed0: 57 68 69 63 68 20 6c 6f 6f 70 20 74 6f 20 70 72  Which loop to pr
7ee0: 6f 76 69 64 65 20 68 69 6e 74 73 20 66 6f 72 20  ovide hints for 
7ef0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7f00: 70 45 6e 64 52 61 6e 67 65 20 20 2f 2a 20 48 69  pEndRange  /* Hi
7f10: 6e 74 20 74 68 69 73 20 65 6e 64 2d 6f 66 2d 73  nt this end-of-s
7f20: 63 61 6e 20 62 6f 75 6e 64 61 72 79 20 74 65 72  can boundary ter
7f30: 6d 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  m if not NULL */
7f40: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
7f50: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
7f60: 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
7f70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7f80: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
7f90: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
7fa0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 30 3b 0a  xpr *pExpr = 0;.
7fb0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
7fc0: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
7fd0: 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
7fe0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7ff0: 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
8000: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
8010: 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 43 43  , j;.  struct CC
8020: 75 72 48 69 6e 74 20 73 48 69 6e 74 3b 0a 20 20  urHint sHint;.  
8030: 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a  Walker sWalker;.
8040: 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
8050: 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
8060: 53 51 4c 49 54 45 5f 43 75 72 73 6f 72 48 69 6e  SQLITE_CursorHin
8070: 74 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ts) ) return;.  
8080: 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
8090: 54 61 62 43 75 72 3b 0a 20 20 61 73 73 65 72 74  TabCur;.  assert
80a0: 28 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e  ( iCur==pWInfo->
80b0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
80c0: 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
80d0: 6f 72 20 29 3b 0a 20 20 73 48 69 6e 74 2e 69 54  or );.  sHint.iT
80e0: 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
80f0: 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20 3d 20  sHint.iIdxCur = 
8100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
8110: 0a 20 20 73 48 69 6e 74 2e 70 49 64 78 20 3d 20  .  sHint.pIdx = 
8120: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
8130: 49 6e 64 65 78 3b 0a 20 20 6d 65 6d 73 65 74 28  Index;.  memset(
8140: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
8150: 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
8160: 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
8170: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
8180: 6b 65 72 2e 75 2e 70 43 43 75 72 48 69 6e 74 20  ker.u.pCCurHint 
8190: 3d 20 26 73 48 69 6e 74 3b 0a 20 20 70 57 43 20  = &sHint;.  pWC 
81a0: 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
81b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43    for(i=0; i<pWC
81c0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
81d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
81e0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  >a[i];.    if( p
81f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8200: 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
8210: 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
8220: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8230: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
8240: 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
8250: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  y ) continue;.. 
8260: 20 20 20 2f 2a 20 41 6e 79 20 74 65 72 6d 73 20     /* Any terms 
8270: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
8280: 74 20 6f 66 20 74 68 65 20 4f 4e 28 2e 2e 2e 29  t of the ON(...)
8290: 20 63 6c 61 75 73 65 20 66 6f 72 20 61 6e 79 20   clause for any 
82a0: 4c 45 46 54 20 0a 20 20 20 20 2a 2a 20 4a 4f 49  LEFT .    ** JOI
82b0: 4e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  N for which the 
82c0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 69 73  current table is
82d0: 20 6e 6f 74 20 74 68 65 20 72 68 73 20 61 72 65   not the rhs are
82e0: 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 2a 2a 20   omitted.    ** 
82f0: 66 72 6f 6d 20 74 68 65 20 63 75 72 73 6f 72 2d  from the cursor-
8300: 68 69 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  hint. .    **.  
8310: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 74 61 62    ** If this tab
8320: 6c 65 20 69 73 20 74 68 65 20 72 68 73 20 6f 66  le is the rhs of
8330: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 22 49   a LEFT JOIN, "I
8340: 53 22 20 6f 72 20 22 49 53 20 4e 55 4c 4c 22 20  S" or "IS NULL" 
8350: 74 65 72 6d 73 20 0a 20 20 20 20 2a 2a 20 74 68  terms .    ** th
8360: 61 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  at were specifie
8370: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
8380: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 75   WHERE clause mu
8390: 73 74 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  st be excluded..
83a0: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 74      ** This is t
83b0: 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 66 6f  o address the fo
83c0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  llowing:.    **.
83d0: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
83e0: 2e 2e 2e 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ... t1 LEFT JOIN
83f0: 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d 74 32 2e   t2 ON (t1.a=t2.
8400: 62 29 20 57 48 45 52 45 20 74 32 2e 63 20 49 53  b) WHERE t2.c IS
8410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a 2a 0a 20 20   NULL;.    **.  
8420: 20 20 2a 2a 20 53 61 79 20 74 68 65 72 65 20 69    ** Say there i
8430: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  s a single row i
8440: 6e 20 74 32 20 74 68 61 74 20 6d 61 74 63 68 65  n t2 that matche
8450: 73 20 28 74 31 2e 61 3d 74 32 2e 62 29 2c 20 62  s (t1.a=t2.b), b
8460: 75 74 20 69 74 73 0a 20 20 20 20 2a 2a 20 74 32  ut its.    ** t2
8470: 2e 63 20 76 61 6c 75 65 73 20 69 73 20 6e 6f 74  .c values is not
8480: 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 28 74   NULL. If the (t
8490: 32 2e 63 20 49 53 20 4e 55 4c 4c 29 20 63 6f 6e  2.c IS NULL) con
84a0: 73 74 72 61 69 6e 74 20 69 73 20 0a 20 20 20 20  straint is .    
84b0: 2a 2a 20 70 75 73 68 65 64 20 64 6f 77 6e 20 74  ** pushed down t
84c0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  o the cursor, th
84d0: 69 73 20 72 6f 77 20 69 73 20 66 69 6c 74 65 72  is row is filter
84e0: 65 64 20 6f 75 74 2c 20 63 61 75 73 69 6e 67 0a  ed out, causing.
84f0: 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 74 6f      ** SQLite to
8500: 20 73 79 6e 74 68 65 73 69 7a 65 20 61 20 72 6f   synthesize a ro
8510: 77 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  w of NULL values
8520: 2e 20 57 68 69 63 68 20 64 6f 65 73 20 6d 61 74  . Which does mat
8530: 63 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48  ch the.    ** WH
8540: 45 52 45 20 63 6c 61 75 73 65 2c 20 61 6e 64 20  ERE clause, and 
8550: 73 6f 20 74 68 65 20 71 75 65 72 79 20 72 65 74  so the query ret
8560: 75 72 6e 73 20 61 20 72 6f 77 2e 20 57 68 69 63  urns a row. Whic
8570: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
8580: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
8590: 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f  r the same reaso
85a0: 6e 2c 20 57 48 45 52 45 20 74 65 72 6d 73 20 73  n, WHERE terms s
85b0: 75 63 68 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20  uch as:.    **. 
85c0: 20 20 20 2a 2a 20 20 20 57 48 45 52 45 20 31 20     **   WHERE 1 
85d0: 3d 20 28 74 32 2e 63 20 49 53 20 4e 55 4c 4c 29  = (t2.c IS NULL)
85e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 61  .    **.    ** a
85f0: 72 65 20 61 6c 73 6f 20 65 78 63 6c 75 64 65 64  re also excluded
8600: 2e 20 53 65 65 20 63 6f 64 65 43 75 72 73 6f 72  . See codeCursor
8610: 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e  HintIsOrFunction
8620: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
8630: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8640: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  TabItem->fg.join
8650: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
8660: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
8670: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
8680: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  pr;.      if( !E
8690: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86a0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
86b0: 6e 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  n) .       || pE
86c0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
86d0: 61 62 6c 65 21 3d 70 54 61 62 49 74 65 6d 2d 3e  able!=pTabItem->
86e0: 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 29 7b  iCursor.      ){
86f0: 0a 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65 72  .        sWalker
8700: 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  .eCode = 0;.    
8710: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
8720: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
8730: 43 75 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75  CursorHintIsOrFu
8740: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  nction;.        
8750: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
8760: 26 73 57 61 6c 6b 65 72 2c 20 70 54 65 72 6d 2d  &sWalker, pTerm-
8770: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
8780: 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f   if( sWalker.eCo
8790: 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
87a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
87b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  {.      if( Expr
87c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
87d0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
87e0: 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
87f0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
8800: 20 41 6c 6c 20 74 65 72 6d 73 20 69 6e 20 70 57   All terms in pW
8810: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 65  Loop->aLTerm[] e
8820: 78 63 65 70 74 20 70 45 6e 64 52 61 6e 67 65 20  xcept pEndRange 
8830: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6e 69 74  are used to init
8840: 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 74 68  ialize.    ** th
8850: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 73 65  e cursor.  These
8860: 20 74 65 72 6d 73 20 61 72 65 20 6e 6f 74 20 6e   terms are not n
8870: 65 65 64 65 64 20 61 73 20 68 69 6e 74 73 20 66  eeded as hints f
8880: 6f 72 20 61 20 70 75 72 65 20 72 61 6e 67 65 0a  or a pure range.
8890: 20 20 20 20 2a 2a 20 73 63 61 6e 20 28 74 68 61      ** scan (tha
88a0: 74 20 68 61 73 20 6e 6f 20 3d 3d 20 74 65 72 6d  t has no == term
88b0: 73 29 20 73 6f 20 6f 6d 69 74 20 74 68 65 6d 2e  s) so omit them.
88c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
88d0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  p->u.btree.nEq==
88e0: 30 20 26 26 20 70 54 65 72 6d 21 3d 70 45 6e 64  0 && pTerm!=pEnd
88f0: 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 66  Range ){.      f
8900: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d  or(j=0; j<pLoop-
8910: 3e 6e 4c 54 65 72 6d 20 26 26 20 70 4c 6f 6f 70  >nLTerm && pLoop
8920: 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21 3d 70 54 65  ->aLTerm[j]!=pTe
8930: 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  rm; j++){}.     
8940: 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c   if( j<pLoop->nL
8950: 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
8960: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
8970: 6f 20 73 75 62 71 75 65 72 69 65 73 20 6f 72 20  o subqueries or 
8980: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
8990: 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  c functions allo
89a0: 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  wed */.    if( s
89b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69  qlite3ExprContai
89c0: 6e 73 53 75 62 71 75 65 72 79 28 70 54 65 72 6d  nsSubquery(pTerm
89d0: 2d 3e 70 45 78 70 72 29 20 29 20 63 6f 6e 74 69  ->pExpr) ) conti
89e0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  nue;..    /* For
89f0: 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
8a00: 6d 61 6b 65 20 73 75 72 65 20 72 65 66 65 72 65  make sure refere
8a10: 6e 63 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  nced columns are
8a20: 20 61 63 74 75 61 6c 6c 79 20 69 6e 0a 20 20 20   actually in.   
8a30: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   ** the index. *
8a40: 2f 0a 20 20 20 20 69 66 28 20 73 48 69 6e 74 2e  /.    if( sHint.
8a50: 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
8a60: 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 3d   sWalker.eCode =
8a70: 20 30 3b 0a 20 20 20 20 20 20 73 57 61 6c 6b 65   0;.      sWalke
8a80: 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
8a90: 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  = codeCursorHint
8aa0: 43 68 65 63 6b 45 78 70 72 3b 0a 20 20 20 20 20  CheckExpr;.     
8ab0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
8ac0: 28 26 73 57 61 6c 6b 65 72 2c 20 70 54 65 72 6d  (&sWalker, pTerm
8ad0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
8ae0: 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64  if( sWalker.eCod
8af0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
8b10: 65 20 73 75 72 76 69 76 65 20 61 6c 6c 20 70 72  e survive all pr
8b20: 69 6f 72 20 74 65 73 74 73 2c 20 74 68 61 74 20  ior tests, that 
8b30: 6d 65 61 6e 73 20 74 68 69 73 20 74 65 72 6d 20  means this term 
8b40: 69 73 20 77 6f 72 74 68 20 68 69 6e 74 69 6e 67  is worth hinting
8b50: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 20 3d 20   */.    pExpr = 
8b60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
8b70: 62 2c 20 70 45 78 70 72 2c 20 73 71 6c 69 74 65  b, pExpr, sqlite
8b80: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 65  3ExprDup(db, pTe
8b90: 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 29 3b 0a  rm->pExpr, 0));.
8ba0: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 21    }.  if( pExpr!
8bb0: 3d 30 20 29 7b 0a 20 20 20 20 73 57 61 6c 6b 65  =0 ){.    sWalke
8bc0: 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
8bd0: 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  = codeCursorHint
8be0: 46 69 78 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  FixExpr;.    sql
8bf0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57  ite3WalkExpr(&sW
8c00: 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 20  alker, pExpr);. 
8c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c20: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 75 72 73 6f  dOp4(v, OP_Curso
8c30: 72 48 69 6e 74 2c 20 0a 20 20 20 20 20 20 20 20  rHint, .        
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
8c50: 48 69 6e 74 2e 70 49 64 78 20 3f 20 73 48 69 6e  Hint.pIdx ? sHin
8c60: 74 2e 69 49 64 78 43 75 72 20 3a 20 73 48 69 6e  t.iIdxCur : sHin
8c70: 74 2e 69 54 61 62 43 75 72 29 2c 20 30 2c 20 30  t.iTabCur), 0, 0
8c80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c90: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
8ca0: 68 61 72 2a 29 70 45 78 70 72 2c 20 50 34 5f 45  har*)pExpr, P4_E
8cb0: 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  XPR);.  }.}.#els
8cc0: 65 0a 23 20 64 65 66 69 6e 65 20 63 6f 64 65 43  e.# define codeC
8cd0: 75 72 73 6f 72 48 69 6e 74 28 41 2c 42 2c 43 2c  ursorHint(A,B,C,
8ce0: 44 29 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a  D)  /* No-op */.
8cf0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8d00: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8d10: 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  INTS */../*.** C
8d20: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
8d30: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
8d40: 62 2d 74 72 65 65 20 28 61 20 74 61 62 6c 65 29  b-tree (a table)
8d50: 2e 20 52 65 67 69 73 74 65 72 20 69 52 6f 77 69  . Register iRowi
8d60: 64 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  d contains.** a 
8d70: 72 6f 77 69 64 20 76 61 6c 75 65 20 6a 75 73 74  rowid value just
8d80: 20 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f   read from curso
8d90: 72 20 69 49 64 78 43 75 72 2c 20 6f 70 65 6e 20  r iIdxCur, open 
8da0: 6f 6e 20 69 6e 64 65 78 20 70 49 64 78 2e 20 54  on index pIdx. T
8db0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8dc0: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
8dd0: 6f 20 64 6f 20 61 20 64 65 66 65 72 72 65 64 20  o do a deferred 
8de0: 73 65 65 6b 20 6f 66 20 63 75 72 73 6f 72 20 69  seek of cursor i
8df0: 43 75 72 20 74 6f 20 74 68 65 20 0a 2a 2a 20 72  Cur to the .** r
8e00: 6f 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20 72  owid stored in r
8e10: 65 67 69 73 74 65 72 20 69 52 6f 77 69 64 2e 0a  egister iRowid..
8e20: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
8e30: 74 68 69 73 20 69 73 20 6a 75 73 74 3a 0a 2a 2a  this is just:.**
8e40: 0a 2a 2a 20 20 20 4f 50 5f 44 65 66 65 72 72 65  .**   OP_Deferre
8e50: 64 53 65 65 6b 20 24 69 43 75 72 20 24 69 52 6f  dSeek $iCur $iRo
8e60: 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  wid.**.** Howeve
8e70: 72 2c 20 69 66 20 74 68 65 20 73 63 61 6e 20 63  r, if the scan c
8e80: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
8e90: 6f 64 65 64 20 69 73 20 61 20 62 72 61 6e 63 68  oded is a branch
8ea0: 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f 6f 70 20 61   of an OR-loop a
8eb0: 6e 64 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  nd.** the statem
8ec0: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ent currently be
8ed0: 69 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20 53  ing coded is a S
8ee0: 45 4c 45 43 54 2c 20 74 68 65 6e 20 50 33 20 6f  ELECT, then P3 o
8ef0: 66 20 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65  f OP_DeferredSee
8f00: 6b 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 69  k.** is set to i
8f10: 49 64 78 43 75 72 20 61 6e 64 20 50 34 20 69 73  IdxCur and P4 is
8f20: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
8f30: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
8f40: 65 67 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  egers.** contain
8f50: 69 6e 67 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f  ing one entry fo
8f60: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
8f70: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
8f80: 72 20 69 43 75 72 20 69 73 20 6f 70 65 6e 20 0a  r iCur is open .
8f90: 2a 2a 20 6f 6e 2e 20 46 6f 72 20 65 61 63 68 20  ** on. For each 
8fa0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  table column, if
8fb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74   the column is t
8fc0: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
8fd0: 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 2c  f the .** index,
8fe0: 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
8ff0: 70 6f 6e 64 69 6e 67 20 61 72 72 61 79 20 65 6e  ponding array en
9000: 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 28 69  try is set to (i
9010: 2b 31 29 2e 20 49 66 20 74 68 65 20 63 6f 6c 75  +1). If the colu
9020: 6d 6e 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61  mn.** does not a
9030: 70 70 65 61 72 20 69 6e 20 74 68 65 20 69 6e 64  ppear in the ind
9040: 65 78 20 61 74 20 61 6c 6c 2c 20 74 68 65 20 61  ex at all, the a
9050: 72 72 61 79 20 65 6e 74 72 79 20 69 73 20 73 65  rray entry is se
9060: 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
9070: 63 20 76 6f 69 64 20 63 6f 64 65 44 65 66 65 72  c void codeDefer
9080: 72 65 64 53 65 65 6b 28 0a 20 20 57 68 65 72 65  redSeek(.  Where
9090: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
90a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
90b0: 65 72 65 20 63 6c 61 75 73 65 20 63 6f 6e 74 65  ere clause conte
90c0: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
90d0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
90e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
90f0: 20 73 63 61 6e 20 69 73 20 75 73 69 6e 67 20 2a   scan is using *
9100: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
9130: 72 20 49 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a  r IPK b-tree */.
9140: 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 20 2f 2a 20 49 6e 64 65 78 20 63 75 72 73 6f    /* Index curso
9170: 72 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  r */.){.  Parse 
9180: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
9190: 2d 3e 70 50 61 72 73 65 3b 20 2f 2a 20 50 61 72  ->pParse; /* Par
91a0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
91b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
91c0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
91d0: 2f 2a 20 56 64 62 65 20 74 6f 20 67 65 6e 65 72  /* Vdbe to gener
91e0: 61 74 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  ate code within 
91f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 49  */..  assert( iI
9200: 64 78 43 75 72 3e 30 20 29 3b 0a 20 20 61 73 73  dxCur>0 );.  ass
9210: 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
9220: 75 6d 6e 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  umn[pIdx->nColum
9230: 6e 2d 31 5d 3d 3d 2d 31 20 29 3b 0a 20 20 0a 20  n-1]==-1 );.  . 
9240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9250: 70 33 28 76 2c 20 4f 50 5f 44 65 66 65 72 72 65  p3(v, OP_Deferre
9260: 64 53 65 65 6b 2c 20 69 49 64 78 43 75 72 2c 20  dSeek, iIdxCur, 
9270: 30 2c 20 69 43 75 72 29 3b 0a 20 20 69 66 28 20  0, iCur);.  if( 
9280: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
9290: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
92a0: 55 42 43 4c 41 55 53 45 29 0a 20 20 20 26 26 20  UBCLAUSE).   && 
92b0: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 73 71  DbMaskAllZero(sq
92c0: 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
92d0: 65 6c 28 70 50 61 72 73 65 29 2d 3e 77 72 69 74  el(pParse)->writ
92e0: 65 4d 61 73 6b 29 0a 20 20 29 7b 0a 20 20 20 20  eMask).  ){.    
92f0: 69 6e 74 20 69 3b 0a 20 20 20 20 54 61 62 6c 65  int i;.    Table
9300: 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
9310: 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 2a  Table;.    int *
9320: 61 69 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ai = (int*)sqlit
9330: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
9340: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
9350: 66 28 69 6e 74 29 2a 28 70 54 61 62 2d 3e 6e 43  f(int)*(pTab->nC
9360: 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20  ol+1));.    if( 
9370: 61 69 20 29 7b 0a 20 20 20 20 20 20 61 69 5b 30  ai ){.      ai[0
9380: 5d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  ] = pTab->nCol;.
9390: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
93a0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  <pIdx->nColumn-1
93b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
93c0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
93d0: 43 6f 6c 75 6d 6e 5b 69 5d 3c 70 54 61 62 2d 3e  Column[i]<pTab->
93e0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
93f0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
9400: 6d 6e 5b 69 5d 3e 3d 30 20 29 20 61 69 5b 70 49  mn[i]>=0 ) ai[pI
9410: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2b  dx->aiColumn[i]+
9420: 31 5d 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  1] = i+1;.      
9430: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
9440: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
9450: 31 2c 20 28 63 68 61 72 2a 29 61 69 2c 20 50 34  1, (char*)ai, P4
9460: 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20 20  _INTARRAY);.    
9470: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
9480: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9490: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
94a0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
94b0: 73 20 61 20 76 65 63 74 6f 72 2c 20 67 65 6e 65  s a vector, gene
94c0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rate.** code to 
94d0: 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
94e0: 6e 52 65 67 20 65 6c 65 6d 65 6e 74 73 20 6f 66  nReg elements of
94f0: 20 74 68 65 20 76 65 63 74 6f 72 20 69 6e 74 6f   the vector into
9500: 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20   an array.** of 
9510: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
9520: 6e 67 20 77 69 74 68 20 69 52 65 67 2e 0a 2a 2a  ng with iReg..**
9530: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9540: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76  ssion is not a v
9550: 65 63 74 6f 72 2c 20 74 68 65 6e 20 6e 52 65 67  ector, then nReg
9560: 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
9570: 31 2e 20 49 6e 0a 2a 2a 20 74 68 69 73 20 63 61  1. In.** this ca
9580: 73 65 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  se, generate cod
9590: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
95a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
95b0: 20 6c 65 61 76 65 20 74 68 65 0a 2a 2a 20 72 65   leave the.** re
95c0: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
95d0: 20 69 52 65 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   iReg..*/.static
95e0: 20 76 6f 69 64 20 63 6f 64 65 45 78 70 72 4f 72   void codeExprOr
95f0: 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
9600: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
9610: 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
9620: 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  g){.  assert( nR
9630: 65 67 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 20  eg>0 );.  if( p 
9640: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
9650: 56 65 63 74 6f 72 28 70 29 20 29 7b 0a 23 69 66  Vector(p) ){.#if
9660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9670: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 69 66  _SUBQUERY.    if
9680: 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
9690: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
96a0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
96b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
96c0: 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 20      int iSelect 
96d0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
96e0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
96f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
9700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9710: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 53 65  (v, OP_Copy, iSe
9720: 6c 65 63 74 2c 20 69 52 65 67 2c 20 6e 52 65 67  lect, iReg, nReg
9730: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  -1);.    }else.#
9740: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
9750: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
9760: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9770: 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20   p->x.pList;.   
9780: 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3c     assert( nReg<
9790: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  =pList->nExpr );
97a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
97b0: 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nReg; i++){.  
97c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
97d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
97e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
97f0: 20 69 52 65 67 2b 69 29 3b 0a 20 20 20 20 20 20   iReg+i);.      
9800: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
9810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
9820: 67 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  g==1 );.    sqli
9830: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9840: 73 65 2c 20 70 2c 20 69 52 65 67 29 3b 0a 20 20  se, p, iReg);.  
9850: 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61  }.}../* An insta
9860: 6e 63 65 20 6f 66 20 74 68 65 20 49 64 78 45 78  nce of the IdxEx
9870: 70 72 54 72 61 6e 73 20 6f 62 6a 65 63 74 20 63  prTrans object c
9880: 61 72 72 69 65 73 20 69 6e 66 6f 72 6d 61 74 69  arries informati
9890: 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 6d 61  on about a.** ma
98a0: 70 70 69 6e 67 20 66 72 6f 6d 20 61 6e 20 65 78  pping from an ex
98b0: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 61 62 6c  pression on tabl
98c0: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 74 6f 20 61  e columns into a
98d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 20 69 6e   column in an in
98e0: 64 65 78 0a 2a 2a 20 64 6f 77 6e 20 74 68 72 6f  dex.** down thro
98f0: 75 67 68 20 74 68 65 20 57 61 6c 6b 65 72 2e 0a  ugh the Walker..
9900: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
9910: 74 20 49 64 78 45 78 70 72 54 72 61 6e 73 20 7b  t IdxExprTrans {
9920: 0a 20 20 45 78 70 72 20 2a 70 49 64 78 45 78 70  .  Expr *pIdxExp
9930: 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  r;    /* The ind
9940: 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex expression */
9950: 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20  .  int iTabCur; 
9960: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
9970: 73 6f 72 20 6f 66 20 74 68 65 20 63 6f 72 72 65  sor of the corre
9980: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a  sponding table *
9990: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b  /.  int iIdxCur;
99a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
99b0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
99c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ex */.  int iIdx
99d0: 43 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Col;       /* Th
99e0: 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74 68 65  e column for the
99f0: 20 69 6e 64 65 78 20 2a 2f 0a 7d 20 49 64 78 45   index */.} IdxE
9a00: 78 70 72 54 72 61 6e 73 3b 0a 0a 2f 2a 20 54 68  xprTrans;../* Th
9a10: 65 20 77 61 6c 6b 65 72 20 6e 6f 64 65 20 63 61  e walker node ca
9a20: 6c 6c 62 61 63 6b 20 75 73 65 64 20 74 6f 20 74  llback used to t
9a30: 72 61 6e 73 66 6f 72 6d 20 6d 61 74 63 68 69 6e  ransform matchin
9a40: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  g expressions in
9a50: 74 6f 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  to.** a referenc
9a60: 65 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 63 6f  e to an index co
9a70: 6c 75 6d 6e 20 66 6f 72 20 61 6e 20 69 6e 64 65  lumn for an inde
9a80: 78 20 6f 6e 20 61 6e 20 65 78 70 72 65 73 73 69  x on an expressi
9a90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  on..**.** If pEx
9aa0: 70 72 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e  pr matches, then
9ab0: 20 74 72 61 6e 73 66 6f 72 6d 20 69 74 20 69 6e   transform it in
9ac0: 74 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  to a reference t
9ad0: 6f 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  o the index colu
9ae0: 6d 6e 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  mn.** that conta
9af0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
9b00: 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69   pExpr..*/.stati
9b10: 63 20 69 6e 74 20 77 68 65 72 65 49 6e 64 65 78  c int whereIndex
9b20: 45 78 70 72 54 72 61 6e 73 4e 6f 64 65 28 57 61  ExprTransNode(Wa
9b30: 6c 6b 65 72 20 2a 70 2c 20 45 78 70 72 20 2a 70  lker *p, Expr *p
9b40: 45 78 70 72 29 7b 0a 20 20 49 64 78 45 78 70 72  Expr){.  IdxExpr
9b50: 54 72 61 6e 73 20 2a 70 58 20 3d 20 70 2d 3e 75  Trans *pX = p->u
9b60: 2e 70 49 64 78 54 72 61 6e 73 3b 0a 20 20 69 66  .pIdxTrans;.  if
9b70: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
9b80: 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70  pare(0, pExpr, p
9b90: 58 2d 3e 70 49 64 78 45 78 70 72 2c 20 70 58 2d  X->pIdxExpr, pX-
9ba0: 3e 69 54 61 62 43 75 72 29 3d 3d 30 20 29 7b 0a  >iTabCur)==0 ){.
9bb0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
9bc0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 70  TK_COLUMN;.    p
9bd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
9be0: 58 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  X->iIdxCur;.    
9bf0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
9c00: 20 70 58 2d 3e 69 49 64 78 43 6f 6c 3b 0a 20 20   pX->iIdxCol;.  
9c10: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
9c20: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
9c30: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
9c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
9c50: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
9c60: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
9c70: 6e 64 65 78 65 73 20 6f 6e 20 65 78 70 72 65 73  ndexes on expres
9c80: 73 69 6f 6e 20 58 2c 20 6c 6f 63 61 74 65 20 65  sion X, locate e
9c90: 76 65 72 79 20 69 6e 73 74 61 6e 63 65 20 6f 66  very instance of
9ca0: 20 65 78 70 72 65 73 73 69 6f 6e 20 58 0a 2a 2a   expression X.**
9cb0: 20 69 6e 20 70 45 78 70 72 20 61 6e 64 20 63 68   in pExpr and ch
9cc0: 61 6e 67 65 20 74 68 61 74 20 73 75 62 65 78 70  ange that subexp
9cd0: 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 72  ression into a r
9ce0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
9cf0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
9d00: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
9d10: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
9d20: 69 64 20 77 68 65 72 65 49 6e 64 65 78 45 78 70  id whereIndexExp
9d30: 72 54 72 61 6e 73 28 0a 20 20 49 6e 64 65 78 20  rTrans(.  Index 
9d40: 2a 70 49 64 78 2c 20 20 20 20 20 20 2f 2a 20 54  *pIdx,      /* T
9d50: 68 65 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he Index */.  in
9d60: 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20  t iTabCur,      
9d70: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
9d80: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 62   table that is b
9d90: 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a  eing indexed */.
9da0: 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20    int iIdxCur,  
9db0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
9dc0: 20 74 68 65 20 69 6e 64 65 78 20 69 74 73 65 6c   the index itsel
9dd0: 66 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  f */.  WhereInfo
9de0: 20 2a 70 57 49 6e 66 6f 20 2f 2a 20 54 72 61 6e   *pWInfo /* Tran
9df0: 73 66 6f 72 6d 20 65 78 70 72 65 73 73 69 6f 6e  sform expression
9e00: 73 20 69 6e 20 74 68 69 73 20 57 48 45 52 45 20  s in this WHERE 
9e10: 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 69  clause */.){.  i
9e20: 6e 74 20 69 49 64 78 43 6f 6c 3b 20 20 20 20 20  nt iIdxCol;     
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9e40: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  umn number of th
9e50: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 45 78 70  e index */.  Exp
9e60: 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b  rList *aColExpr;
9e70: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
9e80: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
9e90: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 57 61 6c  indexed */.  Wal
9ea0: 6b 65 72 20 77 3b 0a 20 20 49 64 78 45 78 70 72  ker w;.  IdxExpr
9eb0: 54 72 61 6e 73 20 78 3b 0a 20 20 61 43 6f 6c 45  Trans x;.  aColE
9ec0: 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c  xpr = pIdx->aCol
9ed0: 45 78 70 72 3b 0a 20 20 69 66 28 20 61 43 6f 6c  Expr;.  if( aCol
9ee0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
9ef0: 3b 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 69 6e 64  ;  /* Not an ind
9f00: 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ex on expression
9f10: 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77  s */.  memset(&w
9f20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
9f30: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
9f40: 63 6b 20 3d 20 77 68 65 72 65 49 6e 64 65 78 45  ck = whereIndexE
9f50: 78 70 72 54 72 61 6e 73 4e 6f 64 65 3b 0a 20 20  xprTransNode;.  
9f60: 77 2e 75 2e 70 49 64 78 54 72 61 6e 73 20 3d 20  w.u.pIdxTrans = 
9f70: 26 78 3b 0a 20 20 78 2e 69 54 61 62 43 75 72 20  &x;.  x.iTabCur 
9f80: 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 78 2e 69  = iTabCur;.  x.i
9f90: 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  IdxCur = iIdxCur
9fa0: 3b 0a 20 20 66 6f 72 28 69 49 64 78 43 6f 6c 3d  ;.  for(iIdxCol=
9fb0: 30 3b 20 69 49 64 78 43 6f 6c 3c 61 43 6f 6c 45  0; iIdxCol<aColE
9fc0: 78 70 72 2d 3e 6e 45 78 70 72 3b 20 69 49 64 78  xpr->nExpr; iIdx
9fd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Col++){.    if( 
9fe0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
9ff0: 49 64 78 43 6f 6c 5d 21 3d 58 4e 5f 45 58 50 52  IdxCol]!=XN_EXPR
a000: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a010: 20 61 73 73 65 72 74 28 20 61 43 6f 6c 45 78 70   assert( aColExp
a020: 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
a030: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 78 2e  xpr!=0 );.    x.
a040: 69 49 64 78 43 6f 6c 20 3d 20 69 49 64 78 43 6f  iIdxCol = iIdxCo
a050: 6c 3b 0a 20 20 20 20 78 2e 70 49 64 78 45 78 70  l;.    x.pIdxExp
a060: 72 20 3d 20 61 43 6f 6c 45 78 70 72 2d 3e 61 5b  r = aColExpr->a[
a070: 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  iIdxCol].pExpr;.
a080: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
a090: 78 70 72 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e  xpr(&w, pWInfo->
a0a0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
a0b0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
a0c0: 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  (&w, pWInfo->pOr
a0d0: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
a0e0: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
a0f0: 26 77 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  &w, pWInfo->pRes
a100: 75 6c 74 53 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  ultSet);.  }.}..
a110: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a120: 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
a130: 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
a140: 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
a150: 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
a160: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
a170: 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
a180: 6f 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71  o..*/.Bitmask sq
a190: 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
a1a0: 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
a1b0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
a1c0: 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
a1d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
a1e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a1f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
a200: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
a210: 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
a220: 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
a230: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
a240: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
a250: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
a260: 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
a270: 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
a280: 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
a290: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a2a0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
a2b0: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
a2c0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
a2d0: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
a2e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
a2f0: 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
a300: 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
a310: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
a320: 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
a330: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
a340: 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
a350: 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
a360: 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
a370: 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
a380: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a390: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
a3a0: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
a3b0: 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
a3c0: 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
a3d0: 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
a3e0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
a3f0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
a400: 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
a410: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
a420: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
a430: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
a440: 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
a450: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
a460: 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
a470: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
a480: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
a490: 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
a4a0: 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
a4b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a4e0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
a4f0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
a500: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
a510: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a520: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
a550: 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
a560: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
a570: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
a580: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
a590: 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
a5a0: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
a5b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
a5c0: 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
a5d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
a5e0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
a5f0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
a600: 0a 20 20 69 6e 74 20 61 64 64 72 48 61 6c 74 3b  .  int addrHalt;
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 2f 2a 20 61 64 64 72 42 72 6b 20 66 6f     /* addrBrk fo
a630: 72 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  r the outermost 
a640: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
a650: 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
a660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
a670: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
a680: 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
a690: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
a6a0: 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
a6b0: 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
a6c0: 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
a6d0: 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
a6e0: 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
a6f0: 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
a700: 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
a710: 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
a720: 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20  e returning */. 
a730: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30   Index *pIdx = 0
a740: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
a750: 64 65 78 20 75 73 65 64 20 62 79 20 6c 6f 6f 70  dex used by loop
a760: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
a770: 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
a780: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
a790: 61 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 72 61  ation of constra
a7a0: 69 6e 74 20 67 65 6e 65 72 61 74 6f 72 20 6c 6f  int generator lo
a7b0: 6f 70 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  op */..  pParse 
a7c0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
a7d0: 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
a7e0: 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26  pVdbe;.  pWC = &
a7f0: 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64  pWInfo->sWC;.  d
a800: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a810: 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
a820: 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
a830: 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
a840: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49  >pWLoop;.  pTabI
a850: 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
a860: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
a870: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
a880: 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
a890: 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d  ursor;.  pLevel-
a8a0: 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52  >notReady = notR
a8b0: 65 61 64 79 20 26 20 7e 73 71 6c 69 74 65 33 57  eady & ~sqlite3W
a8c0: 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
a8d0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
a8e0: 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28  Cur);.  bRev = (
a8f0: 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e  pWInfo->revMask>
a900: 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d  >iLevel)&1;.  om
a910: 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70  itTable = (pLoop
a920: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
a930: 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
a940: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
a950: 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
a960: 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
a970: 43 4c 41 55 53 45 29 3d 3d 30 3b 0a 20 20 56 64  CLAUSE)==0;.  Vd
a980: 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
a990: 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
a9a0: 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65  -loop%d: %s",iLe
a9b0: 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54  vel,pTabItem->pT
a9c0: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
a9d0: 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
a9e0: 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
a9f0: 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
aa00: 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
aa10: 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
aa20: 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
aa30: 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
aa40: 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
aa50: 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
aa60: 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
aa70: 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
aa80: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
aa90: 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
aaa0: 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
aab0: 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
aac0: 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
aad0: 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
aae0: 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
aaf0: 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
ab00: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
ab10: 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
ab20: 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
ab30: 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
ab40: 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
ab50: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
ab60: 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
ab70: 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
ab80: 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
ab90: 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
aba0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
abb0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
abc0: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
abd0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
abe0: 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
abf0: 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
ac00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ac10: 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
ac20: 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
ac30: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
ac40: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
ac50: 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
ac60: 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
ac70: 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
ac80: 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
ac90: 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
aca0: 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
acb0: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
acc0: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
acd0: 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
ace0: 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
acf0: 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  0].fg.jointype &
ad00: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
ad10: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
ad20: 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
ad30: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
ad40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ad50: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
ad60: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
ad70: 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
ad80: 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
ad90: 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
ada0: 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
adb0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 61   /* Compute a sa
adc0: 66 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75  fe address to ju
add0: 6d 70 20 74 6f 20 69 66 20 77 65 20 64 69 73 63  mp to if we disc
ade0: 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 74 61  over that the ta
adf0: 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 69  ble for.  ** thi
ae00: 73 20 6c 6f 6f 70 20 69 73 20 65 6d 70 74 79 20  s loop is empty 
ae10: 61 6e 64 20 63 61 6e 20 6e 65 76 65 72 20 63 6f  and can never co
ae20: 6e 74 72 69 62 75 74 65 20 63 6f 6e 74 65 6e 74  ntribute content
ae30: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 69 4c 65  . */.  for(j=iLe
ae40: 76 65 6c 3b 20 6a 3e 30 20 26 26 20 70 57 49 6e  vel; j>0 && pWIn
ae50: 66 6f 2d 3e 61 5b 6a 5d 2e 69 4c 65 66 74 4a 6f  fo->a[j].iLeftJo
ae60: 69 6e 3d 3d 30 3b 20 6a 2d 2d 29 7b 7d 0a 20 20  in==0; j--){}.  
ae70: 61 64 64 72 48 61 6c 74 20 3d 20 70 57 49 6e 66  addrHalt = pWInf
ae80: 6f 2d 3e 61 5b 6a 5d 2e 61 64 64 72 42 72 6b 3b  o->a[j].addrBrk;
ae90: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
aea0: 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  ase of a FROM cl
aeb0: 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d  ause subquery im
aec0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
aed0: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  o-routine */.  i
aee0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
aef0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
af00: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
af10: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
af20: 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  Return;.    sqli
af30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
af40: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
af50: 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
af60: 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
af70: 6c 6c 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76  llSub);.    pLev
af80: 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
af90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
afa0: 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
afb0: 64 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  d, addrBrk);.   
afc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
afd0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
afe0: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
aff0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
b000: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
b010: 65 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  e));.    pLevel-
b020: 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
b030: 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
b040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b050: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
b060: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
b070: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
b080: 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
b090: 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20  /* Case 1:  The 
b0a0: 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
b0b0: 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
b0c0: 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
b0d0: 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
b0e0: 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
b0f0: 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
b100: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
b110: 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
b120: 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
b130: 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
b140: 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  nd;.    int nCon
b150: 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d  straint = pLoop-
b160: 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 6e 74  >nLTerm;.    int
b170: 20 69 49 6e 3b 20 20 20 20 2f 2a 20 43 6f 75 6e   iIn;    /* Coun
b180: 74 65 72 20 66 6f 72 20 49 4e 20 63 6f 6e 73 74  ter for IN const
b190: 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 73  raints */..    s
b1a0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
b1b0: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
b1c0: 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
b1d0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
b1e0: 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
b1f0: 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46  2);.    addrNotF
b200: 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
b210: 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28  ddrBrk;.    for(
b220: 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
b230: 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
b240: 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52  int iTarget = iR
b250: 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54  eg+j+2;.      pT
b260: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
b270: 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
b280: 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30  ( NEVER(pTerm==0
b290: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
b2a0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
b2b0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
b2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
b2d0: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
b2e0: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
b2f0: 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
b300: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
b310: 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
b320: 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
b330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b340: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
b350: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
b360: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
b370: 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f   codeExprOrVecto
b380: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
b390: 2c 20 69 54 61 72 67 65 74 2c 20 31 29 3b 0a 20  , iTarget, 1);. 
b3a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b3d0: 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
b3e0: 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
b3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b400: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b410: 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
b420: 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
b430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
b440: 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
b450: 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
b460: 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b480: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
b490: 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
b4a0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
b4b0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
b4c0: 65 20 3f 20 50 34 5f 44 59 4e 41 4d 49 43 20 3a  e ? P4_DYNAMIC :
b4d0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
b4e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b4f0: 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
b500: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
b510: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
b520: 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
b530: 76 65 6c 2d 3e 6f 70 20 3d 20 70 57 49 6e 66 6f  vel->op = pWInfo
b540: 2d 3e 65 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  ->eOnePass ? OP_
b550: 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e 65 78 74 3b  Noop : OP_VNext;
b560: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
b570: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
b580: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
b590: 20 69 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   iIn = pLevel->u
b5a0: 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20 66 6f 72  .in.nIn;.    for
b5b0: 28 6a 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  (j=nConstraint-1
b5c0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
b5d0: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
b5e0: 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
b5f0: 20 20 20 20 69 66 28 20 6a 3c 31 36 20 26 26 20      if( j<16 && 
b600: 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f  (pLoop->u.vtab.o
b610: 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b  mitMask>>j)&1 ){
b620: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
b630: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
b640: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
b650: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
b660: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
b670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
b680: 70 72 20 2a 70 43 6f 6d 70 61 72 65 3b 20 20 2f  pr *pCompare;  /
b690: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
b6a0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
b6b0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
b6c0: 74 3b 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20  t;    /* RHS of 
b6d0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a  the comparison *
b6e0: 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  /.        VdbeOp
b6f0: 20 2a 70 4f 70 3b 20 20 20 20 20 2f 2a 20 4f 70   *pOp;     /* Op
b700: 63 6f 64 65 20 74 6f 20 61 63 63 65 73 73 20 74  code to access t
b710: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
b720: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  IN constraint */
b730: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c  ..        /* Rel
b740: 6f 61 64 20 74 68 65 20 63 6f 6e 73 74 72 61 69  oad the constrai
b750: 6e 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  nt value into re
b760: 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e 20 20 54 68  g[iReg+j+2].  Th
b770: 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20  e same value.   
b780: 20 20 20 20 20 2a 2a 20 77 61 73 20 6c 6f 61 64       ** was load
b790: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 61 6d 65  ed into the same
b7a0: 20 72 65 67 69 73 74 65 72 20 70 72 69 6f 72 20   register prior 
b7b0: 74 6f 20 74 68 65 20 4f 50 5f 56 46 69 6c 74 65  to the OP_VFilte
b7c0: 72 2c 20 62 75 74 0a 20 20 20 20 20 20 20 20 2a  r, but.        *
b7d0: 2a 20 74 68 65 20 78 46 69 6c 74 65 72 20 69 6d  * the xFilter im
b7e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
b7f0: 68 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ht have changed 
b800: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 72 0a  the datatype or.
b810: 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64          ** encod
b820: 69 6e 67 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ing of the value
b830: 20 69 6e 20 74 68 65 20 72 65 67 69 73 74 65 72   in the register
b840: 2c 20 73 6f 20 69 74 20 2a 6d 75 73 74 2a 20 62  , so it *must* b
b850: 65 20 72 65 6c 6f 61 64 65 64 2e 20 2a 2f 0a 20  e reloaded. */. 
b860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b870: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
b880: 6f 6f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  oop!=0 || db->ma
b890: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
b8a0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
b8b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b8c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b8d0: 20 69 49 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20   iIn>0 );.      
b8e0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
b8f0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 4c  3VdbeGetOp(v, pL
b900: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
b910: 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64 64 72 49 6e  op[--iIn].addrIn
b920: 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Top);.          
b930: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
b940: 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 7c  ode==OP_Column |
b950: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
b960: 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  P_Rowid );.     
b970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
b980: 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 43 6f 6c  ->opcode!=OP_Col
b990: 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d  umn || pOp->p3==
b9a0: 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20  iReg+j+2 );.    
b9b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b9c0: 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f  p->opcode!=OP_Ro
b9d0: 77 69 64 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d  wid || pOp->p2==
b9e0: 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20  iReg+j+2 );.    
b9f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ba00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
ba10: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
ba20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ba30: 64 4f 70 33 28 76 2c 20 70 4f 70 2d 3e 6f 70 63  dOp3(v, pOp->opc
ba40: 6f 64 65 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  ode, pOp->p1, pO
ba50: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29 3b  p->p2, pOp->p3);
ba60: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
ba70: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
ba80: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
ba90: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
baa0: 65 78 74 20 72 6f 77 20 69 66 20 0a 20 20 20 20  ext row if .    
bab0: 20 20 20 20 2a 2a 20 74 68 65 20 49 4e 20 63 6f      ** the IN co
bac0: 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
bad0: 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20 20  satisfied */.   
bae0: 20 20 20 20 20 70 43 6f 6d 70 61 72 65 20 3d 20       pCompare = 
baf0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bb00: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 30 2c 20 30  rse, TK_EQ, 0, 0
bb10: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
bb20: 74 28 20 70 43 6f 6d 70 61 72 65 21 3d 30 20 7c  t( pCompare!=0 |
bb30: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
bb40: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
bb50: 28 20 70 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20  ( pCompare ){.  
bb60: 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65          pCompare
bb70: 2d 3e 70 4c 65 66 74 20 3d 20 70 54 65 72 6d 2d  ->pLeft = pTerm-
bb80: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
bb90: 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72           pCompar
bba0: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  e->pRight = pRig
bbb0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
bbc0: 28 64 62 2c 20 54 4b 5f 52 45 47 49 53 54 45 52  (db, TK_REGISTER
bbd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
bbe0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
bbf0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
bc00: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 2b  ->iTable = iReg+
bc10: 6a 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j+2;.           
bc20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
bc30: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 6d  lse(pParse, pCom
bc40: 70 61 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  pare, pLevel->ad
bc50: 64 72 43 6f 6e 74 2c 20 30 29 3b 0a 20 20 20 20  drCont, 0);.    
bc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc70: 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66    pCompare->pLef
bc80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
bc90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
bca0: 74 65 28 64 62 2c 20 70 43 6f 6d 70 61 72 65 29  te(db, pCompare)
bcb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
bcd0: 20 54 68 65 73 65 20 72 65 67 69 73 74 65 72 73   These registers
bce0: 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 65 73   need to be pres
bcf0: 65 72 76 65 64 20 69 6e 20 63 61 73 65 20 74 68  erved in case th
bd00: 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
bd10: 72 61 74 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  rator.    ** loo
bd20: 70 2e 20 20 53 6f 20 77 65 20 63 6f 75 6c 64 20  p.  So we could 
bd30: 64 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  deallocate the r
bd40: 65 67 69 73 74 65 72 73 20 68 65 72 65 20 28 61  egisters here (a
bd50: 6e 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  nd potentially. 
bd60: 20 20 20 2a 2a 20 72 65 75 73 65 20 74 68 65 6d     ** reuse them
bd70: 20 6c 61 74 65 72 29 20 69 66 20 28 70 4c 6f 6f   later) if (pLoo
bd80: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
bd90: 52 45 5f 49 4e 5f 41 42 4c 45 29 3d 3d 30 2e 20  RE_IN_ABLE)==0. 
bda0: 20 42 75 74 20 69 74 20 73 65 65 6d 73 0a 20 20   But it seems.  
bdb0: 20 20 2a 2a 20 73 69 6d 70 6c 65 72 20 61 6e 64    ** simpler and
bdc0: 20 73 61 66 65 72 20 74 6f 20 73 69 6d 70 6c 79   safer to simply
bdd0: 20 6e 6f 74 20 72 65 75 73 65 20 74 68 65 20 72   not reuse the r
bde0: 65 67 69 73 74 65 72 73 2e 0a 20 20 20 20 2a 2a  egisters..    **
bdf0: 0a 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74  .    **    sqlit
be00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
be10: 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
be20: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
be30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
be40: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
be50: 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65  pParse);.  }else
be60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
be70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
be80: 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  BLE */..  if( (p
be90: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
bea0: 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
beb0: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
bec0: 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
bed0: 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
bee0: 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b  UMN_EQ))!=0.  ){
bef0: 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
bf00: 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
bf10: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
bf20: 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
bf30: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
bf40: 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
bf50: 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
bf60: 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
bf70: 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
bf80: 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
bf90: 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
bfa0: 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
bfb0: 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
bfc0: 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
bfd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
bfe0: 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
bff0: 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20  ee.nEq==1 );.   
c000: 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
c010: 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
c020: 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
c030: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c040: 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
c050: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
c060: 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
c070: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
c080: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
c090: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
c0a0: 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 2b   iReleaseReg = +
c0b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c0c0: 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
c0d0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
c0e0: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
c0f0: 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
c100: 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
c110: 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67 21    if( iRowidReg!
c120: 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20 73  =iReleaseReg ) s
c130: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
c140: 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
c150: 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
c160: 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
c170: 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
c180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c190: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
c1a0: 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
c1b0: 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
c1c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
c1e0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
c1f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77  nge(pParse, iRow
c200: 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73  idReg, 1);.    s
c210: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
c220: 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
c230: 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
c240: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c250: 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
c260: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
c270: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
c280: 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
c290: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
c2a0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
c2b0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
c2c0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
c2d0: 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20  RANGE)!=0.  ){. 
c2e0: 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57     /* Case 3:  W
c2f0: 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
c300: 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
c310: 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
c320: 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a  D field..    */.
c330: 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d      int testOp =
c340: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e   OP_Noop;.    in
c350: 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74  t start;.    int
c360: 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30   memEndValue = 0
c370: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
c380: 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a  *pStart, *pEnd;.
c390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
c3a0: 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
c3b0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61   j = 0;.    pSta
c3c0: 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20  rt = pEnd = 0;. 
c3d0: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
c3e0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
c3f0: 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74  M_LIMIT ) pStart
c400: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
c410: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70  [j++];.    if( p
c420: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c430: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
c440: 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e  ) pEnd = pLoop->
c450: 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
c460: 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 21   assert( pStart!
c470: 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b  =0 || pEnd!=0 );
c480: 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b  .    if( bRev ){
c490: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
c4a0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74  Start;.      pSt
c4b0: 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
c4c0: 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
c4d0: 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 43 75      }.    codeCu
c4e0: 72 73 6f 72 48 69 6e 74 28 70 54 61 62 49 74 65  rsorHint(pTabIte
c4f0: 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65  m, pWInfo, pLeve
c500: 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 69 66  l, pEnd);.    if
c510: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
c520: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
c530: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
c540: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
c550: 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
c560: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
c570: 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
c580: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
c590: 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
c5a0: 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
c5b0: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  y */.      int o
c5c0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
c5d0: 20 2f 2a 20 43 75 72 73 6f 72 20 73 65 65 6b 20   /* Cursor seek 
c5e0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
c5f0: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
c600: 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
c610: 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
c620: 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
c630: 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
c640: 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
c650: 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
c660: 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
c670: 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
c680: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
c690: 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
c6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
c6b0: 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c  T */  OP_SeekGT,
c6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
c6d0: 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
c6e0: 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  LE,.           /
c6f0: 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
c700: 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  eekLT,.         
c710: 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
c720: 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20 7d  P_SeekGE.      }
c730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c740: 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
c750: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
c760: 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
c770: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
c780: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
c790: 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
c7a0: 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
c7b0: 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
c7c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
c7d0: 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
c7e0: 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
c7f0: 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
c800: 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72 74   assert( (pStart
c810: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
c820: 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
c830: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
c840: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
c850: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
c860: 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
c870: 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
c880: 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
c890: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c8a0: 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
c8b0: 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
c8c0: 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
c8d0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
c8e0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
c8f0: 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69 67  sVector(pX->pRig
c900: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ht) ){.        r
c910: 31 20 3d 20 72 54 65 6d 70 20 3d 20 73 71 6c 69  1 = rTemp = sqli
c920: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
c930: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 63  arse);.        c
c940: 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28  odeExprOrVector(
c950: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
c960: 68 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  ht, r1, 1);.    
c970: 20 20 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70      op = aMoveOp
c980: 5b 28 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54  [(pX->op - TK_GT
c990: 29 20 7c 20 30 78 30 30 30 31 5d 3b 0a 20 20 20  ) | 0x0001];.   
c9a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c9b0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
c9c0: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
c9d0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
c9e0: 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  rTemp);.        
c9f0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
ca00: 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
ca10: 20 20 20 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f       op = aMoveO
ca20: 70 5b 28 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47  p[(pX->op - TK_G
ca30: 54 29 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  T)];.      }.   
ca40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ca50: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 43 75 72  dOp3(v, op, iCur
ca60: 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
ca70: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
ca80: 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
ca90: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
caa0: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
cab0: 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _GT);.      Vdbe
cac0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
cad0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20  ->op==TK_LE);.  
cae0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
caf0: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
cb00: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LT);.      Vdbe
cb10: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
cb20: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20  ->op==TK_GE);.  
cb30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cb40: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
cb50: 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
cb60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cb70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
cb80: 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
cb90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cbb0: 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
cbc0: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
cbd0: 20 69 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29   iCur, addrHalt)
cbe0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
cbf0: 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
cc00: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
cc10: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
cc20: 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
cc30: 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
cc40: 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
cc50: 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
cc60: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
cc70: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
cc80: 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
cc90: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
cca0: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
ccb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
ccc0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
ccd0: 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
cce0: 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
ccf0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
cd00: 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
cd10: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
cd20: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
cd30: 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
cd40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64  >nMem;.      cod
cd50: 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50  eExprOrVector(pP
cd60: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
cd70: 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 31  , memEndValue, 1
cd80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
cd90: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
cda0: 74 6f 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20  tor(pX->pRight) 
cdb0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e  .       && (pX->
cdc0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
cdd0: 3e 6f 70 3d 3d 54 4b 5f 47 54 29 20 0a 20 20 20  >op==TK_GT) .   
cde0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65     ){.        te
cdf0: 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
ce00: 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
ce10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ce20: 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
ce30: 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
ce40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ce50: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
ce60: 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52  rIsVector(pX->pR
ce70: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
ce80: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
ce90: 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
cea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74    }.    }.    st
ceb0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
cec0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
ced0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
cee0: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
cef0: 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
cf00: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
cf10: 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
cf20: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
cf30: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
cf40: 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
cf50: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
cf60: 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
cf70: 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
cf80: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
cf90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cfa0: 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
cfb0: 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
cfc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
cfd0: 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
cfe0: 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
cff0: 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
d000: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d010: 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
d020: 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
d030: 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
d040: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
d050: 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65  v, testOp==OP_Le
d060: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
d070: 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
d080: 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
d090: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
d0a0: 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65  v, testOp==OP_Ge
d0b0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
d0c0: 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
d0d0: 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
d0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d0f0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
d100: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
d110: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
d120: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
d130: 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
d140: 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
d150: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
d160: 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
d170: 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
d180: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
d190: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
d1a0: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
d1b0: 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
d1c0: 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
d1d0: 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
d1e0: 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
d1f0: 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
d200: 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
d210: 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
d220: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
d230: 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
d240: 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
d250: 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
d260: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
d270: 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
d280: 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
d290: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
d2a0: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
d2b0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
d2c0: 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
d2d0: 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
d2e0: 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
d2f0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
d300: 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
d310: 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
d320: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
d330: 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
d340: 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
d350: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
d360: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
d370: 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
d380: 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
d390: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
d3a0: 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
d3b0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
d3c0: 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
d3d0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
d3e0: 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
d3f0: 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
d400: 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
d410: 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
d420: 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
d430: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
d440: 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
d450: 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
d460: 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
d470: 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
d480: 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
d490: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
d4a0: 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
d4b0: 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
d4c0: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
d4d0: 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
d4e0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
d4f0: 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
d500: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
d510: 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
d520: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
d530: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
d540: 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
d550: 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
d560: 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
d570: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
d580: 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
d590: 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
d5a0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
d5b0: 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
d5c0: 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
d5d0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
d5e0: 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
d5f0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
d600: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
d610: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
d620: 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
d630: 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
d640: 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
d650: 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
d660: 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
d670: 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
d680: 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
d690: 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
d6a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
d6b0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
d6c0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
d6d0: 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
d6e0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
d6f0: 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
d700: 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
d710: 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
d720: 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
d730: 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
d740: 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
d750: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
d760: 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20  ekGT,           
d770: 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
d780: 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
d790: 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
d7a0: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
d7b0: 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LT,           /*
d7c0: 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
d7d0: 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
d7e0: 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
d7f0: 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45  .      OP_SeekGE
d800: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
d810: 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
d820: 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
d830: 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
d840: 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20       OP_SeekLE  
d850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
d860: 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
d870: 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
d880: 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
d890: 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
d8a0: 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
d8b0: 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64   = {.      OP_Id
d8c0: 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
d8d0: 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 0: (end_const
d8e0: 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
d8f0: 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
d900: 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20      OP_IdxGT,   
d910: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
d920: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
d930: 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64  && !bRev &&  end
d940: 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
d950: 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20  IdxLE,          
d960: 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
d970: 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
d980: 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a  v && !endEq) */.
d990: 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20        OP_IdxLT, 
d9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
d9b0: 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
d9c0: 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65  s &&  bRev &&  e
d9d0: 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  ndEq) */.    };.
d9e0: 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
d9f0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
da00: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
da10: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
da20: 73 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 42 74  s */.    u16 nBt
da30: 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  m = pLoop->u.btr
da40: 65 65 2e 6e 42 74 6d 3b 20 20 20 2f 2a 20 4c 65  ee.nBtm;   /* Le
da50: 6e 67 74 68 20 6f 66 20 42 54 4d 20 76 65 63 74  ngth of BTM vect
da60: 6f 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 54  or */.    u16 nT
da70: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
da80: 72 65 65 2e 6e 54 6f 70 3b 20 20 20 2f 2a 20 4c  ree.nTop;   /* L
da90: 65 6e 67 74 68 20 6f 66 20 54 4f 50 20 76 65 63  ength of TOP vec
daa0: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tor */.    int r
dab0: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
dac0: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
dad0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
dae0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
daf0: 65 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  es */.    WhereT
db00: 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
db10: 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
db20: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
db30: 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
db40: 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
db50: 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
db60: 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
db70: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
db80: 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
db90: 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbb0: 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
dbc0: 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
dbd0: 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
dbe0: 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
dbf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
dc00: 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
dc10: 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
dc20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
dc30: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
dc40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
dc50: 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
dc60: 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
dc70: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
dc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dc90: 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
dca0: 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  t terms */.    i
dcb0: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dcd0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
dce0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
dcf0: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
dd00: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
dd10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
dd20: 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
dd30: 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
dd40: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
dd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
dd60: 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
dd70: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
dd80: 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
dd90: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
dda0: 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
ddb0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
ddc0: 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66      char *zEndAf
ddd0: 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
dde0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
ddf0: 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
de00: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
de10: 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  u8 bSeekPastNull
de20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
de30: 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73  True to seek pas
de40: 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20  t initial nulls 
de50: 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41  */.    u8 bStopA
de60: 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
de70: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69      /* Add condi
de80: 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74  tion to terminat
de90: 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20  e at NULLs */.. 
dea0: 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
deb0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
dec0: 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
ded0: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
dee0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e      assert( nEq>
def0: 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b  =pLoop->nSkip );
df00: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
df10: 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
df20: 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
df30: 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
df40: 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
df50: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
df60: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
df70: 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
df80: 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
df90: 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
dfa0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
dfb0: 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
dfc0: 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
dfd0: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
dfe0: 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
dff0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
e000: 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
e010: 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
e020: 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
e030: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
e040: 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
e050: 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
e060: 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
e070: 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
e080: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
e090: 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
e0a0: 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
e0b0: 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
e0c0: 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
e0d0: 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
e0e0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20  ->pOrderBy==0.  
e0f0: 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
e100: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
e110: 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  r==1.         ||
e120: 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
e130: 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
e140: 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20  BY_MIN)==0 );.  
e150: 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
e160: 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
e170: 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
e180: 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
e190: 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26  nOBSat>0.     &&
e1a0: 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
e1b0: 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
e1c0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
e1d0: 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20  >nSkip==0 );.   
e1e0: 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
e1f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
e200: 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
e210: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
e220: 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
e230: 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
e240: 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
e250: 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
e260: 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
e270: 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20  /.    j = nEq;. 
e280: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
e290: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
e2a0: 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
e2b0: 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70   pRangeStart = p
e2c0: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
e2d0: 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
e2e0: 65 67 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52  eg = MAX(nExtraR
e2f0: 65 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  eg, pLoop->u.btr
e300: 65 65 2e 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20  ee.nBtm);.      
e310: 2f 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61  /* Like optimiza
e320: 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
e330: 72 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63  raints always oc
e340: 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a  cur in pairs */.
e350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
e360: 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
e370: 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
e380: 50 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  PT)==0 || .     
e390: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d           (pLoop-
e3a0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
e3b0: 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29  _TOP_LIMIT)!=0 )
e3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e3d0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
e3e0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
e3f0: 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
e400: 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
e410: 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
e420: 6e 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28  nExtraReg = MAX(
e430: 6e 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70  nExtraReg, pLoop
e440: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 29 3b  ->u.btree.nTop);
e450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e460: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
e470: 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 69 66  H_BLOBS.      if
e480: 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
e490: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
e4a0: 45 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOPT)!=0 ){.    
e4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
e4c0: 67 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20  geStart!=0 );   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f    /* LIKE opt co
e4f0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
e500: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61       assert( pRa
e510: 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
e520: 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
e530: 20 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69   );   /* occur i
e540: 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20  n pairs */.     
e550: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65     pLevel->iLike
e560: 52 65 70 43 6e 74 72 20 3d 20 28 75 33 32 29 2b  RepCntr = (u32)+
e570: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
e580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e590: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e5a0: 6e 74 65 67 65 72 2c 20 31 2c 20 28 69 6e 74 29  nteger, 1, (int)
e5b0: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
e5c0: 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56  Cntr);.        V
e5d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e5e0: 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  LIKE loop counte
e5f0: 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  r"));.        pL
e600: 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
e610: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
e620: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e630: 20 20 20 20 20 20 20 2f 2a 20 69 4c 69 6b 65 52         /* iLikeR
e640: 65 70 43 6e 74 72 20 61 63 74 75 61 6c 6c 79 20  epCntr actually 
e650: 73 74 6f 72 65 73 20 32 78 20 74 68 65 20 63 6f  stores 2x the co
e660: 75 6e 74 65 72 20 72 65 67 69 73 74 65 72 20 6e  unter register n
e670: 75 6d 62 65 72 2e 20 20 54 68 65 0a 20 20 20 20  umber.  The.    
e680: 20 20 20 20 2a 2a 20 62 6f 74 74 6f 6d 20 62 69      ** bottom bi
e690: 74 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  t indicates whet
e6a0: 68 65 72 20 74 68 65 20 73 65 61 72 63 68 20 6f  her the search o
e6b0: 72 64 65 72 20 69 73 20 41 53 43 20 6f 72 20 44  rder is ASC or D
e6c0: 45 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ESC. */.        
e6d0: 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29  testcase( bRev )
e6e0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
e6f0: 73 65 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  se( pIdx->aSortO
e700: 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
e710: 45 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20  E_SO_DESC );.   
e720: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 52       assert( (bR
e730: 65 76 20 26 20 7e 31 29 3d 3d 30 20 29 3b 0a 20  ev & ~1)==0 );. 
e740: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
e750: 4c 69 6b 65 52 65 70 43 6e 74 72 20 3c 3c 3d 31  LikeRepCntr <<=1
e760: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
e770: 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 7c  ->iLikeRepCntr |
e780: 3d 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e  = bRev ^ (pIdx->
e790: 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
e7a0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29  =SQLITE_SO_DESC)
e7b0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
e7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
e7d0: 65 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20  eStart==0 ){.   
e7e0: 20 20 20 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61       j = pIdx->a
e7f0: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
e800: 20 20 20 20 20 20 69 66 28 20 28 6a 3e 3d 30 20        if( (j>=0 
e810: 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  && pIdx->pTable-
e820: 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
e830: 3d 3d 30 29 20 7c 7c 20 6a 3d 3d 58 4e 5f 45 58  ==0) || j==XN_EX
e840: 50 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PR ){.          
e850: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
e860: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
e870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e880: 73 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64  ssert( pRangeEnd
e890: 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e  ==0 || (pRangeEn
e8a0: 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
e8b0: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a  M_VNULL)==0 );..
e8c0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
e8d0: 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
e8e0: 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
e8f0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
e900: 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
e910: 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
e920: 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
e930: 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
e940: 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
e950: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
e960: 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
e970: 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
e980: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e990: 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79   (nEq<pIdx->nKey
e9a0: 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49  Col && bRev==(pI
e9b0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
e9c0: 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
e9d0: 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
e9e0: 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79  ev && pIdx->nKey
e9f0: 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  Col==nEq).    ){
ea00: 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
ea10: 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
ea20: 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
ea30: 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c  ;.      SWAP(u8,
ea40: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
ea50: 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20  bStopAtNull);.  
ea60: 20 20 20 20 53 57 41 50 28 75 38 2c 20 6e 42 74      SWAP(u8, nBt
ea70: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 7d 0a  m, nTop);.    }.
ea80: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
ea90: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
eaa0: 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
eab0: 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
eac0: 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64  or IN.    ** and
ead0: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
eae0: 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
eaf0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
eb00: 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
eb10: 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
eb20: 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Base..    */.   
eb30: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
eb40: 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f  pTabItem, pWInfo
eb50: 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  , pLevel, pRange
eb60: 45 6e 64 29 3b 0a 20 20 20 20 72 65 67 42 61 73  End);.    regBas
eb70: 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
eb80: 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
eb90: 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
eba0: 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
ebb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
ebc0: 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73  StartAff==0 || s
ebd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ebe0: 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29  StartAff)>=nEq )
ebf0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74  ;.    if( zStart
ec00: 41 66 66 20 26 26 20 6e 54 6f 70 20 29 7b 0a 20  Aff && nTop ){. 
ec10: 20 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73       zEndAff = s
ec20: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ec30: 62 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45  b, &zStartAff[nE
ec40: 71 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  q]);.    }.    a
ec50: 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
ec60: 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 74  >addrNxt;..    t
ec70: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
ec80: 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
ec90: 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
eca0: 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
ecb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
ecc0: 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
ecd0: 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
ece0: 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
ecf0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ed00: 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
ed10: 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
ed20: 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
ed30: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ed40: 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
ed50: 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
ed60: 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
ed70: 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
ed80: 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
ed90: 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
eda0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
edb0: 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
edc0: 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
edd0: 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
ede0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
edf0: 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
ee00: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
ee10: 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
ee20: 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
ee30: 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
ee40: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
ee50: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
ee60: 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
ee70: 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
ee80: 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
ee90: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
eea0: 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
eeb0: 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
eec0: 68 74 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78  ht;.      codeEx
eed0: 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73  prOrVector(pPars
eee0: 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
eef0: 73 65 2b 6e 45 71 2c 20 6e 42 74 6d 29 3b 0a 20  se+nEq, nBtm);. 
ef00: 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70       whereLikeOp
ef10: 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67  timizationString
ef20: 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c  Fixup(v, pLevel,
ef30: 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
ef40: 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
ef50: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
ef60: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
ef70: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
ef80: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
ef90: 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
efa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
efb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
efc0: 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
efd0: 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
efe0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
eff0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
f000: 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
f010: 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Aff ){.        u
f020: 70 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69  pdateRangeAffini
f030: 74 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 42  tyStr(pRight, nB
f040: 74 6d 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e  tm, &zStartAff[n
f050: 45 71 5d 29 3b 0a 20 20 20 20 20 20 7d 20 20 0a  Eq]);.      }  .
f060: 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
f070: 74 20 2b 3d 20 6e 42 74 6d 3b 0a 20 20 20 20 20  t += nBtm;.     
f080: 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
f090: 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
f0a0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
f0b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f0c0: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
f0d0: 70 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  pRight)==0 ){.  
f0e0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
f0f0: 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
f100: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65  Start);.      }e
f110: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61  lse{.        sta
f120: 72 74 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  rtEq = 1;.      
f130: 7d 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61 73  }.      bSeekPas
f140: 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
f150: 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61  else if( bSeekPa
f160: 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  stNull ){.      
f170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f180: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
f190: 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
f1a0: 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
f1b0: 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
f1c0: 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
f1d0: 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
f1e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
f1f0: 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
f200: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
f210: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62   nConstraint - b
f220: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53  SeekPastNull, zS
f230: 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 69 66  tartAff);.    if
f240: 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3e 30  ( pLoop->nSkip>0
f250: 20 26 26 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3d   && nConstraint=
f260: 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b  =pLoop->nSkip ){
f270: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6b  .      /* The sk
f280: 69 70 2d 73 63 61 6e 20 6c 6f 67 69 63 20 69 6e  ip-scan logic in
f290: 73 69 64 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  side the call to
f2a0: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
f2b0: 43 6f 6e 73 74 72 61 69 6e 74 73 28 29 0a 20 20  Constraints().  
f2c0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
f2d0: 20 61 6c 72 65 61 64 79 20 6c 65 66 74 20 74 68   already left th
f2e0: 65 20 63 75 72 73 6f 72 20 73 69 74 74 69 6e 67  e cursor sitting
f2f0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   on the correct 
f300: 72 6f 77 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f  row,.      ** so
f310: 20 6e 6f 20 66 75 72 74 68 65 72 20 73 65 65 6b   no further seek
f320: 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ing is needed */
f330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f340: 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
f350: 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
f360: 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
f370: 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
f380: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21       assert( op!
f390: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
f3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
f3b0: 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
f3c0: 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
f3d0: 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
f3e0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f3f0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
f400: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
f410: 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
f420: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
f430: 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
f440: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
f450: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29  (v, op==OP_Last)
f460: 3b 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  ;    testcase( o
f470: 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
f480: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
f490: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
f4a0: 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kGT);  testcase(
f4b0: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29   op==OP_SeekGT )
f4c0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
f4d0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
f4e0: 5f 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63  _SeekGE);  testc
f4f0: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
f500: 47 45 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  GE );.      Vdbe
f510: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
f520: 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74  ==OP_SeekLE);  t
f530: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
f540: 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20  SeekLE );.      
f550: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
f560: 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
f570: 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
f580: 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 20 20  =OP_SeekLT );.  
f590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64    }..    /* Load
f5a0: 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
f5b0: 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
f5c0: 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
f5d0: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
f5e0: 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
f5f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
f600: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
f610: 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
f620: 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
f630: 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
f640: 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
f650: 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
f660: 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
f670: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
f680: 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
f690: 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72  codeExprOrVector
f6a0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
f6b0: 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54   regBase+nEq, nT
f6c0: 6f 70 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  op);.      where
f6d0: 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  LikeOptimization
f6e0: 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70  StringFixup(v, p
f6f0: 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
f700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
f710: 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
f720: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
f730: 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
f740: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
f750: 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
f760: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f780: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
f790: 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
f7a0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
f7b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
f7c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
f7d0: 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Aff ){.        u
f7e0: 70 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69  pdateRangeAffini
f7f0: 74 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 54  tyStr(pRight, nT
f800: 6f 70 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  op, zEndAff);.  
f810: 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
f820: 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
f830: 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f  regBase+nEq, nTo
f840: 70 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20  p, zEndAff);.   
f850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f860: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
f870: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
f880: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
f890: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
f8a0: 2b 3d 20 6e 54 6f 70 3b 0a 20 20 20 20 20 20 74  += nTop;.      t
f8b0: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
f8c0: 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
f8d0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 0a 20  RM_VIRTUAL );.. 
f8e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f8f0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 52 69  ExprIsVector(pRi
f900: 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ght)==0 ){.     
f910: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
f920: 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
f930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f940: 20 20 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20          endEq = 
f950: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
f960: 65 6c 73 65 20 69 66 28 20 62 53 74 6f 70 41 74  else if( bStopAt
f970: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
f980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f990: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
f9a0: 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
f9b0: 20 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20     endEq = 0;.  
f9c0: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
f9d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
f9e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f9f0: 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
fa00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
fa10: 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20   zEndAff);..    
fa20: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
fa30: 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70  op body */.    p
fa40: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
fa50: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fa60: 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  dr(v);..    /* C
fa70: 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
fa80: 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
fa90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
faa0: 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66  range. */.    if
fab0: 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ( nConstraint ){
fac0: 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  .      op = aEnd
fad0: 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45  Op[bRev*2 + endE
fae0: 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  q];.      sqlite
faf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
fb00: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
fb10: 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
fb20: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
fb30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
fb40: 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20  p==OP_IdxGT );  
fb50: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
fb60: 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29  , op==OP_IdxGT )
fb70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fb80: 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
fb90: 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
fba0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  f(v, op==OP_IdxG
fbb0: 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
fbc0: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
fbd0: 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  T );  VdbeCovera
fbe0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
fbf0: 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  dxLT );.      te
fc00: 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
fc10: 64 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76  dxLE );  VdbeCov
fc20: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
fc30: 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d  P_IdxLE );.    }
fc40: 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
fc50: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
fc60: 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
fc70: 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65     if( omitTable
fc80: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64   ){.      /* pId
fc90: 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x is a covering 
fca0: 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20  index.  No need 
fcb0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61  to access the ma
fcc0: 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  in table. */.   
fcd0: 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f   }else if( HasRo
fce0: 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
fcf0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
fd00: 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
fd10: 67 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b 5f  gs & WHERE_SEEK_
fd20: 54 41 42 4c 45 29 20 7c 7c 20 28 0a 20 20 20 20  TABLE) || (.    
fd30: 20 20 20 20 20 20 28 70 57 49 6e 66 6f 2d 3e 77        (pWInfo->w
fd40: 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
fd50: 45 5f 53 45 45 4b 5f 55 4e 49 51 5f 54 41 42 4c  E_SEEK_UNIQ_TABL
fd60: 45 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  E) .       && (p
fd70: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
fd80: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 29  =ONEPASS_SINGLE)
fd90: 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20  .      )){.     
fda0: 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
fdb0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fdc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fdd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fde0: 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
fdf0: 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
fe00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe10: 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
fe20: 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
fe30: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
fe40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe50: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
fe60: 73 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 69 52  sts, iCur, 0, iR
fe70: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
fe80: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
fe90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fea0: 20 20 20 20 20 20 20 20 63 6f 64 65 44 65 66 65          codeDefe
feb0: 72 72 65 64 53 65 65 6b 28 70 57 49 6e 66 6f 2c  rredSeek(pWInfo,
fec0: 20 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49 64   pIdx, iCur, iId
fed0: 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
fee0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75     }else if( iCu
fef0: 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20  r!=iIdxCur ){.  
ff00: 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
ff10: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
ff20: 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54  eyIndex(pIdx->pT
ff30: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f  able);.      iRo
ff40: 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33  widReg = sqlite3
ff50: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
ff60: 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  rse, pPk->nKeyCo
ff70: 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  l);.      for(j=
ff80: 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
ff90: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
ffa0: 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   k = sqlite3Colu
ffb0: 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
ffc0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
ffd0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ffe0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fff0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
10000 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67  ur, k, iRowidReg
10010 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10030 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
10040 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64  tFound, iCur, ad
10050 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20  drCont,.        
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50     iRowidReg, pP
10080 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  k->nKeyCol); Vdb
10090 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
100a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
100b0 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20  Idx is an index 
100c0 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65  on one or more e
100d0 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e  xpressions, then
100e0 20 6c 6f 6f 6b 20 74 68 72 6f 75 67 68 0a 20 20   look through.  
100f0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 65 78 70    ** all the exp
10100 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 57 49 6e  ressions in pWIn
10110 66 6f 20 61 6e 64 20 74 72 79 20 74 6f 20 74 72  fo and try to tr
10120 61 6e 73 66 6f 72 6d 20 6d 61 74 63 68 69 6e 67  ansform matching
10130 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20 20   expressions.   
10140 20 2a 2a 20 69 6e 74 6f 20 72 65 66 65 72 65 6e   ** into referen
10150 63 65 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ce to index colu
10160 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
10170 77 68 65 72 65 49 6e 64 65 78 45 78 70 72 54 72  whereIndexExprTr
10180 61 6e 73 28 70 49 64 78 2c 20 69 43 75 72 2c 20  ans(pIdx, iCur, 
10190 69 49 64 78 43 75 72 2c 20 70 57 49 6e 66 6f 29  iIdxCur, pWInfo)
101a0 3b 0a 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72  ;...    /* Recor
101b0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
101c0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
101d0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f  ate the loop. */
101e0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
101f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10200 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
10210 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
10220 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
10230 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
10240 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
10250 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
10260 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
10270 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
10280 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
10290 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
102a0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20     pLevel->p3 = 
102b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  (pLoop->wsFlags&
102c0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
102d0 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20  )!=0 ? 1:0;.    
102e0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
102f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
10300 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
10310 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
10320 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
10330 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
10340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10350 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
10360 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
10370 7d 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61  }.    if( omitTa
10380 62 6c 65 20 29 20 70 49 64 78 20 3d 20 30 3b 0a  ble ) pIdx = 0;.
10390 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
103a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
103b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
103c0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
103d0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
103e0 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
103f0 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
10400 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
10410 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
10420 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
10430 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
10440 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
10450 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
10460 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
10470 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
10480 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
10490 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
104a0 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
104b0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
104c0 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
104d0 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
104e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
104f0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
10500 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
10510 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
10520 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
10530 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
10540 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
10550 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
10560 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
10570 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
10580 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
10590 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
105a0 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
105b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
105c0 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
105d0 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
105e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
105f0 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
10600 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
10610 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
10620 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
10630 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
10640 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
10650 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
10660 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
10670 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
10680 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
10690 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
106a0 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
106b0 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
106c0 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
106d0 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
106e0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
106f0 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
10700 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
10710 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
10720 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
10730 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
10740 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
10770 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
10780 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
10790 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
107a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
107b0 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
107c0 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
107d0 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
107e0 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
107f0 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
10800 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
10810 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
10820 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
10830 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
10840 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
10850 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
10860 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
10870 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
10880 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
10890 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
108a0 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
108b0 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
108c0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
108d0 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
108e0 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
108f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
10900 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
10910 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
10920 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
10930 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
10940 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
10950 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
10960 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
10970 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
10980 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
10990 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
109a0 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
109b0 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31      ** Added 201
109c0 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20  4-05-26: If the 
109d0 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f  table is a WITHO
109e0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
109f0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20  then.    ** use 
10a00 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
10a10 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ex instead of a 
10a20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72 64  RowSet to record
10a30 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20   the primary.   
10a40 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65 20   ** keys of the 
10a50 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c 72  rows we have alr
10a60 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a  eady seen..    *
10a70 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65  *.    */.    Whe
10a80 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
10a90 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
10aa0 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
10ab0 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
10ac0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f  .    SrcList *pO
10ad0 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53  rTab;       /* S
10ae0 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
10af0 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65  ist or OR-clause
10b00 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
10b10 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d     Index *pCov =
10b20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10b30 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76  /* Potential cov
10b40 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20  ering index (or 
10b50 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74  NULL) */.    int
10b60 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73   iCovCur = pPars
10b70 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43  e->nTab++;  /* C
10b80 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69  ursor used for i
10b90 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61  ndex scans (if a
10ba0 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ny) */..    int 
10bb0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
10bc0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
10bd0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10be0 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
10bf0 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
10c00 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10c30 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
10c40 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
10c50 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
10c80 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
10c90 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
10ca0 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
10cb0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
10cc0 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
10cd0 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
10ce0 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10d10 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
10d20 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
10d30 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
10d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10d50 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
10d60 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
10d70 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10da0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10db0 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
10dc0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
10dd0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
10de0 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  or sub-WHERE cla
10df0 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  use */.    Expr 
10e00 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e20 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
10e30 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
10e40 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10e50 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
10e60 62 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  b;..    pTerm = 
10e70 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
10e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
10e90 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
10ea0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
10eb0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
10ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
10ed0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
10ee0 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
10ef0 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
10f00 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
10f10 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
10f20 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
10f30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
10f40 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
10f50 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
10f60 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
10f70 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
10f80 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
10f90 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
10fa0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
10fb0 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
10fc0 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
10fd0 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
10fe0 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
10ff0 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
11000 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
11010 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
11020 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
11030 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
11040 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
11050 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
11060 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
11070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
11090 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
110a0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
110b0 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
110c0 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
110d0 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
110e0 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
110f0 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
11100 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
11110 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
11120 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
11130 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11160 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
11170 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
11180 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
11190 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
111a0 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
111b0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
111c0 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
111d0 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
111e0 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
111f0 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
11200 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
11210 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
11220 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
11230 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
11240 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
11250 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
11260 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
11270 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
11280 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
11290 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
112a0 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
112b0 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
112c0 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
112d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
112e0 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
112f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
11300 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
11310 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11320 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
11330 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
11340 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
11350 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
11360 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
11370 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63 72   rowset.  Or, cr
11380 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
11390 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  l index.    ** c
113a0 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e  apable of holdin
113b0 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69  g primary keys i
113c0 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
113d0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20  WITHOUT ROWID.. 
113e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
113f0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
11400 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
11410 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
11420 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
11430 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
11440 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
11450 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
11460 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
11470 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
11480 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
11490 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
114a0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
114b0 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
114c0 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
114d0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
114e0 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
114f0 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
11500 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
11510 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
11520 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
11530 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
11540 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
11550 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
11560 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
11570 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
11580 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
11590 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
115a0 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
115b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
115c0 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
115d0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
115e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
115f0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
11600 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
11610 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
11620 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77  {.        regRow
11630 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
11640 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
11650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11660 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
11670 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20  egRowset);.     
11680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11690 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
116a0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
116b0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
116c0 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 70     regRowset = p
116d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
116e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
116f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11700 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72 65  penEphemeral, re
11710 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b  gRowset, pPk->nK
11720 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  eyCol);.        
11730 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
11740 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
11750 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPk);.      }.  
11760 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
11770 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11780 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
11790 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
117a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
117b0 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
117c0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
117d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
117e0 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66  E clause is z of
117f0 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20   the form:  (x1 
11800 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e  OR x2 OR ...) AN
11810 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  D y.    ** Then 
11820 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78  for every term x
11830 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74  N, evaluate as t
11840 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
11850 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a  : xN AND z.    *
11860 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d  * That way, term
11870 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20  s in y that are 
11880 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68  factored into th
11890 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69  e disjunction wi
118a0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63  ll.    ** be pic
118b0 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65  ked up by the re
118c0 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
118d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
118e0 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20  in() below..    
118f0 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c  **.    ** Actual
11900 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72  ly, each subexpr
11910 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72  ession is conver
11920 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77  ted to "xN AND w
11930 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20  " where w is.   
11940 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73   ** the "interes
11950 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a  ting" terms of z
11960 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69   - terms that di
11970 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
11980 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e  in the.    ** ON
11990 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
119a0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
119b0 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20   and terms that 
119c0 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20  are usable as . 
119d0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20     ** indices.. 
119e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
119f0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  s optimization a
11a00 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  lso only applies
11a10 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78   if the (x1 OR x
11a20 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20  2 OR ...) term. 
11a30 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e     ** is not con
11a40 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e  tained in the ON
11a50 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
11a60 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53  T JOIN..    ** S
11a70 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f  ee ticket http:/
11a80 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
11a90 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30  src/info/f236930
11aa0 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  4e4.    */.    i
11ab0 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
11ac0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
11ad0 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
11ae0 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
11af0 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
11b00 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11b10 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
11b20 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
11b30 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e        if( &pWC->
11b40 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72  a[iTerm] == pTer
11b50 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
11b60 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
11b70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11b80 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
11b90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11ba0 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
11bb0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
11bc0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
11bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
11be0 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65  case( pWC->a[iTe
11bf0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45  rm].wtFlags & TE
11c00 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
11c10 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
11c20 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
11c30 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
11c40 45 52 4d 5f 43 4f 44 45 44 29 29 21 3d 30 20 29  ERM_CODED))!=0 )
11c50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11c60 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
11c70 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
11c80 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
11c90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11ca0 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
11cb0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
11cc0 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
11cd0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
11ce0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
11cf0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
11d00 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
11d10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
11d20 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
11d30 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
11d40 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
11d50 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
11d60 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
11d70 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
11d80 5f 41 4e 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46  _AND|TKFLG_DONTF
11d90 4f 4c 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  OLD, 0, pAndExpr
11da0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11db0 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 20 73  ..    /* Run a s
11dc0 65 70 61 72 61 74 65 20 57 48 45 52 45 20 63 6c  eparate WHERE cl
11dd0 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 65  ause for each te
11de0 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61  rm of the OR cla
11df0 75 73 65 2e 20 20 41 66 74 65 72 0a 20 20 20 20  use.  After.    
11e00 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64  ** eliminating d
11e10 75 70 6c 69 63 61 74 65 73 20 66 72 6f 6d 20 6f  uplicates from o
11e20 74 68 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ther WHERE claus
11e30 65 73 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 66  es, the action f
11e40 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 73  or each.    ** s
11e50 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
11e60 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20  is to to invoke 
11e70 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
11e80 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
11e90 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ne..    */.    w
11ea0 63 74 72 6c 46 6c 61 67 73 20 3d 20 20 57 48 45  ctrlFlags =  WHE
11eb0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
11ec0 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
11ed0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 45  Flags & WHERE_SE
11ee0 45 4b 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20 66  EK_TABLE);.    f
11ef0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
11f00 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
11f10 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
11f20 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
11f30 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
11f40 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
11f50 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
11f60 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  | (pOrTerm->eOpe
11f70 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
11f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  =0 ){.        Wh
11f90 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e  ereInfo *pSubWIn
11fa0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
11fb0 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
11fc0 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
11fd0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
11fe0 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
11ff0 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72  ->pExpr; /* Curr
12000 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65  ent OR clause te
12010 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  rm */.        in
12020 74 20 6a 6d 70 31 20 3d 20 30 3b 20 20 20 20 20  t jmp1 = 0;     
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12040 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70   Address of jump
12050 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
12060 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
12070 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
12080 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
12090 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
120a0 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
120b0 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
120c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
120d0 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
120e0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
120f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
12100 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
12110 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
12120 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
12130 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
12140 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62 70  E(0xffff, ("Subp
12150 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73  lan for OR-claus
12160 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  e:\n"));.       
12170 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
12180 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
12190 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
121a0 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20      wctrlFlags, 
121e0 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
121f0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
12200 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
12210 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
12220 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
12230 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
12240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
12250 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
12260 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  p;.          int
12270 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
12280 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
12290 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
122a0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
122b0 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
122c0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
122d0 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
122e0 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
122f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12300 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74  e3WhereAddScanSt
12310 61 74 75 73 28 76 2c 20 70 4f 72 54 61 62 2c 20  atus(v, pOrTab, 
12320 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
12330 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
12340 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12350 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57 48  is is the sub-WH
12360 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79 2e  ERE clause body.
12370 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76 65    First skip ove
12380 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  r.          ** d
12390 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66 72  uplicate rows fr
123a0 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
123b0 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 20  RE clauses, and 
123c0 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20 20  record the.     
123d0 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28 6f       ** rowid (o
123e0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 66  r PRIMARY KEY) f
123f0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
12400 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ow so that the s
12410 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
12420 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b 69   row will be ski
12430 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75 65  pped in subseque
12440 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  nt sub-WHERE cla
12450 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20  uses..          
12460 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
12470 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
12480 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
12490 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
124a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
124b0 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
124c0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
124d0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
124e0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
124f0 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
12500 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
12510 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
12520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
12530 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
12540 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 72  Tab, -1, iCur, r
12550 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
12560 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 31 20             jmp1 
12570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12580 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
12590 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
125a0 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  et, 0,.         
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20    r,iSet);.     
125e0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
125f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12610 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
12620 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
12630 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
12640 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
12650 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50      int nPk = pP
12660 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
12670 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
12680 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  k;..            
12690 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b    /* Read the PK
126a0 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
126b0 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  f temp registers
126c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
126d0 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65     r = sqlite3Ge
126e0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
126f0 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  e, nPk);.       
12700 20 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30         for(iPk=0
12710 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b  ; iPk<nPk; iPk++
12720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12730 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
12740 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d  k->aiColumn[iPk]
12750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12760 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12770 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
12780 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
12790 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 29  ol, iCur, r+iPk)
127a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
127b0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
127c0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
127d0 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c 72 65   temp table alre
127e0 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  ady contains thi
127f0 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20  s key. If so,.  
12800 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
12810 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72 65 61  he row has alrea
12820 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64 65 64  dy been included
12830 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
12840 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  et and.         
12850 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 69       ** can be i
12860 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d 70 69  gnored (by jumpi
12870 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f 73 75  ng past the Gosu
12880 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77  b below). Otherw
12890 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ise,.           
128a0 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65     ** insert the
128b0 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65   key into the te
128c0 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70 72 6f  mp table and pro
128d0 63 65 65 64 20 77 69 74 68 20 70 72 6f 63 65 73  ceed with proces
128e0 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  sing.           
128f0 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20     ** the row.. 
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a               **.
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
12920 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65   Use some of the
12930 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69   same optimizati
12940 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53 65 74  ons as OP_RowSet
12950 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a 20 20  Test: If iSet.  
12960 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
12970 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65 20 74  s zero, assume t
12980 68 61 74 20 74 68 65 20 6b 65 79 20 63 61 6e 6e  hat the key cann
12990 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20 70 72  ot already be pr
129a0 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20  esent in.       
129b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 65         ** the te
129c0 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20 69 66  mp table. And if
129d0 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61 73 73   iSet is -1, ass
129e0 75 6d 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ume that there i
129f0 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20  s no .          
12a00 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69      ** need to i
12a10 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e  nsert the key in
12a20 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
12a30 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 65  e, as it will ne
12a40 76 65 72 20 0a 20 20 20 20 20 20 20 20 20 20 20  ver .           
12a50 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65 64 20     ** be tested 
12a60 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20  for.  */ .      
12a70 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
12a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12a90 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c 69 74      jmp1 = sqlit
12aa0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
12ab0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67  v, OP_Found, reg
12ac0 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50  Rowset, 0, r, nP
12ad0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
12ae0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12af0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
12b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
12b10 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29     if( iSet>=0 )
12b20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b40 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
12b50 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65  cord, r, nPk, re
12b60 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
12b70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12b80 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
12b90 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72   OP_IdxInsert, r
12ba0 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77  egRowset, regRow
12bb0 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 20 20 20 20 20 20 20 20 72 2c 20 6e 50 6b 29           r, nPk)
12be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12bf0 20 20 69 66 28 20 69 53 65 74 20 29 20 73 71 6c    if( iSet ) sql
12c00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12c10 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
12c20 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
12c30 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
12c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c            /* Rel
12c50 65 61 73 65 20 74 68 65 20 61 72 72 61 79 20 6f  ease the array o
12c60 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  f temp registers
12c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
12c80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12c90 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
12ca0 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20  , r, nPk);.     
12cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12cc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
12cd0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61  /* Invoke the ma
12ce0 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20  in loop body as 
12cf0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
12d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12d10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12d20 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
12d30 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
12d40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  .          /* Ju
12d50 6d 70 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e  mp here (skippin
12d60 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  g the main loop 
12d70 62 6f 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29  body subroutine)
12d80 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   if the.        
12d90 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62    ** current sub
12da0 2d 57 48 45 52 45 20 72 6f 77 20 69 73 20 61 20  -WHERE row is a 
12db0 64 75 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70  duplicate from p
12dc0 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e  rior sub-WHEREs.
12dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
12de0 28 20 6a 6d 70 31 20 29 20 73 71 6c 69 74 65 33  ( jmp1 ) sqlite3
12df0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12e00 6a 6d 70 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  jmp1);..        
12e10 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
12e20 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
12e30 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
12e40 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
12e50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
12e60 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
12e70 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
12e80 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
12e90 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
12ea0 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
12eb0 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
12ec0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
12ed0 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
12ee0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
12ef0 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
12f00 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
12f10 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
12f20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
12f30 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
12f40 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
12f50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
12f60 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
12f70 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
12f80 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
12f90 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
12fa0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
12fb0 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
12fc0 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
12fd0 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
12fe0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
12ff0 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
13000 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
13010 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
13020 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
13030 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
13040 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
13050 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
13060 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
13070 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
13080 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
13090 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
130a0 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
130b0 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
130c0 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
130d0 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
130e0 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
130f0 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
13100 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
13110 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
13120 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
13130 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
13140 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
13150 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
13160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
13170 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
13180 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
13190 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
131a0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
131b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
131c0 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
131d0 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
131e0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
131f0 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
13200 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
13210 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
13220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53   */.          pS
13230 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e  ubLoop = pSubWIn
13240 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b  fo->a[0].pWLoop;
13250 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13260 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  t( (pSubLoop->ws
13270 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
13280 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a  TO_INDEX)==0 );.
13290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
132a0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
132b0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
132c0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
132d0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75  && (ii==0 || pSu
132e0 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
132f0 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20  Index==pCov).   
13300 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73 52          && (HasR
13310 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
13320 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
13330 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72  (pSubLoop->u.btr
13340 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20  ee.pIndex)).    
13350 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
13370 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
13380 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
13390 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
133a0 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
133b0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
133c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
133d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
133e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
133f0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
13400 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
13410 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
13420 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
13430 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
13440 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13450 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
13460 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
13470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13480 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
13490 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
134a0 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
134b0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
134c0 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
134d0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
134e0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
134f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13500 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
13510 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
13520 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
13530 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
13540 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
13550 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13560 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
13570 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
13580 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
13590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
135a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f  lveLabel(v, iLoo
135b0 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28  pBody);..    if(
135c0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
135d0 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b  1 ) sqlite3Stack
135e0 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29  Free(db, pOrTab)
135f0 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
13600 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
13610 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
13620 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
13630 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13640 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
13650 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
13660 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65   /* Case 6:  The
13670 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
13680 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
13690 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
136a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
136b0 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
136c0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
136d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
136e0 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
136f0 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
13700 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
13710 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
13720 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
13730 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
13740 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
13750 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
13760 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
13770 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
13780 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
13790 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73 69  marked isRecursi
137a0 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ve have only a s
137b0 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69  ingle row that i
137c0 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20  s stored in.    
137d0 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75    ** a pseudo-cu
137e0 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74  rsor.  No need t
137f0 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74  o Rewind or Next
13800 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a   such cursors. *
13810 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  /.      pLevel->
13820 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
13830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
13840 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70 54  odeCursorHint(pT
13850 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20  abItem, pWInfo, 
13860 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  pLevel, 0);.    
13870 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
13880 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
13890 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
138a0 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
138b0 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
138c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
138d0 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
138e0 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29 3b 0a  Cur, addrHalt);.
138f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
13900 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
13910 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
13920 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d  rageIf(v, bRev!=
13930 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  0);.      pLevel
13940 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
13950 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
13960 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20  N_STEP;.    }.  
13970 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13980 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
13990 4e 53 54 41 54 55 53 0a 20 20 70 4c 65 76 65 6c  NSTATUS.  pLevel
139a0 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 73 71  ->addrVisit = sq
139b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
139c0 41 64 64 72 28 76 29 3b 0a 23 65 6e 64 69 66 0a  Addr(v);.#endif.
139d0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
139e0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
139f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
13a00 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
13a10 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
13a20 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
13a30 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
13a40 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
13a50 69 73 20 6c 6f 6f 70 20 6d 61 79 20 72 75 6e 20  is loop may run 
13a60 62 65 74 77 65 65 6e 20 6f 6e 65 20 61 6e 64 20  between one and 
13a70 74 68 72 65 65 20 74 69 6d 65 73 2c 20 64 65 70  three times, dep
13a80 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 20 20  ending on the.  
13a90 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ** constraints t
13aa0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 20  o be generated. 
13ab0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 73 74 61  The value of sta
13ac0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 4c 6f 6f  ck variable iLoo
13ad0 70 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  p.  ** determine
13ae0 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
13af0 73 20 63 6f 64 65 64 20 62 79 20 65 61 63 68 20  s coded by each 
13b00 69 74 65 72 61 74 69 6f 6e 2c 20 61 73 20 66 6f  iteration, as fo
13b10 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
13b20 20 69 4c 6f 6f 70 3d 3d 31 3a 20 43 6f 64 65 20   iLoop==1: Code 
13b30 6f 6e 6c 79 20 65 78 70 72 65 73 73 69 6f 6e 73  only expressions
13b40 20 74 68 61 74 20 61 72 65 20 65 6e 74 69 72 65   that are entire
13b50 6c 79 20 63 6f 76 65 72 65 64 20 62 79 20 70 49  ly covered by pI
13b60 64 78 2e 0a 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d  dx..  ** iLoop==
13b70 32 3a 20 43 6f 64 65 20 72 65 6d 61 69 6e 69 6e  2: Code remainin
13b80 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  g expressions th
13b90 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
13ba0 6e 20 63 6f 72 72 65 6c 61 74 65 64 0a 20 20 2a  n correlated.  *
13bb0 2a 20 20 20 20 20 20 20 20 20 20 20 73 75 62 2d  *           sub-
13bc0 71 75 65 72 69 65 73 2e 20 20 0a 20 20 2a 2a 20  queries.  .  ** 
13bd0 69 4c 6f 6f 70 3d 3d 33 3a 20 43 6f 64 65 20 61  iLoop==3: Code a
13be0 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 65 78 70  ll remaining exp
13bf0 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  ressions..  **. 
13c00 20 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73   ** An effort is
13c10 20 6d 61 64 65 20 74 6f 20 73 6b 69 70 20 75 6e   made to skip un
13c20 6e 65 63 65 73 73 61 72 79 20 69 74 65 72 61 74  necessary iterat
13c30 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
13c40 2e 0a 20 20 2a 2f 0a 20 20 69 4c 6f 6f 70 20 3d  ..  */.  iLoop =
13c50 20 28 70 49 64 78 20 3f 20 31 20 3a 20 32 29 3b   (pIdx ? 1 : 2);
13c60 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69  .  do{.    int i
13c70 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Next = 0;       
13c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
13c90 20 76 61 6c 75 65 20 66 6f 72 20 69 4c 6f 6f 70   value for iLoop
13ca0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72   */.    for(pTer
13cb0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
13cc0 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
13cd0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
13ce0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
13cf0 20 20 69 6e 74 20 73 6b 69 70 4c 69 6b 65 41 64    int skipLikeAd
13d00 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 65  dr = 0;.      te
13d10 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
13d20 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
13d30 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
13d40 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
13d50 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
13d60 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
13d70 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
13d80 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
13d90 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
13da0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
13db0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13dc0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
13dd0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
13de0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
13df0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
13e00 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
13e10 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
13e20 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
13e30 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
13e40 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  E)!=0 );.       
13e50 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
13e60 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
13e70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13e80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 20 3d      }.      pE =
13e90 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
13ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
13eb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
13ec0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
13ed0 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
13ee0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
13ef0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
13f00 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
13f10 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
13f20 20 69 66 28 20 69 4c 6f 6f 70 3d 3d 31 20 26 26   if( iLoop==1 &&
13f30 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76   !sqlite3ExprCov
13f40 65 72 65 64 42 79 49 6e 64 65 78 28 70 45 2c 20  eredByIndex(pE, 
13f50 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
13f60 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
13f70 20 20 69 4e 65 78 74 20 3d 20 32 3b 0a 20 20 20    iNext = 2;.   
13f80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
13f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13fa0 20 69 4c 6f 6f 70 3c 33 20 26 26 20 28 70 54 65   iLoop<3 && (pTe
13fb0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13fc0 52 4d 5f 56 41 52 53 45 4c 45 43 54 29 20 29 7b  RM_VARSELECT) ){
13fd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65  .        if( iNe
13fe0 78 74 3d 3d 30 20 29 20 69 4e 65 78 74 20 3d 20  xt==0 ) iNext = 
13ff0 33 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  3;.        conti
14000 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
14010 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
14020 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
14030 4b 45 43 4f 4e 44 20 29 7b 0a 20 20 20 20 20 20  KECOND ){.      
14040 20 20 2f 2a 20 49 66 20 74 68 65 20 54 45 52 4d    /* If the TERM
14050 5f 4c 49 4b 45 43 4f 4e 44 20 66 6c 61 67 20 69  _LIKECOND flag i
14060 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61 6e  s set, that mean
14070 73 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65  s that the range
14080 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 20 20   search.        
14090 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
140a0 20 74 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   to guarantee th
140b0 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  at the LIKE oper
140c0 61 74 6f 72 20 69 73 20 74 72 75 65 2c 20 73 6f  ator is true, so
140d0 20 77 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   we.        ** c
140e0 61 6e 20 73 6b 69 70 20 74 68 65 20 63 61 6c 6c  an skip the call
140f0 20 74 6f 20 74 68 65 20 6c 69 6b 65 28 41 2c 42   to the like(A,B
14100 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 42 75 74  ) function.  But
14110 20 74 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   this only works
14120 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
14130 73 74 72 69 6e 67 73 2e 20 20 53 6f 20 64 6f 20  strings.  So do 
14140 6e 6f 74 20 73 6b 69 70 20 74 68 65 20 63 61 6c  not skip the cal
14150 6c 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  l to the functio
14160 6e 20 6f 6e 20 74 68 65 20 70 61 73 73 0a 20 20  n on the pass.  
14170 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
14180 6d 70 61 72 65 73 20 42 4c 4f 42 73 2e 20 2a 2f  mpares BLOBs. */
14190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
141a0 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
141b0 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 20 20 63  _BLOBS.        c
141c0 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
141d0 20 20 20 20 20 20 20 75 33 32 20 78 20 3d 20 70         u32 x = p
141e0 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
141f0 6e 74 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ntr;.        ass
14200 65 72 74 28 20 78 3e 30 20 29 3b 0a 20 20 20 20  ert( x>0 );.    
14210 20 20 20 20 73 6b 69 70 4c 69 6b 65 41 64 64 72      skipLikeAddr
14220 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14230 64 4f 70 31 28 76 2c 20 28 78 26 31 29 3f 4f 50  dOp1(v, (x&1)?OP
14240 5f 49 66 4e 6f 74 3a 4f 50 5f 49 66 2c 20 28 69  _IfNot:OP_If, (i
14250 6e 74 29 28 78 3e 3e 31 29 29 3b 0a 20 20 20 20  nt)(x>>1));.    
14260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14270 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  (v);.#endif.    
14280 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
14290 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
142a0 20 30 78 66 66 66 66 20 2a 2f 0a 20 20 20 20 20   0xffff */.     
142b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
142c0 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
142d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
142e0 74 28 28 76 2c 20 22 57 68 65 72 65 54 65 72 6d  t((v, "WhereTerm
142f0 5b 25 64 5d 20 28 25 70 29 20 70 72 69 6f 72 69  [%d] (%p) priori
14300 74 79 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ty=%d",.        
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 70 57 43 2d 3e 6e 54 65 72 6d 2d 6a 2c 20 70   pWC->nTerm-j, p
14330 54 65 72 6d 2c 20 69 4c 6f 6f 70 29 29 3b 0a 20  Term, iLoop));. 
14340 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
14350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14360 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
14370 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
14380 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
14390 0a 20 20 20 20 20 20 69 66 28 20 73 6b 69 70 4c  .      if( skipL
143a0 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  ikeAddr ) sqlite
143b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
143c0 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a   skipLikeAddr);.
143d0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
143e0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
143f0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  ED;.    }.    iL
14400 6f 6f 70 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  oop = iNext;.  }
14410 77 68 69 6c 65 28 20 69 4c 6f 6f 70 3e 30 20 29  while( iLoop>0 )
14420 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  ;..  /* Insert c
14430 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
14440 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
14450 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
14460 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
14470 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
14480 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
14490 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
144a0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
144b0 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
144c0 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
144d0 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
144e0 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
144f0 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
14500 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
14510 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
14520 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
14530 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
14540 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
14550 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
14560 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
14570 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
14580 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
14590 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
145a0 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
145b0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
145c0 20 45 78 70 72 20 2a 70 45 2c 20 73 45 41 6c 74   Expr *pE, sEAlt
145d0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
145e0 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70  *pAlt;.    if( p
145f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14600 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
14610 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
14620 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
14630 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
14640 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29  & (WO_EQ|WO_IS))
14650 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
14660 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
14670 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
14680 51 55 49 56 29 3d 3d 30 20 29 20 63 6f 6e 74 69  QUIV)==0 ) conti
14690 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
146a0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
146b0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
146c0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
146d0 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e  >iLeftJoin ) con
146e0 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
146f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
14700 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
14710 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
14720 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20  P_FromJoin) );. 
14730 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
14740 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
14750 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
14760 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c  y)!=0 );.    pAl
14770 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
14780 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
14790 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
147a0 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
147b0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
147c0 20 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f         WO_EQ|WO_
147d0 49 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  IN|WO_IS, 0);.  
147e0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
147f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14800 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
14810 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
14820 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
14830 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
14840 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
14850 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14860 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
14870 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
14880 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
14890 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
148a0 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
148b0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
148c0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
148d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
148e0 0a 20 20 20 20 73 45 41 6c 74 20 3d 20 2a 70 41  .    sEAlt = *pA
148f0 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73  lt->pExpr;.    s
14900 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20 70 45 2d  EAlt.pLeft = pE-
14910 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69  >pLeft;.    sqli
14920 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14930 50 61 72 73 65 2c 20 26 73 45 41 6c 74 2c 20 61  Parse, &sEAlt, a
14940 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
14950 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
14960 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
14970 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
14980 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
14990 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
149a0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
149b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
149c0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
149d0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
149e0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
149f0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
14a00 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
14a10 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
14a20 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
14a30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14a40 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
14a50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14a60 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
14a70 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
14a80 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
14a90 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
14aa0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
14ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
14ac0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
14ad0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
14ae0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
14af0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
14b00 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
14b10 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14b20 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
14b30 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
14b40 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14b50 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14b60 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
14b70 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
14b80 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
14b90 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
14ba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14bb0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
14bc0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
14bd0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
14be0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14bf0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
14c00 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
14c10 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
14c20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
14c30 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
14c40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14c50 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14c60 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
14c70 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
14c80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
14c90 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
14ca0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
14cb0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
14cc0 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e  return pLevel->n
14cd0 6f 74 52 65 61 64 79 3b 0a 7d 0a                 otReady;.}.