/ Hex Artifact Content
Login

Artifact e1aaadd8fec650037cfbf27d1b3470338fb3b58fec34d11082df16fe9a08fbd7:


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 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
1230: 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1240: 73 65 29 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  se)->explain==2 
1250: 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  ).#endif.  {.   
1260: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1270: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1280: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1290: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
12a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
12b0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
12c0: 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
12d0: 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
12e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12f0: 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
1300: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
1310: 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
1320: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
1330: 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
1340: 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
1350: 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
1360: 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1380: 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
1390: 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
13a0: 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
13b0: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13d0: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
13e0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
13f0: 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
1420: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
1430: 6f 70 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  op */.    char *
1440: 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  zMsg;           
1450: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
1460: 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75  to add to EQP ou
1470: 74 70 75 74 20 2a 2f 0a 20 20 20 20 53 74 72 41  tput */.    StrA
1480: 63 63 75 6d 20 73 74 72 3b 20 20 20 20 20 20 20  ccum str;       
1490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
14a0: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2a   output string *
14b0: 2f 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  /.    char zBuf[
14c0: 31 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  100];           
14d0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73      /* Initial s
14e0: 70 61 63 65 20 66 6f 72 20 45 51 50 20 6f 75 74  pace for EQP out
14f0: 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  put string */.. 
1500: 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
1510: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66  l->pWLoop;.    f
1520: 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  lags = pLoop->ws
1530: 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28  Flags;.    if( (
1540: 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
1550: 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
1560: 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55  lags&WHERE_OR_SU
1570: 42 43 4c 41 55 53 45 29 20 29 20 72 65 74 75 72  BCLAUSE) ) retur
1580: 6e 20 30 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  n 0;..    isSear
1590: 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45  ch = (flags&(WHE
15a0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
15b0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
15c0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
15d0: 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56   ((flags&WHERE_V
15e0: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
15f0: 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  && (pLoop->u.btr
1600: 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20  ee.nEq>0)).     
1610: 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c         || (wctrl
1620: 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
1630: 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
1640: 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20  RDERBY_MAX));.. 
1650: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1660: 75 6d 49 6e 69 74 28 26 73 74 72 2c 20 64 62 2c  umInit(&str, db,
1670: 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42   zBuf, sizeof(zB
1680: 75 66 29 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  uf), SQLITE_MAX_
1690: 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 73 71 6c  LENGTH);.    sql
16a0: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
16b0: 6e 64 41 6c 6c 28 26 73 74 72 2c 20 69 73 53 65  ndAll(&str, isSe
16c0: 61 72 63 68 20 3f 20 22 53 45 41 52 43 48 22 20  arch ? "SEARCH" 
16d0: 3a 20 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69  : "SCAN");.    i
16e0: 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
16f0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1700: 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
1710: 22 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  " SUBQUERY %d", 
1720: 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
1730: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1740: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1750: 74 66 28 26 73 74 72 2c 20 22 20 54 41 42 4c 45  tf(&str, " TABLE
1760: 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
1770: 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1780: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
1790: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
17a0: 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
17b0: 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
17c0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
17d0: 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
17e0: 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
17f0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
1800: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==0 ){.      con
1810: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
1820: 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  0;.      Index *
1830: 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73  pIdx;..      ass
1840: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
1850: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b  ree.pIndex!=0 );
1860: 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
1870: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1880: 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dex;.      asser
1890: 74 28 20 21 28 66 6c 61 67 73 26 57 48 45 52 45  t( !(flags&WHERE
18a0: 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20  _AUTO_INDEX) || 
18b0: 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58  (flags&WHERE_IDX
18c0: 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20  _ONLY) );.      
18d0: 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  if( !HasRowid(pI
18e0: 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73  tem->pTab) && Is
18f0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1900: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
1910: 20 69 66 28 20 69 73 53 65 61 72 63 68 20 29 7b   if( isSearch ){
1920: 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20  .          zFmt 
1930: 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b  = "PRIMARY KEY";
1940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1950: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1960: 20 26 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c   & WHERE_PARTIAL
1970: 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IDX ){.        z
1980: 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43  Fmt = "AUTOMATIC
1990: 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e   PARTIAL COVERIN
19a0: 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20  G INDEX";.      
19b0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
19c0: 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
19d0: 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  EX ){.        zF
19e0: 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20  mt = "AUTOMATIC 
19f0: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b  COVERING INDEX";
1a00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a10: 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49   flags & WHERE_I
1a20: 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
1a30: 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52     zFmt = "COVER
1a40: 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20  ING INDEX %s";. 
1a50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a60: 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45      zFmt = "INDE
1a70: 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  X %s";.      }. 
1a80: 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b       if( zFmt ){
1a90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aa0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1ab0: 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20  str, " USING ", 
1ac0: 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  7);.        sqli
1ad0: 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1ae0: 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e 61   zFmt, pIdx->zNa
1af0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  me);.        exp
1b00: 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 26  lainIndexRange(&
1b10: 73 74 72 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 20  str, pLoop);.   
1b20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1b30: 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
1b40: 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c  E_IPK)!=0 && (fl
1b50: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1b60: 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20  TRAINT)!=0 ){.  
1b70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b80: 7a 52 61 6e 67 65 4f 70 3b 0a 20 20 20 20 20 20  zRangeOp;.      
1b90: 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1ba0: 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1bb0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1bc0: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1bd0: 3d 20 22 3d 22 3b 0a 20 20 20 20 20 20 7d 65 6c  = "=";.      }el
1be0: 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1bf0: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1c00: 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1c10: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61  T ){.        zRa
1c20: 6e 67 65 4f 70 20 3d 20 22 3e 3f 20 41 4e 44 20  ngeOp = ">? AND 
1c30: 72 6f 77 69 64 3c 22 3b 0a 20 20 20 20 20 20 7d  rowid<";.      }
1c40: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
1c50: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1c60: 7b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65  {.        zRange
1c70: 4f 70 20 3d 20 22 3e 22 3b 0a 20 20 20 20 20 20  Op = ">";.      
1c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1c90: 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45  ssert( flags&WHE
1ca0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20  RE_TOP_LIMIT);. 
1cb0: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1cc0: 3d 20 22 3c 22 3b 0a 20 20 20 20 20 20 7d 0a 20  = "<";.      }. 
1cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1ce0: 6e 74 66 28 26 73 74 72 2c 20 22 20 55 53 49 4e  ntf(&str, " USIN
1cf0: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1d00: 59 20 4b 45 59 20 28 72 6f 77 69 64 25 73 3f 29  Y KEY (rowid%s?)
1d10: 22 2c 7a 52 61 6e 67 65 4f 70 29 3b 0a 20 20 20  ",zRangeOp);.   
1d20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1d40: 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
1d50: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1d60: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1d70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d80: 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 22  3XPrintf(&str, "
1d90: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1da0: 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20  NDEX %d:%s",.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1dc0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1dd0: 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
1de0: 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1df0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1e00: 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45  SQLITE_EXPLAIN_E
1e10: 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20  STIMATED_ROWS.  
1e20: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
1e30: 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73  t>=10 ){.      s
1e40: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1e50: 74 72 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77  tr, " (~%llu row
1e60: 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45  s)", sqlite3LogE
1e70: 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e  stToInt(pLoop->n
1e80: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Out));.    }else
1e90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
1ea0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
1eb0: 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c  tr, " (~1 row)",
1ec0: 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   9);.    }.#endi
1ed0: 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
1ee0: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
1ef0: 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65  sh(&str);.    re
1f00: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1f10: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
1f20: 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
1f30: 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34  , iFrom, zMsg,P4
1f40: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20  _DYNAMIC);.  }. 
1f50: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23   return ret;.}.#
1f60: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f70: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
1f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f90: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
1fa0: 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  TATUS./*.** Conf
1fb0: 69 67 75 72 65 20 74 68 65 20 56 4d 20 70 61 73  igure the VM pas
1fc0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1fd0: 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
1fe0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d  n.** sqlite3_stm
1ff0: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  t_scanstatus() e
2000: 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
2010: 6e 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20 75  ng to the scan u
2020: 73 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65  sed to .** imple
2030: 6d 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e  ment level pLvl.
2040: 20 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c 69   Argument pSrcli
2050: 73 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  st is a pointer 
2060: 74 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20  to the FROM .** 
2070: 63 6c 61 75 73 65 20 74 68 61 74 20 74 68 65 20  clause that the 
2080: 73 63 61 6e 20 72 65 61 64 73 20 64 61 74 61 20  scan reads data 
2090: 66 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  from..**.** If a
20a0: 72 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70 6c  rgument addrExpl
20b0: 61 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69 74  ain is not 0, it
20c0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 61 64 64   must be the add
20d0: 72 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f  ress of an .** O
20e0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
20f0: 63 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72  ction that descr
2100: 69 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c 6f  ibes the same lo
2110: 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  op..*/.void sqli
2120: 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2130: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 76  tatus(.  Vdbe *v
2140: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2150: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
2160: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
2170: 75 73 20 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20  us entry to */. 
2180: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 6c 69   SrcList *pSrcli
2190: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21a0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
21b0: 70 4c 76 6c 20 72 65 61 64 73 20 64 61 74 61 20  pLvl reads data 
21c0: 66 72 6f 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  from */.  WhereL
21d0: 65 76 65 6c 20 2a 70 4c 76 6c 2c 20 20 20 20 20  evel *pLvl,     
21e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
21f0: 65 6c 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  el to add scanst
2200: 61 74 75 73 28 29 20 65 6e 74 72 79 20 66 6f 72  atus() entry for
2210: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
2220: 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
2230: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2240: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
2250: 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 63 6f  or 0) */.){.  co
2260: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 20 3d  nst char *zObj =
2270: 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   0;.  WhereLoop 
2280: 2a 70 4c 6f 6f 70 20 3d 20 70 4c 76 6c 2d 3e 70  *pLoop = pLvl->p
2290: 57 4c 6f 6f 70 3b 0a 20 20 69 66 28 20 28 70 4c  WLoop;.  if( (pL
22a0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
22b0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
22c0: 45 29 3d 3d 30 20 20 26 26 20 20 70 4c 6f 6f 70  E)==0  &&  pLoop
22d0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
22e0: 21 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 62 6a 20  !=0 ){.    zObj 
22f0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2300: 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a  .pIndex->zName;.
2310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 62    }else{.    zOb
2320: 6a 20 3d 20 70 53 72 63 6c 69 73 74 2d 3e 61 5b  j = pSrclist->a[
2330: 70 4c 76 6c 2d 3e 69 46 72 6f 6d 5d 2e 7a 4e 61  pLvl->iFrom].zNa
2340: 6d 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  me;.  }.  sqlite
2350: 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28  3VdbeScanStatus(
2360: 0a 20 20 20 20 20 20 76 2c 20 61 64 64 72 45 78  .      v, addrEx
2370: 70 6c 61 69 6e 2c 20 70 4c 76 6c 2d 3e 61 64 64  plain, pLvl->add
2380: 72 42 6f 64 79 2c 20 70 4c 76 6c 2d 3e 61 64 64  rBody, pLvl->add
2390: 72 56 69 73 69 74 2c 20 70 4c 6f 6f 70 2d 3e 6e  rVisit, pLoop->n
23a0: 4f 75 74 2c 20 7a 4f 62 6a 0a 20 20 29 3b 0a 7d  Out, zObj.  );.}
23b0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
23c0: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
23d0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
23e0: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
23f0: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
2400: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
2410: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
2420: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
2430: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
2440: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
2450: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
2460: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
2470: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
2480: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
2490: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
24a0: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
24b0: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
24c0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
24d0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
24e0: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
24f0: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
2500: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
2510: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
2520: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
2530: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
2540: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2550: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
2560: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
2570: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
2580: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
2590: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
25a0: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
25b0: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
25c0: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
25d0: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
25e0: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
25f0: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
2600: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
2610: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
2620: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
2630: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
2640: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
2650: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
2660: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
2670: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
2680: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
2690: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
26a0: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
26b0: 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
26c0: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
26d0: 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
26e0: 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
26f0: 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
2700: 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
2710: 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
2720: 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
2730: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
2740: 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
2750: 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
2760: 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
2770: 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
2780: 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
2790: 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
27a0: 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
27b0: 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
27c0: 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
27d0: 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
27e0: 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
27f0: 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
2800: 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
2810: 65 74 20 23 38 31 33 2e 0a 2a 2a 0a 2a 2a 20 49  et #813..**.** I
2820: 66 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64 72  f all the childr
2830: 65 6e 20 6f 66 20 61 20 74 65 72 6d 20 61 72 65  en of a term are
2840: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
2850: 74 68 61 74 20 74 65 72 6d 20 69 73 20 61 6c 73  that term is als
2860: 6f 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  o.** automatical
2870: 6c 79 20 64 69 73 61 62 6c 65 64 2e 20 20 49 6e  ly disabled.  In
2880: 20 74 68 69 73 20 77 61 79 2c 20 74 65 72 6d 73   this way, terms
2890: 20 67 65 74 20 64 69 73 61 62 6c 65 64 20 69 66   get disabled if
28a0: 20 64 65 72 69 76 65 64 0a 2a 2a 20 76 69 72 74   derived.** virt
28b0: 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 74 65  ual terms are te
28c0: 73 74 65 64 20 66 69 72 73 74 2e 20 20 46 6f 72  sted first.  For
28d0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
28e0: 20 20 20 20 20 78 20 47 4c 4f 42 20 27 61 62 63       x GLOB 'abc
28f0: 2a 27 20 41 4e 44 20 78 3e 3d 27 61 62 63 27 20  *' AND x>='abc' 
2900: 41 4e 44 20 78 3c 27 61 63 64 27 0a 2a 2a 20 20  AND x<'acd'.**  
2910: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
2920: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 2f 20 20  /     \______/  
2930: 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20     \_____/.**   
2940: 20 20 20 20 20 20 70 61 72 65 6e 74 20 20 20 20        parent    
2950: 20 20 20 20 20 20 63 68 69 6c 64 31 20 20 20 20        child1    
2960: 20 20 20 63 68 69 6c 64 32 0a 2a 2a 0a 2a 2a 20     child2.**.** 
2970: 4f 6e 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  Only the parent 
2980: 74 65 72 6d 20 77 61 73 20 69 6e 20 74 68 65 20  term was in the 
2990: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
29a0: 6c 61 75 73 65 2e 20 20 54 68 65 20 63 68 69 6c  lause.  The chil
29b0: 64 31 0a 2a 2a 20 61 6e 64 20 63 68 69 6c 64 32  d1.** and child2
29c0: 20 74 65 72 6d 73 20 77 65 72 65 20 61 64 64 65   terms were adde
29d0: 64 20 62 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  d by the LIKE op
29e0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
29f0: 62 6f 74 68 20 6f 66 0a 2a 2a 20 74 68 65 20 76  both of.** the v
2a00: 69 72 74 75 61 6c 20 63 68 69 6c 64 20 74 65 72  irtual child ter
2a10: 6d 73 20 61 72 65 20 76 61 6c 69 64 2c 20 74 68  ms are valid, th
2a20: 65 6e 20 74 65 73 74 69 6e 67 20 6f 66 20 74 68  en testing of th
2a30: 65 20 70 61 72 65 6e 74 20 63 61 6e 20 62 65 20  e parent can be 
2a40: 0a 2a 2a 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 0a  .** skipped..**.
2a50: 2a 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  ** Usually the p
2a60: 61 72 65 6e 74 20 74 65 72 6d 20 69 73 20 6d 61  arent term is ma
2a70: 72 6b 65 64 20 61 73 20 54 45 52 4d 5f 43 4f 44  rked as TERM_COD
2a80: 45 44 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  ED.  But if the 
2a90: 70 61 72 65 6e 74 0a 2a 2a 20 74 65 72 6d 20 77  parent.** term w
2aa0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 54 45  as originally TE
2ab0: 52 4d 5f 4c 49 4b 45 2c 20 74 68 65 6e 20 74 68  RM_LIKE, then th
2ac0: 65 20 70 61 72 65 6e 74 20 67 65 74 73 20 54 45  e parent gets TE
2ad0: 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 69 6e 73 74  RM_LIKECOND inst
2ae0: 65 61 64 2e 0a 2a 2a 20 54 68 65 20 54 45 52 4d  ead..** The TERM
2af0: 5f 4c 49 4b 45 43 4f 4e 44 20 6d 61 72 6b 69 6e  _LIKECOND markin
2b00: 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
2b10: 20 74 68 65 20 74 65 72 6d 20 73 68 6f 75 6c 64   the term should
2b20: 20 62 65 20 63 6f 64 65 64 20 69 6e 73 69 64 65   be coded inside
2b30: 0a 2a 2a 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61  .** a conditiona
2b40: 6c 20 73 75 63 68 20 74 68 61 74 20 69 73 20 6f  l such that is o
2b50: 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  nly evaluated on
2b60: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73   the second pass
2b70: 20 6f 66 20 61 0a 2a 2a 20 4c 49 4b 45 2d 6f 70   of a.** LIKE-op
2b80: 74 69 6d 69 7a 61 74 69 6f 6e 20 6c 6f 6f 70 2c  timization loop,
2b90: 20 77 68 65 6e 20 73 63 61 6e 6e 69 6e 67 20 42   when scanning B
2ba0: 4c 4f 42 73 20 69 6e 73 74 65 61 64 20 6f 66 20  LOBs instead of 
2bb0: 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61 74  strings..*/.stat
2bc0: 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
2bd0: 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
2be0: 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
2bf0: 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 6e 74  m *pTerm){.  int
2c00: 20 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 61 73   nLoop = 0;.  as
2c10: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
2c20: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 54 65 72  ;.  while( (pTer
2c30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
2c40: 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
2c50: 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
2c60: 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
2c70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2c80: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2c90: 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
2ca0: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
2cb0: 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
2cc0: 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
2cd0: 0a 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  .    if( nLoop &
2ce0: 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
2cf0: 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d  s & TERM_LIKE)!=
2d00: 30 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  0 ){.      pTerm
2d10: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2d20: 4d 5f 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20  M_LIKECOND;.    
2d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
2d40: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
2d50: 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
2d60: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
2d70: 69 50 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61  iParent<0 ) brea
2d80: 6b 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  k;.    pTerm = &
2d90: 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
2da0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
2db0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
2dc0: 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72 6d  !=0 );.    pTerm
2dd0: 2d 3e 6e 43 68 69 6c 64 2d 2d 3b 0a 20 20 20 20  ->nChild--;.    
2de0: 69 66 28 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c  if( pTerm->nChil
2df0: 64 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d!=0 ) break;.  
2e00: 20 20 6e 4c 6f 6f 70 2b 2b 3b 0a 20 20 7d 0a 7d    nLoop++;.  }.}
2e10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
2e20: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
2e30: 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
2e40: 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
2e50: 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
2e60: 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
2e70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
2e80: 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
2e90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
2ea0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 65  QLITE_AFF_BLOB e
2eb0: 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
2ec0: 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
2ed0: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
2ee0: 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
2ef0: 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
2f00: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
2f10: 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
2f20: 5f 41 46 46 5f 42 4c 4f 42 2c 20 74 68 65 6e 20  _AFF_BLOB, then 
2f30: 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
2f40: 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
2f50: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
2f60: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
2f70: 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
2f80: 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
2f90: 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
2fa0: 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
2fb0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
2fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
2fd0: 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
2fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2ff0: 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
3000: 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
3010: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3020: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
3030: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
3040: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
3050: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3060: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3070: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
3080: 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
3090: 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
30a0: 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
30b0: 46 46 5f 42 4c 4f 42 20 65 6e 74 72 69 65 73 20  FF_BLOB entries 
30c0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
30d0: 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
30e0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
30f0: 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
3100: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
3110: 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  0]==SQLITE_AFF_B
3120: 4c 4f 42 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  LOB ){.    n--;.
3130: 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
3140: 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
3150: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
3160: 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
3170: 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6e 2d  F_BLOB ){.    n-
3180: 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
3190: 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
31a0: 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
31b0: 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
31c0: 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
31d0: 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
31e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
31f0: 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
3200: 62 61 73 65 2c 20 6e 2c 20 30 2c 20 7a 41 66 66  base, n, 0, zAff
3210: 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
3220: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
3230: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
3240: 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
3250: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
3260: 6f 6e 20 70 52 69 67 68 74 2c 20 77 68 69 63 68  on pRight, which
3270: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
3280: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
3290: 61 74 69 6f 6e 2c 20 69 73 20 0a 2a 2a 20 65 69  ation, is .** ei
32a0: 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 66  ther a vector of
32b0: 20 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 72 2c 20   n elements or, 
32c0: 69 66 20 6e 3d 3d 31 2c 20 61 20 73 63 61 6c 61  if n==1, a scala
32d0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
32e0: 20 42 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70   Before the comp
32f0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
3300: 2c 20 61 66 66 69 6e 69 74 79 20 7a 41 66 66 20  , affinity zAff 
3310: 69 73 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64  is to be applied
3320: 0a 2a 2a 20 74 6f 20 74 68 65 20 70 52 69 67 68  .** to the pRigh
3330: 74 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 66  t values. This f
3340: 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73  unction modifies
3350: 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74 68   characters with
3360: 69 6e 20 74 68 65 0a 2a 2a 20 61 66 66 69 6e 69  in the.** affini
3370: 74 79 20 73 74 72 69 6e 67 20 74 6f 20 53 51 4c  ty string to SQL
3380: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 69 66 20  ITE_AFF_BLOB if 
3390: 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  either:.**.**   
33a0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
33b0: 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d   will be perform
33c0: 65 64 20 77 69 74 68 20 6e 6f 20 61 66 66 69 6e  ed with no affin
33d0: 69 74 79 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 74  ity, or.**   * t
33e0: 68 65 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  he affinity chan
33f0: 67 65 20 69 6e 20 7a 41 66 66 20 69 73 20 67 75  ge in zAff is gu
3400: 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20  aranteed not to 
3410: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
3420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3430: 20 75 70 64 61 74 65 52 61 6e 67 65 41 66 66 69   updateRangeAffi
3440: 6e 69 74 79 53 74 72 28 0a 20 20 45 78 70 72 20  nityStr(.  Expr 
3450: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
3460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
3470: 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  S of comparison 
3480: 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34b0: 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74  f vector element
34c0: 73 20 69 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 20  s in comparison 
34d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
3500: 20 73 74 72 69 6e 67 20 74 6f 20 6d 6f 64 69 66   string to modif
3510: 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  y */.){.  int i;
3520: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
3530: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
3540: 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
3550: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
3560: 52 69 67 68 74 2c 20 69 29 3b 0a 20 20 20 20 69  Right, i);.    i
3570: 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
3580: 65 41 66 66 69 6e 69 74 79 28 70 2c 20 7a 41 66  eAffinity(p, zAf
3590: 66 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[i])==SQLITE_AF
35a0: 46 5f 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 73  F_BLOB.     || s
35b0: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
35c0: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
35d0: 70 2c 20 7a 41 66 66 5b 69 5d 29 0a 20 20 20 20  p, zAff[i]).    
35e0: 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 5d  ){.      zAff[i]
35f0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
3600: 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  OB;.    }.  }.}.
3610: 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 61 6e  ../*.** pX is an
3620: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
3630: 68 65 20 66 6f 72 6d 3a 20 20 28 76 65 63 74 6f  he form:  (vecto
3640: 72 29 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  r) IN (SELECT ..
3650: 2e 29 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  .).** In other w
3660: 6f 72 64 73 2c 20 69 74 20 69 73 20 61 20 76 65  ords, it is a ve
3670: 63 74 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ctor IN operator
3680: 20 77 69 74 68 20 61 20 53 45 4c 45 43 54 20 63   with a SELECT c
3690: 6c 61 75 73 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  lause on the.** 
36a0: 4c 48 53 2e 20 20 42 75 74 20 6e 6f 74 20 61 6c  LHS.  But not al
36b0: 6c 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 76  l terms in the v
36c0: 65 63 74 6f 72 20 61 72 65 20 69 6e 64 65 78 61  ector are indexa
36d0: 62 6c 65 20 61 6e 64 20 74 68 65 20 74 65 72 6d  ble and the term
36e0: 73 20 6d 69 67 68 74 0a 2a 2a 20 6e 6f 74 20 62  s might.** not b
36f0: 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  e in the correct
3700: 20 6f 72 64 65 72 20 66 6f 72 20 69 6e 64 65 78   order for index
3710: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
3720: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61 20  routine makes a 
3730: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70 75  copy of the inpu
3740: 74 20 70 58 20 65 78 70 72 65 73 73 69 6f 6e 20  t pX expression 
3750: 61 6e 64 20 74 68 65 6e 20 61 64 6a 75 73 74 73  and then adjusts
3760: 0a 2a 2a 20 74 68 65 20 76 65 63 74 6f 72 20 6f  .** the vector o
3770: 6e 20 74 68 65 20 4c 48 53 20 77 69 74 68 20 63  n the LHS with c
3780: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68 61  orresponding cha
3790: 6e 67 65 73 20 74 6f 20 74 68 65 20 53 45 4c 45  nges to the SELE
37a0: 43 54 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  CT so that.** th
37b0: 65 20 76 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e  e vector contain
37c0: 73 20 6f 6e 6c 79 20 69 6e 64 65 78 20 74 65 72  s only index ter
37d0: 6d 73 20 61 6e 64 20 74 68 6f 73 65 20 74 65 72  ms and those ter
37e0: 6d 73 20 61 72 65 20 69 6e 20 74 68 65 20 63 6f  ms are in the co
37f0: 72 72 65 63 74 0a 2a 2a 20 6f 72 64 65 72 2e 20  rrect.** order. 
3800: 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 49 4e   The modified IN
3810: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
3820: 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61  eturned.  The ca
3830: 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
3840: 62 6c 65 0a 2a 2a 20 66 6f 72 20 64 65 6c 65 74  ble.** for delet
3850: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 65 64  ing the returned
3860: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
3870: 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  ** Example:.**.*
3880: 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  *    CREATE TABL
3890: 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  E t1(a,b,c,d,e,f
38a0: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
38b0: 49 4e 44 45 58 20 74 31 78 31 20 4f 4e 20 74 31  INDEX t1x1 ON t1
38c0: 28 65 2c 63 29 3b 0a 2a 2a 20 20 20 20 53 45 4c  (e,c);.**    SEL
38d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
38e0: 45 52 45 20 28 61 2c 62 2c 63 2c 64 2c 65 29 20  ERE (a,b,c,d,e) 
38f0: 49 4e 20 28 53 45 4c 45 43 54 20 76 2c 77 2c 78  IN (SELECT v,w,x
3900: 2c 79 2c 7a 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  ,y,z FROM t2).**
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
3930: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
3940: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
3950: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
3980: 70 58 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  pX expression.**
3990: 0a 2a 2a 20 53 69 6e 63 65 20 6f 6e 6c 79 20 63  .** Since only c
39a0: 6f 6c 75 6d 6e 73 20 65 20 61 6e 64 20 63 20 63  olumns e and c c
39b0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
39c0: 74 68 65 20 69 6e 64 65 78 2c 20 69 6e 20 74 68  the index, in th
39d0: 61 74 20 6f 72 64 65 72 2c 0a 2a 2a 20 74 68 65  at order,.** the
39e0: 20 6d 6f 64 69 66 69 65 64 20 49 4e 20 65 78 70   modified IN exp
39f0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
3a00: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
3a10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
3a20: 65 2c 63 29 20 49 4e 20 28 53 45 4c 45 43 54 20  e,c) IN (SELECT 
3a30: 7a 2c 78 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  z,x FROM t2).**.
3a40: 2a 2a 20 54 68 65 20 72 65 64 75 63 65 64 20 70  ** The reduced p
3a50: 58 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  X is different f
3a60: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
3a70: 20 28 6f 62 76 69 6f 75 73 6c 79 29 20 61 6e 64   (obviously) and
3a80: 20 74 68 75 73 20 69 73 0a 2a 2a 20 6f 6e 6c 79   thus is.** only
3a90: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
3aa0: 6e 67 2c 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  ng, to improve p
3ab0: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65  erformance.  The
3ac0: 20 6f 72 69 67 69 6e 61 6c 20 75 6e 61 6c 74 65   original unalte
3ad0: 72 65 64 0a 2a 2a 20 49 4e 20 65 78 70 72 65 73  red.** IN expres
3ae0: 73 69 6f 6e 20 6d 75 73 74 20 61 6c 73 6f 20 62  sion must also b
3af0: 65 20 72 75 6e 20 6f 6e 20 65 61 63 68 20 6f 75  e run on each ou
3b00: 74 70 75 74 20 72 6f 77 20 66 6f 72 20 63 6f 72  tput row for cor
3b10: 72 65 63 74 6e 65 73 73 2e 0a 2a 2f 0a 73 74 61  rectness..*/.sta
3b20: 74 69 63 20 45 78 70 72 20 2a 72 65 6d 6f 76 65  tic Expr *remove
3b30: 55 6e 69 6e 64 65 78 61 62 6c 65 49 6e 43 6c 61  UnindexableInCla
3b40: 75 73 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  useTerms(.  Pars
3b50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3b60: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
3b70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3b80: 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
3b90: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 6c      /* Look at l
3ba0: 6f 6f 70 20 74 65 72 6d 73 20 73 74 61 72 74 69  oop terms starti
3bb0: 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 57 68 65  ng here */.  Whe
3bc0: 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
3bd0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
3be0: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 45 78 70 72  t loop */.  Expr
3bf0: 20 2a 70 58 20 20 20 20 20 20 20 20 20 20 20 20   *pX            
3c00: 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
3c10: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 72 65 64  ession to be red
3c20: 75 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  uced */.){.  sql
3c30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
3c40: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
3c50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
3c60: 72 44 75 70 28 64 62 2c 20 70 58 2c 20 30 29 3b  rDup(db, pX, 0);
3c70: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
3c80: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3c90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 69    ExprList *pOri
3ca0: 67 52 68 73 20 3d 20 70 4e 65 77 2d 3e 78 2e 70  gRhs = pNew->x.p
3cb0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 20  Select->pEList; 
3cc0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e 6d   /* Original unm
3cd0: 6f 64 69 66 69 65 64 20 52 48 53 20 2a 2f 0a 20  odified RHS */. 
3ce0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
3cf0: 69 67 4c 68 73 20 3d 20 70 4e 65 77 2d 3e 70 4c  igLhs = pNew->pL
3d00: 65 66 74 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  eft->x.pList;   
3d10: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e    /* Original un
3d20: 6d 6f 64 69 66 69 65 64 20 4c 48 53 20 2a 2f 0a  modified LHS */.
3d30: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52      ExprList *pR
3d40: 68 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  hs = 0;         
3d50: 2f 2a 20 4e 65 77 20 52 48 53 20 61 66 74 65 72  /* New RHS after
3d60: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 2a   modifications *
3d70: 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
3d80: 70 4c 68 73 20 3d 20 30 3b 20 20 20 20 20 20 20  pLhs = 0;       
3d90: 20 20 2f 2a 20 4e 65 77 20 4c 48 53 20 61 66 74    /* New LHS aft
3da0: 65 72 20 6d 6f 64 73 20 2a 2f 0a 20 20 20 20 69  er mods */.    i
3db0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3dd0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
3de0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
3df0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3e00: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
3e10: 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
3e20: 53 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 69 3d  S */..    for(i=
3e30: 69 45 71 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c  iEq; i<pLoop->nL
3e40: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
3e50: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54    if( pLoop->aLT
3e60: 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70  erm[i]->pExpr==p
3e70: 58 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  X ){.        int
3e80: 20 69 46 69 65 6c 64 20 3d 20 70 4c 6f 6f 70 2d   iField = pLoop-
3e90: 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 69 46 69 65  >aLTerm[i]->iFie
3ea0: 6c 64 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld - 1;.        
3eb0: 61 73 73 65 72 74 28 20 70 4f 72 69 67 52 68 73  assert( pOrigRhs
3ec0: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3ed0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
3ee0: 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78  pRhs = sqlite3Ex
3ef0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
3f00: 72 73 65 2c 20 70 52 68 73 2c 20 70 4f 72 69 67  rse, pRhs, pOrig
3f10: 52 68 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  Rhs->a[iField].p
3f20: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
3f30: 4f 72 69 67 52 68 73 2d 3e 61 5b 69 46 69 65 6c  OrigRhs->a[iFiel
3f40: 64 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  d].pExpr = 0;.  
3f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
3f60: 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69 65 6c 64  rigLhs->a[iField
3f70: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
3f80: 20 20 20 20 20 20 70 4c 68 73 20 3d 20 73 71 6c        pLhs = sql
3f90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
3fa0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  nd(pParse, pLhs,
3fb0: 20 70 4f 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69   pOrigLhs->a[iFi
3fc0: 65 6c 64 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  eld].pExpr);.   
3fd0: 20 20 20 20 20 70 4f 72 69 67 4c 68 73 2d 3e 61       pOrigLhs->a
3fe0: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 20 3d  [iField].pExpr =
3ff0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4000: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
4010: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4020: 70 4f 72 69 67 52 68 73 29 3b 0a 20 20 20 20 73  pOrigRhs);.    s
4030: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4040: 6c 65 74 65 28 64 62 2c 20 70 4f 72 69 67 4c 68  lete(db, pOrigLh
4050: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c  s);.    pNew->pL
4060: 65 66 74 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  eft->x.pList = p
4070: 4c 68 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78  Lhs;.    pNew->x
4080: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
4090: 20 3d 20 70 52 68 73 3b 0a 20 20 20 20 69 66 28   = pRhs;.    if(
40a0: 20 70 4c 68 73 20 26 26 20 70 4c 68 73 2d 3e 6e   pLhs && pLhs->n
40b0: 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Expr==1 ){.     
40c0: 20 2f 2a 20 54 61 6b 65 20 63 61 72 65 20 68 65   /* Take care he
40d0: 72 65 20 6e 6f 74 20 74 6f 20 67 65 6e 65 72 61  re not to genera
40e0: 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 63  te a TK_VECTOR c
40f0: 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 6c 79 20 61  ontaining only a
4100: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
4110: 20 76 61 6c 75 65 2e 20 53 69 6e 63 65 20 74 68   value. Since th
4120: 65 20 70 61 72 73 65 72 20 6e 65 76 65 72 20 63  e parser never c
4130: 72 65 61 74 65 73 20 73 75 63 68 20 61 20 76 65  reates such a ve
4140: 63 74 6f 72 2c 20 73 6f 6d 65 0a 20 20 20 20 20  ctor, some.     
4150: 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 72 6f   ** of the subro
4160: 75 74 69 6e 65 73 20 64 6f 20 6e 6f 74 20 68 61  utines do not ha
4170: 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2e 20  ndle this case. 
4180: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
4190: 70 20 3d 20 70 4c 68 73 2d 3e 61 5b 30 5d 2e 70  p = pLhs->a[0].p
41a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4c 68 73  Expr;.      pLhs
41b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 30  ->a[0].pExpr = 0
41c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
41d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  xprDelete(db, pN
41e0: 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
41f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
4200: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65  p;.    }.    pSe
4210: 6c 65 63 74 20 3d 20 70 4e 65 77 2d 3e 78 2e 70  lect = pNew->x.p
4220: 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
4230: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
4240: 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  y ){.      /* If
4250: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4260: 65 6d 65 6e 74 20 68 61 73 20 61 6e 20 4f 52 44  ement has an ORD
4270: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 7a 65  ER BY clause, ze
4280: 72 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ro the .      **
4290: 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 72   iOrderByCol var
42a0: 69 61 62 6c 65 73 2e 20 54 68 65 73 65 20 61 72  iables. These ar
42b0: 65 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  e set to non-zer
42c0: 6f 20 77 68 65 6e 20 61 6e 20 0a 20 20 20 20 20  o when an .     
42d0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
42e0: 6d 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  m exactly matche
42f0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72  s one of the ter
4300: 6d 73 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  ms of the .     
4310: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 2e 20   ** result-set. 
4320: 53 69 6e 63 65 20 74 68 65 20 72 65 73 75 6c 74  Since the result
4330: 2d 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45  -set of the SELE
4340: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  CT statement may
4350: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62  .      ** have b
4360: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 6f 72 20  een modified or 
4370: 72 65 6f 72 64 65 72 65 64 2c 20 74 68 65 73 65  reordered, these
4380: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4390: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
43a0: 2a 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ** set correctly
43b0: 2e 20 20 53 69 6e 63 65 20 73 65 74 74 69 6e 67  .  Since setting
43c0: 20 74 68 65 6d 20 69 73 20 6a 75 73 74 20 61 6e   them is just an
43d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 0a   optimization, .
43e0: 20 20 20 20 20 20 2a 2a 20 69 74 27 73 20 65 61        ** it's ea
43f0: 73 69 65 73 74 20 6a 75 73 74 20 74 6f 20 7a 65  siest just to ze
4400: 72 6f 20 74 68 65 6d 20 68 65 72 65 2e 20 20 2a  ro them here.  *
4410: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
4420: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65   *pOrderBy = pSe
4430: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  lect->pOrderBy;.
4440: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4450: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
4460: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4470: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
4480: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
4490: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
44a0: 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 70 72 69  }..#if 0.    pri
44b0: 6e 74 66 28 22 46 6f 72 20 69 6e 64 65 78 69 6e  ntf("For indexin
44c0: 67 2c 20 63 68 61 6e 67 65 20 74 68 65 20 49 4e  g, change the IN
44d0: 20 65 78 70 72 3a 5c 6e 22 29 3b 0a 20 20 20 20   expr:\n");.    
44e0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
44f0: 78 70 72 28 30 2c 20 70 58 2c 20 30 29 3b 0a 20  xpr(0, pX, 0);. 
4500: 20 20 20 70 72 69 6e 74 66 28 22 49 6e 74 6f 3a     printf("Into:
4510: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
4520: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
4530: 20 70 4e 65 77 2c 20 30 29 3b 0a 23 65 6e 64 69   pNew, 0);.#endi
4540: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  f.  }.  return p
4550: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  New;.}.../*.** G
4560: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
4570: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
4580: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
4590: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
45a0: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
45b0: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
45c0: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
45d0: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
45e0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
45f0: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
4600: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
4610: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
4620: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
4630: 20 61 20 72 65 67 69 73 74 65 72 2c 20 74 68 65   a register, the
4640: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69   index.** of whi
4650: 63 68 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ch is returned. 
4660: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
4670: 61 64 65 20 73 74 6f 72 65 20 74 68 65 20 72 65  ade store the re
4680: 73 75 6c 74 20 69 6e 20 69 54 61 72 67 65 74 20  sult in iTarget 
4690: 62 75 74 0a 2a 2a 20 74 68 69 73 20 69 73 20 6f  but.** this is o
46a0: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 66  nly guaranteed f
46b0: 6f 72 20 54 4b 5f 49 53 4e 55 4c 4c 20 61 6e 64  or TK_ISNULL and
46c0: 20 54 4b 5f 49 4e 20 63 6f 6e 73 74 72 61 69 6e   TK_IN constrain
46d0: 74 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  ts.  If the.** c
46e0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 61 20 54  onstraint is a T
46f0: 4b 5f 45 51 20 6f 72 20 54 4b 5f 49 53 2c 20 74  K_EQ or TK_IS, t
4700: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
4710: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6c  value might be l
4720: 65 66 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 6f  eft in.** some o
4730: 74 68 65 72 20 72 65 67 69 73 74 65 72 20 61 6e  ther register an
4740: 64 20 69 74 20 69 73 20 74 68 65 20 63 61 6c 6c  d it is the call
4750: 65 72 27 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  er's responsibil
4760: 69 74 79 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74  ity to compensat
4770: 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  e..**.** For a c
4780: 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
4790: 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
47a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
47b0: 65 76 61 6c 75 61 74 65 64 20 69 6e 0a 2a 2a 20  evaluated in.** 
47c0: 73 74 72 61 69 67 68 74 2d 6c 69 6e 65 20 63 6f  straight-line co
47d0: 64 65 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  de.  For constra
47e0: 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
47f0: 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
4800: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4810: 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
4820: 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
4830: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
4840: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
4850: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
4860: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
4870: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
4880: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4890: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
48a0: 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
48b0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
48c0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
48d0: 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
48e0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
48f0: 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
4900: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
4910: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
4920: 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20  */.  int iEq,   
4930: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
4940: 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  x of the equalit
4950: 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
4960: 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  is level */.  in
4970: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
4980: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65    /* True for re
4990: 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f  verse-order IN o
49a0: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
49b0: 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
49c0: 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
49d0: 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
49e0: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
49f0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
4a00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
4a10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4a20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
4a30: 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
4a50: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
4a60: 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
4a70: 74 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  t( pLevel->pWLoo
4a80: 70 2d 3e 61 4c 54 65 72 6d 5b 69 45 71 5d 3d 3d  p->aLTerm[iEq]==
4a90: 70 54 65 72 6d 20 29 3b 0a 20 20 61 73 73 65 72  pTerm );.  asser
4aa0: 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
4ab0: 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
4ac0: 5f 45 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _EQ || pX->op==T
4ad0: 4b 5f 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67  K_IS ){.    iReg
4ae0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4af0: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
4b00: 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
4b10: 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
4b20: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
4b30: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
4b40: 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
4b50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b60: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
4b70: 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
4b80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4b90: 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
4ba0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 49 4e    int eType = IN
4bb0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 20  _INDEX_NOOP;.   
4bc0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
4bd0: 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
4be0: 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  n;.    WhereLoop
4bf0: 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c   *pLoop = pLevel
4c00: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ->pWLoop;.    in
4c10: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71  t i;.    int nEq
4c20: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
4c30: 69 4d 61 70 20 3d 20 30 3b 0a 0a 20 20 20 20 69  iMap = 0;..    i
4c40: 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
4c50: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
4c60: 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20  ALTABLE)==0.    
4c70: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
4c80: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20  ree.pIndex!=0.  
4c90: 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
4ca0: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53  btree.pIndex->aS
4cb0: 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
4cc0: 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
4cd0: 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
4ce0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
4cf0: 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
4d00: 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
4d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
4d20: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
4d30: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
4d40: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
4d50: 69 3c 69 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<iEq; i++){.   
4d60: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
4d70: 54 65 72 6d 5b 69 5d 20 26 26 20 70 4c 6f 6f 70  Term[i] && pLoop
4d80: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
4d90: 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
4da0: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
4db0: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
4dc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 54 61        return iTa
4dd0: 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
4de0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 45    }.    for(i=iE
4df0: 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q;i<pLoop->nLTer
4e00: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  m; i++){.      a
4e10: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
4e20: 54 65 72 6d 5b 69 5d 21 3d 30 20 29 3b 0a 20 20  Term[i]!=0 );.  
4e30: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
4e40: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
4e50: 3d 70 58 20 29 20 6e 45 71 2b 2b 3b 0a 20 20 20  =pX ) nEq++;.   
4e60: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 58 2d   }..    if( (pX-
4e70: 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
4e80: 65 6c 65 63 74 29 3d 3d 30 20 7c 7c 20 70 58 2d  elect)==0 || pX-
4e90: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4ea0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  st->nExpr==1 ){.
4eb0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71        eType = sq
4ec0: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
4ed0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f  (pParse, pX, IN_
4ee0: 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c 20 30  INDEX_LOOP, 0, 0
4ef0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4f00: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4f10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4f20: 20 20 20 20 70 58 20 3d 20 72 65 6d 6f 76 65 55      pX = removeU
4f30: 6e 69 6e 64 65 78 61 62 6c 65 49 6e 43 6c 61 75  nindexableInClau
4f40: 73 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  seTerms(pParse, 
4f50: 69 45 71 2c 20 70 4c 6f 6f 70 2c 20 70 58 29 3b  iEq, pLoop, pX);
4f60: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  ..      if( !db-
4f70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f80: 0a 20 20 20 20 20 20 20 20 61 69 4d 61 70 20 3d  .        aiMap =
4f90: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62   (int*)sqlite3Db
4fa0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
4fb0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  e->db, sizeof(in
4fc0: 74 29 2a 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  t)*nEq);.       
4fd0: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
4fe0: 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
4ff0: 73 65 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58  se, pX, IN_INDEX
5000: 5f 4c 4f 4f 50 2c 20 30 2c 20 61 69 4d 61 70 29  _LOOP, 0, aiMap)
5010: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
5020: 3e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d  >pExpr->iTable =
5030: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
5040: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5050: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5060: 20 70 58 29 3b 0a 20 20 20 20 20 20 70 58 20 3d   pX);.      pX =
5070: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
5080: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
5090: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
50a0: 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
50b0: 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
50c0: 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
50d0: 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
50e0: 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
50f0: 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
5100: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
5110: 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
5120: 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
5130: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
5140: 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b  rageIf(v, bRev);
5150: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
5160: 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20  eIf(v, !bRev);. 
5170: 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
5180: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
5190: 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
51a0: 29 3b 0a 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  );..    pLoop->w
51b0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
51c0: 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28  IN_ABLE;.    if(
51d0: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
51e0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
51f0: 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
5200: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5210: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 0a  abel(v);.    }..
5220: 20 20 20 20 69 20 3d 20 70 4c 65 76 65 6c 2d 3e      i = pLevel->
5230: 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20 70 4c  u.in.nIn;.    pL
5240: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2b  evel->u.in.nIn +
5250: 3d 20 6e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65  = nEq;.    pLeve
5260: 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
5270: 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
5280: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
5290: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
52a0: 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
52b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
52e0: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
52f0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
5300: 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
5310: 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
5320: 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
5330: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 70  {.      int iMap
5340: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5350: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
5360: 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 20 20 20  aiMap[] */.     
5370: 20 70 49 6e 20 2b 3d 20 69 3b 0a 20 20 20 20 20   pIn += i;.     
5380: 20 66 6f 72 28 69 3d 69 45 71 3b 69 3c 70 4c 6f   for(i=iEq;i<pLo
5390: 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29  op->nLTerm; i++)
53a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
53b0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
53c0: 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20  pExpr==pX ){.   
53d0: 20 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20         int iOut 
53e0: 3d 20 69 52 65 67 20 2b 20 69 20 2d 20 69 45 71  = iReg + i - iEq
53f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5400: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
5410: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
5420: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
5430: 45 71 3e 31 20 29 3b 20 20 2f 2a 20 48 61 70 70  Eq>1 );  /* Happ
5440: 65 6e 73 20 77 69 74 68 20 61 20 55 4e 49 51 55  ens with a UNIQU
5450: 45 20 69 6e 64 65 78 20 6f 6e 20 52 4f 57 49 44  E index on ROWID
5460: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5470: 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
5480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5490: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
54a0: 69 54 61 62 2c 20 69 4f 75 74 29 3b 0a 20 20 20  iTab, iOut);.   
54b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
54c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
54d0: 6f 6c 20 3d 20 61 69 4d 61 70 20 3f 20 61 69 4d  ol = aiMap ? aiM
54e0: 61 70 5b 69 4d 61 70 2b 2b 5d 20 3a 20 30 3b 0a  ap[iMap++] : 0;.
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
5500: 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
5510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5520: 2c 4f 50 5f 43 6f 6c 75 6d 6e 2c 69 54 61 62 2c  ,OP_Column,iTab,
5530: 20 69 43 6f 6c 2c 20 69 4f 75 74 29 3b 0a 20 20   iCol, iOut);.  
5540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5560: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
5570: 6c 6c 2c 20 69 4f 75 74 29 3b 20 56 64 62 65 43  ll, iOut); VdbeC
5580: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5590: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 45 71        if( i==iEq
55a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
55b0: 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
55c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
55d0: 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
55e0: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66  bRev ? OP_PrevIf
55f0: 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66  Open : OP_NextIf
5600: 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Open;.          
5610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5620: 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70     pIn->eEndLoop
5630: 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
5640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5650: 20 20 20 20 70 49 6e 2b 2b 3b 0a 20 20 20 20 20      pIn++;.     
5660: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
5680: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
5690: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
56a0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
56b0: 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
56c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
56d0: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
56e0: 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
56f0: 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
5700: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5710: 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
5720: 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
5730: 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
5740: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e  an.** index scan
5750: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
5760: 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
5770: 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
5780: 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
5790: 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
57a0: 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
57b0: 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
57c0: 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
57d0: 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
57e0: 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
57f0: 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
5800: 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
5810: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
5820: 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
5830: 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
5840: 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
5850: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
5860: 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
5870: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
5880: 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
5890: 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
58a0: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
58b0: 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
58c0: 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
58d0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
58e0: 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
58f0: 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
5900: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
5910: 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
5920: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
5930: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
5940: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
5950: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
5960: 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
5970: 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
5980: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
5990: 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
59a0: 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
59b0: 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
59c0: 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
59d0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
59e0: 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
59f0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
5a00: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
5a10: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
5a20: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
5a30: 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
5a40: 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65  .** The nExtraRe
5a50: 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  g parameter is 0
5a60: 20 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20   or 1.  It is 0 
5a70: 69 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61  if all WHERE cla
5a80: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
5a90: 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20  ** are == or IN 
5aa0: 61 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20  and are covered 
5ab0: 62 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78  by the nEq.  nEx
5ac0: 74 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74  traReg is 1 if t
5ad0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  here is.** an in
5ae0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
5af0: 69 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65  int (such as the
5b00: 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22   "c>=5 AND c<10"
5b10: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
5b20: 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20   that.** occurs 
5b30: 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75  after the nEq qu
5b40: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
5b50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
5b60: 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
5b70: 61 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e  a range of nEq+n
5b80: 45 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20  ExtraReg memory 
5b90: 63 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e  cells and return
5ba0: 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
5bb0: 66 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f  f the first memo
5bc0: 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20  ry cell in that 
5bd0: 72 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20  range. The code 
5be0: 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
5bf0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
5c00: 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
5c10: 72 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b  range to store k
5c20: 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74  eys for.** start
5c30: 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e   and termination
5c40: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74   conditions of t
5c50: 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20  he loop..** key 
5c60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
5c70: 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
5c80: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
5c90: 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
5ca0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
5cb0: 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
5cc0: 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
5cd0: 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
5ce0: 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  al.** use..**.**
5cf0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
5d00: 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74  g, *pzAff is set
5d10: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
5d20: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
5d30: 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68   a.** copy of th
5d40: 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
5d50: 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20  y string of the 
5d60: 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20  index allocated 
5d70: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
5d80: 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65  DbMalloc(). Exce
5d90: 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  pt, entries in t
5da0: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  he copy of the s
5db0: 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64  tring associated
5dc0: 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74  .** with equalit
5dd0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  y constraints th
5de0: 61 74 20 75 73 65 20 42 4c 4f 42 20 6f 72 20 4e  at use BLOB or N
5df0: 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
5e00: 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
5e10: 45 5f 41 46 46 5f 42 4c 4f 42 2e 20 54 68 69 73  E_AFF_BLOB. This
5e20: 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
5e30: 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
5e40: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
5e50: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
5e60: 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
5e70: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
5e80: 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
5e90: 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
5ea0: 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
5eb0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
5ec0: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
5ed0: 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
5ee0: 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
5ef0: 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
5f00: 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
5f10: 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
5f20: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
5f30: 74 32 2e 62 29 20 68 61 73 20 42 4c 4f 42 2f 4e  t2.b) has BLOB/N
5f40: 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
5f50: 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
5f60: 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
5f70: 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
5f80: 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
5f90: 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
5fa0: 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
5fb0: 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
5fc0: 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
5fd0: 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
5fe0: 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
5ff0: 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
6000: 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
6010: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2e 0a 2a  LITE_AFF_BLOB..*
6020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
6030: 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
6040: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
6050: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
6060: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6070: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
6080: 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
6090: 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
60a0: 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
60b0: 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
60c0: 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
60d0: 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
60e0: 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
60f0: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
6100: 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
6110: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6120: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
6130: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
6140: 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
6150: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
6160: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
6170: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
6180: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20  /.){.  u16 nEq; 
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
61b0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
61c0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
61d0: 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69  de */.  u16 nSki
61e0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
61f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6200: 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
6210: 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  umns to skip */.
6220: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6230: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
6240: 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
6250: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
6260: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
6290: 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
62a0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
62b0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
62d0: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
62e0: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
62f0: 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
6300: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
6310: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
6320: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
6350: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
6360: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
6370: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
6380: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
6390: 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
63a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
63b0: 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
63c0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
63d0: 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
6400: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
6410: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
6420: 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
6430: 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
6440: 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
6450: 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
6460: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
6470: 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
6480: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
6490: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
64a0: 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
64b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
64c0: 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  ;.  nSkip = pLoo
64d0: 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78  p->nSkip;.  pIdx
64e0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
64f0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65  e.pIndex;.  asse
6500: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a  rt( pIdx!=0 );..
6510: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
6520: 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
6530: 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
6540: 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
6550: 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
6560: 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
6570: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
6580: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
6590: 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  e.nEq + nExtraRe
65a0: 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
65b0: 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
65c0: 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
65d0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
65e0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
65f0: 6e 69 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e  nityStr(pParse->
6600: 64 62 2c 70 49 64 78 29 29 3b 0a 20 20 61 73 73  db,pIdx));.  ass
6610: 65 72 74 28 20 7a 41 66 66 21 3d 30 20 7c 7c 20  ert( zAff!=0 || 
6620: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6630: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
6640: 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
6650: 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
6660: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
6670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6680: 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
6690: 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
66a0: 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
66b0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
66c0: 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
66d0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
66e0: 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
66f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6700: 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
6710: 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
6720: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
6730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6740: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
6750: 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
6760: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6770: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
6780: 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
6790: 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
67c0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
67d0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
67e0: 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
67f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6800: 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
6810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6820: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
6830: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
6840: 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
6850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6860: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6870: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
6880: 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
6890: 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
68a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 58  ->aiColumn[j]==X
68b0: 4e 5f 45 58 50 52 20 29 3b 0a 20 20 20 20 20 20  N_EXPR );.      
68c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
68d0: 22 25 73 22 2c 20 65 78 70 6c 61 69 6e 49 6e 64  "%s", explainInd
68e0: 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 64  exColumnName(pId
68f0: 78 2c 20 6a 29 29 29 3b 0a 20 20 20 20 7d 0a 20  x, j)));.    }. 
6900: 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61   }    ..  /* Eva
6910: 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
6920: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
6930: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41   */.  assert( zA
6940: 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74  ff==0 || (int)st
6950: 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20  rlen(zAff)>=nEq 
6960: 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70  );.  for(j=nSkip
6970: 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
6980: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70     int r1;.    p
6990: 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
69a0: 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73  Term[j];.    ass
69b0: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
69c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
69d0: 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69  owing testcase i
69e0: 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  s true for indic
69f0: 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
6a00: 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
6a10: 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
6a20: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
6a30: 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
6a40: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
6a50: 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
6a60: 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
6a70: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6a80: 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
6a90: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
6aa0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
6ab0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
6ac0: 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
6ad0: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
6ae0: 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
6af0: 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a   bRev, regBase+j
6b00: 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
6b10: 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
6b20: 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
6b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6b50: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
6b60: 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
6b70: 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
6b80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6b90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ba0: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
6bb0: 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
6bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6bd0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
6be0: 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
6bf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 45     if( pTerm->pE
6c00: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
6c10: 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
6c20: 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e       /* No affin
6c30: 69 74 79 20 65 76 65 72 20 6e 65 65 64 73 20 74  ity ever needs t
6c40: 6f 20 62 65 20 28 6f 72 20 73 68 6f 75 6c 64 20  o be (or should 
6c50: 62 65 29 20 61 70 70 6c 69 65 64 20 74 6f 20 61  be) applied to a
6c60: 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
6c70: 2a 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 6f  * from the RHS o
6c80: 66 20 61 6e 20 22 3f 20 49 4e 20 28 53 45 4c 45  f an "? IN (SELE
6c90: 43 54 20 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  CT ...)" express
6ca0: 69 6f 6e 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ion. The .      
6cb0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64    ** sqlite3Find
6cc0: 49 6e 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  InIndex() routin
6cd0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  e has already en
6ce0: 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20 0a  sured that the .
6cf0: 20 20 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e          ** affin
6d00: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ity of the compa
6d10: 72 69 73 6f 6e 20 68 61 73 20 62 65 65 6e 20 61  rison has been a
6d20: 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 76 61  pplied to the va
6d30: 6c 75 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lue.  */.       
6d40: 20 69 66 28 20 7a 41 66 66 20 29 20 7a 41 66 66   if( zAff ) zAff
6d50: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
6d60: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 7d 0a 20  _BLOB;.      }. 
6d70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
6d80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6d90: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
6da0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
6db0: 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
6dc0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
6dd0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
6de0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 49 53  tFlags & TERM_IS
6df0: 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )==0 && sqlite3E
6e00: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
6e10: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
6e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e30: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
6e40: 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
6e50: 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
6e60: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
6e70: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
6e80: 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
6e90: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6ea0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
6eb0: 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
6ec0: 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
6ed0: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
6ee0: 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
6ef0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
6f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6f10: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
6f20: 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
6f30: 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
6f40: 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
6f50: 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
6f60: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
6f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6f80: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
6f90: 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
6fa0: 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
6fb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
6fc0: 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
6fd0: 42 4c 4f 42 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74  BLOBS./*.** If t
6fe0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
6ff0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
7000: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
7010: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
7020: 74 0a 2a 2a 20 28 61 20 73 74 72 69 6e 67 20 6c  t.** (a string l
7030: 69 74 65 72 61 6c 29 20 74 68 61 74 20 6f 72 69  iteral) that ori
7040: 67 69 6e 61 74 65 64 20 66 72 6f 6d 20 74 68 65  ginated from the
7050: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
7060: 6f 6e 2c 20 74 68 65 6e 20 0a 2a 2a 20 73 65 74  on, then .** set
7070: 20 50 33 20 61 6e 64 20 50 35 20 6f 6e 20 74 68   P3 and P5 on th
7080: 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f  e OP_String opco
7090: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  de so that the s
70a0: 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 63 61  tring will be ca
70b0: 73 74 0a 2a 2a 20 74 6f 20 61 20 42 4c 4f 42 20  st.** to a BLOB 
70c0: 61 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  at appropriate t
70d0: 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  imes..**.** The 
70e0: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
70f0: 6e 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75 61  n trys to evalua
7100: 74 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  te "x LIKE 'abc%
7110: 27 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a 2a  '" as a range.**
7120: 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78 3e   expression: "x>
7130: 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62  ='ABC' AND x<'ab
7140: 64 27 22 2e 20 20 42 75 74 20 74 68 69 73 20 72  d'".  But this r
7150: 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
7160: 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20 6c   range.** scan l
7170: 6f 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20 6f  oop run twice, o
7180: 6e 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73 20  nce for strings 
7190: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  and a second tim
71a0: 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a 20  e for BLOBs..** 
71b0: 54 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70  The OP_String op
71c0: 63 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65 63  codes on the sec
71d0: 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72 74  ond pass convert
71e0: 20 74 68 65 20 75 70 70 65 72 20 61 6e 64 20 6c   the upper and l
71f0: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73 74  ower.** bound st
7200: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 73 20 74  ring constants t
7210: 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72  o blobs.  This r
7220: 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
7230: 20 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67   necessary chang
7240: 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f  es.** to the OP_
7250: 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66  String opcodes f
7260: 6f 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65  or that to happe
7270: 6e 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  n..**.** Except,
7280: 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 66 20 53   of course, if S
7290: 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
72a0: 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 20 69 73  T_MATCH_BLOBS is
72b0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 2a   defined, then.*
72c0: 2a 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 70  * only the one p
72d0: 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
72e0: 73 74 72 69 6e 67 20 73 70 61 63 65 20 69 73 20  string space is 
72f0: 72 65 71 75 69 72 65 64 2c 20 73 6f 20 74 68 69  required, so thi
7300: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 62 65 63  s routine.** bec
7310: 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  omes a no-op..*/
7320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
7330: 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69  reLikeOptimizati
7340: 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 0a 20  onStringFixup(. 
7350: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
7360: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 65 70           /* prep
7370: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
7380: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7390: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  n */.  WhereLeve
73a0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 2f  l *pLevel,     /
73b0: 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20  * The loop that 
73c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 4c 49 4b  contains the LIK
73d0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
73e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
73f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
7400: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
7410: 75 6e 64 20 6a 75 73 74 20 63 6f 64 65 64 20 2a  und just coded *
7420: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  /.){.  if( pTerm
7430: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
7440: 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
7450: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
7460: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
7470: 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 30 20  >iLikeRepCntr>0 
7480: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
7490: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
74a0: 20 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74   -1);.    assert
74b0: 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20  ( pOp!=0 );.    
74c0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
74d0: 6f 64 65 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20  ode==OP_String8 
74e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
74f0: 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 70 57 49 6e  pTerm->pWC->pWIn
7500: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
7510: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7520: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 69      pOp->p3 = (i
7530: 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
7540: 65 52 65 70 43 6e 74 72 3e 3e 31 29 3b 20 20 2f  eRepCntr>>1);  /
7550: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
7560: 6e 67 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ng counter */.  
7570: 20 20 70 4f 70 2d 3e 70 35 20 3d 20 28 75 38 29    pOp->p5 = (u8)
7580: 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65  (pLevel->iLikeRe
7590: 70 43 6e 74 72 26 31 29 3b 20 20 20 20 2f 2a 20  pCntr&1);    /* 
75a0: 41 53 43 20 6f 72 20 44 45 53 43 20 2a 2f 0a 20  ASC or DESC */. 
75b0: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
75c0: 69 6e 65 20 77 68 65 72 65 4c 69 6b 65 4f 70 74  ine whereLikeOpt
75d0: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
75e0: 69 78 75 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64  ixup(A,B,C).#end
75f0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
7600: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
7610: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  HINTS./*.** Info
7620: 72 6d 61 74 69 6f 6e 20 69 73 20 70 61 73 73 65  rmation is passe
7630: 64 20 66 72 6f 6d 20 63 6f 64 65 43 75 72 73 6f  d from codeCurso
7640: 72 48 69 6e 74 28 29 20 64 6f 77 6e 20 74 6f 20  rHint() down to 
7650: 69 6e 64 69 76 69 64 75 61 6c 20 6e 6f 64 65 73  individual nodes
7660: 20 6f 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65   of.** the expre
7670: 73 73 69 6f 6e 20 74 72 65 65 20 28 62 79 20 73  ssion tree (by s
7680: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
7690: 29 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  ) using an insta
76a0: 6e 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 73  nce of this.** s
76b0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
76c0: 75 63 74 20 43 43 75 72 48 69 6e 74 20 7b 0a 20  uct CCurHint {. 
76d0: 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
76e0: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
76f0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f  he main table */
7700: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
7710: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
7720: 20 74 68 65 20 69 6e 64 65 78 2c 20 69 66 20 70   the index, if p
7730: 49 64 78 21 3d 30 2e 20 20 55 6e 75 73 65 64 20  Idx!=0.  Unused 
7740: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 49  otherwise */.  I
7750: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f  ndex *pIdx;    /
7760: 2a 20 54 68 65 20 69 6e 64 65 78 20 75 73 65 64  * The index used
7770: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74   to access the t
7780: 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  able */.};../*.*
7790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
77a0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 76  is called for ev
77b0: 65 72 79 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65  ery node of an e
77c0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
77d0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a  s a candidate.**
77e0: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68 69   for a cursor hi
77f0: 6e 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 63  nt on an index c
7800: 75 72 73 6f 72 2e 20 20 46 6f 72 20 54 4b 5f 43  ursor.  For TK_C
7810: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74  OLUMN nodes that
7820: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 68   reference.** th
7830: 65 20 74 61 62 6c 65 20 43 43 75 72 48 69 6e 74  e table CCurHint
7840: 2e 69 54 61 62 43 75 72 2c 20 76 65 72 69 66 79  .iTabCur, verify
7850: 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
7860: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 0a 2a 2a 20  olumn can be.** 
7870: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
7880: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
7890: 69 74 20 63 61 6e 6e 6f 74 2c 20 74 68 65 6e 20  it cannot, then 
78a0: 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  set pWalker->eCo
78b0: 64 65 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74  de to 1..*/.stat
78c0: 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f  ic int codeCurso
78d0: 72 48 69 6e 74 43 68 65 63 6b 45 78 70 72 28 57  rHintCheckExpr(W
78e0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
78f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
7900: 73 74 72 75 63 74 20 43 43 75 72 48 69 6e 74 20  struct CCurHint 
7910: 2a 70 48 69 6e 74 20 3d 20 70 57 61 6c 6b 65 72  *pHint = pWalker
7920: 2d 3e 75 2e 70 43 43 75 72 48 69 6e 74 3b 0a 20  ->u.pCCurHint;. 
7930: 20 61 73 73 65 72 74 28 20 70 48 69 6e 74 2d 3e   assert( pHint->
7940: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 69 66 28  pIdx!=0 );.  if(
7950: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
7960: 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
7970: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 48 69 6e 74  r->iTable==pHint
7980: 2d 3e 69 54 61 62 43 75 72 0a 20 20 20 26 26 20  ->iTabCur.   && 
7990: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
79a0: 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70 49 64 78  ndex(pHint->pIdx
79b0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
79c0: 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
79d0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
79e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
79f0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
7a00: 2a 0a 2a 2a 20 54 65 73 74 20 77 68 65 74 68 65  *.** Test whethe
7a10: 72 20 6f 72 20 6e 6f 74 20 65 78 70 72 65 73 73  r or not express
7a20: 69 6f 6e 20 70 45 78 70 72 2c 20 77 68 69 63 68  ion pExpr, which
7a30: 20 77 61 73 20 70 61 72 74 20 6f 66 20 61 20 57   was part of a W
7a40: 48 45 52 45 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  HERE clause,.** 
7a50: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
7a60: 65 64 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  ed in the cursor
7a70: 2d 68 69 6e 74 20 66 6f 72 20 61 20 74 61 62 6c  -hint for a tabl
7a80: 65 20 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65  e that is on the
7a90: 20 72 68 73 0a 2a 2a 20 6f 66 20 61 20 4c 45 46   rhs.** of a LEF
7aa0: 54 20 4a 4f 49 4e 2e 20 53 65 74 20 57 61 6c 6b  T JOIN. Set Walk
7ab0: 65 72 2e 65 43 6f 64 65 20 74 6f 20 6e 6f 6e 2d  er.eCode to non-
7ac0: 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
7ad0: 72 6e 69 6e 67 20 69 66 20 74 68 65 20 0a 2a 2a  rning if the .**
7ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
7af0: 6f 74 20 73 75 69 74 61 62 6c 65 2e 0a 2a 2a 0a  ot suitable..**.
7b00: 2a 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  ** An expression
7b10: 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20 69   is unsuitable i
7b20: 66 20 69 74 20 6d 69 67 68 74 20 65 76 61 6c 75  f it might evalu
7b30: 61 74 65 20 74 6f 20 6e 6f 6e 20 4e 55 4c 4c 20  ate to non NULL 
7b40: 65 76 65 6e 20 69 66 0a 2a 2a 20 61 20 54 4b 5f  even if.** a TK_
7b50: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 20 74 68 61 74  COLUMN node that
7b60: 20 64 6f 65 73 20 61 66 66 65 63 74 20 74 68 65   does affect the
7b70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78   value of the ex
7b80: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 0a  pression is set.
7b90: 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 46 6f 72 20  ** to NULL. For 
7ba0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
7bb0: 20 63 6f 6c 20 49 53 20 4e 55 4c 4c 0a 2a 2a 20   col IS NULL.** 
7bc0: 20 20 63 6f 6c 20 49 53 20 4e 4f 54 20 4e 55 4c    col IS NOT NUL
7bd0: 4c 0a 2a 2a 20 20 20 63 6f 61 6c 65 73 63 65 28  L.**   coalesce(
7be0: 63 6f 6c 2c 20 31 29 0a 2a 2a 20 20 20 43 41 53  col, 1).**   CAS
7bf0: 45 20 57 48 45 4e 20 63 6f 6c 20 54 48 45 4e 20  E WHEN col THEN 
7c00: 30 20 45 4c 53 45 20 31 20 45 4e 44 0a 2a 2f 0a  0 ELSE 1 END.*/.
7c10: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
7c20: 75 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e  ursorHintIsOrFun
7c30: 63 74 69 6f 6e 28 57 61 6c 6b 65 72 20 2a 70 57  ction(Walker *pW
7c40: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
7c50: 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
7c60: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 0a 20 20 20  ->op==TK_IS .   
7c70: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
7c80: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72  _ISNULL || pExpr
7c90: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
7ca0: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
7cb0: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 70  =TK_NOTNULL || p
7cc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
7cd0: 45 20 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  E .  ){.    pWal
7ce0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
7cf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
7d00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
7d10: 4f 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 31  ON ){.    int d1
7d20: 3b 0a 20 20 20 20 63 68 61 72 20 64 32 5b 34 5d  ;.    char d2[4]
7d30: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
7d40: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
7d50: 6f 6e 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  on(pWalker->pPar
7d60: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26  se->db, pExpr, &
7d70: 64 31 2c 20 64 32 29 20 29 7b 0a 20 20 20 20 20  d1, d2) ){.     
7d80: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
7d90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
7da0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
7db0: 74 69 6e 75 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tinue;.}.../*.**
7dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7dd0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  s called on ever
7de0: 79 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78 70  y node of an exp
7df0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 75 73 65  ression tree use
7e00: 64 20 61 73 20 61 6e 0a 2a 2a 20 61 72 67 75 6d  d as an.** argum
7e10: 65 6e 74 20 74 6f 20 74 68 65 20 4f 50 5f 43 75  ent to the OP_Cu
7e20: 72 73 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63  rsorHint instruc
7e30: 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 6e 6f 64  tion. If the nod
7e40: 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  e is a TK_COLUMN
7e50: 0a 2a 2a 20 74 68 61 74 20 61 63 63 65 73 73 65  .** that accesse
7e60: 73 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  s any table othe
7e70: 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 69  r than the one i
7e80: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
7e90: 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72  CCurHint.iTabCur
7ea0: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 66 6f  , then do the fo
7eb0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
7ec0: 20 31 29 20 61 6c 6c 6f 63 61 74 65 20 61 20 72   1) allocate a r
7ed0: 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 64 65  egister and code
7ee0: 20 61 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e   an OP_Column in
7ef0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 61  struction to rea
7f00: 64 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 73  d .**      the s
7f10: 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
7f20: 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 72 65 67  into the new reg
7f30: 69 73 74 65 72 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ister, and.**.**
7f40: 20 20 20 32 29 20 74 72 61 6e 73 66 6f 72 6d 20     2) transform 
7f50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
7f60: 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
7f70: 53 54 45 52 20 6e 6f 64 65 20 74 68 61 74 20 72  STER node that r
7f80: 65 61 64 73 20 0a 2a 2a 20 20 20 20 20 20 66 72  eads .**      fr
7f90: 6f 6d 20 74 68 65 20 6e 65 77 6c 79 20 70 6f 70  om the newly pop
7fa0: 75 6c 61 74 65 64 20 72 65 67 69 73 74 65 72 2e  ulated register.
7fb0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 69 66 20  .**.** Also, if 
7fc0: 74 68 65 20 6e 6f 64 65 20 69 73 20 61 20 54 4b  the node is a TK
7fd0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 64 6f 65  _COLUMN that doe
7fe0: 73 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62  s access the tab
7ff0: 6c 65 20 69 64 65 6e 69 66 69 65 64 0a 2a 2a 20  le idenified.** 
8000: 62 79 20 70 43 43 75 72 48 69 6e 74 2e 69 54 61  by pCCurHint.iTa
8010: 62 43 75 72 2c 20 61 6e 64 20 61 6e 20 69 6e 64  bCur, and an ind
8020: 65 78 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ex is being used
8030: 20 28 77 68 69 63 68 20 77 65 20 77 69 6c 6c 0a   (which we will.
8040: 2a 2a 20 6b 6e 6f 77 20 62 65 63 61 75 73 65 20  ** know because 
8050: 43 43 75 72 48 69 6e 74 2e 70 49 64 78 21 3d 30  CCurHint.pIdx!=0
8060: 29 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d  ) then transform
8070: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 69   the TK_COLUMN i
8080: 6e 74 6f 0a 2a 2a 20 61 6e 20 61 63 63 65 73 73  nto.** an access
8090: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 61   of the index ra
80a0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 72  ther than the or
80b0: 69 67 69 6e 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  iginal table..*/
80c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
80d0: 43 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70  CursorHintFixExp
80e0: 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
80f0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
8100: 0a 20 20 69 6e 74 20 72 63 20 3d 20 57 52 43 5f  .  int rc = WRC_
8110: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 73 74 72 75  Continue;.  stru
8120: 63 74 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69  ct CCurHint *pHi
8130: 6e 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  nt = pWalker->u.
8140: 70 43 43 75 72 48 69 6e 74 3b 0a 20 20 69 66 28  pCCurHint;.  if(
8150: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
8160: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 69 66 28  OLUMN ){.    if(
8170: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
8180: 70 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 20 29  pHint->iTabCur )
8190: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
81a0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
81b0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
81c0: 69 6e 74 20 72 65 67 20 3d 20 2b 2b 70 57 61 6c  int reg = ++pWal
81d0: 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 6e 4d 65  ker->pParse->nMe
81e0: 6d 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  m;   /* Register
81f0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   for column valu
8200: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
8210: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
8220: 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 20 20  umnOfTable(.    
8230: 20 20 20 20 20 20 76 2c 20 70 45 78 70 72 2d 3e        v, pExpr->
8240: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61  pTab, pExpr->iTa
8250: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
8260: 75 6d 6e 2c 20 72 65 67 0a 20 20 20 20 20 20 29  umn, reg.      )
8270: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
8280: 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
8290: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
82a0: 61 62 6c 65 20 3d 20 72 65 67 3b 0a 20 20 20 20  able = reg;.    
82b0: 7d 65 6c 73 65 20 69 66 28 20 70 48 69 6e 74 2d  }else if( pHint-
82c0: 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
82d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
82e0: 3d 20 70 48 69 6e 74 2d 3e 69 49 64 78 43 75 72  = pHint->iIdxCur
82f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
8300: 43 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33  Column = sqlite3
8310: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48  ColumnOfIndex(pH
8320: 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  int->pIdx, pExpr
8330: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
8340: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8350: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20  >iColumn>=0 );. 
8360: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
8370: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
8380: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
8390: 20 20 20 2f 2a 20 41 6e 20 61 67 67 72 65 67 61     /* An aggrega
83a0: 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  te function in t
83b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
83c0: 6f 66 20 61 20 71 75 65 72 79 20 6d 65 61 6e 73  of a query means
83d0: 20 74 68 69 73 20 6d 75 73 74 0a 20 20 20 20 2a   this must.    *
83e0: 2a 20 62 65 20 61 20 63 6f 72 72 65 6c 61 74 65  * be a correlate
83f0: 64 20 73 75 62 2d 71 75 65 72 79 2c 20 61 6e 64  d sub-query, and
8400: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
8410: 72 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  r is an aggregat
8420: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
8430: 65 20 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  e parent context
8440: 2e 20 44 6f 20 6e 6f 74 20 77 61 6c 6b 20 74 68  . Do not walk th
8450: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  e function argum
8460: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 63 61 73  ents in this cas
8470: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
8480: 20 74 6f 64 6f 3a 20 49 74 20 73 68 6f 75 6c 64   todo: It should
8490: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
84a0: 72 65 70 6c 61 63 65 20 74 68 69 73 20 6e 6f 64  replace this nod
84b0: 65 20 77 69 74 68 20 61 20 54 4b 5f 52 45 47 49  e with a TK_REGI
84c0: 53 54 45 52 0a 20 20 20 20 2a 2a 20 65 78 70 72  STER.    ** expr
84d0: 65 73 73 69 6f 6e 2c 20 61 73 20 74 68 65 20 72  ession, as the r
84e0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
84f0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
8500: 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 20 20 20  stored in a .   
8510: 20 2a 2a 20 72 65 67 69 73 74 65 72 20 61 74 20   ** register at 
8520: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 65 20  this point. The 
8530: 73 61 6d 65 20 68 6f 6c 64 73 20 66 6f 72 20 54  same holds for T
8540: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  K_AGG_COLUMN nod
8550: 65 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  es. */.    rc = 
8560: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
8570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8580: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6e 20 4f  *.** Insert an O
8590: 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 69 6e 73  P_CursorHint ins
85a0: 74 72 75 63 74 69 6f 6e 20 69 66 20 69 74 20 69  truction if it i
85b0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
85c0: 20 64 6f 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69   do so..*/.stati
85d0: 63 20 76 6f 69 64 20 63 6f 64 65 43 75 72 73 6f  c void codeCurso
85e0: 72 48 69 6e 74 28 0a 20 20 73 74 72 75 63 74 20  rHint(.  struct 
85f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
8600: 61 62 49 74 65 6d 2c 20 20 2f 2a 20 46 52 4f 4d  abItem,  /* FROM
8610: 20 63 6c 61 75 73 65 20 69 74 65 6d 20 2a 2f 0a   clause item */.
8620: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
8630: 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 77  nfo,    /* The w
8640: 68 65 72 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20  here clause */. 
8650: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
8660: 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
8670: 6c 6f 6f 70 20 74 6f 20 70 72 6f 76 69 64 65 20  loop to provide 
8680: 68 69 6e 74 73 20 66 6f 72 20 2a 2f 0a 20 20 57  hints for */.  W
8690: 68 65 72 65 54 65 72 6d 20 2a 70 45 6e 64 52 61  hereTerm *pEndRa
86a0: 6e 67 65 20 20 2f 2a 20 48 69 6e 74 20 74 68 69  nge  /* Hint thi
86b0: 73 20 65 6e 64 2d 6f 66 2d 73 63 61 6e 20 62 6f  s end-of-scan bo
86c0: 75 6e 64 61 72 79 20 74 65 72 6d 20 69 66 20 6e  undary term if n
86d0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
86e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
86f0: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
8700: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8710: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
8720: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
8730: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
8740: 45 78 70 72 20 3d 20 30 3b 0a 20 20 57 68 65 72  Expr = 0;.  Wher
8750: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
8760: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
8770: 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
8780: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
8790: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
87a0: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
87b0: 20 73 74 72 75 63 74 20 43 43 75 72 48 69 6e 74   struct CCurHint
87c0: 20 73 48 69 6e 74 3b 0a 20 20 57 61 6c 6b 65 72   sHint;.  Walker
87d0: 20 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 69 66 28   sWalker;..  if(
87e0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
87f0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
8800: 5f 43 75 72 73 6f 72 48 69 6e 74 73 29 20 29 20  _CursorHints) ) 
8810: 72 65 74 75 72 6e 3b 0a 20 20 69 43 75 72 20 3d  return;.  iCur =
8820: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
8830: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ;.  assert( iCur
8840: 3d 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ==pWInfo->pTabLi
8850: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
8860: 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a  rom].iCursor );.
8870: 20 20 73 48 69 6e 74 2e 69 54 61 62 43 75 72 20    sHint.iTabCur 
8880: 3d 20 69 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e  = iCur;.  sHint.
8890: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
88a0: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 73 48 69  ->iIdxCur;.  sHi
88b0: 6e 74 2e 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  nt.pIdx = pLoop-
88c0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
88d0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
88e0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
88f0: 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
8900: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
8910: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  se;.  sWalker.u.
8920: 70 43 43 75 72 48 69 6e 74 20 3d 20 26 73 48 69  pCCurHint = &sHi
8930: 6e 74 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  nt;.  pWC = &pWI
8940: 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 66 6f 72 28  nfo->sWC;.  for(
8950: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
8960: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 65  m; i++){.    pTe
8970: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 5d 3b  rm = &pWC->a[i];
8980: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8990: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
89a0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
89b0: 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
89c0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
89d0: 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
89e0: 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 29 20 63 6f  l->notReady ) co
89f0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
8a00: 41 6e 79 20 74 65 72 6d 73 20 73 70 65 63 69 66  Any terms specif
8a10: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
8a20: 68 65 20 4f 4e 28 2e 2e 2e 29 20 63 6c 61 75 73  he ON(...) claus
8a30: 65 20 66 6f 72 20 61 6e 79 20 4c 45 46 54 20 0a  e for any LEFT .
8a40: 20 20 20 20 2a 2a 20 4a 4f 49 4e 20 66 6f 72 20      ** JOIN for 
8a50: 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e  which the curren
8a60: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 74  t table is not t
8a70: 68 65 20 72 68 73 20 61 72 65 20 6f 6d 69 74 74  he rhs are omitt
8a80: 65 64 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ed.    ** from t
8a90: 68 65 20 63 75 72 73 6f 72 2d 68 69 6e 74 2e 20  he cursor-hint. 
8aa0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
8ab0: 66 20 74 68 69 73 20 74 61 62 6c 65 20 69 73 20  f this table is 
8ac0: 74 68 65 20 72 68 73 20 6f 66 20 61 20 4c 45 46  the rhs of a LEF
8ad0: 54 20 4a 4f 49 4e 2c 20 22 49 53 22 20 6f 72 20  T JOIN, "IS" or 
8ae0: 22 49 53 20 4e 55 4c 4c 22 20 74 65 72 6d 73 20  "IS NULL" terms 
8af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 72  .    ** that wer
8b00: 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  e specified as p
8b10: 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
8b20: 20 63 6c 61 75 73 65 20 6d 75 73 74 20 62 65 20   clause must be 
8b30: 65 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2a  excluded..    **
8b40: 20 54 68 69 73 20 69 73 20 74 6f 20 61 64 64 72   This is to addr
8b50: 65 73 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ess the followin
8b60: 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
8b70: 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 74 31     SELECT ... t1
8b80: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
8b90: 20 28 74 31 2e 61 3d 74 32 2e 62 29 20 57 48 45   (t1.a=t2.b) WHE
8ba0: 52 45 20 74 32 2e 63 20 49 53 20 4e 55 4c 4c 3b  RE t2.c IS NULL;
8bb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
8bc0: 61 79 20 74 68 65 72 65 20 69 73 20 61 20 73 69  ay there is a si
8bd0: 6e 67 6c 65 20 72 6f 77 20 69 6e 20 74 32 20 74  ngle row in t2 t
8be0: 68 61 74 20 6d 61 74 63 68 65 73 20 28 74 31 2e  hat matches (t1.
8bf0: 61 3d 74 32 2e 62 29 2c 20 62 75 74 20 69 74 73  a=t2.b), but its
8c00: 0a 20 20 20 20 2a 2a 20 74 32 2e 63 20 76 61 6c  .    ** t2.c val
8c10: 75 65 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ues is not NULL.
8c20: 20 49 66 20 74 68 65 20 28 74 32 2e 63 20 49 53   If the (t2.c IS
8c30: 20 4e 55 4c 4c 29 20 63 6f 6e 73 74 72 61 69 6e   NULL) constrain
8c40: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 75 73  t is .    ** pus
8c50: 68 65 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  hed down to the 
8c60: 63 75 72 73 6f 72 2c 20 74 68 69 73 20 72 6f 77  cursor, this row
8c70: 20 69 73 20 66 69 6c 74 65 72 65 64 20 6f 75 74   is filtered out
8c80: 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a  , causing.    **
8c90: 20 53 51 4c 69 74 65 20 74 6f 20 73 79 6e 74 68   SQLite to synth
8ca0: 65 73 69 7a 65 20 61 20 72 6f 77 20 6f 66 20 4e  esize a row of N
8cb0: 55 4c 4c 20 76 61 6c 75 65 73 2e 20 57 68 69 63  ULL values. Whic
8cc0: 68 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 65  h does match the
8cd0: 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
8ce0: 61 75 73 65 2c 20 61 6e 64 20 73 6f 20 74 68 65  ause, and so the
8cf0: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61   query returns a
8d00: 20 72 6f 77 2e 20 57 68 69 63 68 20 69 73 20 69   row. Which is i
8d10: 6e 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 2a 2a  ncorrect..    **
8d20: 0a 20 20 20 20 2a 2a 20 46 6f 72 20 74 68 65 20  .    ** For the 
8d30: 73 61 6d 65 20 72 65 61 73 6f 6e 2c 20 57 48 45  same reason, WHE
8d40: 52 45 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  RE terms such as
8d50: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
8d60: 20 20 57 48 45 52 45 20 31 20 3d 20 28 74 32 2e    WHERE 1 = (t2.
8d70: 63 20 49 53 20 4e 55 4c 4c 29 0a 20 20 20 20 2a  c IS NULL).    *
8d80: 2a 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 73  *.    ** are als
8d90: 6f 20 65 78 63 6c 75 64 65 64 2e 20 53 65 65 20  o excluded. See 
8da0: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73  codeCursorHintIs
8db0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 66 6f 72  OrFunction() for
8dc0: 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 2a 2f   details..    */
8dd0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
8de0: 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
8df0: 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
8e00: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8e10: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
8e20: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
8e30: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8e40: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 0a 20 20  EP_FromJoin) .  
8e50: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69       || pExpr->i
8e60: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
8e70: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
8e80: 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
8e90: 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65     sWalker.eCode
8ea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 57   = 0;.        sW
8eb0: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
8ec0: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
8ed0: 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e  HintIsOrFunction
8ee0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ef0: 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
8f00: 65 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  er, pTerm->pExpr
8f10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
8f20: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63  Walker.eCode ) c
8f30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
8f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8f50: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8f60: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
8f70: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
8f80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8f90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   }..    /* All t
8fa0: 65 72 6d 73 20 69 6e 20 70 57 4c 6f 6f 70 2d 3e  erms in pWLoop->
8fb0: 61 4c 54 65 72 6d 5b 5d 20 65 78 63 65 70 74 20  aLTerm[] except 
8fc0: 70 45 6e 64 52 61 6e 67 65 20 61 72 65 20 75 73  pEndRange are us
8fd0: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
8fe0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
8ff0: 6f 72 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  or.  These terms
9000: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
9010: 61 73 20 68 69 6e 74 73 20 66 6f 72 20 61 20 70  as hints for a p
9020: 75 72 65 20 72 61 6e 67 65 0a 20 20 20 20 2a 2a  ure range.    **
9030: 20 73 63 61 6e 20 28 74 68 61 74 20 68 61 73 20   scan (that has 
9040: 6e 6f 20 3d 3d 20 74 65 72 6d 73 29 20 73 6f 20  no == terms) so 
9050: 6f 6d 69 74 20 74 68 65 6d 2e 20 2a 2f 0a 20 20  omit them. */.  
9060: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
9070: 74 72 65 65 2e 6e 45 71 3d 3d 30 20 26 26 20 70  tree.nEq==0 && p
9080: 54 65 72 6d 21 3d 70 45 6e 64 52 61 6e 67 65 20  Term!=pEndRange 
9090: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
90a0: 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  ; j<pLoop->nLTer
90b0: 6d 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  m && pLoop->aLTe
90c0: 72 6d 5b 6a 5d 21 3d 70 54 65 72 6d 3b 20 6a 2b  rm[j]!=pTerm; j+
90d0: 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 6a  +){}.      if( j
90e0: 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  <pLoop->nLTerm )
90f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
9100: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 73 75 62 71  ..    /* No subq
9110: 75 65 72 69 65 73 20 6f 72 20 6e 6f 6e 2d 64 65  ueries or non-de
9120: 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63  terministic func
9130: 74 69 6f 6e 73 20 61 6c 6c 6f 77 65 64 20 2a 2f  tions allowed */
9140: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9150: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
9160: 75 65 72 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  uery(pTerm->pExp
9170: 72 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  r) ) continue;..
9180: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
9190: 64 65 78 20 73 63 61 6e 2c 20 6d 61 6b 65 20 73  dex scan, make s
91a0: 75 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 63  ure referenced c
91b0: 6f 6c 75 6d 6e 73 20 61 72 65 20 61 63 74 75 61  olumns are actua
91c0: 6c 6c 79 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  lly in.    ** th
91d0: 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  e index. */.    
91e0: 69 66 28 20 73 48 69 6e 74 2e 70 49 64 78 21 3d  if( sHint.pIdx!=
91f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 57 61 6c 6b  0 ){.      sWalk
9200: 65 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  er.eCode = 0;.  
9210: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
9220: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
9230: 43 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b 45  CursorHintCheckE
9240: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
9250: 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
9260: 6b 65 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  ker, pTerm->pExp
9270: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 57  r);.      if( sW
9280: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63 6f  alker.eCode ) co
9290: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
92a0: 20 20 20 2f 2a 20 49 66 20 77 65 20 73 75 72 76     /* If we surv
92b0: 69 76 65 20 61 6c 6c 20 70 72 69 6f 72 20 74 65  ive all prior te
92c0: 73 74 73 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  sts, that means 
92d0: 74 68 69 73 20 74 65 72 6d 20 69 73 20 77 6f 72  this term is wor
92e0: 74 68 20 68 69 6e 74 69 6e 67 20 2a 2f 0a 20 20  th hinting */.  
92f0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
9300: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 45 78  3ExprAnd(db, pEx
9310: 70 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  pr, sqlite3ExprD
9320: 75 70 28 64 62 2c 20 70 54 65 72 6d 2d 3e 70 45  up(db, pTerm->pE
9330: 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20  xpr, 0));.  }.  
9340: 69 66 28 20 70 45 78 70 72 21 3d 30 20 29 7b 0a  if( pExpr!=0 ){.
9350: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
9360: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
9370: 43 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70  CursorHintFixExp
9380: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  r;.    sqlite3Wa
9390: 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
93a0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c   pExpr);.    sql
93b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
93c0: 2c 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 2c  , OP_CursorHint,
93d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
93e0: 20 20 20 20 20 20 20 20 28 73 48 69 6e 74 2e 70          (sHint.p
93f0: 49 64 78 20 3f 20 73 48 69 6e 74 2e 69 49 64 78  Idx ? sHint.iIdx
9400: 43 75 72 20 3a 20 73 48 69 6e 74 2e 69 54 61 62  Cur : sHint.iTab
9410: 43 75 72 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Cur), 0, 0,.    
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70    (const char*)p
9440: 45 78 70 72 2c 20 50 34 5f 45 58 50 52 29 3b 0a  Expr, P4_EXPR);.
9450: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
9460: 66 69 6e 65 20 63 6f 64 65 43 75 72 73 6f 72 48  fine codeCursorH
9470: 69 6e 74 28 41 2c 42 2c 43 2c 44 29 20 20 2f 2a  int(A,B,C,D)  /*
9480: 20 4e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   No-op */.#endif
9490: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
94a0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 20 2a  E_CURSOR_HINTS *
94b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20  /../*.** Cursor 
94c0: 69 43 75 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  iCur is open on 
94d0: 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  an intkey b-tree
94e0: 20 28 61 20 74 61 62 6c 65 29 2e 20 52 65 67 69   (a table). Regi
94f0: 73 74 65 72 20 69 52 6f 77 69 64 20 63 6f 6e 74  ster iRowid cont
9500: 61 69 6e 73 0a 2a 2a 20 61 20 72 6f 77 69 64 20  ains.** a rowid 
9510: 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
9520: 66 72 6f 6d 20 63 75 72 73 6f 72 20 69 49 64 78  from cursor iIdx
9530: 43 75 72 2c 20 6f 70 65 6e 20 6f 6e 20 69 6e 64  Cur, open on ind
9540: 65 78 20 70 49 64 78 2e 20 54 68 69 73 0a 2a 2a  ex pIdx. This.**
9550: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
9560: 74 65 73 20 63 6f 64 65 20 74 6f 20 64 6f 20 61  tes code to do a
9570: 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
9580: 66 20 63 75 72 73 6f 72 20 69 43 75 72 20 74 6f  f cursor iCur to
9590: 20 74 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20 73   the .** rowid s
95a0: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
95b0: 72 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  r iRowid..**.** 
95c0: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
95d0: 73 20 6a 75 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s just:.**.**   
95e0: 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20  OP_DeferredSeek 
95f0: 24 69 43 75 72 20 24 69 52 6f 77 69 64 0a 2a 2a  $iCur $iRowid.**
9600: 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
9610: 74 68 65 20 73 63 61 6e 20 63 75 72 72 65 6e 74  the scan current
9620: 6c 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69  ly being coded i
9630: 73 20 61 20 62 72 61 6e 63 68 20 6f 66 20 61 6e  s a branch of an
9640: 20 4f 52 2d 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20   OR-loop and.** 
9650: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75  the statement cu
9660: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
9670: 64 65 64 20 69 73 20 61 20 53 45 4c 45 43 54 2c  ded is a SELECT,
9680: 20 74 68 65 6e 20 50 33 20 6f 66 20 4f 50 5f 44   then P3 of OP_D
9690: 65 66 65 72 72 65 64 53 65 65 6b 0a 2a 2a 20 69  eferredSeek.** i
96a0: 73 20 73 65 74 20 74 6f 20 69 49 64 78 43 75 72  s set to iIdxCur
96b0: 20 61 6e 64 20 50 34 20 69 73 20 73 65 74 20 74   and P4 is set t
96c0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  o point to an ar
96d0: 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 0a  ray of integers.
96e0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e  ** containing on
96f0: 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
9700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
9710: 61 62 6c 65 20 63 75 72 73 6f 72 20 69 43 75 72  able cursor iCur
9720: 20 69 73 20 6f 70 65 6e 20 0a 2a 2a 20 6f 6e 2e   is open .** on.
9730: 20 46 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   For each table 
9740: 63 6f 6c 75 6d 6e 2c 20 69 66 20 74 68 65 20 63  column, if the c
9750: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 69 27 74  olumn is the i't
9760: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
9770: 0a 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  .** index, then 
9780: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
9790: 67 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 73  g array entry is
97a0: 20 73 65 74 20 74 6f 20 28 69 2b 31 29 2e 20 49   set to (i+1). I
97b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
97c0: 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
97d0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 74 20  in the index at 
97e0: 61 6c 6c 2c 20 74 68 65 20 61 72 72 61 79 20 65  all, the array e
97f0: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 30  ntry is set to 0
9800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9810: 20 63 6f 64 65 44 65 66 65 72 72 65 64 53 65 65   codeDeferredSee
9820: 6b 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  k(.  WhereInfo *
9830: 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  pWInfo,         
9840: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 63 6c       /* Where cl
9850: 61 75 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ause context */.
9860: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 2f 2a 20 49 6e 64 65 78 20 73 63 61 6e 20    /* Index scan 
9890: 69 73 20 75 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  is using */.  in
98a0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 43 75 72 73 6f 72 20 66 6f 72 20 49 50 4b 20   Cursor for IPK 
98d0: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
98e0: 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9900: 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 29  ndex cursor */.)
9910: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
9920: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9930: 73 65 3b 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e  se; /* Parse con
9940: 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  text */.  Vdbe *
9950: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9960: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62  e;        /* Vdb
9970: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 63 6f  e to generate co
9980: 64 65 20 77 69 74 68 69 6e 20 2a 2f 0a 0a 20 20  de within */..  
9990: 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e  assert( iIdxCur>
99a0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
99b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 49  Idx->aiColumn[pI
99c0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  dx->nColumn-1]==
99d0: 2d 31 20 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74  -1 );.  .  sqlit
99e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
99f0: 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b 2c  OP_DeferredSeek,
9a00: 20 69 49 64 78 43 75 72 2c 20 30 2c 20 69 43 75   iIdxCur, 0, iCu
9a10: 72 29 3b 0a 20 20 69 66 28 20 28 70 57 49 6e 66  r);.  if( (pWInf
9a20: 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
9a30: 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
9a40: 53 45 29 0a 20 20 20 26 26 20 44 62 4d 61 73 6b  SE).   && DbMask
9a50: 41 6c 6c 5a 65 72 6f 28 73 71 6c 69 74 65 33 50  AllZero(sqlite3P
9a60: 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
9a70: 72 73 65 29 2d 3e 77 72 69 74 65 4d 61 73 6b 29  rse)->writeMask)
9a80: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
9a90: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
9aa0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
9ab0: 0a 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 28  .    int *ai = (
9ac0: 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  int*)sqlite3DbMa
9ad0: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
9ae0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  >db, sizeof(int)
9af0: 2a 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 29  *(pTab->nCol+1))
9b00: 3b 0a 20 20 20 20 69 66 28 20 61 69 20 29 7b 0a  ;.    if( ai ){.
9b10: 20 20 20 20 20 20 61 69 5b 30 5d 20 3d 20 70 54        ai[0] = pT
9b20: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
9b30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
9b40: 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 2b 2b 29  >nColumn-1; i++)
9b50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9b60: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9b70: 5b 69 5d 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  [i]<pTab->nCol )
9b80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
9b90: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e  dx->aiColumn[i]>
9ba0: 3d 30 20 29 20 61 69 5b 70 49 64 78 2d 3e 61 69  =0 ) ai[pIdx->ai
9bb0: 43 6f 6c 75 6d 6e 5b 69 5d 2b 31 5d 20 3d 20 69  Column[i]+1] = i
9bc0: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
9bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9be0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
9bf0: 61 72 2a 29 61 69 2c 20 50 34 5f 49 4e 54 41 52  ar*)ai, P4_INTAR
9c00: 52 41 59 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RAY);.    }.  }.
9c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
9c20: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
9c30: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
9c40: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 76 65  argument is a ve
9c50: 63 74 6f 72 2c 20 67 65 6e 65 72 61 74 65 0a 2a  ctor, generate.*
9c60: 2a 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  * code to write 
9c70: 74 68 65 20 66 69 72 73 74 20 6e 52 65 67 20 65  the first nReg e
9c80: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 76  lements of the v
9c90: 65 63 74 6f 72 20 69 6e 74 6f 20 61 6e 20 61 72  ector into an ar
9ca0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
9cb0: 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
9cc0: 68 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  h iReg..**.** If
9cd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9ce0: 69 73 20 6e 6f 74 20 61 20 76 65 63 74 6f 72 2c  is not a vector,
9cf0: 20 74 68 65 6e 20 6e 52 65 67 20 6d 75 73 74 20   then nReg must 
9d00: 62 65 20 70 61 73 73 65 64 20 31 2e 20 49 6e 0a  be passed 1. In.
9d10: 2a 2a 20 74 68 69 73 20 63 61 73 65 2c 20 67 65  ** this case, ge
9d20: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
9d30: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
9d40: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
9d50: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
9d60: 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
9d70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9d80: 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72  codeExprOrVector
9d90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9da0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
9db0: 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
9dc0: 61 73 73 65 72 74 28 20 6e 52 65 67 3e 30 20 29  assert( nReg>0 )
9dd0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 73 71 6c  ;.  if( p && sql
9de0: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
9df0: 28 70 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  (p) ){.#ifndef S
9e00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9e10: 45 52 59 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  ERY.    if( (p->
9e20: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
9e30: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 56  lect) ){.      V
9e40: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9e50: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 69 6e  >pVdbe;.      in
9e60: 74 20 69 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  t iSelect = sqli
9e70: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
9e80: 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30  (pParse, p, 0, 0
9e90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9ea0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9eb0: 5f 43 6f 70 79 2c 20 69 53 65 6c 65 63 74 2c 20  _Copy, iSelect, 
9ec0: 69 52 65 67 2c 20 6e 52 65 67 2d 31 29 3b 0a 20  iReg, nReg-1);. 
9ed0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
9ee0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
9ef0: 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  i;.      ExprLis
9f00: 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 78 2e  t *pList = p->x.
9f10: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pList;.      ass
9f20: 65 72 74 28 20 6e 52 65 67 3c 3d 70 4c 69 73 74  ert( nReg<=pList
9f30: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
9f40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67   for(i=0; i<nReg
9f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9f60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9f70: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
9f80: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 52 65 67 2b  [i].pExpr, iReg+
9f90: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
9fa0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
9fb0: 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 31 20 29  ssert( nReg==1 )
9fc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
9fd0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2c  rCode(pParse, p,
9fe0: 20 69 52 65 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   iReg);.  }.}../
9ff0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
a000: 20 74 68 65 20 49 64 78 45 78 70 72 54 72 61 6e   the IdxExprTran
a010: 73 20 6f 62 6a 65 63 74 20 63 61 72 72 69 65 73  s object carries
a020: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
a030: 75 74 20 61 0a 2a 2a 20 6d 61 70 70 69 6e 67 20  ut a.** mapping 
a040: 66 72 6f 6d 20 61 6e 20 65 78 70 72 65 73 73 69  from an expressi
a050: 6f 6e 20 6f 6e 20 74 61 62 6c 65 20 63 6f 6c 75  on on table colu
a060: 6d 6e 73 20 69 6e 74 6f 20 61 20 63 6f 6c 75 6d  mns into a colum
a070: 6e 20 69 6e 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  n in an index.**
a080: 20 64 6f 77 6e 20 74 68 72 6f 75 67 68 20 74 68   down through th
a090: 65 20 57 61 6c 6b 65 72 2e 0a 2a 2f 0a 74 79 70  e Walker..*/.typ
a0a0: 65 64 65 66 20 73 74 72 75 63 74 20 49 64 78 45  edef struct IdxE
a0b0: 78 70 72 54 72 61 6e 73 20 7b 0a 20 20 45 78 70  xprTrans {.  Exp
a0c0: 72 20 2a 70 49 64 78 45 78 70 72 3b 20 20 20 20  r *pIdxExpr;    
a0d0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 78 70  /* The index exp
a0e0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
a0f0: 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
a100: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
a110: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
a120: 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ng table */.  in
a130: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
a140: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66   /* The cursor f
a150: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
a160: 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 3b 20 20    int iIdxCol;  
a170: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
a180: 6d 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  mn for the index
a190: 20 2a 2f 0a 7d 20 49 64 78 45 78 70 72 54 72 61   */.} IdxExprTra
a1a0: 6e 73 3b 0a 0a 2f 2a 20 54 68 65 20 77 61 6c 6b  ns;../* The walk
a1b0: 65 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  er node callback
a1c0: 20 75 73 65 64 20 74 6f 20 74 72 61 6e 73 66 6f   used to transfo
a1d0: 72 6d 20 6d 61 74 63 68 69 6e 67 20 65 78 70 72  rm matching expr
a1e0: 65 73 73 69 6f 6e 73 20 69 6e 74 6f 0a 2a 2a 20  essions into.** 
a1f0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
a200: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
a210: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61  or an index on a
a220: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
a230: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 6d 61 74  .** If pExpr mat
a240: 63 68 65 73 2c 20 74 68 65 6e 20 74 72 61 6e 73  ches, then trans
a250: 66 6f 72 6d 20 69 74 20 69 6e 74 6f 20 61 20 72  form it into a r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a270: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  index column.** 
a280: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
a290: 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
a2a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2b0: 77 68 65 72 65 49 6e 64 65 78 45 78 70 72 54 72  whereIndexExprTr
a2c0: 61 6e 73 4e 6f 64 65 28 57 61 6c 6b 65 72 20 2a  ansNode(Walker *
a2d0: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
a2e0: 0a 20 20 49 64 78 45 78 70 72 54 72 61 6e 73 20  .  IdxExprTrans 
a2f0: 2a 70 58 20 3d 20 70 2d 3e 75 2e 70 49 64 78 54  *pX = p->u.pIdxT
a300: 72 61 6e 73 3b 0a 20 20 69 66 28 20 73 71 6c 69  rans;.  if( sqli
a310: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
a320: 2c 20 70 45 78 70 72 2c 20 70 58 2d 3e 70 49 64  , pExpr, pX->pId
a330: 78 45 78 70 72 2c 20 70 58 2d 3e 69 54 61 62 43  xExpr, pX->iTabC
a340: 75 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45  ur)==0 ){.    pE
a350: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
a360: 55 4d 4e 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  UMN;.    pExpr->
a370: 69 54 61 62 6c 65 20 3d 20 70 58 2d 3e 69 49 64  iTable = pX->iId
a380: 78 43 75 72 3b 0a 20 20 20 20 70 45 78 70 72 2d  xCur;.    pExpr-
a390: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 58 2d 3e 69  >iColumn = pX->i
a3a0: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 70 45 78 70  IdxCol;.    pExp
a3b0: 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  r->pTab = 0;.   
a3c0: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
a3d0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
a3e0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
a3f0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nue;.  }.}../*.*
a400: 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 65 73  * For an indexes
a410: 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 58   on expression X
a420: 2c 20 6c 6f 63 61 74 65 20 65 76 65 72 79 20 69  , locate every i
a430: 6e 73 74 61 6e 63 65 20 6f 66 20 65 78 70 72 65  nstance of expre
a440: 73 73 69 6f 6e 20 58 0a 2a 2a 20 69 6e 20 70 45  ssion X.** in pE
a450: 78 70 72 20 61 6e 64 20 63 68 61 6e 67 65 20 74  xpr and change t
a460: 68 61 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  hat subexpressio
a470: 6e 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e  n into a referen
a480: 63 65 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  ce to the approp
a490: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
a4a0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  of the index..*/
a4b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
a4c0: 72 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73  reIndexExprTrans
a4d0: 28 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  (.  Index *pIdx,
a4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 6e 64        /* The Ind
a4f0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ex */.  int iTab
a500: 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
a510: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
a520: 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 69   that is being i
a530: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
a540: 69 49 64 78 43 75 72 2c 20 20 20 20 20 20 2f 2a  iIdxCur,      /*
a550: 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 69   Cursor of the i
a560: 6e 64 65 78 20 69 74 73 65 6c 66 20 2a 2f 0a 20  ndex itself */. 
a570: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
a580: 66 6f 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20  fo /* Transform 
a590: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
a5a0: 68 69 73 20 57 48 45 52 45 20 63 6c 61 75 73 65  his WHERE clause
a5b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 49 64   */.){.  int iId
a5c0: 78 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  xCol;           
a5d0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
a5e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
a5f0: 78 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  x */.  ExprList 
a600: 2a 61 43 6f 6c 45 78 70 72 3b 20 20 20 20 20 20  *aColExpr;      
a610: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
a620: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 65   that are indexe
a630: 64 20 2a 2f 0a 20 20 57 61 6c 6b 65 72 20 77 3b  d */.  Walker w;
a640: 0a 20 20 49 64 78 45 78 70 72 54 72 61 6e 73 20  .  IdxExprTrans 
a650: 78 3b 0a 20 20 61 43 6f 6c 45 78 70 72 20 3d 20  x;.  aColExpr = 
a660: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 3b 0a  pIdx->aColExpr;.
a670: 20 20 69 66 28 20 61 43 6f 6c 45 78 70 72 3d 3d    if( aColExpr==
a680: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
a690: 4e 6f 74 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20  Not an index on 
a6a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  expressions */. 
a6b0: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
a6c0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
a6d0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 77  ExprCallback = w
a6e0: 68 65 72 65 49 6e 64 65 78 45 78 70 72 54 72 61  hereIndexExprTra
a6f0: 6e 73 4e 6f 64 65 3b 0a 20 20 77 2e 75 2e 70 49  nsNode;.  w.u.pI
a700: 64 78 54 72 61 6e 73 20 3d 20 26 78 3b 0a 20 20  dxTrans = &x;.  
a710: 78 2e 69 54 61 62 43 75 72 20 3d 20 69 54 61 62  x.iTabCur = iTab
a720: 43 75 72 3b 0a 20 20 78 2e 69 49 64 78 43 75 72  Cur;.  x.iIdxCur
a730: 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 66 6f   = iIdxCur;.  fo
a740: 72 28 69 49 64 78 43 6f 6c 3d 30 3b 20 69 49 64  r(iIdxCol=0; iId
a750: 78 43 6f 6c 3c 61 43 6f 6c 45 78 70 72 2d 3e 6e  xCol<aColExpr->n
a760: 45 78 70 72 3b 20 69 49 64 78 43 6f 6c 2b 2b 29  Expr; iIdxCol++)
a770: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
a780: 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c  aiColumn[iIdxCol
a790: 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e  ]!=XN_EXPR ) con
a7a0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
a7b0: 74 28 20 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  t( aColExpr->a[i
a7c0: 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 21 3d 30  IdxCol].pExpr!=0
a7d0: 20 29 3b 0a 20 20 20 20 78 2e 69 49 64 78 43 6f   );.    x.iIdxCo
a7e0: 6c 20 3d 20 69 49 64 78 43 6f 6c 3b 0a 20 20 20  l = iIdxCol;.   
a7f0: 20 78 2e 70 49 64 78 45 78 70 72 20 3d 20 61 43   x.pIdxExpr = aC
a800: 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f  olExpr->a[iIdxCo
a810: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 73 71  l].pExpr;.    sq
a820: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
a830: 2c 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65  , pWInfo->pWhere
a840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
a850: 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
a860: 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29  WInfo->pOrderBy)
a870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
a880: 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 57  kExprList(&w, pW
a890: 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
a8a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a8b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
a8c0: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
a8d0: 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f  he iLevel-th loo
a8e0: 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  p in the WHERE c
a8f0: 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  lause.** impleme
a900: 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ntation describe
a910: 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a  d by pWInfo..*/.
a920: 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33 57  Bitmask sqlite3W
a930: 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53  hereCodeOneLoopS
a940: 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66  tart(.  WhereInf
a950: 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20  o *pWInfo,   /* 
a960: 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61  Complete informa
a970: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
a980: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
a990: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
a9a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
a9b0: 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e  evel of pWInfo->
a9c0: 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  a[] should be co
a9d0: 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ded */.  Bitmask
a9e0: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
a9f0: 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
aa00: 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
aa10: 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
aa20: 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
aa30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
aa40: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
aa50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
aa60: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
aa70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
aa80: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
aa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
aaa0: 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
aab0: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
aac0: 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
aad0: 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
aae0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
aaf0: 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
ab00: 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
ab10: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
ab20: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
ab30: 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
ab40: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
ab50: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
ab60: 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
ab70: 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
ab80: 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
ab90: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
aba0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
abb0: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f   object being co
abc0: 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
abd0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
abe0: 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
abf0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
ac00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
ac10: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac30: 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
ac40: 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
ac50: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
ac60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
ac70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ac80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
acb0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
acc0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ace0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
acf0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
ad00: 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
ad10: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ad20: 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
ad30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
ad40: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
ad50: 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
ad80: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
ad90: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
ada0: 20 61 64 64 72 48 61 6c 74 3b 20 20 20 20 20 20   addrHalt;      
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
adc0: 61 64 64 72 42 72 6b 20 66 6f 72 20 74 68 65 20  addrBrk for the 
add0: 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 2a  outermost loop *
ade0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
adf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae00: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
ae10: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
ae20: 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
ae30: 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
ae40: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
ae50: 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
ae60: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
ae70: 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
ae80: 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
ae90: 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
aea0: 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
aeb0: 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
aec0: 72 6e 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  rning */.  Index
aed0: 20 2a 70 49 64 78 20 3d 20 30 3b 20 20 20 20 20   *pIdx = 0;     
aee0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
aef0: 65 64 20 62 79 20 6c 6f 6f 70 20 28 69 66 20 61  ed by loop (if a
af00: 6e 79 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ny) */.  int iLo
af10: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
af20: 20 20 20 2f 2a 20 49 74 65 72 61 74 69 6f 6e 20     /* Iteration 
af30: 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 67 65  of constraint ge
af40: 6e 65 72 61 74 6f 72 20 6c 6f 6f 70 20 2a 2f 0a  nerator loop */.
af50: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
af60: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
af70: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
af80: 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
af90: 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50  ->sWC;.  db = pP
afa0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76  arse->db;.  pLev
afb0: 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
afc0: 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70  iLevel];.  pLoop
afd0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
afe0: 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  p;.  pTabItem = 
aff0: 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
b000: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
b010: 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
b020: 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
b030: 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  .  pLevel->notRe
b040: 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26  ady = notReady &
b050: 20 7e 73 71 6c 69 74 65 33 57 68 65 72 65 47 65   ~sqlite3WhereGe
b060: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
b070: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
b080: 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f    bRev = (pWInfo
b090: 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65  ->revMask>>iLeve
b0a0: 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  l)&1;.  omitTabl
b0b0: 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  e = (pLoop->wsFl
b0c0: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
b0d0: 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
b0e0: 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
b0f0: 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
b100: 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
b110: 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75  )==0;.  VdbeModu
b120: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
b130: 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25  egin WHERE-loop%
b140: 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54  d: %s",iLevel,pT
b150: 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
b160: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  ame));..  /* Cre
b170: 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
b180: 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
b190: 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
b1a0: 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20  ctions.  ** for 
b1b0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
b1c0: 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42  .  Jump to addrB
b1d0: 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
b1e0: 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  of a loop..  ** 
b1f0: 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
b200: 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
b210: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
b220: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
b230: 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   loop..  **.  **
b240: 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
b250: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
b260: 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61  e also have a "a
b270: 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68  ddrNxt" label th
b280: 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  at.  ** means to
b290: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
b2a0: 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
b2b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
b2c0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61  hen.  ** there a
b2d0: 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
b2e0: 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
b2f0: 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72  aints, the "addr
b300: 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20  Nxt" label.  ** 
b310: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
b320: 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20  addrBrk"..  */. 
b330: 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65   addrBrk = pLeve
b340: 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  l->addrBrk = pLe
b350: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
b360: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
b370: 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f  bel(v);.  addrCo
b380: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nt = pLevel->add
b390: 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
b3a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b3b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
b3c0: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
b3d0: 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
b3e0: 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
b3f0: 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61   and.  ** initia
b400: 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
b410: 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
b420: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
b430: 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72  tches any.  ** r
b440: 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
b450: 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
b460: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  ..  */.  if( pLe
b470: 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
b480: 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e  (pTabItem[0].fg.
b490: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
b4a0: 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
b4b0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
b4c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b4d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b4e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b4f0: 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
b500: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
b510: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b520: 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
b530: 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
b540: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
b550: 6d 70 75 74 65 20 61 20 73 61 66 65 20 61 64 64  mpute a safe add
b560: 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
b570: 69 66 20 77 65 20 64 69 73 63 6f 76 65 72 20 74  if we discover t
b580: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 66 6f  hat the table fo
b590: 72 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 6f 70  r.  ** this loop
b5a0: 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 63 61   is empty and ca
b5b0: 6e 20 6e 65 76 65 72 20 63 6f 6e 74 72 69 62 75  n never contribu
b5c0: 74 65 20 63 6f 6e 74 65 6e 74 2e 20 2a 2f 0a 20  te content. */. 
b5d0: 20 66 6f 72 28 6a 3d 69 4c 65 76 65 6c 3b 20 6a   for(j=iLevel; j
b5e0: 3e 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 61 5b  >0 && pWInfo->a[
b5f0: 6a 5d 2e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 3b  j].iLeftJoin==0;
b600: 20 6a 2d 2d 29 7b 7d 0a 20 20 61 64 64 72 48 61   j--){}.  addrHa
b610: 6c 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a  lt = pWInfo->a[j
b620: 5d 2e 61 64 64 72 42 72 6b 3b 0a 0a 20 20 2f 2a  ].addrBrk;..  /*
b630: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
b640: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
b650: 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
b660: 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
b670: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
b680: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
b690: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
b6a0: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
b6b0: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
b6c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b6d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b6e0: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
b6f0: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
b700: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
b710: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
b720: 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41   =  sqlite3VdbeA
b730: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
b740: 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64  d, regYield, add
b750: 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  rBrk);.    VdbeC
b760: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b770: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b780: 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25  "next row of \"%
b790: 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e  s\"", pTabItem->
b7a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
b7b0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
b7c0: 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65  OP_Goto;.  }else
b7d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b7e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b7f0: 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70  LE.  if(  (pLoop
b800: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
b810: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
b820: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
b830: 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 1:  The table 
b840: 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
b850: 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
b860: 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
b870: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
b880: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
b890: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
b8a0: 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
b8b0: 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
b8c0: 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
b8d0: 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20  addrNotFound;.  
b8e0: 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
b8f0: 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  t = pLoop->nLTer
b900: 6d 3b 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  m;.    int iIn; 
b910: 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 66 6f     /* Counter fo
b920: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
b930: 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
b940: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
b950: 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
b960: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b970: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
b980: 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
b990: 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
b9a0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
b9b0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
b9c0: 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
b9d0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
b9e0: 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
b9f0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
ba00: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
ba10: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45  ;.      if( NEVE
ba20: 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 63 6f  R(pTerm==0) ) co
ba30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
ba40: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ba50: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
ba60: 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
ba70: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
ba80: 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
ba90: 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
baa0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
bab0: 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
bac0: 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
bad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 78  else{.        Ex
bae0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
baf0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
bb00: 74 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  t;.        codeE
bb10: 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72  xprOrVector(pPar
bb20: 73 65 2c 20 70 52 69 67 68 74 2c 20 69 54 61 72  se, pRight, iTar
bb30: 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  get, 1);.      }
bb40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bb50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bb60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f  OP_Integer, pLoo
bb70: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
bb80: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
bb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bba0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43  , OP_Integer, nC
bbb0: 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b  onstraint, iReg+
bbc0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
bbd0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
bbe0: 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61  VFilter, iCur, a
bbf0: 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65  ddrNotFound, iRe
bc00: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
bc10: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
bc20: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20  u.vtab.idxStr,. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
bc50: 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34  ab.needFree ? P4
bc60: 5f 44 59 4e 41 4d 49 43 20 3a 20 50 34 5f 53 54  _DYNAMIC : P4_ST
bc70: 41 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43  ATIC);.    VdbeC
bc80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
bc90: 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
bca0: 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
bcb0: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
bcc0: 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  r;.    pLevel->o
bcd0: 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  p = pWInfo->eOne
bce0: 50 61 73 73 20 3f 20 4f 50 5f 4e 6f 6f 70 20 3a  Pass ? OP_Noop :
bcf0: 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
bd00: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
bd10: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
bd20: 64 72 28 76 29 3b 0a 20 20 20 20 69 49 6e 20 3d  dr(v);.    iIn =
bd30: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
bd40: 6e 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 43 6f  n;.    for(j=nCo
bd50: 6e 73 74 72 61 69 6e 74 2d 31 3b 20 6a 3e 3d 30  nstraint-1; j>=0
bd60: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 54  ; j--){.      pT
bd70: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
bd80: 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
bd90: 28 20 6a 3c 31 36 20 26 26 20 28 70 4c 6f 6f 70  ( j<16 && (pLoop
bda0: 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
bdb0: 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20  k>>j)&1 ){.     
bdc0: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
bdd0: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
bde0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
bdf0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
be00: 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
be10: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 43          Expr *pC
be20: 6f 6d 70 61 72 65 3b 20 20 2f 2a 20 54 68 65 20  ompare;  /* The 
be30: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
be40: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  tor */.        E
be50: 78 70 72 20 2a 70 52 69 67 68 74 3b 20 20 20 20  xpr *pRight;    
be60: 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20 63 6f  /* RHS of the co
be70: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 20 20  mparison */.    
be80: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
be90: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74       /* Opcode t
bea0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 61 6c  o access the val
beb0: 75 65 20 6f 66 20 74 68 65 20 49 4e 20 63 6f 6e  ue of the IN con
bec0: 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
bed0: 20 20 20 20 2f 2a 20 52 65 6c 6f 61 64 20 74 68      /* Reload th
bee0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  e constraint val
bef0: 75 65 20 69 6e 74 6f 20 72 65 67 5b 69 52 65 67  ue into reg[iReg
bf00: 2b 6a 2b 32 5d 2e 20 20 54 68 65 20 73 61 6d 65  +j+2].  The same
bf10: 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
bf20: 2a 20 77 61 73 20 6c 6f 61 64 65 64 20 69 6e 74  * was loaded int
bf30: 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  o the same regis
bf40: 74 65 72 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ter prior to the
bf50: 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 62 75 74   OP_VFilter, but
bf60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bf70: 78 46 69 6c 74 65 72 20 69 6d 70 6c 65 6d 65 6e  xFilter implemen
bf80: 74 61 74 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  tation might hav
bf90: 65 20 63 68 61 6e 67 65 64 20 74 68 65 20 64 61  e changed the da
bfa0: 74 61 74 79 70 65 20 6f 72 0a 20 20 20 20 20 20  tatype or.      
bfb0: 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 6f 66    ** encoding of
bfc0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
bfd0: 65 20 72 65 67 69 73 74 65 72 2c 20 73 6f 20 69  e register, so i
bfe0: 74 20 2a 6d 75 73 74 2a 20 62 65 20 72 65 6c 6f  t *must* be relo
bff0: 61 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aded. */.       
c000: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
c010: 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 21 3d 30  >u.in.aInLoop!=0
c020: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
c030: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
c040: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
c050: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
c060: 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 3e 30     assert( iIn>0
c070: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   );.          pO
c080: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
c090: 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  etOp(v, pLevel->
c0a0: 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 2d 2d 69  u.in.aInLoop[--i
c0b0: 49 6e 5d 2e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In].addrInTop);.
c0c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
c0d0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
c0e0: 50 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d  P_Column || pOp-
c0f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
c100: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  d );.          a
c110: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
c120: 64 65 21 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 7c 7c  de!=OP_Column ||
c130: 20 70 4f 70 2d 3e 70 33 3d 3d 69 52 65 67 2b 6a   pOp->p3==iReg+j
c140: 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +2 );.          
c150: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
c160: 6f 64 65 21 3d 4f 50 5f 52 6f 77 69 64 20 7c 7c  ode!=OP_Rowid ||
c170: 20 70 4f 70 2d 3e 70 32 3d 3d 69 52 65 67 2b 6a   pOp->p2==iReg+j
c180: 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +2 );.          
c190: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 6f  testcase( pOp->o
c1a0: 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
c1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c1d0: 2c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 2c 20 70  , pOp->opcode, p
c1e0: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
c1f0: 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20   pOp->p3);.     
c200: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
c210: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c220: 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  hat will continu
c230: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
c240: 77 20 69 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  w if .        **
c250: 20 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61 69   the IN constrai
c260: 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  nt is not satisf
c270: 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ied */.        p
c280: 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
c290: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c2a0: 4b 5f 45 51 2c 20 30 2c 20 30 29 3b 0a 20 20 20  K_EQ, 0, 0);.   
c2b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
c2c0: 6d 70 61 72 65 21 3d 30 20 7c 7c 20 64 62 2d 3e  mpare!=0 || db->
c2d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c2e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6d          if( pCom
c2f0: 70 61 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  pare ){.        
c300: 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66    pCompare->pLef
c310: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
c320: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
c330: 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70 52 69     pCompare->pRi
c340: 67 68 74 20 3d 20 70 52 69 67 68 74 20 3d 20 73  ght = pRight = s
c350: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
c360: 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 29 3b 0a  K_REGISTER, 0);.
c370: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
c380: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
c390: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 54 61 62      pRight->iTab
c3a0: 6c 65 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  le = iReg+j+2;. 
c3b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c3c0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
c3d0: 61 72 73 65 2c 20 70 43 6f 6d 70 61 72 65 2c 20  arse, pCompare, 
c3e0: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
c3f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
c400: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d  }.          pCom
c410: 70 61 72 65 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  pare->pLeft = 0;
c420: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c430: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
c440: 20 70 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20   pCompare);.    
c450: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c460: 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 73 65    }.    /* These
c470: 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 20   registers need 
c480: 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 20  to be preserved 
c490: 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 69 73  in case there is
c4a0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a   an IN operator.
c4b0: 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 20 20 53 6f      ** loop.  So
c4c0: 20 77 65 20 63 6f 75 6c 64 20 64 65 61 6c 6c 6f   we could deallo
c4d0: 63 61 74 65 20 74 68 65 20 72 65 67 69 73 74 65  cate the registe
c4e0: 72 73 20 68 65 72 65 20 28 61 6e 64 20 70 6f 74  rs here (and pot
c4f0: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  entially.    ** 
c500: 72 65 75 73 65 20 74 68 65 6d 20 6c 61 74 65 72  reuse them later
c510: 29 20 69 66 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ) if (pLoop->wsF
c520: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
c530: 41 42 4c 45 29 3d 3d 30 2e 20 20 42 75 74 20 69  ABLE)==0.  But i
c540: 74 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a 20 73  t seems.    ** s
c550: 69 6d 70 6c 65 72 20 61 6e 64 20 73 61 66 65 72  impler and safer
c560: 20 74 6f 20 73 69 6d 70 6c 79 20 6e 6f 74 20 72   to simply not r
c570: 65 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  euse the registe
c580: 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
c590: 2a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  *    sqlite3Rele
c5a0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
c5b0: 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
c5c0: 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 2a  traint+2);.    *
c5d0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
c5e0: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
c5f0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
c600: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c610: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c620: 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  ..  if( (pLoop->
c630: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
c640: 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70  IPK)!=0.   && (p
c650: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c660: 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
c670: 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
c680: 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  ))!=0.  ){.    /
c690: 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61  * Case 2:  We ca
c6a0: 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
c6b0: 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
c6c0: 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
c6d0: 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
c6e0: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
c6f0: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
c700: 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
c710: 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
c720: 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
c730: 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
c740: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
c750: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
c760: 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
c770: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  /.    assert( pL
c780: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
c790: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 65 72 6d  ==1 );.    pTerm
c7a0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
c7b0: 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
c7c0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
c7d0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
c7e0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
c7f0: 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
c800: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
c810: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
c820: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
c830: 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c 65  UAL );.    iRele
c840: 61 73 65 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  aseReg = ++pPars
c850: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f  e->nMem;.    iRo
c860: 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
c870: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
c880: 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
c890: 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
c8a0: 73 65 52 65 67 29 3b 0a 20 20 20 20 69 66 28 20  seReg);.    if( 
c8b0: 69 52 6f 77 69 64 52 65 67 21 3d 69 52 65 6c 65  iRowidReg!=iRele
c8c0: 61 73 65 52 65 67 20 29 20 73 71 6c 69 74 65 33  aseReg ) sqlite3
c8d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
c8e0: 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
c8f0: 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
c900: 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
c910: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
c920: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c930: 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 75 72 2c  SeekRowid, iCur,
c940: 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
c950: 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
c960: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
c970: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
c980: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
c990: 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
c9a0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
c9b0: 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
c9c0: 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
c9d0: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
c9e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c9f0: 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
ca00: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
ca10: 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
ca20: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
ca30: 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
ca40: 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
ca50: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
ca60: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
ca70: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
ca80: 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
ca90: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
caa0: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
cab0: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
cac0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
cad0: 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
cae0: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
caf0: 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
cb00: 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
cb10: 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
cb20: 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
cb30: 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
cb40: 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
cb50: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
cb60: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
cb70: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
cb80: 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
cb90: 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
cba0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
cbb0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
cbc0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
cbd0: 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
cbe0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
cbf0: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
cc00: 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
cc10: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
cc20: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
cc30: 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
cc40: 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
cc50: 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
cc60: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
cc70: 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69      codeCursorHi
cc80: 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57 49  nt(pTabItem, pWI
cc90: 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 45 6e  nfo, pLevel, pEn
cca0: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  d);.    if( pSta
ccb0: 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
ccc0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
ccd0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
cce0: 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
ccf0: 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
cd00: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
cd10: 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
cd20: 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
cd30: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
cd40: 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 20  rt boundary */. 
cd50: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
cd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
cd70: 72 73 6f 72 20 73 65 65 6b 20 6f 70 65 72 61 74  rsor seek operat
cd80: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ion */..      /*
cd90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
cda0: 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
cdb0: 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
cdc0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
cdd0: 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
cde0: 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
cdf0: 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
ce00: 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
ce10: 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
ce20: 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
ce30: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
ce40: 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
ce50: 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20  OP_SeekGT,.     
ce60: 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
ce70: 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20  /  OP_SeekLE,.  
ce80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
ce90: 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c  T */  OP_SeekLT,
cea0: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
ceb0: 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
cec0: 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  GE.      };.    
ced0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
cee0: 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
cef0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
cf00: 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
cf10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
cf20: 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
cf30: 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
cf40: 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
cf50: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
cf60: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
cf70: 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
cf80: 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
cf90: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
cfa0: 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c  t( (pStart->wtFl
cfb0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
cfc0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
cfd0: 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
cfe0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
cff0: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
d000: 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
d010: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d020: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
d030: 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
d040: 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  t->leftCursor!=i
d050: 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69  Cur ); /* transi
d060: 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
d070: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
d080: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
d090: 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20 29 7b  r(pX->pRight) ){
d0a0: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 72 54  .        r1 = rT
d0b0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74  emp = sqlite3Get
d0c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d0d0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 78 70  .        codeExp
d0e0: 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73 65  rOrVector(pParse
d0f0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 72 31  , pX->pRight, r1
d100: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  , 1);.        te
d110: 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
d120: 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 20  TK_GT );.       
d130: 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
d140: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
d150: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
d160: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ->op==TK_LT );. 
d170: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d180: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29   pX->op==TK_LE )
d190: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 61  ;.        op = a
d1a0: 4d 6f 76 65 4f 70 5b 28 28 70 58 2d 3e 6f 70 20  MoveOp[((pX->op 
d1b0: 2d 20 54 4b 5f 47 54 20 2d 20 31 29 20 26 20 30  - TK_GT - 1) & 0
d1c0: 78 33 29 20 7c 20 30 78 31 5d 3b 0a 20 20 20 20  x3) | 0x1];.    
d1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
d1e0: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
d1f0: 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20  =OP_SeekGE );.  
d200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
d210: 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
d220: 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
d230: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d240: 70 58 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pX->op!=TK_LT ||
d250: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
d260: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d270: 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  ( pX->op!=TK_LE 
d280: 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || op==OP_SeekLE
d290: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
d2a0: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
d2b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
d2c0: 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
d2d0: 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
d2e0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
d2f0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
d300: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  t);.        op =
d310: 20 61 4d 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f 70   aMoveOp[(pX->op
d320: 20 2d 20 54 4b 5f 47 54 29 5d 3b 0a 20 20 20 20   - TK_GT)];.    
d330: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d340: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
d350: 70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  p, iCur, addrBrk
d360: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
d370: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
d380: 22 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  "));.      VdbeC
d390: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
d3a0: 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20  >op==TK_GT);.   
d3b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
d3c0: 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
d3d0: 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LE);.      VdbeC
d3e0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
d3f0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20  >op==TK_LT);.   
d400: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
d410: 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
d420: 47 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  GE);.      sqlit
d430: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
d440: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
d450: 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
d460: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d470: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
d480: 65 6d 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  emp);.    }else{
d490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d4a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
d4b0: 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
d4c0: 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
d4d0: 64 72 48 61 6c 74 29 3b 0a 20 20 20 20 20 20 56  drHalt);.      V
d4e0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
d4f0: 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20   bRev==0);.     
d500: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
d510: 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
d520: 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
d530: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
d540: 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
d550: 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
d560: 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
d570: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d580: 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  (pEnd->wtFlags &
d590: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
d5a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
d5b0: 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  e( pEnd->leftCur
d5c0: 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
d5d0: 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  Transitive const
d5e0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
d5f0: 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
d600: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d610: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
d620: 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b  memEndValue = ++
d630: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d640: 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65      codeExprOrVe
d650: 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 58 2d  ctor(pParse, pX-
d660: 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
d670: 61 6c 75 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  alue, 1);.      
d680: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78  if( 0==sqlite3Ex
d690: 70 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70  prIsVector(pX->p
d6a0: 52 69 67 68 74 29 20 0a 20 20 20 20 20 20 20 26  Right) .       &
d6b0: 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  & (pX->op==TK_LT
d6c0: 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
d6d0: 54 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  T) .      ){.   
d6e0: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
d6f0: 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
d700: 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
d710: 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
d720: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
d730: 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
d740: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
d750: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
d760: 28 70 58 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a  (pX->pRight) ){.
d770: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
d780: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
d790: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d7a0: 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
d7b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d7c0: 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
d7d0: 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
d7e0: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
d7f0: 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
d800: 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
d810: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
d820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d830: 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
d840: 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
d850: 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
d860: 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
d870: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d890: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
d8a0: 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
d8b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d8c0: 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
d8d0: 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
d8e0: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
d8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d900: 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
d910: 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
d920: 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
d930: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d940: 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
d950: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
d960: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
d970: 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29  , testOp==OP_Lt)
d980: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d990: 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
d9a0: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
d9b0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
d9c0: 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29  , testOp==OP_Gt)
d9d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d9e0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
d9f0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
da00: 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
da10: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
da20: 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
da30: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
da40: 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
da50: 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61  /* Case 4: A sca
da60: 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
da70: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
da80: 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
da90: 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
daa0: 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
dab0: 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
dac0: 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
dad0: 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
dae0: 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
daf0: 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
db00: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
db10: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
db20: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
db30: 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
db40: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
db50: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
db60: 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
db70: 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
db80: 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
db90: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
dba0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
dbb0: 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
dbc0: 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
dbd0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
dbe0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
dbf0: 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
dc00: 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
dc10: 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
dc20: 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
dc30: 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
dc40: 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
dc50: 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
dc60: 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
dc70: 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
dc80: 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
dc90: 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
dca0: 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
dcb0: 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
dcc0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
dcd0: 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
dce0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
dcf0: 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
dd00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
dd10: 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
dd30: 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
dd40: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
dd50: 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
dd60: 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
dd70: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
dd80: 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
dd90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
dda0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
ddb0: 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
ddc0: 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
ddd0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
dde0: 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
ddf0: 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
de00: 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
de10: 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
de20: 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
de30: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
de40: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
de50: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
de60: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
de70: 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
de80: 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
de90: 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
dea0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
deb0: 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
dec0: 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
ded0: 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
dee0: 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
def0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
df00: 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
df10: 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
df20: 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
df30: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
df40: 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
df50: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
df60: 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
df70: 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
df80: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
df90: 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
dfa0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
dfb0: 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
dfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
dfd0: 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
dfe0: 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
dff0: 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
e000: 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
e010: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
e020: 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
e030: 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
e040: 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
e050: 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20    OP_SeekGT,    
e060: 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
e070: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
e080: 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
e090: 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
e0a0: 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20  OP_SeekLT,      
e0b0: 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
e0c0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
e0d0: 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
e0e0: 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
e0f0: 5f 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20  _SeekGE,        
e100: 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
e110: 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
e120: 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
e130: 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
e140: 65 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20  eekLE           
e150: 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
e160: 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
e170: 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
e180: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
e190: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
e1a0: 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
e1b0: 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
e1c0: 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e         /* 0: (en
e1d0: 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
e1e0: 20 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71   !bRev && !endEq
e1f0: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
e200: 78 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGT,            
e210: 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
e220: 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
e230: 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
e240: 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20      OP_IdxLE,   
e250: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
e260: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
e270: 26 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64  &&  bRev && !end
e280: 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
e290: 49 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20  IdxLT,          
e2a0: 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e    /* 3: (end_con
e2b0: 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
e2c0: 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a  v &&  endEq) */.
e2d0: 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e      };.    u16 n
e2e0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
e2f0: 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20  ree.nEq;     /* 
e300: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
e310: 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
e320: 75 31 36 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70  u16 nBtm = pLoop
e330: 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 20  ->u.btree.nBtm; 
e340: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 42    /* Length of B
e350: 54 4d 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20  TM vector */.   
e360: 20 75 31 36 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f   u16 nTop = pLoo
e370: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b  p->u.btree.nTop;
e380: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
e390: 54 4f 50 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20  TOP vector */.  
e3a0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3c0: 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
e3d0: 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
e3e0: 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
e3f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
e400: 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
e410: 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
e420: 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
e430: 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
e440: 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
e450: 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
e460: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
e470: 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
e480: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
e490: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
e4a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
e4b0: 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
e4c0: 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
e4d0: 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
e500: 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
e510: 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
e520: 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
e530: 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
e540: 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
e550: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
e560: 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
e570: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
e580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
e590: 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
e5a0: 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
e5b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e5c0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
e5d0: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
e5e0: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
e5f0: 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
e600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e610: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
e620: 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
e630: 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
e660: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
e670: 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
e680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
e690: 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
e6a0: 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
e6b0: 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
e6c0: 2a 7a 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20  *zEndAff = 0;   
e6d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
e6e0: 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
e6f0: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
e700: 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50  */.    u8 bSeekP
e710: 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20  astNull = 0;    
e720: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
e730: 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c  eek past initial
e740: 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38   nulls */.    u8
e750: 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30   bStopAtNull = 0
e760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
e770: 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74  d condition to t
e780: 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c  erminate at NULL
e790: 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  s */..    pIdx =
e7a0: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
e7b0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
e7c0: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
e7d0: 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72  dxCur;.    asser
e7e0: 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 6e  t( nEq>=pLoop->n
e7f0: 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Skip );..    /* 
e800: 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
e810: 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
e820: 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
e830: 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
e840: 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
e850: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
e860: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
e870: 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
e880: 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
e890: 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
e8a0: 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
e8b0: 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
e8c0: 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
e8d0: 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
e8e0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
e8f0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
e900: 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
e910: 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
e920: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
e930: 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
e940: 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
e950: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
e960: 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
e970: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
e980: 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
e990: 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
e9a0: 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
e9b0: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
e9c0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
e9d0: 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
e9e0: 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  y==0.         ||
e9f0: 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
ea00: 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20  y->nExpr==1.    
ea10: 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d       || (pWInfo-
ea20: 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
ea30: 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
ea40: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 57  0 );.    if( (pW
ea50: 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
ea60: 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
ea70: 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  IN)!=0.     && p
ea80: 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a  WInfo->nOBSat>0.
ea90: 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
eaa0: 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20  KeyCol>nEq).    
eab0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
eac0: 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
ead0: 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b 50   );.      bSeekP
eae0: 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  astNull = 1;.   
eaf0: 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
eb00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
eb10: 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
eb20: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
eb30: 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
eb40: 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
eb50: 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
eb60: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
eb70: 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
eb80: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
eb90: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
eba0: 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
ebb0: 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
ebc0: 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
ebd0: 6e 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28  nExtraReg = MAX(
ebe0: 6e 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70  nExtraReg, pLoop
ebf0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 29 3b  ->u.btree.nBtm);
ec00: 0a 20 20 20 20 20 20 2f 2a 20 4c 69 6b 65 20 6f  .      /* Like o
ec10: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67  ptimization rang
ec20: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c  e constraints al
ec30: 77 61 79 73 20 6f 63 63 75 72 20 69 6e 20 70 61  ways occur in pa
ec40: 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  irs */.      ass
ec50: 65 72 74 28 20 28 70 52 61 6e 67 65 53 74 61 72  ert( (pRangeStar
ec60: 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
ec70: 4d 5f 4c 49 4b 45 4f 50 54 29 3d 3d 30 20 7c 7c  M_LIKEOPT)==0 ||
ec80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ec90: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
eca0: 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
ecb0: 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  T)!=0 );.    }. 
ecc0: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
ecd0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
ece0: 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
ecf0: 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
ed00: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
ed10: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
ed20: 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52 65 67   = MAX(nExtraReg
ed30: 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
ed40: 2e 6e 54 6f 70 29 3b 0a 23 69 66 6e 64 65 66 20  .nTop);.#ifndef 
ed50: 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53  SQLITE_LIKE_DOES
ed60: 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20  NT_MATCH_BLOBS. 
ed70: 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
ed80: 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
ed90: 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20  ERM_LIKEOPT)!=0 
eda0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
edb0: 74 28 20 70 52 61 6e 67 65 53 74 61 72 74 21 3d  t( pRangeStart!=
edc0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
edd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
ede0: 20 6f 70 74 20 63 6f 6e 73 74 72 61 69 6e 74 73   opt constraints
edf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ee00: 72 74 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  rt( pRangeStart-
ee10: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ee20: 4c 49 4b 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20  LIKEOPT );   /* 
ee30: 6f 63 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a  occur in pairs *
ee40: 2f 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  /.        pLevel
ee50: 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d  ->iLikeRepCntr =
ee60: 20 28 75 33 32 29 2b 2b 70 50 61 72 73 65 2d 3e   (u32)++pParse->
ee70: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
ee80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ee90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
eea0: 2c 20 28 69 6e 74 29 70 4c 65 76 65 6c 2d 3e 69  , (int)pLevel->i
eeb0: 4c 69 6b 65 52 65 70 43 6e 74 72 29 3b 0a 20 20  LikeRepCntr);.  
eec0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
eed0: 74 28 28 76 2c 20 22 4c 49 4b 45 20 6c 6f 6f 70  t((v, "LIKE loop
eee0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
eef0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
ef00: 72 4c 69 6b 65 52 65 70 20 3d 20 73 71 6c 69 74  rLikeRep = sqlit
ef10: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ef20: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  r(v);.        /*
ef30: 20 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 61 63   iLikeRepCntr ac
ef40: 74 75 61 6c 6c 79 20 73 74 6f 72 65 73 20 32 78  tually stores 2x
ef50: 20 74 68 65 20 63 6f 75 6e 74 65 72 20 72 65 67   the counter reg
ef60: 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 20 20 54  ister number.  T
ef70: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 6f  he.        ** bo
ef80: 74 74 6f 6d 20 62 69 74 20 69 6e 64 69 63 61 74  ttom bit indicat
ef90: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73  es whether the s
efa0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 41  earch order is A
efb0: 53 43 20 6f 72 20 44 45 53 43 2e 20 2a 2f 0a 20  SC or DESC. */. 
efc0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
efd0: 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 20   bRev );.       
efe0: 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
eff0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
f000: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  ==SQLITE_SO_DESC
f010: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
f020: 72 74 28 20 28 62 52 65 76 20 26 20 7e 31 29 3d  rt( (bRev & ~1)=
f030: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  =0 );.        pL
f040: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
f050: 74 72 20 3c 3c 3d 31 3b 0a 20 20 20 20 20 20 20  tr <<=1;.       
f060: 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
f070: 70 43 6e 74 72 20 7c 3d 20 62 52 65 76 20 5e 20  pCntr |= bRev ^ 
f080: 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65  (pIdx->aSortOrde
f090: 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
f0a0: 4f 5f 44 45 53 43 29 3b 0a 20 20 20 20 20 20 7d  O_DESC);.      }
f0b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
f0c0: 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30  ( pRangeStart==0
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
f0e0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
f0f0: 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Eq];.        if(
f100: 20 28 6a 3e 3d 30 20 26 26 20 70 49 64 78 2d 3e   (j>=0 && pIdx->
f110: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e  pTable->aCol[j].
f120: 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 20 7c 7c 20 6a  notNull==0) || j
f130: 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
f140: 20 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74         bSeekPast
f150: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  Null = 1;.      
f160: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f170: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
f180: 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
f190: 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
f1a0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
f1b0: 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
f1c0: 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
f1d0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
f1e0: 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
f1f0: 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
f200: 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
f210: 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
f220: 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
f230: 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
f240: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
f250: 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
f260: 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
f270: 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
f280: 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64      if( (nEq<pId
f290: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52  x->nKeyCol && bR
f2a0: 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
f2b0: 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
f2c0: 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20  TE_SO_ASC)).    
f2d0: 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64   || (bRev && pId
f2e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29  x->nKeyCol==nEq)
f2f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57  .    ){.      SW
f300: 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
f310: 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
f320: 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53  eStart);.      S
f330: 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73  WAP(u8, bSeekPas
f340: 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75  tNull, bStopAtNu
f350: 6c 6c 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28  ll);.      SWAP(
f360: 75 38 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b  u8, nBtm, nTop);
f370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
f380: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f390: 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
f3a0: 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
f3b0: 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
f3c0: 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
f3d0: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
f3e0: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
f3f0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
f400: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
f410: 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
f420: 20 2a 2f 0a 20 20 20 20 63 6f 64 65 43 75 72 73   */.    codeCurs
f430: 6f 72 48 69 6e 74 28 70 54 61 62 49 74 65 6d 2c  orHint(pTabItem,
f440: 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c   pWInfo, pLevel,
f450: 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
f460: 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
f470: 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
f480: 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52  pParse,pLevel,bR
f490: 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53  ev,nExtraReg,&zS
f4a0: 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 73  tartAff);.    as
f4b0: 73 65 72 74 28 20 7a 53 74 61 72 74 41 66 66 3d  sert( zStartAff=
f4c0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
f4d0: 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66 29  len30(zStartAff)
f4e0: 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66 28  >=nEq );.    if(
f4f0: 20 7a 53 74 61 72 74 41 66 66 20 26 26 20 6e 54   zStartAff && nT
f500: 6f 70 20 29 7b 0a 20 20 20 20 20 20 7a 45 6e 64  op ){.      zEnd
f510: 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
f520: 74 72 44 75 70 28 64 62 2c 20 26 7a 53 74 61 72  trDup(db, &zStar
f530: 74 41 66 66 5b 6e 45 71 5d 29 3b 0a 20 20 20 20  tAff[nEq]);.    
f540: 7d 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  }.    addrNxt = 
f550: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
f560: 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
f570: 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
f580: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
f590: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
f5a0: 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
f5b0: 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
f5c0: 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
f5d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5e0: 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
f5f0: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
f600: 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
f610: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f620: 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
f630: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
f640: 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
f650: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f660: 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
f670: 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
f680: 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
f690: 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
f6a0: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
f6b0: 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
f6c0: 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
f6d0: 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
f6e0: 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
f6f0: 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
f700: 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
f710: 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
f720: 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
f730: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
f740: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f750: 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
f760: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
f770: 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
f780: 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
f790: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
f7a0: 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
f7b0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
f7c0: 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f   codeExprOrVecto
f7d0: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
f7e0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e  , regBase+nEq, n
f7f0: 42 74 6d 29 3b 0a 20 20 20 20 20 20 77 68 65 72  Btm);.      wher
f800: 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f  eLikeOptimizatio
f810: 6e 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20  nStringFixup(v, 
f820: 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
f830: 61 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  art);.      if( 
f840: 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74  (pRangeStart->wt
f850: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
f860: 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  LL)==0.       &&
f870: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
f880: 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20  eNull(pRight).  
f890: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
f8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f8b0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
f8c0: 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
f8d0: 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Nxt);.        Vd
f8e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f8f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f900: 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
f910: 20 20 20 20 20 20 75 70 64 61 74 65 52 61 6e 67        updateRang
f920: 65 41 66 66 69 6e 69 74 79 53 74 72 28 70 52 69  eAffinityStr(pRi
f930: 67 68 74 2c 20 6e 42 74 6d 2c 20 26 7a 53 74 61  ght, nBtm, &zSta
f940: 72 74 41 66 66 5b 6e 45 71 5d 29 3b 0a 20 20 20  rtAff[nEq]);.   
f950: 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
f960: 6e 73 74 72 61 69 6e 74 20 2b 3d 20 6e 42 74 6d  nstraint += nBtm
f970: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f980: 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
f990: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
f9a0: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 69  RTUAL );.      i
f9b0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
f9c0: 56 65 63 74 6f 72 28 70 52 69 67 68 74 29 3d 3d  Vector(pRight)==
f9d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
f9e0: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
f9f0: 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
fa00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fa10: 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 31 3b      startEq = 1;
fa20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fa30: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30  SeekPastNull = 0
fa40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fa50: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b  bSeekPastNull ){
fa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fa80: 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
fa90: 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
faa0: 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
fab0: 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
fac0: 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
fad0: 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
fae0: 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
faf0: 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
fb00: 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
fb10: 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e  int - bSeekPastN
fb20: 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  ull, zStartAff);
fb30: 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
fb40: 6e 53 6b 69 70 3e 30 20 26 26 20 6e 43 6f 6e 73  nSkip>0 && nCons
fb50: 74 72 61 69 6e 74 3d 3d 70 4c 6f 6f 70 2d 3e 6e  traint==pLoop->n
fb60: 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Skip ){.      /*
fb70: 20 54 68 65 20 73 6b 69 70 2d 73 63 61 6e 20 6c   The skip-scan l
fb80: 6f 67 69 63 20 69 6e 73 69 64 65 20 74 68 65 20  ogic inside the 
fb90: 63 61 6c 6c 20 74 6f 20 63 6f 64 65 41 6c 6c 45  call to codeAllE
fba0: 71 75 61 6c 69 74 79 43 6f 6e 73 74 72 61 69 6e  qualityConstrain
fbb0: 74 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 61 62  ts().      ** ab
fbc0: 6f 76 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ove has already 
fbd0: 6c 65 66 74 20 74 68 65 20 63 75 72 73 6f 72 20  left the cursor 
fbe0: 73 69 74 74 69 6e 67 20 6f 6e 20 74 68 65 20 63  sitting on the c
fbf0: 6f 72 72 65 63 74 20 72 6f 77 2c 0a 20 20 20 20  orrect row,.    
fc00: 20 20 2a 2a 20 73 6f 20 6e 6f 20 66 75 72 74 68    ** so no furth
fc10: 65 72 20 73 65 65 6b 69 6e 67 20 69 73 20 6e 65  er seeking is ne
fc20: 65 64 65 64 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  eded */.    }els
fc30: 65 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 53  e{.      op = aS
fc40: 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
fc50: 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
fc60: 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
fc70: 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Rev];.      asse
fc80: 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
fc90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fca0: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
fcb0: 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
fcc0: 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
fcd0: 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 56 64  raint);.      Vd
fce0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fcf0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
fd00: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65  eIf(v, op==OP_Re
fd10: 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65  wind);  testcase
fd20: 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
fd30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
fd40: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
fd50: 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
fd60: 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
fd70: 74 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  t );.      VdbeC
fd80: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
fd90: 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65  =OP_SeekGT);  te
fda0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
fdb0: 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 20 20 56  eekGT );.      V
fdc0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
fdd0: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b   op==OP_SeekGE);
fde0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
fdf0: 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20  OP_SeekGE );.   
fe00: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
fe10: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
fe20: 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  LE);  testcase( 
fe30: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b  op==OP_SeekLE );
fe40: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
fe50: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
fe60: 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
fe70: 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
fe80: 54 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  T );.    }..    
fe90: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
fea0: 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
feb0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
fec0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
fed0: 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
fee0: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
fef0: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
ff00: 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
ff10: 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
ff20: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
ff30: 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
ff40: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
ff50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ff60: 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
ff70: 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
ff80: 0a 20 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f  .      codeExprO
ff90: 72 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  rVector(pParse, 
ffa0: 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
ffb0: 6e 45 71 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  nEq, nTop);.    
ffc0: 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d    whereLikeOptim
ffd0: 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69 78  izationStringFix
ffe0: 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20 70 52  up(v, pLevel, pR
fff0: 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 20 20  angeEnd);.      
10000 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
10010 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
10020 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20  NULL)==0.       
10030 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
10040 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a  nBeNull(pRight).
10050 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
10060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10070 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
10080 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
10090 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  drNxt);.        
100a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
100b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100c0 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20  f( zEndAff ){.  
100d0 20 20 20 20 20 20 75 70 64 61 74 65 52 61 6e 67        updateRang
100e0 65 41 66 66 69 6e 69 74 79 53 74 72 28 70 52 69  eAffinityStr(pRi
100f0 67 68 74 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64 41  ght, nTop, zEndA
10100 66 66 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ff);.        cod
10110 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
10120 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
10130 45 71 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64 41 66  Eq, nTop, zEndAf
10140 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
10150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10160 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
10170 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
10180 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73     }.      nCons
10190 74 72 61 69 6e 74 20 2b 3d 20 6e 54 6f 70 3b 0a  traint += nTop;.
101a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
101b0 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
101c0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
101d0 4c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  L );..      if( 
101e0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
101f0 74 6f 72 28 70 52 69 67 68 74 29 3d 3d 30 20 29  tor(pRight)==0 )
10200 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
10210 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
10220 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 20 20  angeEnd);.      
10230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 65  }else{.        e
10240 6e 64 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  ndEq = 1;.      
10250 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
10260 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20  bStopAtNull ){. 
10270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
10290 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
102a0 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  q);.      sqlite
102b0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
102c0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
102d0 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
102e0 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  endEq = 0;.     
102f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
10300 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10310 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61  3DbFree(db, zSta
10320 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
10330 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
10340 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
10350 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
10360 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
10370 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
10380 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10390 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
103a0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
103b0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
103c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
103d0 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ge. */.    if( n
103e0 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
103f0 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
10400 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b  bRev*2 + endEq];
10410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10420 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
10430 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
10440 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
10450 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
10460 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10470 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62  OP_IdxGT );  Vdb
10480 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
10490 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  p==OP_IdxGT );. 
104a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
104b0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20  p==OP_IdxGE );  
104c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
104d0 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  , op==OP_IdxGE )
104e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
104f0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
10500 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
10510 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  f(v, op==OP_IdxL
10520 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
10530 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
10540 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
10550 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
10560 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  dxLE );.    }.. 
10570 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
10580 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
10590 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
105a0 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b  if( omitTable ){
105b0 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69  .      /* pIdx i
105c0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
105d0 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  ex.  No need to 
105e0 61 63 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20  access the main 
105f0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65  table. */.    }e
10600 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
10610 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29  (pIdx->pTable) )
10620 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  {.      if( (pWI
10630 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
10640 26 20 57 48 45 52 45 5f 53 45 45 4b 5f 54 41 42  & WHERE_SEEK_TAB
10650 4c 45 29 20 7c 7c 20 28 0a 20 20 20 20 20 20 20  LE) || (.       
10660 20 20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72     (pWInfo->wctr
10670 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
10680 45 45 4b 5f 55 4e 49 51 5f 54 41 42 4c 45 29 20  EEK_UNIQ_TABLE) 
10690 0a 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e  .       && (pWIn
106a0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
106b0 45 50 41 53 53 5f 53 49 4e 47 4c 45 29 0a 20 20  EPASS_SINGLE).  
106c0 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20      )){.        
106d0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
106e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
106f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10700 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
10710 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
10720 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
10730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10740 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
10750 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
10760 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  dReg);.        s
10770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10780 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
10790 2c 20 69 43 75 72 2c 20 30 2c 20 69 52 6f 77 69  , iCur, 0, iRowi
107a0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56  dReg);.        V
107b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
107c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
107d0 20 20 20 20 20 63 6f 64 65 44 65 66 65 72 72 65       codeDeferre
107e0 64 53 65 65 6b 28 70 57 49 6e 66 6f 2c 20 70 49  dSeek(pWInfo, pI
107f0 64 78 2c 20 69 43 75 72 2c 20 69 49 64 78 43 75  dx, iCur, iIdxCu
10800 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10810 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72 21 3d  }else if( iCur!=
10820 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20 20  iIdxCur ){.     
10830 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
10840 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
10850 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c  ndex(pIdx->pTabl
10860 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  e);.      iRowid
10870 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
10880 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
10890 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
108a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
108b0 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
108c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
108d0 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
108e0 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b  fIndex(pIdx, pPk
108f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a  ->aiColumn[j]);.
10900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10910 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10920 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
10930 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29   k, iRowidReg+j)
10940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10960 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10970 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43  und, iCur, addrC
10980 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ont,.           
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e  iRowidReg, pPk->
109b0 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
109c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
109d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 49 64 78  ..    /* If pIdx
109e0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
109f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65 78 70 72  one or more expr
10a00 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 6c 6f  essions, then lo
10a10 6f 6b 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ok through.    *
10a20 2a 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  * all the expres
10a30 73 69 6f 6e 73 20 69 6e 20 70 57 49 6e 66 6f 20  sions in pWInfo 
10a40 61 6e 64 20 74 72 79 20 74 6f 20 74 72 61 6e 73  and try to trans
10a50 66 6f 72 6d 20 6d 61 74 63 68 69 6e 67 20 65 78  form matching ex
10a60 70 72 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2a  pressions.    **
10a70 20 69 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 20   into reference 
10a80 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  to index columns
10a90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 65  ..    */.    whe
10aa0 72 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73  reIndexExprTrans
10ab0 28 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49 64  (pIdx, iCur, iId
10ac0 78 43 75 72 2c 20 70 57 49 6e 66 6f 29 3b 0a 0a  xCur, pWInfo);..
10ad0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
10ae0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
10af0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
10b00 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
10b10 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
10b20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
10b30 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ROW ){.      pLe
10b40 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
10b50 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
10b60 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
10b70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
10b80 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
10b90 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
10ba0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
10bb0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
10bc0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
10bd0 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c  pLevel->p3 = (pL
10be0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
10bf0 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d  RE_UNQ_WANTED)!=
10c00 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28  0 ? 1:0;.    if(
10c10 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
10c20 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
10c30 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  INT)==0 ){.     
10c40 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
10c50 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
10c60 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
10c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10c80 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
10c90 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
10ca0 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65     if( omitTable
10cb0 20 29 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d   ) pIdx = 0;.  }
10cc0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
10cd0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
10ce0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
10cf0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
10d00 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
10d10 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35  ){.    /* Case 5
10d20 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73  :  Two or more s
10d30 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65  eparately indexe
10d40 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
10d50 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20  d by OR.    **. 
10d60 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
10d70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
10d80 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
10d90 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20  ,b,c,d);.    ** 
10da0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
10db0 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
10dc0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
10dd0 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i2 ON t1(b);. 
10de0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
10df0 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29  NDEX i3 ON t1(c)
10e00 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
10e10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
10e20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20  t1 WHERE a=5 OR 
10e30 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44  b=7 OR (c=11 AND
10e40 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20   d=13).    **.  
10e50 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d    ** In the exam
10e60 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74  ple, there are t
10e70 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72  hree indexed ter
10e80 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
10e90 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74  OR..    ** The t
10ea0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c  op of the loop l
10eb0 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
10ec0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
10ed0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
10ee0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
10ef0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
10f00 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
10f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e    **.    ** Then
10f20 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  , for each index
10f30 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c  ed term, the fol
10f40 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75  lowing. The argu
10f50 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ments to.    ** 
10f60 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73  RowSetTest are s
10f70 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77  uch that the row
10f80 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
10f90 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  t row is inserte
10fa0 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  d.    ** into th
10fb0 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20  e RowSet. If it 
10fc0 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
10fd0 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70  nt, control skip
10fe0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73  s the.    ** Gos
10ff0 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75  ub opcode and ju
11000 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20  mps straight to 
11010 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
11020 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29  ed by WhereEnd()
11030 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
11050 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29  ereBegin(<term>)
11060 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
11070 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20   RowSetTest     
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49               # I
11090 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f  nsert rowid into
110a0 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20   rowset.    **  
110b0 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20          Gosub   
110c0 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20     2 A.    **   
110d0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
110e0 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20  eEnd().    **.  
110f0 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74    ** Following t
11100 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74  he above, code t
11110 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
11120 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74  loop. Label A, t
11130 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
11140 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62   of the Gosub ab
11150 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68  ove, jumps to th
11160 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69  e instruction ri
11170 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f  ght after the Go
11180 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  to..    **.    *
11190 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
111a0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
111b0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
111c0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
111d0 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
111e0 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20    Goto       B  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
11200 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69  The loop is fini
11210 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  shed..    **.   
11220 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f   **       A: <lo
11230 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20  op body>        
11240 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72           # Retur
11250 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72  n data, whatever
11260 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11270 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
11280 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
11290 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b       # Jump back
112a0 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20   to the Gosub.  
112b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
112c0 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20    B: <after the 
112d0 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop>.    **.   
112e0 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30   ** Added 2014-0
112f0 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62  5-26: If the tab
11300 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  le is a WITHOUT 
11310 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65  ROWID table, the
11320 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20  n.    ** use an 
11330 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
11340 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77  instead of a Row
11350 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68  Set to record th
11360 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a  e primary.    **
11370 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77   keys of the row
11380 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  s we have alread
11390 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20  y seen..    **. 
113a0 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
113b0 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
113c0 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
113d0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
113e0 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
113f0 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
11400 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
11410 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
11420 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
11430 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
11440 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11460 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
11470 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
11480 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
11490 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
114a0 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
114b0 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
114c0 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
114d0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
114e0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
114f0 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
11500 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
11510 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
11520 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
11530 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
11560 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
11570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
11580 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
115b0 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
115c0 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
115d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
115e0 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
115f0 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
11600 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
11610 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11640 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
11650 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
11660 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
11670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
11680 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
11690 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
116a0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
116d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
116e0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20  u16 wctrlFlags; 
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
11710 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
11720 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41   */.    Expr *pA
11730 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20  ndExpr = 0;     
11740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
11750 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20   ".. AND (...)" 
11760 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
11770 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11780 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
11790 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
117a0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
117b0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
117c0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
117d0 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
117e0 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
117f0 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
11800 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
11810 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
11820 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
11830 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
11840 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
11850 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
11860 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
11870 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
11880 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
11890 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
118a0 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
118b0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
118c0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
118d0 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
118e0 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
118f0 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
11900 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
11910 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
11920 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
11930 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
11940 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
11950 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
11960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11970 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
11980 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
11990 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
119a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
119b0 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
119c0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
119d0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
119e0 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
119f0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
11a00 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
11a10 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
11a20 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
11a30 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
11a40 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
11a50 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
11a60 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
11a90 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
11aa0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
11ab0 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
11ac0 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
11ad0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
11ae0 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
11af0 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
11b00 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
11b10 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
11b20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
11b30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
11b40 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
11b50 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
11b60 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
11b70 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
11b80 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
11b90 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
11ba0 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
11bb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
11bc0 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
11bd0 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
11be0 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
11bf0 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
11c00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11c10 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
11c20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
11c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11c40 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
11c50 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
11c60 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
11c70 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
11c80 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
11c90 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
11ca0 77 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74  wset.  Or, creat
11cb0 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
11cc0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61  ndex.    ** capa
11cd0 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70  ble of holding p
11ce0 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
11cf0 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  he case of a WIT
11d00 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20  HOUT ROWID..    
11d10 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
11d20 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
11d30 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
11d40 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
11d50 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
11d60 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
11d70 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
11d80 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
11d90 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
11da0 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
11db0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
11dc0 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
11dd0 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
11de0 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
11df0 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
11e00 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
11e10 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
11e20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
11e30 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
11e40 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
11e50 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
11e60 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
11e70 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
11e80 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
11e90 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
11ea0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
11eb0 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
11ec0 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
11ed0 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
11ee0 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
11ef0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
11f00 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
11f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
11f20 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
11f30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
11f40 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
11f50 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
11f60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11f70 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
11f80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11f90 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
11fa0 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  owset);.      }e
11fb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  lse{.        Ind
11fc0 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
11fd0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
11fe0 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
11ff0 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72  regRowset = pPar
12000 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
12030 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f  Ephemeral, regRo
12040 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  wset, pPk->nKeyC
12050 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
12060 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
12070 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b  Info(pParse, pPk
12080 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12090 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
120a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
120b0 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
120c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120d0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
120e0 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
120f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12100 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
12110 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
12120 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
12130 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
12140 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
12150 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
12160 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
12170 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
12180 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
12190 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
121a0 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
121b0 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
121c0 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
121d0 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
121e0 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
121f0 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
12200 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12210 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
12220 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
12230 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
12240 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
12250 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
12260 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
12270 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
12280 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
12290 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
122a0 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
122b0 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
122c0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
122d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
122e0 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
122f0 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
12300 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
12310 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
12320 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
12330 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
12340 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
12350 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
12360 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
12370 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
12380 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
12390 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
123a0 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
123b0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
123c0 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
123d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
123e0 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
123f0 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
12400 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
12410 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
12420 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
12430 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
12440 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
12450 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
12460 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69     if( &pWC->a[i
12470 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29  Term] == pTerm )
12480 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12490 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
124a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
124b0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
124c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
124d0 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
124e0 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
124f0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
12500 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12510 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
12520 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
12530 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20  CODED );.       
12540 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
12550 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
12560 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
12570 5f 43 4f 44 45 44 29 29 21 3d 30 20 29 20 63 6f  _CODED))!=0 ) co
12580 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12590 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
125a0 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
125b0 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
125c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
125d0 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
125e0 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
125f0 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
12600 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
12610 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
12620 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
12630 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
12640 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
12650 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
12660 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
12670 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
12680 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
12690 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
126a0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
126b0 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46 4f 4c 44  D|TKFLG_DONTFOLD
126c0 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  , 0, pAndExpr);.
126d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
126e0 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61     /* Run a sepa
126f0 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  rate WHERE claus
12700 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
12710 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
12720 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  .  After.    ** 
12730 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c  eliminating dupl
12740 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65  icates from othe
12750 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  r WHERE clauses,
12760 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20   the action for 
12770 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d  each.    ** sub-
12780 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
12790 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  to to invoke the
127a0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
127b0 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  as a subroutine.
127c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72  .    */.    wctr
127d0 6c 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f  lFlags =  WHERE_
127e0 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 7c 20 28  OR_SUBCLAUSE | (
127f0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
12800 67 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b 5f  gs & WHERE_SEEK_
12810 54 41 42 4c 45 29 3b 0a 20 20 20 20 66 6f 72 28  TABLE);.    for(
12820 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
12830 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
12840 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
12850 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
12860 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
12870 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
12880 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
12890 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
128a0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
128c0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
128d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
128e0 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
128f0 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
12900 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45        Expr *pOrE
12910 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  xpr = pOrTerm->p
12920 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Expr; /* Current
12930 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20   OR clause term 
12940 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  */.        int j
12950 6d 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mp1 = 0;        
12960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
12970 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70  dress of jump op
12980 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
12990 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
129a0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
129b0 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f  rty(pOrExpr, EP_
129c0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
129d0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
129e0 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
129f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
12a00 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
12a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12a20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
12a30 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
12a40 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
12a50 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
12a60 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
12a70 78 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61 6e  xffff, ("Subplan
12a80 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a 5c   for OR-clause:\
12a90 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53  n"));.        pS
12aa0 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
12ab0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
12ac0 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
12ad0 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43 6f   wctrlFlags, iCo
12b10 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
12b20 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
12b30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
12b40 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12b50 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
12b60 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
12b70 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
12b80 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a  Loop *pSubLoop;.
12b90 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
12ba0 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
12bb0 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
12bc0 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
12bd0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f        pParse, pO
12be0 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
12bf0 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20  ->a[0], iLevel, 
12c00 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30  pLevel->iFrom, 0
12c10 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
12c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
12c30 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
12c40 73 28 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  s(v, pOrTab, &pS
12c50 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61  ubWInfo->a[0], a
12c60 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20  ddrExplain);..  
12c70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
12c80 69 73 20 74 68 65 20 73 75 62 2d 57 48 45 52 45  is the sub-WHERE
12c90 20 63 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46   clause body.  F
12ca0 69 72 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20  irst skip over. 
12cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c           ** dupl
12cc0 69 63 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20  icate rows from 
12cd0 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20  prior sub-WHERE 
12ce0 63 6c 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63  clauses, and rec
12cf0 6f 72 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  ord the.        
12d00 20 20 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50    ** rowid (or P
12d10 52 49 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20  RIMARY KEY) for 
12d20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
12d30 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
12d40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
12d50 77 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  w will be skippe
12d60 64 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20  d in subsequent 
12d70 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
12d80 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  s..          */.
12d90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
12da0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
12db0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
12dc0 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
12dd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
12de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
12df0 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
12e00 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
12e10 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
12e20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
12e30 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
12e40 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
12e50 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
12e60 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
12e70 2c 20 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52  , -1, iCur, regR
12e80 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
12e90 20 20 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73          jmp1 = s
12ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12eb0 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
12ec0 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
12ed0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12f00 2c 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ,iSet);.        
12f10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12f20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
12f30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12f40 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
12f50 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
12f60 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
12f70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12f80 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e   int nPk = pPk->
12f90 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nKeyCol;.       
12fa0 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a         int iPk;.
12fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
12fc0 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e  * Read the PK in
12fd0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74  to an array of t
12fe0 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a  emp registers. *
12ff0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
13000 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  r = sqlite3GetTe
13010 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13020 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
13030 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69      for(iPk=0; i
13040 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a  Pk<nPk; iPk++){.
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e  int iCol = pPk->
13070 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20  aiColumn[iPk];. 
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13090 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
130a0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61  tColumnToReg(pPa
130b0 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  rse, pTab, iCol,
130c0 20 69 43 75 72 2c 20 72 2b 69 50 6b 29 3b 0a 20   iCur, r+iPk);. 
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130f0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
13100 6d 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  mp table already
13110 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b   contains this k
13120 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  ey. If so,.     
13130 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
13140 72 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79 20  row has already 
13150 62 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e  been included in
13160 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
13170 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
13180 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f    ** can be igno
13190 72 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20  red (by jumping 
131a0 70 61 73 74 20 74 68 65 20 47 6f 73 75 62 20 62  past the Gosub b
131b0 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65  elow). Otherwise
131c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
131d0 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65  ** insert the ke
131e0 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  y into the temp 
131f0 74 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65  table and procee
13200 64 20 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e  d with processin
13210 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
13220 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20  ** the row..    
13230 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
13240 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73             ** Us
13250 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61  e some of the sa
13260 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  me optimizations
13270 20 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73   as OP_RowSetTes
13280 74 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20 20  t: If iSet.     
13290 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a           ** is z
132a0 65 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ero, assume that
132b0 20 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20   the key cannot 
132c0 61 6c 72 65 61 64 79 20 62 65 20 70 72 65 73 65  already be prese
132d0 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nt in.          
132e0 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20      ** the temp 
132f0 74 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53  table. And if iS
13300 65 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65  et is -1, assume
13310 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
13320 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o .             
13330 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   ** need to inse
13340 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20  rt the key into 
13350 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  the temp table, 
13360 61 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72  as it will never
13370 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13380 2a 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  ** be tested for
13390 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  .  */ .         
133a0 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 7b       if( iSet ){
133b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
133c0 20 6a 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56   jmp1 = sqlite3V
133d0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
133e0 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77  OP_Found, regRow
133f0 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b  set, 0, r, nPk);
13400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13410 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13430 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
13440 69 66 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20  if( iSet>=0 ){. 
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13470 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13480 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f  d, r, nPk, regRo
13490 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
134a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
134b0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
134c0 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52  _IdxInsert, regR
134d0 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c  owset, regRowid,
134e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 20 20 72 2c 20 6e 50 6b 29 3b 0a 20        r, nPk);. 
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
13520 66 28 20 69 53 65 74 20 29 20 73 71 6c 69 74 65  f( iSet ) sqlite
13530 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
13540 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
13550 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20  ESULT);.        
13560 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
13570 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73         /* Releas
13580 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 74  e the array of t
13590 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f  emp registers */
135a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
135b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
135c0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
135d0 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
135e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
135f0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
13600 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20  Invoke the main 
13610 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73  loop body as a s
13620 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
13630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13650 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
13660 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
13670 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13680 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74  here (skipping t
13690 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64  he main loop bod
136a0 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66  y subroutine) if
136b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
136c0 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48  * current sub-WH
136d0 45 52 45 20 72 6f 77 20 69 73 20 61 20 64 75 70  ERE row is a dup
136e0 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f  licate from prio
136f0 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f  r sub-WHEREs. */
13700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
13710 6d 70 31 20 29 20 73 71 6c 69 74 65 33 56 64 62  mp1 ) sqlite3Vdb
13720 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
13730 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  1);..          /
13740 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
13750 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
13760 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
13770 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
13780 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
13790 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
137a0 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
137b0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
137c0 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
137d0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
137e0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
137f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
13800 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
13810 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
13820 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
13830 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13840 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
13850 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
13860 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
13870 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
13880 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
13890 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
138a0 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
138b0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
138c0 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
138d0 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
138e0 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
138f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
13900 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
13910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
13920 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
13930 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
13940 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
13950 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
13960 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
13970 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
13980 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
13990 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
139a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
139b0 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
139c0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
139d0 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
139e0 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
139f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
13a00 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
13a10 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
13a20 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
13a30 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
13a40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
13a50 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
13a60 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
13a70 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
13a80 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
13a90 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
13aa0 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
13ab0 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
13ac0 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
13ad0 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
13ae0 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
13af0 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
13b00 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
13b10 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
13b20 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
13b30 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
13b40 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
13b50 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
13b60 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
13b70 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
13b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b90 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
13ba0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
13bb0 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20  INDEX)==0 );.   
13bc0 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62         if( (pSub
13bd0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
13be0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
13bf0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
13c00 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f  (ii==0 || pSubLo
13c10 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
13c20 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  ex==pCov).      
13c30 20 20 20 20 20 26 26 20 28 48 61 73 52 6f 77 69       && (HasRowi
13c40 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
13c50 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 53  imaryKeyIndex(pS
13c60 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
13c70 70 49 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20  pIndex)).       
13c80 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
13c90 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
13ca0 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75  nfo->a[0].iIdxCu
13cb0 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20  r==iCovCur );.  
13cc0 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
13cd0 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
13ce0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
13cf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13d00 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
13d10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
13d20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
13d30 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
13d40 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
13d50 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
13d60 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
13d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
13d80 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
13d90 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
13da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13db0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
13dc0 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
13dd0 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
13de0 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
13df0 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
13e00 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
13e10 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
13e20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13e30 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
13e40 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  AndExpr);.    }.
13e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13e60 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
13e70 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
13e80 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
13e90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13ea0 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
13eb0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
13ec0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
13ed0 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
13ee0 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
13ef0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
13f00 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
13f10 65 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  e(db, pOrTab);. 
13f20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
13f30 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
13f40 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
13f50 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
13f60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13f70 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
13f80 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
13f90 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20   Case 6:  There 
13fa0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
13fb0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
13fc0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
13fd0 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
13fe0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
13ff0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
14000 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
14010 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
14020 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
14030 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
14040 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
14050 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
14060 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
14070 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
14080 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  ev==1 );.    if(
14090 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 69 73   pTabItem->fg.is
140a0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
140b0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72     /* Tables mar
140c0 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65 20  ked isRecursive 
140d0 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
140e0 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 73  le row that is s
140f0 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  tored in.      *
14100 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  * a pseudo-curso
14110 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52  r.  No need to R
14120 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75  ewind or Next su
14130 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20  ch cursors. */. 
14140 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
14150 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
14160 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65  else{.      code
14170 43 75 72 73 6f 72 48 69 6e 74 28 70 54 61 62 49  CursorHint(pTabI
14180 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65  tem, pWInfo, pLe
14190 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  vel, 0);.      p
141a0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
141b0 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70  p[bRev];.      p
141c0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
141d0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
141e0 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
141f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
14200 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
14210 2c 20 61 64 64 72 48 61 6c 74 29 3b 0a 20 20 20  , addrHalt);.   
14220 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
14230 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
14240 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
14250 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
14260 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
14270 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
14280 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
14290 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  TEP;.    }.  }..
142a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
142b0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
142c0 41 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61  ATUS.  pLevel->a
142d0 64 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74  ddrVisit = sqlit
142e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
142f0 72 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  r(v);.#endif..  
14300 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
14310 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
14320 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
14330 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
14340 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  y.  ** computed 
14350 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
14360 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
14370 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
14380 6c 6f 6f 70 20 6d 61 79 20 72 75 6e 20 62 65 74  loop may run bet
14390 77 65 65 6e 20 6f 6e 65 20 61 6e 64 20 74 68 72  ween one and thr
143a0 65 65 20 74 69 6d 65 73 2c 20 64 65 70 65 6e 64  ee times, depend
143b0 69 6e 67 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ing on the.  ** 
143c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62  constraints to b
143d0 65 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65  e generated. The
143e0 20 76 61 6c 75 65 20 6f 66 20 73 74 61 63 6b 20   value of stack 
143f0 76 61 72 69 61 62 6c 65 20 69 4c 6f 6f 70 0a 20  variable iLoop. 
14400 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74   ** determines t
14410 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 63  he constraints c
14420 6f 64 65 64 20 62 79 20 65 61 63 68 20 69 74 65  oded by each ite
14430 72 61 74 69 6f 6e 2c 20 61 73 20 66 6f 6c 6c 6f  ration, as follo
14440 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 4c  ws:.  **.  ** iL
14450 6f 6f 70 3d 3d 31 3a 20 43 6f 64 65 20 6f 6e 6c  oop==1: Code onl
14460 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  y expressions th
14470 61 74 20 61 72 65 20 65 6e 74 69 72 65 6c 79 20  at are entirely 
14480 63 6f 76 65 72 65 64 20 62 79 20 70 49 64 78 2e  covered by pIdx.
14490 0a 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 32 3a 20  .  ** iLoop==2: 
144a0 43 6f 64 65 20 72 65 6d 61 69 6e 69 6e 67 20 65  Code remaining e
144b0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
144c0 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63  do not contain c
144d0 6f 72 72 65 6c 61 74 65 64 0a 20 20 2a 2a 20 20  orrelated.  **  
144e0 20 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65           sub-que
144f0 72 69 65 73 2e 20 20 0a 20 20 2a 2a 20 69 4c 6f  ries.  .  ** iLo
14500 6f 70 3d 3d 33 3a 20 43 6f 64 65 20 61 6c 6c 20  op==3: Code all 
14510 72 65 6d 61 69 6e 69 6e 67 20 65 78 70 72 65 73  remaining expres
14520 73 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sions..  **.  **
14530 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   An effort is ma
14540 64 65 20 74 6f 20 73 6b 69 70 20 75 6e 6e 65 63  de to skip unnec
14550 65 73 73 61 72 79 20 69 74 65 72 61 74 69 6f 6e  essary iteration
14560 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  s of the loop.. 
14570 20 2a 2f 0a 20 20 69 4c 6f 6f 70 20 3d 20 28 70   */.  iLoop = (p
14580 49 64 78 20 3f 20 31 20 3a 20 32 29 3b 0a 20 20  Idx ? 1 : 2);.  
14590 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  do{.    int iNex
145a0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
145b0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 76 61        /* Next va
145c0 6c 75 65 20 66 6f 72 20 69 4c 6f 6f 70 20 2a 2f  lue for iLoop */
145d0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
145e0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
145f0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
14600 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
14610 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
14620 6e 74 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20  nt skipLikeAddr 
14630 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63  = 0;.      testc
14640 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
14650 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
14660 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
14670 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
14680 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
14690 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
146a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
146b0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
146c0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
146d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
146e0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
146f0 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
14700 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
14710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
14720 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
14730 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
14740 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
14750 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
14760 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
14770 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 57  =0 );.        pW
14780 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
14790 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rms = 1;.       
147a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
147b0 20 7d 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54   }.      pE = pT
147c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
147d0 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
147e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
147f0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
14800 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
14810 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
14820 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
14830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
14840 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
14850 28 20 69 4c 6f 6f 70 3d 3d 31 20 26 26 20 21 73  ( iLoop==1 && !s
14860 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
14870 64 42 79 49 6e 64 65 78 28 70 45 2c 20 70 4c 65  dByIndex(pE, pLe
14880 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 49  vel->iTabCur, pI
14890 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
148a0 4e 65 78 74 20 3d 20 32 3b 0a 20 20 20 20 20 20  Next = 2;.      
148b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
148c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c    }.      if( iL
148d0 6f 6f 70 3c 33 20 26 26 20 28 70 54 65 72 6d 2d  oop<3 && (pTerm-
148e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
148f0 56 41 52 53 45 4c 45 43 54 29 20 29 7b 0a 20 20  VARSELECT) ){.  
14900 20 20 20 20 20 20 69 66 28 20 69 4e 65 78 74 3d        if( iNext=
14910 3d 30 20 29 20 69 4e 65 78 74 20 3d 20 33 3b 0a  =0 ) iNext = 3;.
14920 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14930 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14940 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
14950 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43  ags & TERM_LIKEC
14960 4f 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OND ){.        /
14970 2a 20 49 66 20 74 68 65 20 54 45 52 4d 5f 4c 49  * If the TERM_LI
14980 4b 45 43 4f 4e 44 20 66 6c 61 67 20 69 73 20 73  KECOND flag is s
14990 65 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  et, that means t
149a0 68 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 65  hat the range se
149b0 61 72 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  arch.        ** 
149c0 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
149d0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
149e0 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
149f0 72 20 69 73 20 74 72 75 65 2c 20 73 6f 20 77 65  r is true, so we
14a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  .        ** can 
14a10 73 6b 69 70 20 74 68 65 20 63 61 6c 6c 20 74 6f  skip the call to
14a20 20 74 68 65 20 6c 69 6b 65 28 41 2c 42 29 20 66   the like(A,B) f
14a30 75 6e 63 74 69 6f 6e 2e 20 20 42 75 74 20 74 68  unction.  But th
14a40 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 0a 20 20  is only works.  
14a50 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 73 74 72        ** for str
14a60 69 6e 67 73 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  ings.  So do not
14a70 20 73 6b 69 70 20 74 68 65 20 63 61 6c 6c 20 74   skip the call t
14a80 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6f  o the function o
14a90 6e 20 74 68 65 20 70 61 73 73 0a 20 20 20 20 20  n the pass.     
14aa0 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6d 70 61     ** that compa
14ab0 72 65 73 20 42 4c 4f 42 73 2e 20 2a 2f 0a 23 69  res BLOBs. */.#i
14ac0 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45  fdef SQLITE_LIKE
14ad0 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c  _DOESNT_MATCH_BL
14ae0 4f 42 53 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  OBS.        cont
14af0 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  inue;.#else.    
14b00 20 20 20 20 75 33 32 20 78 20 3d 20 70 4c 65 76      u32 x = pLev
14b10 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
14b20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14b30 28 20 78 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( x>0 );.       
14b40 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20   skipLikeAddr = 
14b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b60 31 28 76 2c 20 28 78 26 31 29 3f 4f 50 5f 49 66  1(v, (x&1)?OP_If
14b70 4e 6f 74 3a 4f 50 5f 49 66 2c 20 28 69 6e 74 29  Not:OP_If, (int)
14b80 28 78 3e 3e 31 29 29 3b 0a 20 20 20 20 20 20 20  (x>>1));.       
14b90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14ba0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
14bb0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
14bc0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
14bd0 66 66 66 66 20 2a 2f 0a 20 20 20 20 20 20 69 66  ffff */.      if
14be0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
14bf0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 56  ace ){.        V
14c00 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14c10 76 2c 20 22 57 68 65 72 65 54 65 72 6d 5b 25 64  v, "WhereTerm[%d
14c20 5d 20 28 25 70 29 20 70 72 69 6f 72 69 74 79 3d  ] (%p) priority=
14c30 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
14c50 43 2d 3e 6e 54 65 72 6d 2d 6a 2c 20 70 54 65 72  C->nTerm-j, pTer
14c60 6d 2c 20 69 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  m, iLoop));.    
14c70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
14c80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
14c90 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
14ca0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
14cb0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
14cc0 20 20 20 20 69 66 28 20 73 6b 69 70 4c 69 6b 65      if( skipLike
14cd0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
14ce0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 6b  beJumpHere(v, sk
14cf0 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20 20 20  ipLikeAddr);.   
14d00 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
14d10 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
14d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 6f 6f 70  .    }.    iLoop
14d30 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 77 68 69   = iNext;.  }whi
14d40 6c 65 28 20 69 4c 6f 6f 70 3e 30 20 29 3b 0a 0a  le( iLoop>0 );..
14d50 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
14d60 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
14d70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
14d80 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
14d90 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
14da0 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
14db0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
14dc0 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
14dd0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
14de0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
14df0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
14e00 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
14e10 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
14e20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
14e30 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
14e40 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
14e50 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
14e60 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
14e70 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
14e80 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
14e90 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
14ea0 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
14eb0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
14ec0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
14ed0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
14ee0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
14ef0 70 72 20 2a 70 45 2c 20 73 45 41 6c 74 3b 0a 20  pr *pE, sEAlt;. 
14f00 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
14f10 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lt;.    if( pTer
14f20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
14f30 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
14f40 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
14f50 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
14f60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14f70 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30  WO_EQ|WO_IS))==0
14f80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14f90 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
14fa0 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
14fb0 56 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  V)==0 ) continue
14fc0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14fd0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
14fe0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14ff0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
15000 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
15010 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
15020 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
15030 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15040 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
15050 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
15060 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
15070 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
15080 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
15090 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
150a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
150b0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
150c0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
150d0 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  lumn, notReady,.
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c      WO_EQ|WO_IN|
15100 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IS, 0);.    i
15110 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
15120 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
15130 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
15140 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
15150 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15160 28 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72  (pAlt->eOperator
15170 20 26 20 57 4f 5f 49 4e 29 20 0a 20 20 20 20 20   & WO_IN) .     
15180 26 26 20 28 70 41 6c 74 2d 3e 70 45 78 70 72 2d  && (pAlt->pExpr-
15190 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
151a0 65 6c 65 63 74 29 0a 20 20 20 20 20 26 26 20 28  elect).     && (
151b0 70 41 6c 74 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  pAlt->pExpr->x.p
151c0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
151d0 6e 45 78 70 72 3e 31 29 0a 20 20 20 20 29 7b 0a  nExpr>1).    ){.
151e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
151f0 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
15200 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
15210 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
15220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
15230 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
15240 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
15250 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
15260 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
15270 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
15280 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
15290 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
152a0 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
152b0 73 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70  sEAlt = *pAlt->p
152c0 45 78 70 72 3b 0a 20 20 20 20 73 45 41 6c 74 2e  Expr;.    sEAlt.
152d0 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
152e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  t;.    sqlite3Ex
152f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
15300 2c 20 26 73 45 41 6c 74 2c 20 61 64 64 72 43 6f  , &sEAlt, addrCo
15310 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
15320 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  FNULL);.  }..  /
15330 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
15340 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
15350 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15360 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
15370 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
15380 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
15390 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
153a0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
153b0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
153c0 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
153d0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
153e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
153f0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
15400 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15430 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
15440 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
15450 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15460 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
15470 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
15480 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
15490 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
154a0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
154b0 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
154c0 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
154d0 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
154e0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
154f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
15500 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
15510 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
15520 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
15530 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
15540 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15550 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
15560 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
15570 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
15580 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
15590 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
155a0 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
155b0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
155c0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
155d0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
155e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
155f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
15600 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
15610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15620 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
15630 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
15640 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
15650 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
15660 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
15670 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
15680 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15690 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  n pLevel->notRea
156a0 64 79 3b 0a 7d 0a                                dy;.}.