/ Hex Artifact Content
Login

Artifact 717a65294df46f30e9b9933d2a63a4bcbca5a9a8:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 36  /*.** 2015-06-06
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44  hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  BE code used to 
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57  process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53  HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77  *.** This file w
01f0: 61 73 20 73 70 6c 69 74 20 6f 66 66 20 66 72 6f  as split off fro
0200: 6d 20 77 68 65 72 65 2e 63 20 6f 6e 20 32 30 31  m where.c on 201
0210: 35 2d 30 36 2d 30 36 20 69 6e 20 6f 72 64 65 72  5-06-06 in order
0220: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 0a 2a   to reduce the.*
0230: 2a 20 73 69 7a 65 20 6f 66 20 77 68 65 72 65 2e  * size of where.
0240: 63 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 65 61  c and make it ea
0250: 73 69 65 72 20 74 6f 20 65 64 69 74 2e 20 20 54  sier to edit.  T
0260: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
0270: 73 20 74 68 65 20 72 6f 75 74 69 6e 65 73 0a 2a  s the routines.*
0280: 2a 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  * that actually 
0290: 67 65 6e 65 72 61 74 65 20 74 68 65 20 62 75 6c  generate the bul
02a0: 6b 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  k of the WHERE l
02b0: 6f 6f 70 20 63 6f 64 65 2e 20 20 54 68 65 20 6f  oop code.  The o
02c0: 72 69 67 69 6e 61 6c 20 77 68 65 72 65 2e 63 0a  riginal where.c.
02d0: 2a 2a 20 66 69 6c 65 20 72 65 74 61 69 6e 73 20  ** file retains 
02e0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 64 6f  the code that do
02f0: 65 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e  es query plannin
0300: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 2e 0a  g and analysis..
0310: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0320: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0330: 64 65 20 22 77 68 65 72 65 49 6e 74 2e 68 22 0a  de "whereInt.h".
0340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0350: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 0a 2f 2a  OMIT_EXPLAIN../*
0360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0370: 61 6d 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ame of the i-th 
0380: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 49  column of the pI
0390: 64 78 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  dx index..*/.sta
03a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
03b0: 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75  explainIndexColu
03c0: 6d 6e 4e 61 6d 65 28 49 6e 64 65 78 20 2a 70 49  mnName(Index *pI
03d0: 64 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 20  dx, int i){.  i 
03e0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
03f0: 5b 69 5d 3b 0a 20 20 69 66 28 20 69 3d 3d 58 4e  [i];.  if( i==XN
0400: 5f 45 58 50 52 20 29 20 72 65 74 75 72 6e 20 22  _EXPR ) return "
0410: 3c 65 78 70 72 3e 22 3b 0a 20 20 69 66 28 20 69  <expr>";.  if( i
0420: 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 20 72 65 74  ==XN_ROWID ) ret
0430: 75 72 6e 20 22 72 6f 77 69 64 22 3b 0a 20 20 72  urn "rowid";.  r
0440: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
0450: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
0460: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
0470: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
0480: 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
0490: 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
04a0: 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
04b0: 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
04c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
04d0: 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
04e0: 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
04f0: 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
0500: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
0510: 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
0520: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
0530: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
0540: 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
0550: 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
0560: 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
0570: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
0580: 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
0590: 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
05a0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
05b0: 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
05c0: 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
05d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
05e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
05f0: 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 49 6e  ng built */.  In
0600: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
0610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0620: 65 78 20 74 6f 20 72 65 61 64 20 63 6f 6c 75 6d  ex to read colum
0630: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 2a 2f 0a  n names from */.
0640: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0660: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
0670: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 2f 2a 20 5a 65 72 6f 2d 62 61 73 65 64 20    /* Zero-based 
06a0: 69 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  index of first t
06b0: 65 72 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 41  erm. */.  int bA
06c0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
06d0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
06e0: 6f 20 74 6f 20 61 70 70 65 6e 64 20 22 20 41 4e  o to append " AN
06f0: 44 20 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  D " */.  const c
0700: 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
0710: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0720: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
0730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  ){.  int i;..  a
0740: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 3d 31 20  ssert( nTerm>=1 
0750: 29 3b 0a 20 20 69 66 28 20 62 41 6e 64 20 29 20  );.  if( bAnd ) 
0760: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
0770: 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
0780: 44 20 22 2c 20 35 29 3b 0a 0a 20 20 69 66 28 20  D ", 5);..  if( 
0790: 6e 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65  nTerm>1 ) sqlite
07a0: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
07b0: 70 53 74 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20  pStr, "(", 1);. 
07c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
07d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
07e0: 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
07f0: 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
0800: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 73 71   ",", 1);.    sq
0810: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
0820: 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 65 78 70  endAll(pStr, exp
0830: 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e  lainIndexColumnN
0840: 61 6d 65 28 70 49 64 78 2c 20 69 54 65 72 6d 2b  ame(pIdx, iTerm+
0850: 69 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  i));.  }.  if( n
0860: 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33  Term>1 ) sqlite3
0870: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0880: 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a 0a 20  Str, ")", 1);.. 
0890: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
08a0: 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
08b0: 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 54 65  , 1);..  if( nTe
08c0: 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  rm>1 ) sqlite3St
08d0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
08e0: 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20 20 66 6f  r, "(", 1);.  fo
08f0: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
0900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
0910: 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
0920: 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 2c  mAppend(pStr, ",
0930: 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 1);.    sqlit
0940: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0950: 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
0960: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3e    }.  if( nTerm>
0970: 31 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  1 ) sqlite3StrAc
0980: 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
0990: 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ")", 1);.}../*.*
09a0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
09b0: 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
09c0: 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
09d0: 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
09e0: 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
09f0: 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20 74  n appends text t
0a00: 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73 63  o pStr that desc
0a10: 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65 74  ribes the subset
0a20: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77   of table.** row
0a30: 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
0a40: 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
0a50: 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c 20   form of an SQL 
0a60: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0a70: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
0a80: 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
0a90: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
0aa0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
0ab0: 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
0ac0: 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
0ad0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
0ae0: 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
0af0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0b00: 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
0b10: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
0b20: 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
0b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
0b40: 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
0b50: 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c  (StrAccum *pStr,
0b60: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
0b70: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  p){.  Index *pIn
0b80: 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
0b90: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
0ba0: 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
0bb0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
0bc0: 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
0bd0: 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69  ->nSkip;.  int i
0be0: 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d  , j;..  if( nEq=
0bf0: 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73  =0 && (pLoop->ws
0c00: 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  Flags&(WHERE_BTM
0c10: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
0c20: 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65  _LIMIT))==0 ) re
0c30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
0c40: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
0c50: 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  tr, " (", 2);.  
0c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
0c70: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
0c80: 63 68 61 72 20 2a 7a 20 3d 20 65 78 70 6c 61 69  char *z = explai
0c90: 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65  nIndexColumnName
0ca0: 28 70 49 6e 64 65 78 2c 20 69 29 3b 0a 20 20 20  (pIndex, i);.   
0cb0: 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
0cc0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0cd0: 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
0ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  ;.    sqlite3XPr
0cf0: 69 6e 74 66 28 70 53 74 72 2c 20 69 3e 3d 6e 53  intf(pStr, i>=nS
0d00: 6b 69 70 20 3f 20 22 25 73 3d 3f 22 20 3a 20 22  kip ? "%s=?" : "
0d10: 41 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20  ANY(%s)", z);.  
0d20: 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
0d30: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
0d40: 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
0d50: 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41   ){.    explainA
0d60: 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
0d70: 70 49 6e 64 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75  pIndex, pLoop->u
0d80: 2e 62 74 72 65 65 2e 6e 42 74 6d 2c 20 6a 2c 20  .btree.nBtm, j, 
0d90: 69 2c 20 22 3e 22 29 3b 0a 20 20 20 20 69 20 3d  i, ">");.    i =
0da0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
0db0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
0dc0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
0dd0: 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
0de0: 64 54 65 72 6d 28 70 53 74 72 2c 20 70 49 6e 64  dTerm(pStr, pInd
0df0: 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ex, pLoop->u.btr
0e00: 65 65 2e 6e 54 6f 70 2c 20 6a 2c 20 69 2c 20 22  ee.nTop, j, i, "
0e10: 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
0e20: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0e30: 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
0e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0e50: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
0e60: 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
0e70: 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
0e80: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0e90: 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
0ea0: 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
0eb0: 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
0ec0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
0ed0: 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
0ee0: 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
0ef0: 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
0f00: 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
0f10: 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
0f20: 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
0f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
0f40: 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
0f50: 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
0f60: 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
0f70: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
0f80: 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
0f90: 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
0fa0: 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
0fb0: 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
0fc0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
0fd0: 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
0fe0: 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
0ff0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1000: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nt sqlite3WhereE
1010: 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1050: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1060: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1070: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1080: 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1090: 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
10a0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
10b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10c0: 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
10d0: 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
10e0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
10f0: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1110: 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1120: 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1130: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1160: 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1170: 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1180: 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
11b0: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
11c0: 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  gin() */.){.  in
11d0: 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21  t ret = 0;.#if !
11e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11f0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
1200: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1210: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
1220: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1230: 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
1240: 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  if.  {.    struc
1250: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1260: 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
1270: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1280: 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
1290: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12a0: 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
12b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
12c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
12d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12f0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  handle */.    in
1300: 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
1310: 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
1320: 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
1330: 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
1340: 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
1350: 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
1360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1370: 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
1380: 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
1390: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
13a0: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
13b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
13c0: 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
13d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
13e0: 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1400: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
1410: 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
1420: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1450: 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1460: 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 73  /.    StrAccum s
1470: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
1480: 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75      /* EQP outpu
1490: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  t string */.    
14a0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20  char zBuf[100]; 
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c0: 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66   Initial space f
14d0: 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20 73 74  or EQP output st
14e0: 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  ring */..    pLo
14f0: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1500: 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1510: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1520: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1530: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1540: 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1550: 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
1560: 45 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  E) ) return 0;..
1570: 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1580: 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1590: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
15a0: 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
15b0: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
15c0: 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
15d0: 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
15e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
15f0: 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1600: 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1610: 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1620: 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1630: 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c  _MAX));..    sql
1640: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1650: 28 26 73 74 72 2c 20 64 62 2c 20 7a 42 75 66 2c  (&str, db, zBuf,
1660: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53   sizeof(zBuf), S
1670: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
1690: 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
16a0: 26 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f  &str, isSearch ?
16b0: 20 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41   "SEARCH" : "SCA
16c0: 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
16d0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
16e0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
16f0: 6e 74 66 28 26 73 74 72 2c 20 22 20 53 55 42 51  ntf(&str, " SUBQ
1700: 55 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d  UERY %d", pItem-
1710: 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1730: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1740: 72 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20  r, " TABLE %s", 
1750: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1760: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1770: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1780: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1790: 6e 74 66 28 26 73 74 72 2c 20 22 20 41 53 20 25  ntf(&str, " AS %
17a0: 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
17b0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
17c0: 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
17d0: 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
17e0: 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20 29 7b  UALTABLE))==0 ){
17f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1800: 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20 20 20  r *zFmt = 0;.   
1810: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1830: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1840: 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  ndex!=0 );.     
1850: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1860: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1870: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
1880: 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f  lags&WHERE_AUTO_
1890: 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73  INDEX) || (flags
18a0: 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
18b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
18c0: 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
18d0: 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
18e0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
18f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1900: 73 53 65 61 72 63 68 20 29 7b 0a 20 20 20 20 20  sSearch ){.     
1910: 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 50 52 49       zFmt = "PRI
1920: 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20 20 20 20  MARY KEY";.     
1930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1940: 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45   if( flags & WHE
1950: 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20 29 7b  RE_PARTIALIDX ){
1960: 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
1970: 22 41 55 54 4f 4d 41 54 49 43 20 50 41 52 54 49  "AUTOMATIC PARTI
1980: 41 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  AL COVERING INDE
1990: 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  X";.      }else 
19a0: 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19b0: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a  E_AUTO_INDEX ){.
19c0: 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
19d0: 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49  AUTOMATIC COVERI
19e0: 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
19f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a00: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1a10: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  Y ){.        zFm
1a20: 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20 49 4e  t = "COVERING IN
1a30: 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
1a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
1a50: 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73 22 3b  mt = "INDEX %s";
1a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a70: 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20 20 20  f( zFmt ){.     
1a80: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1a90: 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  umAppend(&str, "
1aa0: 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a 20 20   USING ", 7);.  
1ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1ac0: 69 6e 74 66 28 26 73 74 72 2c 20 7a 46 6d 74 2c  intf(&str, zFmt,
1ad0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
1ae0: 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 49 6e         explainIn
1af0: 64 65 78 52 61 6e 67 65 28 26 73 74 72 2c 20 70  dexRange(&str, p
1b00: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Loop);.      }. 
1b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1b20: 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1b30: 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1b40: 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1b50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
1b60: 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 67 65  nst char *zRange
1b70: 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  Op;.      if( fl
1b80: 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1b90: 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1ba0: 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1bb0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3d 22 3b   zRangeOp = "=";
1bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1bd0: 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
1be0: 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
1bf0: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
1c00: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1c10: 3d 20 22 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  = ">? AND rowid<
1c20: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1c30: 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1c40: 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c50: 20 20 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22      zRangeOp = "
1c60: 3e 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  >";.      }else{
1c70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c80: 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
1c90: 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20 20 20  _LIMIT);.       
1ca0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3c 22 3b   zRangeOp = "<";
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cc0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1cd0: 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e 54 45  tr, " USING INTE
1ce0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
1cf0: 28 72 6f 77 69 64 25 73 3f 29 22 2c 7a 52 61 6e  (rowid%s?)",zRan
1d00: 67 65 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 69 66  geOp);.    }.#if
1d10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d30: 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1d40: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1d50: 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1d70: 74 66 28 26 73 74 72 2c 20 22 20 56 49 52 54 55  tf(&str, " VIRTU
1d80: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1d90: 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d:%s",.         
1da0: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1db0: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1dc0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1dd0: 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1de0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1df0: 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
1e00: 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20  ED_ROWS.    if( 
1e10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20  pLoop->nOut>=10 
1e20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e30: 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 22 20  XPrintf(&str, " 
1e40: 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 20 73  (~%llu rows)", s
1e50: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
1e60: 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  t(pLoop->nOut));
1e70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e80: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1e90: 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20  mAppend(&str, " 
1ea0: 28 7e 31 20 72 6f 77 29 22 2c 20 39 29 3b 0a 20  (~1 row)", 9);. 
1eb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ec0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 53 74  zMsg = sqlite3St
1ed0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74  rAccumFinish(&st
1ee0: 72 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  r);.    ret = sq
1ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1f00: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1f10: 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1f20: 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59 4e 41 4d  m, zMsg,P4_DYNAM
1f30: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
1f40: 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  n ret;.}.#endif 
1f50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1f60: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1f70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f80: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1f90: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1fa0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1fb0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1fc0: 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1fd0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1fe0: 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1ff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2000: 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
2010: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
2020: 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
2030: 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
2040: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2050: 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
2060: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
2070: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
2080: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
2090: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
20a0: 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
20b0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
20c0: 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
20d0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
20e0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
20f0: 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
2100: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2110: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
2120: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
2150: 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
2160: 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
2170: 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
2180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
2190: 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
21a0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
21b0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
21c0: 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
21d0: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
21e0: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
21f0: 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
2200: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2230: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
2240: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
2250: 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
2260: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2270: 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
2280: 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
2290: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
22a0: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
22b0: 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
22c0: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
22d0: 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
22e0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22f0: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
2300: 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
2310: 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
2320: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
2330: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
2340: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
2350: 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
2360: 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
2370: 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
2380: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
2390: 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69  Obj.  );.}.#endi
23a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  f.../*.** Disabl
23b0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
23c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
23d0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
23e0: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
23f0: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
2400: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2410: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
2420: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2430: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
2440: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
2450: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
2460: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
2470: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
2480: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
2490: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
24a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24b0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
24c0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
24d0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
24e0: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
24f0: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2500: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
2510: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
2520: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
2530: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2540: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
2550: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
2560: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
2570: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2580: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
2590: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
25a0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
25b0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
25c0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
25d0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
25e0: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
25f0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
2600: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
2610: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
2620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
2630: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
2640: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
2650: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
2660: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2670: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2680: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
2690: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
26a0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
26b0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
26c0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
26d0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
26e0: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
26f0: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
2700: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
2710: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
2720: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
2730: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
2740: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
2750: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
2760: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
2770: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
2780: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
2790: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
27a0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
27b0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
27c0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
27d0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
27e0: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
27f0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
2800: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  3..**.** If all 
2810: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  the children of 
2820: 61 20 74 65 72 6d 20 61 72 65 20 64 69 73 61 62  a term are disab
2830: 6c 65 64 2c 20 74 68 65 6e 20 74 68 61 74 20 74  led, then that t
2840: 65 72 6d 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  erm is also.** a
2850: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 69 73  utomatically dis
2860: 61 62 6c 65 64 2e 20 20 49 6e 20 74 68 69 73 20  abled.  In this 
2870: 77 61 79 2c 20 74 65 72 6d 73 20 67 65 74 20 64  way, terms get d
2880: 69 73 61 62 6c 65 64 20 69 66 20 64 65 72 69 76  isabled if deriv
2890: 65 64 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ed.** virtual te
28a0: 72 6d 73 20 61 72 65 20 74 65 73 74 65 64 20 66  rms are tested f
28b0: 69 72 73 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  irst.  For examp
28c0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  le:.**.**      x
28d0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 41 4e 44   GLOB 'abc*' AND
28e0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
28f0: 27 61 63 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f  'acd'.**      \_
2900: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
2910: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  \______/     \__
2920: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
2930: 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  parent          
2940: 63 68 69 6c 64 31 20 20 20 20 20 20 20 63 68 69  child1       chi
2950: 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ld2.**.** Only t
2960: 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20 77  he parent term w
2970: 61 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  as in the origin
2980: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
2990: 20 20 54 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20    The child1.** 
29a0: 61 6e 64 20 63 68 69 6c 64 32 20 74 65 72 6d 73  and child2 terms
29b0: 20 77 65 72 65 20 61 64 64 65 64 20 62 79 20 74   were added by t
29c0: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
29d0: 74 69 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f  tion.  If both o
29e0: 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c  f.** the virtual
29f0: 20 63 68 69 6c 64 20 74 65 72 6d 73 20 61 72 65   child terms are
2a00: 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 65 73   valid, then tes
2a10: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 65  ting of the pare
2a20: 6e 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b  nt can be .** sk
2a30: 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  ipped..**.** Usu
2a40: 61 6c 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  ally the parent 
2a50: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 61  term is marked a
2a60: 73 20 54 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42  s TERM_CODED.  B
2a70: 75 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ut if the parent
2a80: 0a 2a 2a 20 74 65 72 6d 20 77 61 73 20 6f 72 69  .** term was ori
2a90: 67 69 6e 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b  ginally TERM_LIK
2aa0: 45 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65  E, then the pare
2ab0: 6e 74 20 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b  nt gets TERM_LIK
2ac0: 45 43 4f 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a  ECOND instead..*
2ad0: 2a 20 54 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43  * The TERM_LIKEC
2ae0: 4f 4e 44 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69  OND marking indi
2af0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
2b00: 65 72 6d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  erm should be co
2b10: 64 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20  ded inside.** a 
2b20: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 75 63 68  conditional such
2b30: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 65 76   that is only ev
2b40: 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
2b50: 65 63 6f 6e 64 20 70 61 73 73 20 6f 66 20 61 0a  econd pass of a.
2b60: 2a 2a 20 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61  ** LIKE-optimiza
2b70: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20  tion loop, when 
2b80: 73 63 61 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69  scanning BLOBs i
2b90: 6e 73 74 65 61 64 20 6f 66 20 73 74 72 69 6e 67  nstead of string
2ba0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2bb0: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
2bc0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2bd0: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
2be0: 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  rm){.  int nLoop
2bf0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 41   = 0;.  while( A
2c00: 4c 57 41 59 53 28 70 54 65 72 6d 21 3d 30 29 0a  LWAYS(pTerm!=0).
2c10: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
2c20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2c30: 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
2c40: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
2c50: 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
2c60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
2c70: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
2c80: 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
2c90: 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
2ca0: 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
2cb0: 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
2cc0: 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
2cd0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
2ce0: 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
2cf0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
2d00: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2d10: 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
2d20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
2d30: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2d40: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
2d50: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
2d60: 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
2d70: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
2d80: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
2d90: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
2da0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
2db0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2dc0: 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
2dd0: 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
2de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2df0: 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
2e00: 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
2e10: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
2e20: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
2e30: 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
2e40: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
2e50: 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
2e60: 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
2e70: 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
2e80: 42 4c 4f 42 20 65 6e 74 72 69 65 73 20 28 77 68  BLOB entries (wh
2e90: 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
2ea0: 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
2eb0: 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
2ec0: 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
2ed0: 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
2ee0: 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
2ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
2f00: 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
2f10: 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
2f20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f30: 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
2f40: 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
2f50: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
2f60: 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
2f70: 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
2f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2f90: 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
2fa0: 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
2fb0: 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
2fc0: 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
2fd0: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
2fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3000: 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
3010: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3020: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
3030: 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
3040: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3050: 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
3060: 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
3070: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
3080: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 65 6e  LITE_AFF_BLOB en
3090: 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
30a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
30b0: 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
30c0: 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
30d0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
30e0: 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
30f0: 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
3100: 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
3110: 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
3120: 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
3130: 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
3140: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
3150: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
3160: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
3170: 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
3180: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
3190: 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
31a0: 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
31b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
31d0: 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 2c 20 30  nity, base, n, 0
31e0: 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
31f0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
3200: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
3210: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
3230: 70 72 65 73 73 69 6f 6e 20 70 52 69 67 68 74 2c  pression pRight,
3240: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 48   which is the RH
3250: 53 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  S of a compariso
3260: 6e 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 73 20  n operation, is 
3270: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 76 65 63  .** either a vec
3280: 74 6f 72 20 6f 66 20 6e 20 65 6c 65 6d 65 6e 74  tor of n element
3290: 73 20 6f 72 2c 20 69 66 20 6e 3d 3d 31 2c 20 61  s or, if n==1, a
32a0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
32b0: 6f 6e 2e 0a 2a 2a 20 42 65 66 6f 72 65 20 74 68  on..** Before th
32c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
32d0: 72 61 74 69 6f 6e 2c 20 61 66 66 69 6e 69 74 79  ration, affinity
32e0: 20 7a 41 66 66 20 69 73 20 74 6f 20 62 65 20 61   zAff is to be a
32f0: 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pplied.** to the
3300: 20 70 52 69 67 68 74 20 76 61 6c 75 65 73 2e 20   pRight values. 
3310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
3320: 64 69 66 69 65 73 20 63 68 61 72 61 63 74 65 72  difies character
3330: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
3340: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
3350: 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  to SQLITE_AFF_BL
3360: 4f 42 20 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a  OB if either:.**
3370: 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63 6f 6d 70  .**   * the comp
3380: 61 72 69 73 6f 6e 20 77 69 6c 6c 20 62 65 20 70  arison will be p
3390: 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
33a0: 20 61 66 66 69 6e 69 74 79 2c 20 6f 72 0a 2a 2a   affinity, or.**
33b0: 20 20 20 2a 20 74 68 65 20 61 66 66 69 6e 69 74     * the affinit
33c0: 79 20 63 68 61 6e 67 65 20 69 6e 20 7a 41 66 66  y change in zAff
33d0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
33e0: 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ot to change the
33f0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
3400: 63 20 76 6f 69 64 20 75 70 64 61 74 65 52 61 6e  c void updateRan
3410: 67 65 41 66 66 69 6e 69 74 79 53 74 72 28 0a 20  geAffinityStr(. 
3420: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 2f 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61   /* RHS of compa
3450: 72 69 73 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  rison */.  int n
3460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3480: 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
3490: 6c 65 6d 65 6e 74 73 20 69 6e 20 63 6f 6d 70 61  lements in compa
34a0: 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  rison */.  char 
34b0: 2a 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 20  *zAff           
34c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
34d0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
34e0: 20 6d 6f 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20   modify */.){.  
34f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3500: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3510: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3520: 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
3530: 65 78 70 72 28 70 52 69 67 68 74 2c 20 69 29 3b  expr(pRight, i);
3540: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3550: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
3560: 70 2c 20 7a 41 66 66 5b 69 5d 29 3d 3d 53 51 4c  p, zAff[i])==SQL
3570: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 20 20 20  ITE_AFF_BLOB.   
3580: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
3590: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
35a0: 68 61 6e 67 65 28 70 2c 20 7a 41 66 66 5b 69 5d  hange(p, zAff[i]
35b0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 7a  ).    ){.      z
35c0: 41 66 66 5b 69 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[i] = SQLITE_
35d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
35e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
35f0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
3600: 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
3610: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
3620: 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
3630: 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
3640: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
3650: 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
3660: 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
3670: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
3680: 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
3690: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
36a0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
36b0: 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 61  int is left in a
36c0: 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 20 69   register, the i
36d0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69 63 68  ndex.** of which
36e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
36f0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
3700: 65 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  e store the resu
3710: 6c 74 20 69 6e 20 69 54 61 72 67 65 74 20 62 75  lt in iTarget bu
3720: 74 0a 2a 2a 20 74 68 69 73 20 69 73 20 6f 6e 6c  t.** this is onl
3730: 79 20 67 75 61 72 61 6e 74 65 65 64 20 66 6f 72  y guaranteed for
3740: 20 54 4b 5f 49 53 4e 55 4c 4c 20 61 6e 64 20 54   TK_ISNULL and T
3750: 4b 5f 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  K_IN constraints
3760: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e  .  If the.** con
3770: 73 74 72 61 69 6e 74 20 69 73 20 61 20 54 4b 5f  straint is a TK_
3780: 45 51 20 6f 72 20 54 4b 5f 49 53 2c 20 74 68 65  EQ or TK_IS, the
3790: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
37a0: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  lue might be lef
37b0: 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  t in.** some oth
37c0: 65 72 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  er register and 
37d0: 69 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  it is the caller
37e0: 27 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  's responsibilit
37f0: 79 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74 65 2e  y to compensate.
3800: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
3810: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
3820: 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
3830: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
3840: 61 6c 75 61 74 65 64 20 69 6e 0a 2a 2a 20 73 74  aluated in.** st
3850: 72 61 69 67 68 74 2d 6c 69 6e 65 20 63 6f 64 65  raight-line code
3860: 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
3870: 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
3880: 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
3890: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
38a0: 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
38b0: 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
38c0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
38d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
38e0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
38f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3900: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
3910: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3920: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3930: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
3940: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3950: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
3960: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
3970: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
3980: 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
3990: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
39a0: 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
39b0: 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
39c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
39d0: 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
39e0: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
39f0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
3a00: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
3a10: 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
3a20: 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
3a30: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
3a40: 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
3a50: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
3a60: 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
3a70: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
3a80: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
3a90: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
3aa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3ab0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3ac0: 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
3ad0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
3ae0: 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
3af0: 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
3b00: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
3b10: 3e 61 4c 54 65 72 6d 5b 69 45 71 5d 3d 3d 70 54  >aLTerm[iEq]==pT
3b20: 65 72 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  erm );.  assert(
3b30: 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
3b40: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
3b50: 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  Q || pX->op==TK_
3b60: 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  IS ){.    iReg =
3b70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3b80: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
3b90: 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
3ba0: 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
3bb0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
3bc0: 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
3bd0: 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
3be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bf0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
3c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
3c10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3c20: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
3c30: 69 6e 74 20 65 54 79 70 65 20 3d 20 49 4e 5f 49  int eType = IN_I
3c40: 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 20 20 69  NDEX_NOOP;.    i
3c50: 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
3c60: 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
3c70: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
3c80: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
3c90: 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  pWLoop;.    int 
3ca0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  i;.    int nEq =
3cb0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 4d   0;.    int *aiM
3cc0: 61 70 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ap = 0;..    if(
3cd0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
3ce0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
3cf0: 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
3d00: 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
3d10: 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
3d20: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
3d30: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
3d40: 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
3d50: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
3d60: 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
3d70: 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
3d80: 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
3d90: 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
3da0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3db0: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
3dc0: 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
3dd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3de0: 69 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  iEq; i++){.     
3df0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   if( pLoop->aLTe
3e00: 72 6d 5b 69 5d 20 26 26 20 70 4c 6f 6f 70 2d 3e  rm[i] && pLoop->
3e10: 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72  aLTerm[i]->pExpr
3e20: 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ==pX ){.        
3e30: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
3e40: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  el, pTerm);.    
3e50: 20 20 20 20 72 65 74 75 72 6e 20 69 54 61 72 67      return iTarg
3e60: 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
3e70: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 45 71 3b  }.    for(i=iEq;
3e80: 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  i<pLoop->nLTerm;
3e90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3ea0: 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 61   ALWAYS(pLoop->a
3eb0: 4c 54 65 72 6d 5b 69 5d 29 20 26 26 20 70 4c 6f  LTerm[i]) && pLo
3ec0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
3ed0: 45 78 70 72 3d 3d 70 58 20 29 20 6e 45 71 2b 2b  Expr==pX ) nEq++
3ee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
3ef0: 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
3f00: 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 20 7c  _xIsSelect)==0 |
3f10: 7c 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  | pX->x.pSelect-
3f20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
3f30: 31 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  1 ){.      eType
3f40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
3f50: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
3f60: 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
3f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
3f80: 65 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  e{.      Select 
3f90: 2a 70 53 65 6c 65 63 74 20 3d 20 70 58 2d 3e 78  *pSelect = pX->x
3fa0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
3fb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3fc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
3fd0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 69 67 52  ExprList *pOrigR
3fe0: 68 73 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  hs = pSelect->pE
3ff0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72  List;.      Expr
4000: 4c 69 73 74 20 2a 70 4f 72 69 67 4c 68 73 20 3d  List *pOrigLhs =
4010: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c   pX->pLeft->x.pL
4020: 69 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  ist;.      ExprL
4030: 69 73 74 20 2a 70 52 68 73 20 3d 20 30 3b 20 20  ist *pRhs = 0;  
4040: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 53 65         /* New Se
4050: 6c 65 63 74 2e 70 45 4c 69 73 74 20 66 6f 72 20  lect.pEList for 
4060: 52 48 53 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  RHS */.      Exp
4070: 72 4c 69 73 74 20 2a 70 4c 68 73 20 3d 20 30 3b  rList *pLhs = 0;
4080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
4090: 70 58 2d 3e 70 4c 65 66 74 20 76 65 63 74 6f 72  pX->pLeft vector
40a0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
40b0: 3d 69 45 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c  =iEq;i<pLoop->nL
40c0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
40d0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
40e0: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
40f0: 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
4100: 20 69 6e 74 20 69 46 69 65 6c 64 20 3d 20 70 4c   int iField = pL
4110: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
4120: 69 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 20 20  iField - 1;.    
4130: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
4140: 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Rhs = sqlite3Exp
4150: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 52 68  rDup(db, pOrigRh
4160: 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  s->a[iField].pEx
4170: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
4180: 20 20 45 78 70 72 20 2a 70 4e 65 77 4c 68 73 20    Expr *pNewLhs 
4190: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
41a0: 28 64 62 2c 20 70 4f 72 69 67 4c 68 73 2d 3e 61  (db, pOrigLhs->a
41b0: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 2c 20  [iField].pExpr, 
41c0: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 70  0);..          p
41d0: 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Rhs = sqlite3Exp
41e0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
41f0: 73 65 2c 20 70 52 68 73 2c 20 70 4e 65 77 52 68  se, pRhs, pNewRh
4200: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  s);.          pL
4210: 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  hs = sqlite3Expr
4220: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
4230: 65 2c 20 70 4c 68 73 2c 20 70 4e 65 77 4c 68 73  e, pLhs, pNewLhs
4240: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4250: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
4260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4270: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
4280: 20 2a 70 4c 65 66 74 20 3d 20 70 58 2d 3e 70 4c   *pLeft = pX->pL
4290: 65 66 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  eft;..        if
42a0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  ( pSelect->pOrde
42b0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
42c0: 20 2f 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43   /* If the SELEC
42d0: 54 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  T statement has 
42e0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
42f0: 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 0a 20 20  se, zero the .  
4300: 20 20 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65          ** iOrde
4310: 72 42 79 43 6f 6c 20 76 61 72 69 61 62 6c 65 73  rByCol variables
4320: 2e 20 54 68 65 73 65 20 61 72 65 20 73 65 74 20  . These are set 
4330: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  to non-zero when
4340: 20 61 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a   an .          *
4350: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
4360: 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
4370: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73  one of the terms
4380: 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 20   of the .       
4390: 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
43a0: 2e 20 53 69 6e 63 65 20 74 68 65 20 72 65 73 75  . Since the resu
43b0: 6c 74 2d 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt-set of the SE
43c0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
43d0: 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
43e0: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
43f0: 65 64 20 6f 72 20 72 65 6f 72 64 65 72 65 64 2c  ed or reordered,
4400: 20 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   these variables
4410: 20 61 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a   are no longer .
4420: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
4430: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6e   correctly.  Sin
4440: 63 65 20 73 65 74 74 69 6e 67 20 74 68 65 6d 20  ce setting them 
4450: 69 73 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d  is just an optim
4460: 69 7a 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20  ization, .      
4470: 20 20 20 20 2a 2a 20 69 74 27 73 20 65 61 73 69      ** it's easi
4480: 65 73 74 20 6a 75 73 74 20 74 6f 20 7a 65 72 6f  est just to zero
4490: 20 74 68 65 6d 20 68 65 72 65 2e 20 20 2a 2f 0a   them here.  */.
44a0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
44b0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
44c0: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
44d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
44e0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
44f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4500: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
4510: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
4520: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
4530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4540: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
4550: 54 61 6b 65 20 63 61 72 65 20 68 65 72 65 20 6e  Take care here n
4560: 6f 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ot to generate a
4570: 20 54 4b 5f 56 45 43 54 4f 52 20 63 6f 6e 74 61   TK_VECTOR conta
4580: 69 6e 69 6e 67 20 6f 6e 6c 79 20 61 0a 20 20 20  ining only a.   
4590: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 76       ** single v
45a0: 61 6c 75 65 2e 20 53 69 6e 63 65 20 74 68 65 20  alue. Since the 
45b0: 70 61 72 73 65 72 20 6e 65 76 65 72 20 63 72 65  parser never cre
45c0: 61 74 65 73 20 73 75 63 68 20 61 20 76 65 63 74  ates such a vect
45d0: 6f 72 2c 20 73 6f 6d 65 0a 20 20 20 20 20 20 20  or, some.       
45e0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 72 6f   ** of the subro
45f0: 75 74 69 6e 65 73 20 64 6f 20 6e 6f 74 20 68 61  utines do not ha
4600: 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2e 20  ndle this case. 
4610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
4620: 70 4c 68 73 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  pLhs->nExpr==1 )
4630: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e  {.          pX->
4640: 70 4c 65 66 74 20 3d 20 70 4c 68 73 2d 3e 61 5b  pLeft = pLhs->a[
4650: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
4660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4670: 20 20 20 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73     pLeft->x.pLis
4680: 74 20 3d 20 70 4c 68 73 3b 0a 20 20 20 20 20 20  t = pLhs;.      
4690: 20 20 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74      aiMap = (int
46a0: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
46b0: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
46c0: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20  , sizeof(int) * 
46d0: 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nEq);.          
46e0: 74 65 73 74 63 61 73 65 28 20 61 69 4d 61 70 3d  testcase( aiMap=
46f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =0 );.        }.
4700: 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
4710: 3e 70 45 4c 69 73 74 20 3d 20 70 52 68 73 3b 0a  >pEList = pRhs;.
4720: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
4730: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
4740: 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 49  ex(pParse, pX, I
4750: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c  N_INDEX_LOOP, 0,
4760: 20 61 69 4d 61 70 29 3b 0a 20 20 20 20 20 20 20   aiMap);.       
4770: 20 74 65 73 74 63 61 73 65 28 20 61 69 4d 61 70   testcase( aiMap
4780: 21 3d 30 20 26 26 20 61 69 4d 61 70 5b 30 5d 21  !=0 && aiMap[0]!
4790: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
47a0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20 3d 20  elect->pEList = 
47b0: 70 4f 72 69 67 52 68 73 3b 0a 20 20 20 20 20 20  pOrigRhs;.      
47c0: 20 20 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74    pLeft->x.pList
47d0: 20 3d 20 70 4f 72 69 67 4c 68 73 3b 0a 20 20 20   = pOrigLhs;.   
47e0: 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 20 3d       pX->pLeft =
47f0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a   pLeft;.      }.
4800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4810: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
4820: 73 65 2d 3e 64 62 2c 20 70 4c 68 73 29 3b 0a 20  se->db, pLhs);. 
4830: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4840: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
4850: 65 2d 3e 64 62 2c 20 70 52 68 73 29 3b 0a 20 20  e->db, pRhs);.  
4860: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
4870: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
4880: 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
4890: 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
48a0: 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
48b0: 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
48c0: 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
48d0: 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
48e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
48f0: 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
4900: 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
4910: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
4920: 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a  ageIf(v, bRev);.
4930: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4940: 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20  If(v, !bRev);.  
4950: 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
4960: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
4970: 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29  E_MULTI_OR)==0 )
4980: 3b 0a 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  ;..    pLoop->ws
4990: 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
49a0: 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
49b0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
49c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
49d0: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
49e0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
49f0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  bel(v);.    }.. 
4a00: 20 20 20 69 20 3d 20 70 4c 65 76 65 6c 2d 3e 75     i = pLevel->u
4a10: 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20 70 4c 65  .in.nIn;.    pLe
4a20: 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2b 3d  vel->u.in.nIn +=
4a30: 20 6e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c   nEq;.    pLevel
4a40: 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
4a50: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
4a60: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
4a70: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
4a80: 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
4a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4ab0: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
4ac0: 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
4ad0: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
4ae0: 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
4af0: 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
4b00: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
4b10: 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 70 20  .      int iMap 
4b20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
4b30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
4b40: 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  iMap[] */.      
4b50: 70 49 6e 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  pIn += i;.      
4b60: 66 6f 72 28 69 3d 69 45 71 3b 69 3c 70 4c 6f 6f  for(i=iEq;i<pLoo
4b70: 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
4b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f  .        if( pLo
4b90: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
4ba0: 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20  Expr==pX ){.    
4bb0: 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d        int iOut =
4bc0: 20 69 52 65 67 20 2b 20 69 20 2d 20 69 45 71 3b   iReg + i - iEq;
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
4be0: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
4bf0: 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
4c00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 45      testcase( nE
4c10: 71 3e 31 20 29 3b 20 20 2f 2a 20 48 61 70 70 65  q>1 );  /* Happe
4c20: 6e 73 20 77 69 74 68 20 61 20 55 4e 49 51 55 45  ns with a UNIQUE
4c30: 20 69 6e 64 65 78 20 6f 6e 20 52 4f 57 49 44 20   index on ROWID 
4c40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
4c50: 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
4c60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c70: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
4c80: 54 61 62 2c 20 69 4f 75 74 29 3b 0a 20 20 20 20  Tab, iOut);.    
4c90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ca0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f           int iCo
4cb0: 6c 20 3d 20 61 69 4d 61 70 20 3f 20 61 69 4d 61  l = aiMap ? aiMa
4cc0: 70 5b 69 4d 61 70 2b 2b 5d 20 3a 20 30 3b 0a 20  p[iMap++] : 0;. 
4cd0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
4ce0: 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
4cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4d00: 4f 50 5f 43 6f 6c 75 6d 6e 2c 69 54 61 62 2c 20  OP_Column,iTab, 
4d10: 69 43 6f 6c 2c 20 69 4f 75 74 29 3b 0a 20 20 20  iCol, iOut);.   
4d20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4d30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d40: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
4d50: 6c 2c 20 69 4f 75 74 29 3b 20 56 64 62 65 43 6f  l, iOut); VdbeCo
4d60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
4d70: 20 20 20 20 20 69 66 28 20 69 3d 3d 69 45 71 20       if( i==iEq 
4d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
4d90: 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
4da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
4db0: 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
4dc0: 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f  Rev ? OP_PrevIfO
4dd0: 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f  pen : OP_NextIfO
4de0: 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  pen;.          }
4df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4e00: 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f    pIn->eEndLoopO
4e10: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
4e20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4e30: 20 20 20 70 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     pIn++;.      
4e40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
4e60: 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20  vel->u.in.nIn = 
4e70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
4e80: 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
4e90: 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 23  e->db, aiMap);.#
4ea0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
4eb0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
4ec0: 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
4ed0: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
4ee0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4ef0: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
4f00: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
4f10: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
4f20: 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e  n.** index scan.
4f30: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
4f40: 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
4f50: 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
4f60: 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
4f70: 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
4f80: 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
4f90: 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
4fa0: 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
4fb0: 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
4fc0: 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
4fd0: 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
4fe0: 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
4ff0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
5000: 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
5010: 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
5020: 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
5030: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
5040: 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
5050: 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
5060: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
5070: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
5080: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
5090: 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
50a0: 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
50b0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
50c0: 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
50d0: 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
50e0: 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
50f0: 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
5100: 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
5110: 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
5120: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
5130: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
5140: 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
5150: 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
5160: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
5170: 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
5180: 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
5190: 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
51a0: 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
51b0: 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
51c0: 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
51d0: 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
51e0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
51f0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
5200: 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
5210: 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
5220: 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67  ** The nExtraReg
5230: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
5240: 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69  or 1.  It is 0 i
5250: 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75  f all WHERE clau
5260: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  se constraints.*
5270: 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61  * are == or IN a
5280: 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  nd are covered b
5290: 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74  y the nEq.  nExt
52a0: 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68  raReg is 1 if th
52b0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65  ere is.** an ine
52c0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
52d0: 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20  nt (such as the 
52e0: 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20  "c>=5 AND c<10" 
52f0: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
5300: 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61  that.** occurs a
5310: 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61  fter the nEq qua
5320: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5340: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
5350: 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45   range of nEq+nE
5360: 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63  xtraReg memory c
5370: 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ells and returns
5380: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
5390: 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
53a0: 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72  y cell in that r
53b0: 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74  ange. The code t
53c0: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
53d0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
53e0: 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72  se that memory r
53f0: 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65  ange to store ke
5400: 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20  ys for.** start 
5410: 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  and termination 
5420: 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68  conditions of th
5430: 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76  e loop..** key v
5440: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
5450: 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
5460: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
5470: 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
5480: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
5490: 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
54a0: 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
54b0: 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
54c0: 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
54d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
54e0: 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
54f0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5500: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
5510: 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
5520: 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
5530: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
5540: 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
5550: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
5560: 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
5570: 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
5580: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
5590: 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
55a0: 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
55b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
55c0: 74 20 75 73 65 20 42 4c 4f 42 20 6f 72 20 4e 4f  t use BLOB or NO
55d0: 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
55e0: 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
55f0: 5f 41 46 46 5f 42 4c 4f 42 2e 20 54 68 69 73 20  _AFF_BLOB. This 
5600: 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
5610: 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
5620: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
5630: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5640: 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
5650: 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
5660: 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
5670: 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
5680: 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
5690: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
56a0: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
56b0: 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
56c0: 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
56d0: 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
56e0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
56f0: 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
5700: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
5710: 32 2e 62 29 20 68 61 73 20 42 4c 4f 42 2f 4e 4f  2.b) has BLOB/NO
5720: 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
5730: 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
5740: 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
5750: 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
5760: 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
5770: 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
5780: 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
5790: 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
57a0: 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
57b0: 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
57c0: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
57d0: 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
57e0: 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
57f0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2e 0a 2a 2f  ITE_AFF_BLOB..*/
5800: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
5810: 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
5820: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5830: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
5840: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5850: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5860: 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
5870: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
5880: 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
5890: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
58a0: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
58b0: 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65    /* Reverse the
58c0: 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65   order of IN ope
58d0: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
58e0: 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
58f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5900: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
5910: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
5920: 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
5930: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
5940: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
5950: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
5960: 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20  .){.  u16 nEq;  
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
5990: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
59a0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
59b0: 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70  e */.  u16 nSkip
59c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
59d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
59e0: 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  f left-most colu
59f0: 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  mns to skip */. 
5a00: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5a10: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
5a20: 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
5a30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
5a40: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a60: 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
5a70: 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
5a80: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
5a90: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
5aa0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
5ab0: 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
5ac0: 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
5ad0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
5ae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
5af0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
5b00: 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
5b30: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
5b40: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5b50: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
5b60: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
5b70: 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
5b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5b90: 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
5ba0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
5bb0: 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5bd0: 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
5be0: 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
5bf0: 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
5c00: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
5c10: 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
5c20: 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
5c30: 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
5c40: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5c50: 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
5c60: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
5c70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
5c80: 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
5c90: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
5ca0: 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  .  nSkip = pLoop
5cb0: 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20  ->nSkip;.  pIdx 
5cc0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
5cd0: 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72  .pIndex;.  asser
5ce0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20  t( pIdx!=0 );.. 
5cf0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
5d00: 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
5d10: 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
5d20: 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
5d30: 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
5d40: 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
5d50: 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
5d60: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
5d70: 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67  .nEq + nExtraReg
5d80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
5d90: 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66   += nReg;..  zAf
5da0: 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
5db0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 73  Dup(pParse->db,s
5dc0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
5dd0: 69 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e 64  ityStr(pParse->d
5de0: 62 2c 70 49 64 78 29 29 3b 0a 20 20 61 73 73 65  b,pIdx));.  asse
5df0: 72 74 28 20 7a 41 66 66 21 3d 30 20 7c 7c 20 70  rt( zAff!=0 || p
5e00: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
5e10: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66  cFailed );..  if
5e20: 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69  ( nSkip ){.    i
5e30: 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
5e40: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
5e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e60: 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f  Op1(v, (bRev?OP_
5e70: 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c  Last:OP_Rewind),
5e80: 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56   iIdxCur);.    V
5e90: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5ea0: 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56   bRev==0);.    V
5eb0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5ec0: 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56   bRev!=0);.    V
5ed0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5ee0: 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20  begin skip-scan 
5ef0: 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  on %s", pIdx->zN
5f00: 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73  ame));.    j = s
5f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5f20: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
5f30: 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b    pLevel->addrSk
5f40: 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ip = sqlite3Vdbe
5f50: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52  AddOp4Int(v, (bR
5f60: 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f  ev?OP_SeekLT:OP_
5f70: 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20  SeekGT),.       
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c       iIdxCur, 0,
5fa0: 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29   regBase, nSkip)
5fb0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5fc0: 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
5fd0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5fe0: 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
5ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6000: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b  eJumpHere(v, j);
6010: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
6020: 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSkip; j++){.   
6030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6040: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6050: 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  n, iIdxCur, j, r
6060: 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
6070: 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
6080: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e  >aiColumn[j]==XN
6090: 5f 45 58 50 52 20 29 3b 0a 20 20 20 20 20 20 56  _EXPR );.      V
60a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
60b0: 25 73 22 2c 20 65 78 70 6c 61 69 6e 49 6e 64 65  %s", explainInde
60c0: 78 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 64 78  xColumnName(pIdx
60d0: 2c 20 6a 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , j)));.    }.  
60e0: 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c  }    ..  /* Eval
60f0: 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
6100: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
6110: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  */.  assert( zAf
6120: 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72  f==0 || (int)str
6130: 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29  len(zAff)>=nEq )
6140: 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b  ;.  for(j=nSkip;
6150: 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
6160: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
6170: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
6180: 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
6190: 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
61a0: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
61b0: 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73  wing testcase is
61c0: 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65   true for indice
61d0: 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74  s with redundant
61e0: 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a   columns. .    *
61f0: 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44  * Ex: CREATE IND
6200: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i1 ON t1(a,b,
6210: 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  a); SELECT * FRO
6220: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41  M t1 WHERE a=0 A
6230: 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74  ND b=0; */.    t
6240: 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d  estcase( (pTerm-
6250: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6260: 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  CODED)!=0 );.   
6270: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
6280: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6290: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
62a0: 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
62b0: 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
62c0: 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
62d0: 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29  bRev, regBase+j)
62e0: 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
62f0: 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
6300: 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
6310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6320: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6330: 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
6340: 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
6350: 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
6360: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6380: 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
6390: 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
63a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
63b0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
63c0: 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
63d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 45 78    if( pTerm->pEx
63e0: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
63f0: 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  IsSelect ){.    
6400: 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69      /* No affini
6410: 74 79 20 65 76 65 72 20 6e 65 65 64 73 20 74 6f  ty ever needs to
6420: 20 62 65 20 28 6f 72 20 73 68 6f 75 6c 64 20 62   be (or should b
6430: 65 29 20 61 70 70 6c 69 65 64 20 74 6f 20 61 20  e) applied to a 
6440: 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
6450: 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 6f 66   from the RHS of
6460: 20 61 6e 20 22 3f 20 49 4e 20 28 53 45 4c 45 43   an "? IN (SELEC
6470: 54 20 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69  T ...)" expressi
6480: 6f 6e 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  on. The .       
6490: 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
64a0: 6e 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  nIndex() routine
64b0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 73   has already ens
64c0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 0a 20  ured that the . 
64d0: 20 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69         ** affini
64e0: 74 79 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ty of the compar
64f0: 69 73 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 70  ison has been ap
6500: 70 6c 69 65 64 20 74 6f 20 74 68 65 20 76 61 6c  plied to the val
6510: 75 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ue.  */.        
6520: 69 66 28 20 7a 41 66 66 20 29 20 7a 41 66 66 5b  if( zAff ) zAff[
6530: 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
6540: 42 4c 4f 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BLOB;.      }.  
6550: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
6560: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6570: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
6580: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
6590: 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
65a0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
65b0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
65c0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 49 53 29  Flags & TERM_IS)
65d0: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  ==0 && sqlite3Ex
65e0: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
65f0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ht) ){.        s
6600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6610: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
6620: 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
6630: 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
6640: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6650: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
6660: 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
6670: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6680: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
6690: 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
66a0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ])==SQLITE_AFF_B
66b0: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LOB ){.         
66c0: 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
66d0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
66e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
66f0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
6700: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
6710: 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
6720: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
6730: 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
6740: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
6750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6760: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
6770: 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
6780: 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
6790: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
67a0: 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
67b0: 4c 4f 42 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  LOBS./*.** If th
67c0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
67d0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
67e0: 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
67f0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
6800: 0a 2a 2a 20 28 61 20 73 74 72 69 6e 67 20 6c 69  .** (a string li
6810: 74 65 72 61 6c 29 20 74 68 61 74 20 6f 72 69 67  teral) that orig
6820: 69 6e 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  inated from the 
6830: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
6840: 6e 2c 20 74 68 65 6e 20 0a 2a 2a 20 73 65 74 20  n, then .** set 
6850: 50 33 20 61 6e 64 20 50 35 20 6f 6e 20 74 68 65  P3 and P5 on the
6860: 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64   OP_String opcod
6870: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 74  e so that the st
6880: 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 63 61 73  ring will be cas
6890: 74 0a 2a 2a 20 74 6f 20 61 20 42 4c 4f 42 20 61  t.** to a BLOB a
68a0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69  t appropriate ti
68b0: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4c  mes..**.** The L
68c0: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
68d0: 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75 61 74   trys to evaluat
68e0: 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27  e "x LIKE 'abc%'
68f0: 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a 2a 20  " as a range.** 
6900: 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78 3e 3d  expression: "x>=
6910: 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62 64  'ABC' AND x<'abd
6920: 27 22 2e 20 20 42 75 74 20 74 68 69 73 20 72 65  '".  But this re
6930: 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
6940: 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20 6c 6f  range.** scan lo
6950: 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20 6f 6e  op run twice, on
6960: 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73 20 61  ce for strings a
6970: 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  nd a second time
6980: 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a 20 54   for BLOBs..** T
6990: 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63  he OP_String opc
69a0: 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65 63 6f  odes on the seco
69b0: 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72 74 20  nd pass convert 
69c0: 74 68 65 20 75 70 70 65 72 20 61 6e 64 20 6c 6f  the upper and lo
69d0: 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73 74 72  wer.** bound str
69e0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 73 20 74 6f  ing constants to
69f0: 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72 6f   blobs.  This ro
6a00: 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
6a10: 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67 65  necessary change
6a20: 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f 53  s.** to the OP_S
6a30: 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66 6f  tring opcodes fo
6a40: 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65 6e  r that to happen
6a50: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
6a60: 6f 66 20 63 6f 75 72 73 65 2c 20 69 66 20 53 51  of course, if SQ
6a70: 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
6a80: 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 20 69 73 20  _MATCH_BLOBS is 
6a90: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 2a 2a  defined, then.**
6aa0: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 70 61   only the one pa
6ab0: 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ss through the s
6ac0: 74 72 69 6e 67 20 73 70 61 63 65 20 69 73 20 72  tring space is r
6ad0: 65 71 75 69 72 65 64 2c 20 73 6f 20 74 68 69 73  equired, so this
6ae0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 62 65 63 6f   routine.** beco
6af0: 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mes a no-op..*/.
6b00: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
6b10: 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f  eLikeOptimizatio
6b20: 6e 53 74 72 69 6e 67 46 69 78 75 70 28 0a 20 20  nStringFixup(.  
6b30: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
6b40: 20 20 20 20 20 20 20 20 2f 2a 20 70 72 65 70 61          /* prepa
6b50: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
6b60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
6b70: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
6b80: 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 2f 2a   *pLevel,     /*
6b90: 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 63   The loop that c
6ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 4c 49 4b 45  ontains the LIKE
6bb0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57   operator */.  W
6bc0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
6bd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 70         /* The up
6be0: 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
6bf0: 6e 64 20 6a 75 73 74 20 63 6f 64 65 64 20 2a 2f  nd just coded */
6c00: 0a 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  .){.  if( pTerm-
6c10: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
6c20: 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 56  LIKEOPT ){.    V
6c30: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
6c40: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6c50: 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 30 20 29  iLikeRepCntr>0 )
6c60: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69  ;.    pOp = sqli
6c70: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
6c80: 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
6c90: 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 61   pOp!=0 );.    a
6ca0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
6cb0: 64 65 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 0a  de==OP_String8 .
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
6cd0: 54 65 72 6d 2d 3e 70 57 43 2d 3e 70 57 49 6e 66  Term->pWC->pWInf
6ce0: 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  o->pParse->db->m
6cf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6d00: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 69 6e     pOp->p3 = (in
6d10: 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t)(pLevel->iLike
6d20: 52 65 70 43 6e 74 72 3e 3e 31 29 3b 20 20 2f 2a  RepCntr>>1);  /*
6d30: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6d40: 67 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  g counter */.   
6d50: 20 70 4f 70 2d 3e 70 35 20 3d 20 28 75 38 29 28   pOp->p5 = (u8)(
6d60: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
6d70: 43 6e 74 72 26 31 29 3b 20 20 20 20 2f 2a 20 41  Cntr&1);    /* A
6d80: 53 43 20 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  SC or DESC */.  
6d90: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
6da0: 6e 65 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69  ne whereLikeOpti
6db0: 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69  mizationStringFi
6dc0: 78 75 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  xup(A,B,C).#endi
6dd0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
6de0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6df0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  INTS./*.** Infor
6e00: 6d 61 74 69 6f 6e 20 69 73 20 70 61 73 73 65 64  mation is passed
6e10: 20 66 72 6f 6d 20 63 6f 64 65 43 75 72 73 6f 72   from codeCursor
6e20: 48 69 6e 74 28 29 20 64 6f 77 6e 20 74 6f 20 69  Hint() down to i
6e30: 6e 64 69 76 69 64 75 61 6c 20 6e 6f 64 65 73 20  ndividual nodes 
6e40: 6f 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  of.** the expres
6e50: 73 69 6f 6e 20 74 72 65 65 20 28 62 79 20 73 71  sion tree (by sq
6e60: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 29  lite3WalkExpr())
6e70: 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e   using an instan
6e80: 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 73 74  ce of this.** st
6e90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
6ea0: 63 74 20 43 43 75 72 48 69 6e 74 20 7b 0a 20 20  ct CCurHint {.  
6eb0: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
6ec0: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68  /* Cursor for th
6ed0: 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a  e main table */.
6ee0: 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
6ef0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
6f00: 74 68 65 20 69 6e 64 65 78 2c 20 69 66 20 70 49  the index, if pI
6f10: 64 78 21 3d 30 2e 20 20 55 6e 75 73 65 64 20 6f  dx!=0.  Unused o
6f20: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 49 6e  therwise */.  In
6f30: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a  dex *pIdx;    /*
6f40: 20 54 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   The index used 
6f50: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74 61  to access the ta
6f60: 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ble */.};../*.**
6f70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6f80: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 76 65  s called for eve
6f90: 72 79 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78  ry node of an ex
6fa0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
6fb0: 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
6fc0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68 69 6e  for a cursor hin
6fd0: 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 63 75  t on an index cu
6fe0: 72 73 6f 72 2e 20 20 46 6f 72 20 54 4b 5f 43 4f  rsor.  For TK_CO
6ff0: 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20  LUMN nodes that 
7000: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 68 65  reference.** the
7010: 20 74 61 62 6c 65 20 43 43 75 72 48 69 6e 74 2e   table CCurHint.
7020: 69 54 61 62 43 75 72 2c 20 76 65 72 69 66 79 20  iTabCur, verify 
7030: 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
7040: 6c 75 6d 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 61  lumn can be.** a
7050: 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20  ccessed through 
7060: 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 69  the index.  If i
7070: 74 20 63 61 6e 6e 6f 74 2c 20 74 68 65 6e 20 73  t cannot, then s
7080: 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  et pWalker->eCod
7090: 65 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  e to 1..*/.stati
70a0: 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72  c int codeCursor
70b0: 48 69 6e 74 43 68 65 63 6b 45 78 70 72 28 57 61  HintCheckExpr(Wa
70c0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
70d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
70e0: 74 72 75 63 74 20 43 43 75 72 48 69 6e 74 20 2a  truct CCurHint *
70f0: 70 48 69 6e 74 20 3d 20 70 57 61 6c 6b 65 72 2d  pHint = pWalker-
7100: 3e 75 2e 70 43 43 75 72 48 69 6e 74 3b 0a 20 20  >u.pCCurHint;.  
7110: 61 73 73 65 72 74 28 20 70 48 69 6e 74 2d 3e 70  assert( pHint->p
7120: 49 64 78 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Idx!=0 );.  if( 
7130: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
7140: 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72  LUMN.   && pExpr
7150: 2d 3e 69 54 61 62 6c 65 3d 3d 70 48 69 6e 74 2d  ->iTable==pHint-
7160: 3e 69 54 61 62 43 75 72 0a 20 20 20 26 26 20 73  >iTabCur.   && s
7170: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
7180: 64 65 78 28 70 48 69 6e 74 2d 3e 70 49 64 78 2c  dex(pHint->pIdx,
7190: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
71a0: 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  <0.  ){.    pWal
71b0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
71c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
71d0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
71e0: 0a 2a 2a 20 54 65 73 74 20 77 68 65 74 68 65 72  .** Test whether
71f0: 20 6f 72 20 6e 6f 74 20 65 78 70 72 65 73 73 69   or not expressi
7200: 6f 6e 20 70 45 78 70 72 2c 20 77 68 69 63 68 20  on pExpr, which 
7210: 77 61 73 20 70 61 72 74 20 6f 66 20 61 20 57 48  was part of a WH
7220: 45 52 45 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 73  ERE clause,.** s
7230: 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64 65  hould be include
7240: 64 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72 2d  d in the cursor-
7250: 68 69 6e 74 20 66 6f 72 20 61 20 74 61 62 6c 65  hint for a table
7260: 20 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65 20   that is on the 
7270: 72 68 73 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  rhs.** of a LEFT
7280: 20 4a 4f 49 4e 2e 20 53 65 74 20 57 61 6c 6b 65   JOIN. Set Walke
7290: 72 2e 65 43 6f 64 65 20 74 6f 20 6e 6f 6e 2d 7a  r.eCode to non-z
72a0: 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72  ero before retur
72b0: 6e 69 6e 67 20 69 66 20 74 68 65 20 0a 2a 2a 20  ning if the .** 
72c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
72d0: 74 20 73 75 69 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  t suitable..**.*
72e0: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
72f0: 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20 69 66  is unsuitable if
7300: 20 69 74 20 6d 69 67 68 74 20 65 76 61 6c 75 61   it might evalua
7310: 74 65 20 74 6f 20 6e 6f 6e 20 4e 55 4c 4c 20 65  te to non NULL e
7320: 76 65 6e 20 69 66 0a 2a 2a 20 61 20 54 4b 5f 43  ven if.** a TK_C
7330: 4f 4c 55 4d 4e 20 6e 6f 64 65 20 74 68 61 74 20  OLUMN node that 
7340: 64 6f 65 73 20 61 66 66 65 63 74 20 74 68 65 20  does affect the 
7350: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
7360: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 0a 2a  ression is set.*
7370: 2a 20 74 6f 20 4e 55 4c 4c 2e 20 46 6f 72 20 65  * to NULL. For e
7380: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
7390: 63 6f 6c 20 49 53 20 4e 55 4c 4c 0a 2a 2a 20 20  col IS NULL.**  
73a0: 20 63 6f 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c   col IS NOT NULL
73b0: 0a 2a 2a 20 20 20 63 6f 61 6c 65 73 63 65 28 63  .**   coalesce(c
73c0: 6f 6c 2c 20 31 29 0a 2a 2a 20 20 20 43 41 53 45  ol, 1).**   CASE
73d0: 20 57 48 45 4e 20 63 6f 6c 20 54 48 45 4e 20 30   WHEN col THEN 0
73e0: 20 45 4c 53 45 20 31 20 45 4e 44 0a 2a 2f 0a 73   ELSE 1 END.*/.s
73f0: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 75  tatic int codeCu
7400: 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e 63  rsorHintIsOrFunc
7410: 74 69 6f 6e 28 57 61 6c 6b 65 72 20 2a 70 57 61  tion(Walker *pWa
7420: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
7430: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
7440: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 0a 20 20 20 7c  >op==TK_IS .   |
7450: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
7460: 49 53 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72 2d  ISNULL || pExpr-
7470: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
7480: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
7490: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 70 45  TK_NOTNULL || pE
74a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45  xpr->op==TK_CASE
74b0: 20 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b   .  ){.    pWalk
74c0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
74d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
74e0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
74f0: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 31 3b  N ){.    int d1;
7500: 0a 20 20 20 20 63 68 61 72 20 64 32 5b 33 5d 3b  .    char d2[3];
7510: 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
7520: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
7530: 6e 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  n(pWalker->pPars
7540: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26 64  e->db, pExpr, &d
7550: 31 2c 20 64 32 29 20 29 7b 0a 20 20 20 20 20 20  1, d2) ){.      
7560: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
7570: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
7580: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
7590: 69 6e 75 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  inue;.}.../*.** 
75a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
75b0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
75c0: 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78 70 72   node of an expr
75d0: 65 73 73 69 6f 6e 20 74 72 65 65 20 75 73 65 64  ession tree used
75e0: 20 61 73 20 61 6e 0a 2a 2a 20 61 72 67 75 6d 65   as an.** argume
75f0: 6e 74 20 74 6f 20 74 68 65 20 4f 50 5f 43 75 72  nt to the OP_Cur
7600: 73 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74  sorHint instruct
7610: 69 6f 6e 2e 20 49 66 20 74 68 65 20 6e 6f 64 65  ion. If the node
7620: 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 0a   is a TK_COLUMN.
7630: 2a 2a 20 74 68 61 74 20 61 63 63 65 73 73 65 73  ** that accesses
7640: 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72   any table other
7650: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 69 64   than the one id
7660: 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 43  entified by.** C
7670: 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c  CurHint.iTabCur,
7680: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 66 6f 6c   then do the fol
7690: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
76a0: 31 29 20 61 6c 6c 6f 63 61 74 65 20 61 20 72 65  1) allocate a re
76b0: 67 69 73 74 65 72 20 61 6e 64 20 63 6f 64 65 20  gister and code 
76c0: 61 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73  an OP_Column ins
76d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 61 64  truction to read
76e0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 73 70   .**      the sp
76f0: 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 69  ecified column i
7700: 6e 74 6f 20 74 68 65 20 6e 65 77 20 72 65 67 69  nto the new regi
7710: 73 74 65 72 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ster, and.**.** 
7720: 20 20 32 29 20 74 72 61 6e 73 66 6f 72 6d 20 74    2) transform t
7730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
7740: 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
7750: 54 45 52 20 6e 6f 64 65 20 74 68 61 74 20 72 65  TER node that re
7760: 61 64 73 20 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ads .**      fro
7770: 6d 20 74 68 65 20 6e 65 77 6c 79 20 70 6f 70 75  m the newly popu
7780: 6c 61 74 65 64 20 72 65 67 69 73 74 65 72 2e 0a  lated register..
7790: 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 69 66 20 74  **.** Also, if t
77a0: 68 65 20 6e 6f 64 65 20 69 73 20 61 20 54 4b 5f  he node is a TK_
77b0: 43 4f 4c 55 4d 4e 20 74 68 61 74 20 64 6f 65 73  COLUMN that does
77c0: 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c   access the tabl
77d0: 65 20 69 64 65 6e 69 66 69 65 64 0a 2a 2a 20 62  e idenified.** b
77e0: 79 20 70 43 43 75 72 48 69 6e 74 2e 69 54 61 62  y pCCurHint.iTab
77f0: 43 75 72 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  Cur, and an inde
7800: 78 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  x is being used 
7810: 28 77 68 69 63 68 20 77 65 20 77 69 6c 6c 0a 2a  (which we will.*
7820: 2a 20 6b 6e 6f 77 20 62 65 63 61 75 73 65 20 43  * know because C
7830: 43 75 72 48 69 6e 74 2e 70 49 64 78 21 3d 30 29  CurHint.pIdx!=0)
7840: 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20   then transform 
7850: 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 69 6e  the TK_COLUMN in
7860: 74 6f 0a 2a 2a 20 61 6e 20 61 63 63 65 73 73 20  to.** an access 
7870: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 61 74  of the index rat
7880: 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 72 69  her than the ori
7890: 67 69 6e 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ginal table..*/.
78a0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
78b0: 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70 72  ursorHintFixExpr
78c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
78d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
78e0: 20 20 69 6e 74 20 72 63 20 3d 20 57 52 43 5f 43    int rc = WRC_C
78f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 73 74 72 75 63  ontinue;.  struc
7900: 74 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69 6e  t CCurHint *pHin
7910: 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
7920: 43 43 75 72 48 69 6e 74 3b 0a 20 20 69 66 28 20  CCurHint;.  if( 
7930: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
7940: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 69 66 28 20  LUMN ){.    if( 
7950: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
7960: 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 20 29 7b  Hint->iTabCur ){
7970: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
7980: 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
7990: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 69  ->pVdbe;.      i
79a0: 6e 74 20 72 65 67 20 3d 20 2b 2b 70 57 61 6c 6b  nt reg = ++pWalk
79b0: 65 72 2d 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  er->pParse->nMem
79c0: 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ;   /* Register 
79d0: 66 6f 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  for column value
79e0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
79f0: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
7a00: 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 20 20 20  mnOfTable(.     
7a10: 20 20 20 20 20 76 2c 20 70 45 78 70 72 2d 3e 70       v, pExpr->p
7a20: 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Tab, pExpr->iTab
7a30: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
7a40: 6d 6e 2c 20 72 65 67 0a 20 20 20 20 20 20 29 3b  mn, reg.      );
7a50: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
7a60: 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
7a70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7a80: 62 6c 65 20 3d 20 72 65 67 3b 0a 20 20 20 20 7d  ble = reg;.    }
7a90: 65 6c 73 65 20 69 66 28 20 70 48 69 6e 74 2d 3e  else if( pHint->
7aa0: 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
7ab0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7ac0: 20 70 48 69 6e 74 2d 3e 69 49 64 78 43 75 72 3b   pHint->iIdxCur;
7ad0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
7ae0: 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33 43  olumn = sqlite3C
7af0: 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69  olumnOfIndex(pHi
7b00: 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  nt->pIdx, pExpr-
7b10: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
7b20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7b30: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20  iColumn>=0 );.  
7b40: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
7b50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
7b60: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  G_FUNCTION ){.  
7b70: 20 20 2f 2a 20 41 6e 20 61 67 67 72 65 67 61 74    /* An aggregat
7b80: 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  e function in th
7b90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
7ba0: 66 20 61 20 71 75 65 72 79 20 6d 65 61 6e 73 20  f a query means 
7bb0: 74 68 69 73 20 6d 75 73 74 0a 20 20 20 20 2a 2a  this must.    **
7bc0: 20 62 65 20 61 20 63 6f 72 72 65 6c 61 74 65 64   be a correlated
7bd0: 20 73 75 62 2d 71 75 65 72 79 2c 20 61 6e 64 20   sub-query, and 
7be0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
7bf0: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
7c00: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
7c10: 20 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e   parent context.
7c20: 20 44 6f 20 6e 6f 74 20 77 61 6c 6b 20 74 68 65   Do not walk the
7c30: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
7c40: 6e 74 73 20 69 6e 20 74 68 69 73 20 63 61 73 65  nts in this case
7c50: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7c60: 74 6f 64 6f 3a 20 49 74 20 73 68 6f 75 6c 64 20  todo: It should 
7c70: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  be possible to r
7c80: 65 70 6c 61 63 65 20 74 68 69 73 20 6e 6f 64 65  eplace this node
7c90: 20 77 69 74 68 20 61 20 54 4b 5f 52 45 47 49 53   with a TK_REGIS
7ca0: 54 45 52 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  TER.    ** expre
7cb0: 73 73 69 6f 6e 2c 20 61 73 20 74 68 65 20 72 65  ssion, as the re
7cc0: 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
7cd0: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  ession must be s
7ce0: 74 6f 72 65 64 20 69 6e 20 61 20 0a 20 20 20 20  tored in a .    
7cf0: 2a 2a 20 72 65 67 69 73 74 65 72 20 61 74 20 74  ** register at t
7d00: 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 65 20 73  his point. The s
7d10: 61 6d 65 20 68 6f 6c 64 73 20 66 6f 72 20 54 4b  ame holds for TK
7d20: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  _AGG_COLUMN node
7d30: 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 57  s. */.    rc = W
7d40: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
7d50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7d60: 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6e 20 4f 50  .** Insert an OP
7d70: 5f 43 75 72 73 6f 72 48 69 6e 74 20 69 6e 73 74  _CursorHint inst
7d80: 72 75 63 74 69 6f 6e 20 69 66 20 69 74 20 69 73  ruction if it is
7d90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20   appropriate to 
7da0: 64 6f 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  do so..*/.static
7db0: 20 76 6f 69 64 20 63 6f 64 65 43 75 72 73 6f 72   void codeCursor
7dc0: 48 69 6e 74 28 0a 20 20 73 74 72 75 63 74 20 53  Hint(.  struct S
7dd0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
7de0: 62 49 74 65 6d 2c 20 20 2f 2a 20 46 52 4f 4d 20  bItem,  /* FROM 
7df0: 63 6c 61 75 73 65 20 69 74 65 6d 20 2a 2f 0a 20  clause item */. 
7e00: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
7e10: 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 77 68  fo,    /* The wh
7e20: 65 72 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ere clause */.  
7e30: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
7e40: 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6c  el,   /* Which l
7e50: 6f 6f 70 20 74 6f 20 70 72 6f 76 69 64 65 20 68  oop to provide h
7e60: 69 6e 74 73 20 66 6f 72 20 2a 2f 0a 20 20 57 68  ints for */.  Wh
7e70: 65 72 65 54 65 72 6d 20 2a 70 45 6e 64 52 61 6e  ereTerm *pEndRan
7e80: 67 65 20 20 2f 2a 20 48 69 6e 74 20 74 68 69 73  ge  /* Hint this
7e90: 20 65 6e 64 2d 6f 66 2d 73 63 61 6e 20 62 6f 75   end-of-scan bou
7ea0: 6e 64 61 72 79 20 74 65 72 6d 20 69 66 20 6e 6f  ndary term if no
7eb0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 50  t NULL */.){.  P
7ec0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
7ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
7ee0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7ef0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
7f00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7f10: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 45  Vdbe;.  Expr *pE
7f20: 78 70 72 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  xpr = 0;.  Where
7f30: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c  Loop *pLoop = pL
7f40: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
7f50: 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
7f60: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
7f70: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7f80: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
7f90: 73 74 72 75 63 74 20 43 43 75 72 48 69 6e 74 20  struct CCurHint 
7fa0: 73 48 69 6e 74 3b 0a 20 20 57 61 6c 6b 65 72 20  sHint;.  Walker 
7fb0: 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 69 66 28 20  sWalker;..  if( 
7fc0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
7fd0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
7fe0: 43 75 72 73 6f 72 48 69 6e 74 73 29 20 29 20 72  CursorHints) ) r
7ff0: 65 74 75 72 6e 3b 0a 20 20 69 43 75 72 20 3d 20  eturn;.  iCur = 
8000: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
8010: 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3d  .  assert( iCur=
8020: 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  =pWInfo->pTabLis
8030: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
8040: 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20  om].iCursor );. 
8050: 20 73 48 69 6e 74 2e 69 54 61 62 43 75 72 20 3d   sHint.iTabCur =
8060: 20 69 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e 69   iCur;.  sHint.i
8070: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
8080: 3e 69 49 64 78 43 75 72 3b 0a 20 20 73 48 69 6e  >iIdxCur;.  sHin
8090: 74 2e 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e  t.pIdx = pLoop->
80a0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
80b0: 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65    memset(&sWalke
80c0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61  r, 0, sizeof(sWa
80d0: 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65  lker));.  sWalke
80e0: 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  r.pParse = pPars
80f0: 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  e;.  sWalker.u.p
8100: 43 43 75 72 48 69 6e 74 20 3d 20 26 73 48 69 6e  CCurHint = &sHin
8110: 74 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  t;.  pWC = &pWIn
8120: 66 6f 2d 3e 73 57 43 3b 0a 20 20 66 6f 72 28 69  fo->sWC;.  for(i
8130: 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; i<pWC->nTerm
8140: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 65 72  ; i++){.    pTer
8150: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 5d 3b 0a  m = &pWC->a[i];.
8160: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
8170: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
8180: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
8190: 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
81a0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
81b0: 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
81c0: 2d 3e 6e 6f 74 52 65 61 64 79 20 29 20 63 6f 6e  ->notReady ) con
81d0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 41  tinue;..    /* A
81e0: 6e 79 20 74 65 72 6d 73 20 73 70 65 63 69 66 69  ny terms specifi
81f0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
8200: 65 20 4f 4e 28 2e 2e 2e 29 20 63 6c 61 75 73 65  e ON(...) clause
8210: 20 66 6f 72 20 61 6e 79 20 4c 45 46 54 20 0a 20   for any LEFT . 
8220: 20 20 20 2a 2a 20 4a 4f 49 4e 20 66 6f 72 20 77     ** JOIN for w
8230: 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74  hich the current
8240: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68   table is not th
8250: 65 20 72 68 73 20 61 72 65 20 6f 6d 69 74 74 65  e rhs are omitte
8260: 64 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  d.    ** from th
8270: 65 20 63 75 72 73 6f 72 2d 68 69 6e 74 2e 20 0a  e cursor-hint. .
8280: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
8290: 20 74 68 69 73 20 74 61 62 6c 65 20 69 73 20 74   this table is t
82a0: 68 65 20 72 68 73 20 6f 66 20 61 20 4c 45 46 54  he rhs of a LEFT
82b0: 20 4a 4f 49 4e 2c 20 22 49 53 22 20 6f 72 20 22   JOIN, "IS" or "
82c0: 49 53 20 4e 55 4c 4c 22 20 74 65 72 6d 73 20 0a  IS NULL" terms .
82d0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 72 65      ** that were
82e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
82f0: 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
8300: 63 6c 61 75 73 65 20 6d 75 73 74 20 62 65 20 65  clause must be e
8310: 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2a 20  xcluded..    ** 
8320: 54 68 69 73 20 69 73 20 74 6f 20 61 64 64 72 65  This is to addre
8330: 73 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ss the following
8340: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
8350: 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 74 31 20    SELECT ... t1 
8360: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
8370: 28 74 31 2e 61 3d 74 32 2e 62 29 20 57 48 45 52  (t1.a=t2.b) WHER
8380: 45 20 74 32 2e 63 20 49 53 20 4e 55 4c 4c 3b 0a  E t2.c IS NULL;.
8390: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 61      **.    ** Sa
83a0: 79 20 74 68 65 72 65 20 69 73 20 61 20 73 69 6e  y there is a sin
83b0: 67 6c 65 20 72 6f 77 20 69 6e 20 74 32 20 74 68  gle row in t2 th
83c0: 61 74 20 6d 61 74 63 68 65 73 20 28 74 31 2e 61  at matches (t1.a
83d0: 3d 74 32 2e 62 29 2c 20 62 75 74 20 69 74 73 0a  =t2.b), but its.
83e0: 20 20 20 20 2a 2a 20 74 32 2e 63 20 76 61 6c 75      ** t2.c valu
83f0: 65 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  es is not NULL. 
8400: 49 66 20 74 68 65 20 28 74 32 2e 63 20 49 53 20  If the (t2.c IS 
8410: 4e 55 4c 4c 29 20 63 6f 6e 73 74 72 61 69 6e 74  NULL) constraint
8420: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 75 73 68   is .    ** push
8430: 65 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 63  ed down to the c
8440: 75 72 73 6f 72 2c 20 74 68 69 73 20 72 6f 77 20  ursor, this row 
8450: 69 73 20 66 69 6c 74 65 72 65 64 20 6f 75 74 2c  is filtered out,
8460: 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20   causing.    ** 
8470: 53 51 4c 69 74 65 20 74 6f 20 73 79 6e 74 68 65  SQLite to synthe
8480: 73 69 7a 65 20 61 20 72 6f 77 20 6f 66 20 4e 55  size a row of NU
8490: 4c 4c 20 76 61 6c 75 65 73 2e 20 57 68 69 63 68  LL values. Which
84a0: 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 65 0a   does match the.
84b0: 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
84c0: 75 73 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  use, and so the 
84d0: 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61 20  query returns a 
84e0: 72 6f 77 2e 20 57 68 69 63 68 20 69 73 20 69 6e  row. Which is in
84f0: 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  correct..    **.
8500: 20 20 20 20 2a 2a 20 46 6f 72 20 74 68 65 20 73      ** For the s
8510: 61 6d 65 20 72 65 61 73 6f 6e 2c 20 57 48 45 52  ame reason, WHER
8520: 45 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 3a  E terms such as:
8530: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8540: 20 57 48 45 52 45 20 31 20 3d 20 28 74 32 2e 63   WHERE 1 = (t2.c
8550: 20 49 53 20 4e 55 4c 4c 29 0a 20 20 20 20 2a 2a   IS NULL).    **
8560: 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 73 6f  .    ** are also
8570: 20 65 78 63 6c 75 64 65 64 2e 20 53 65 65 20 63   excluded. See c
8580: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73 4f  odeCursorHintIsO
8590: 72 46 75 6e 63 74 69 6f 6e 28 29 20 66 6f 72 20  rFunction() for 
85a0: 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 2a 2f 0a  details..    */.
85b0: 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
85c0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
85d0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20  JT_LEFT ){.     
85e0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
85f0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8600: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
8610: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
8620: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 0a 20 20 20  P_FromJoin) .   
8630: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
8640: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
8650: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
8660: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
8670: 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20    sWalker.eCode 
8680: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 57 61  = 0;.        sWa
8690: 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
86a0: 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72 48  ck = codeCursorH
86b0: 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e 3b  intIsOrFunction;
86c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
86d0: 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65  WalkExpr(&sWalke
86e0: 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29  r, pTerm->pExpr)
86f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 57  ;.        if( sW
8700: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63 6f  alker.eCode ) co
8710: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8730: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8740: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
8750: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
8760: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8770: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65  }..    /* All te
8780: 72 6d 73 20 69 6e 20 70 57 4c 6f 6f 70 2d 3e 61  rms in pWLoop->a
8790: 4c 54 65 72 6d 5b 5d 20 65 78 63 65 70 74 20 70  LTerm[] except p
87a0: 45 6e 64 52 61 6e 67 65 20 61 72 65 20 75 73 65  EndRange are use
87b0: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  d to initialize.
87c0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
87d0: 72 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  r.  These terms 
87e0: 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 61  are not needed a
87f0: 73 20 68 69 6e 74 73 20 66 6f 72 20 61 20 70 75  s hints for a pu
8800: 72 65 20 72 61 6e 67 65 0a 20 20 20 20 2a 2a 20  re range.    ** 
8810: 73 63 61 6e 20 28 74 68 61 74 20 68 61 73 20 6e  scan (that has n
8820: 6f 20 3d 3d 20 74 65 72 6d 73 29 20 73 6f 20 6f  o == terms) so o
8830: 6d 69 74 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 20  mit them. */.   
8840: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   if( pLoop->u.bt
8850: 72 65 65 2e 6e 45 71 3d 3d 30 20 26 26 20 70 54  ree.nEq==0 && pT
8860: 65 72 6d 21 3d 70 45 6e 64 52 61 6e 67 65 20 29  erm!=pEndRange )
8870: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
8880: 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   j<pLoop->nLTerm
8890: 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72   && pLoop->aLTer
88a0: 6d 5b 6a 5d 21 3d 70 54 65 72 6d 3b 20 6a 2b 2b  m[j]!=pTerm; j++
88b0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c  ){}.      if( j<
88c0: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
88d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
88e0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 73 75 62 71 75  .    /* No subqu
88f0: 65 72 69 65 73 20 6f 72 20 6e 6f 6e 2d 64 65 74  eries or non-det
8900: 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
8910: 69 6f 6e 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  ions allowed */.
8920: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
8930: 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75  xprContainsSubqu
8940: 65 72 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  ery(pTerm->pExpr
8950: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  ) ) continue;.. 
8960: 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64     /* For an ind
8970: 65 78 20 73 63 61 6e 2c 20 6d 61 6b 65 20 73 75  ex scan, make su
8980: 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 63 6f  re referenced co
8990: 6c 75 6d 6e 73 20 61 72 65 20 61 63 74 75 61 6c  lumns are actual
89a0: 6c 79 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ly in.    ** the
89b0: 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 69   index. */.    i
89c0: 66 28 20 73 48 69 6e 74 2e 70 49 64 78 21 3d 30  f( sHint.pIdx!=0
89d0: 20 29 7b 0a 20 20 20 20 20 20 73 57 61 6c 6b 65   ){.      sWalke
89e0: 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  r.eCode = 0;.   
89f0: 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72     sWalker.xExpr
8a00: 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65 43  Callback = codeC
8a10: 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b 45 78  ursorHintCheckEx
8a20: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
8a30: 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
8a40: 65 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  er, pTerm->pExpr
8a50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 57 61  );.      if( sWa
8a60: 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63 6f 6e  lker.eCode ) con
8a70: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
8a80: 20 20 2f 2a 20 49 66 20 77 65 20 73 75 72 76 69    /* If we survi
8a90: 76 65 20 61 6c 6c 20 70 72 69 6f 72 20 74 65 73  ve all prior tes
8aa0: 74 73 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ts, that means t
8ab0: 68 69 73 20 74 65 72 6d 20 69 73 20 77 6f 72 74  his term is wort
8ac0: 68 20 68 69 6e 74 69 6e 67 20 2a 2f 0a 20 20 20  h hinting */.   
8ad0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
8ae0: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 45 78 70  ExprAnd(db, pExp
8af0: 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  r, sqlite3ExprDu
8b00: 70 28 64 62 2c 20 70 54 65 72 6d 2d 3e 70 45 78  p(db, pTerm->pEx
8b10: 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69  pr, 0));.  }.  i
8b20: 66 28 20 70 45 78 70 72 21 3d 30 20 29 7b 0a 20  f( pExpr!=0 ){. 
8b30: 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72     sWalker.xExpr
8b40: 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65 43  Callback = codeC
8b50: 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70 72  ursorHintFixExpr
8b60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
8b70: 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20  kExpr(&sWalker, 
8b80: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
8b90: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8ba0: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 2c 20   OP_CursorHint, 
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8bc0: 20 20 20 20 20 20 20 28 73 48 69 6e 74 2e 70 49         (sHint.pI
8bd0: 64 78 20 3f 20 73 48 69 6e 74 2e 69 49 64 78 43  dx ? sHint.iIdxC
8be0: 75 72 20 3a 20 73 48 69 6e 74 2e 69 54 61 62 43  ur : sHint.iTabC
8bf0: 75 72 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ur), 0, 0,.     
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 45   (const char*)pE
8c20: 78 70 72 2c 20 50 34 5f 45 58 50 52 29 3b 0a 20  xpr, P4_EXPR);. 
8c30: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
8c40: 69 6e 65 20 63 6f 64 65 43 75 72 73 6f 72 48 69  ine codeCursorHi
8c50: 6e 74 28 41 2c 42 2c 43 2c 44 29 20 20 2f 2a 20  nt(A,B,C,D)  /* 
8c60: 4e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20  No-op */.#endif 
8c70: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
8c80: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 20 2a 2f  _CURSOR_HINTS */
8c90: 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 69  ../*.** Cursor i
8ca0: 43 75 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  Cur is open on a
8cb0: 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20  n intkey b-tree 
8cc0: 28 61 20 74 61 62 6c 65 29 2e 20 52 65 67 69 73  (a table). Regis
8cd0: 74 65 72 20 69 52 6f 77 69 64 20 63 6f 6e 74 61  ter iRowid conta
8ce0: 69 6e 73 0a 2a 2a 20 61 20 72 6f 77 69 64 20 76  ins.** a rowid v
8cf0: 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 66  alue just read f
8d00: 72 6f 6d 20 63 75 72 73 6f 72 20 69 49 64 78 43  rom cursor iIdxC
8d10: 75 72 2c 20 6f 70 65 6e 20 6f 6e 20 69 6e 64 65  ur, open on inde
8d20: 78 20 70 49 64 78 2e 20 54 68 69 73 0a 2a 2a 20  x pIdx. This.** 
8d30: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
8d40: 65 73 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 20  es code to do a 
8d50: 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f 66  deferred seek of
8d60: 20 63 75 72 73 6f 72 20 69 43 75 72 20 74 6f 20   cursor iCur to 
8d70: 74 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20 73 74  the .** rowid st
8d80: 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
8d90: 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e   iRowid..**.** N
8da0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
8db0: 20 6a 75 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f   just:.**.**   O
8dc0: 50 5f 53 65 65 6b 20 24 69 43 75 72 20 24 69 52  P_Seek $iCur $iR
8dd0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  owid.**.** Howev
8de0: 65 72 2c 20 69 66 20 74 68 65 20 73 63 61 6e 20  er, if the scan 
8df0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8e00: 63 6f 64 65 64 20 69 73 20 61 20 62 72 61 6e 63  coded is a branc
8e10: 68 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f 6f 70 20  h of an OR-loop 
8e20: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  and.** the state
8e30: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 62  ment currently b
8e40: 65 69 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20  eing coded is a 
8e50: 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 50 33 20  SELECT, then P3 
8e60: 6f 66 20 74 68 65 20 4f 50 5f 53 65 65 6b 0a 2a  of the OP_Seek.*
8e70: 2a 20 69 73 20 73 65 74 20 74 6f 20 69 49 64 78  * is set to iIdx
8e80: 43 75 72 20 61 6e 64 20 50 34 20 69 73 20 73 65  Cur and P4 is se
8e90: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e  t to point to an
8ea0: 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
8eb0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
8ec0: 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
8ed0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
8ee0: 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 69  e table cursor i
8ef0: 43 75 72 20 69 73 20 6f 70 65 6e 20 0a 2a 2a 20  Cur is open .** 
8f00: 6f 6e 2e 20 46 6f 72 20 65 61 63 68 20 74 61 62  on. For each tab
8f10: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 74 68  le column, if th
8f20: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  e column is the 
8f30: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
8f40: 68 65 20 0a 2a 2a 20 69 6e 64 65 78 2c 20 74 68  he .** index, th
8f50: 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
8f60: 64 69 6e 67 20 61 72 72 61 79 20 65 6e 74 72 79  ding array entry
8f70: 20 69 73 20 73 65 74 20 74 6f 20 28 69 2b 31 29   is set to (i+1)
8f80: 2e 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  . If the column.
8f90: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  ** does not appe
8fa0: 61 72 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ar in the index 
8fb0: 61 74 20 61 6c 6c 2c 20 74 68 65 20 61 72 72 61  at all, the arra
8fc0: 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74  y entry is set t
8fd0: 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o 0..*/.static v
8fe0: 6f 69 64 20 63 6f 64 65 44 65 66 65 72 72 65 64  oid codeDeferred
8ff0: 53 65 65 6b 28 0a 20 20 57 68 65 72 65 49 6e 66  Seek(.  WhereInf
9000: 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20  o *pWInfo,      
9010: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
9020: 20 63 6c 61 75 73 65 20 63 6f 6e 74 65 78 74 20   clause context 
9030: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
9040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9050: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 63       /* Index sc
9060: 61 6e 20 69 73 20 75 73 69 6e 67 20 2a 2f 0a 20  an is using */. 
9070: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 49   /* Cursor for I
90a0: 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  PK b-tree */.  i
90b0: 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20  nt iIdxCur      
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90d0: 2a 20 49 6e 64 65 78 20 63 75 72 73 6f 72 20 2a  * Index cursor *
90e0: 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  /.){.  Parse *pP
90f0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
9100: 50 61 72 73 65 3b 20 2f 2a 20 50 61 72 73 65 20  Parse; /* Parse 
9110: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62  context */.  Vdb
9120: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9130: 56 64 62 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Vdbe;        /* 
9140: 56 64 62 65 20 74 6f 20 67 65 6e 65 72 61 74 65  Vdbe to generate
9150: 20 63 6f 64 65 20 77 69 74 68 69 6e 20 2a 2f 0a   code within */.
9160: 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43  .  assert( iIdxC
9170: 75 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ur>0 );.  assert
9180: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9190: 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  [pIdx->nColumn-1
91a0: 5d 3d 3d 2d 31 20 29 3b 0a 20 20 0a 20 20 73 71  ]==-1 );.  .  sq
91b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
91c0: 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 49 64 78  v, OP_Seek, iIdx
91d0: 43 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a 20  Cur, 0, iCur);. 
91e0: 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
91f0: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
9200: 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a 20  _OR_SUBCLAUSE). 
9210: 20 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a 65    && DbMaskAllZe
9220: 72 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65 54  ro(sqlite3ParseT
9230: 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 2d  oplevel(pParse)-
9240: 3e 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29 7b  >writeMask).  ){
9250: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9260: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
9270: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
9280: 69 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a 29  int *ai = (int*)
9290: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
92a0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
92b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54 61  sizeof(int)*(pTa
92c0: 62 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20  b->nCol+1));.   
92d0: 20 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20 20   if( ai ){.     
92e0: 20 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e   ai[0] = pTab->n
92f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Col;.      for(i
9300: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
9310: 75 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  umn-1; i++){.   
9320: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9330: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 70  x->aiColumn[i]<p
9340: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
9350: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9360: 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 20  iColumn[i]>=0 ) 
9370: 61 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ai[pIdx->aiColum
9380: 6e 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a 20  n[i]+1] = i+1;. 
9390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
93a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
93b0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 61  (v, -1, (char*)a
93c0: 69 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  i, P4_INTARRAY);
93d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
93e0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
93f0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9400: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9410: 65 6e 74 20 69 73 20 61 20 76 65 63 74 6f 72 2c  ent is a vector,
9420: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
9430: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 66  e to write the f
9440: 69 72 73 74 20 6e 52 65 67 20 65 6c 65 6d 65 6e  irst nReg elemen
9450: 74 73 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ts of the vector
9460: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 0a 2a   into an array.*
9470: 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  * of registers s
9480: 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 52 65  tarting with iRe
9490: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
94a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
94b0: 74 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e  t a vector, then
94c0: 20 6e 52 65 67 20 6d 75 73 74 20 62 65 20 70 61   nReg must be pa
94d0: 73 73 65 64 20 31 2e 20 49 6e 0a 2a 2a 20 74 68  ssed 1. In.** th
94e0: 69 73 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  is case, generat
94f0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
9500: 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
9510: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 0a  n and leave the.
9520: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  ** result in reg
9530: 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2f 0a 73  ister iReg..*/.s
9540: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45  tatic void codeE
9550: 78 70 72 4f 72 56 65 63 74 6f 72 28 50 61 72 73  xprOrVector(Pars
9560: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
9570: 2a 70 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  *p, int iReg, in
9580: 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72  t nReg){.  asser
9590: 74 28 20 6e 52 65 67 3e 30 20 29 3b 0a 20 20 69  t( nReg>0 );.  i
95a0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
95b0: 56 65 63 74 6f 72 28 70 29 20 29 7b 0a 23 69 66  Vector(p) ){.#if
95c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
95d0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 69 66  _SUBQUERY.    if
95e0: 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
95f0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
9600: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
9610: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9620: 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 20      int iSelect 
9630: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
9640: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
9650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
9660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9670: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 53 65  (v, OP_Copy, iSe
9680: 6c 65 63 74 2c 20 69 52 65 67 2c 20 6e 52 65 67  lect, iReg, nReg
9690: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  -1);.    }else.#
96a0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
96b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
96c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
96d0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20   p->x.pList;.   
96e0: 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3c     assert( nReg<
96f0: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  =pList->nExpr );
9700: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9710: 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nReg; i++){.  
9720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9730: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
9740: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
9750: 20 69 52 65 67 2b 69 29 3b 0a 20 20 20 20 20 20   iReg+i);.      
9760: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
9770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
9780: 67 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  g==1 );.    sqli
9790: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
97a0: 73 65 2c 20 70 2c 20 69 52 65 67 29 3b 0a 20 20  se, p, iReg);.  
97b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
97c0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
97d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
97e0: 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
97f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9800: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
9810: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
9820: 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61  pWInfo..*/.Bitma
9830: 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  sk sqlite3WhereC
9840: 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
9850: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
9860: 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c  Info,   /* Compl
9870: 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ete information 
9880: 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
9890: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
98a0: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
98b0: 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20   /* Which level 
98c0: 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73  of pWInfo->a[] s
98d0: 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a  hould be coded *
98e0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
98f0: 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63  eady     /* Whic
9900: 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72  h tables are cur
9910: 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
9920: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20   */.){.  int j, 
9930: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
9940: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
9950: 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
9960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9970: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
9980: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
9990: 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20  nt addrNxt;     
99a0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
99b0: 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65  jump to continue
99c0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
99d0: 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  N case */.  int 
99e0: 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20  omitTable;      
99f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
9a00: 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
9a10: 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  y */.  int bRev;
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9a30: 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
9a40: 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
9a50: 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65  e order */.  Whe
9a60: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
9a70: 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c    /* The where l
9a80: 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64  evel to be coded
9a90: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
9aa0: 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68  *pLoop;    /* Th
9ab0: 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
9ac0: 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ct being coded *
9ad0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
9ae0: 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
9af0: 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
9b00: 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
9b10: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
9b20: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
9b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
9b40: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
9b50: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
9b60: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
9b70: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9b80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
9b90: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9bb0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9bc0: 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
9bd0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
9be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9bf0: 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
9c00: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9c10: 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
9c20: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
9c30: 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
9c40: 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
9c50: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
9c60: 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c80: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
9c90: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
9ca0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
9cb0: 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
9cc0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
9cd0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
9ce0: 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
9cf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
9d00: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
9d10: 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
9d20: 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
9d30: 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
9d40: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
9d50: 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
9d60: 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
9d70: 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
9d80: 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20  returning */..  
9d90: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
9da0: 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70  >pParse;.  v = p
9db0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9dc0: 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
9dd0: 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  WC;.  db = pPars
9de0: 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20  e->db;.  pLevel 
9df0: 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
9e00: 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  vel];.  pLoop = 
9e10: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
9e20: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
9e30: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
9e40: 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
9e50: 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
9e60: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
9e70: 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
9e80: 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 73   = notReady & ~s
9e90: 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
9ea0: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
9eb0: 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62  kSet, iCur);.  b
9ec0: 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
9ed0: 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
9ee0: 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
9ef0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
9f00: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
9f10: 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
9f20: 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
9f30: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
9f40: 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
9f50: 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
9f60: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
9f70: 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
9f80: 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
9f90: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
9fa0: 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
9fb0: 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
9fc0: 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
9fd0: 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
9fe0: 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
9ff0: 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
a000: 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
a010: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
a020: 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
a030: 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
a040: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
a050: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
a060: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
a070: 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
a080: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
a090: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
a0a0: 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
a0b0: 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
a0c0: 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
a0d0: 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
a0e0: 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
a0f0: 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
a100: 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
a110: 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
a120: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
a130: 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
a140: 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
a150: 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
a160: 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
a170: 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
a180: 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
a190: 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
a1a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a1b0: 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
a1c0: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
a1d0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
a1e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
a1f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
a200: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
a210: 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
a220: 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
a230: 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
a240: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
a250: 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
a260: 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
a270: 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
a280: 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
a290: 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
a2a0: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
a2b0: 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
a2c0: 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69  abItem[0].fg.joi
a2d0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
a2e0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  !=0 ){.    pLeve
a2f0: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
a300: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a320: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a330: 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 0, pLevel->i
a340: 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
a350: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
a360: 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
a370: 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
a380: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
a390: 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f  al case of a FRO
a3a0: 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M clause subquer
a3b0: 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  y implemented as
a3c0: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
a3d0: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
a3e0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
a3f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
a400: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
a410: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
a420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a430: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
a440: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
a450: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
a460: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
a470: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
a480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a490: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
a4a0: 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
a4b0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a4c0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
a4d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
a4e0: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
a4f0: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
a500: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
a510: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
a520: 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
a530: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a540: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
a550: 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
a560: 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
a570: 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
a580: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
a590: 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
a5a0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
a5b0: 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
a5c0: 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
a5d0: 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
a5e0: 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
a5f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
a600: 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
a610: 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
a620: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
a630: 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
a640: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
a650: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20  oop->nLTerm;.   
a660: 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 2f 2a 20   int iIn;    /* 
a670: 43 6f 75 6e 74 65 72 20 66 6f 72 20 49 4e 20 63  Counter for IN c
a680: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
a690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
a6a0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
a6b0: 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
a6c0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
a6d0: 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
a6e0: 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72  int+2);.    addr
a6f0: 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
a700: 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20  l->addrBrk;.    
a710: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
a720: 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
a730: 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
a740: 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20  = iReg+j+2;.    
a750: 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
a760: 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
a770: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72    if( NEVER(pTer
a780: 6d 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  m==0) ) continue
a790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
a7a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
a7b0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
a7c0: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
a7d0: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
a7e0: 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
a7f0: 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
a800: 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
a810: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
a820: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a830: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
a840: 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
a850: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
a860: 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56       codeExprOrV
a870: 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52  ector(pParse, pR
a880: 69 67 68 74 2c 20 69 54 61 72 67 65 74 2c 20 31  ight, iTarget, 1
a890: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a8c0: 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
a8d0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
a8e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a8f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a900: 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
a910: 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
a920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a930: 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
a940: 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
a950: 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
a980: 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a9a0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
a9b0: 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e  dFree ? P4_MPRIN
a9c0: 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
a9d0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a9e0: 65 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  e(v);.    pLoop-
a9f0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
aa00: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c   = 0;.    pLevel
aa10: 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
aa20: 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 70 57   pLevel->op = pW
aa30: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3f  Info->eOnePass ?
aa40: 20 4f 50 5f 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e   OP_Noop : OP_VN
aa50: 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
aa60: 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
aa70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
aa80: 0a 20 20 20 20 69 49 6e 20 3d 20 70 4c 65 76 65  .    iIn = pLeve
aa90: 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20  l->u.in.nIn;.   
aaa0: 20 66 6f 72 28 6a 3d 6e 43 6f 6e 73 74 72 61 69   for(j=nConstrai
aab0: 6e 74 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  nt-1; j>=0; j--)
aac0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
aad0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
aae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 31 36  ;.      if( j<16
aaf0: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74   && (pLoop->u.vt
ab00: 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
ab10: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
ab20: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
ab30: 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
ab40: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
ab50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
ab60: 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
ab70: 20 20 45 78 70 72 20 2a 70 43 6f 6d 70 61 72 65    Expr *pCompare
ab80: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72  ;  /* The compar
ab90: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
aba0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
abb0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 48 53  Right;    /* RHS
abc0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
abd0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64  on */.        Vd
abe0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 2f  beOp *pOp;     /
abf0: 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 63 63 65  * Opcode to acce
ac00: 73 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ss the value of 
ac10: 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  the IN constrain
ac20: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
ac30: 20 52 65 6c 6f 61 64 20 74 68 65 20 63 6f 6e 73   Reload the cons
ac40: 74 72 61 69 6e 74 20 76 61 6c 75 65 20 69 6e 74  traint value int
ac50: 6f 20 72 65 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e  o reg[iReg+j+2].
ac60: 20 20 54 68 65 20 73 61 6d 65 20 76 61 6c 75 65    The same value
ac70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20  .        ** was 
ac80: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
ac90: 73 61 6d 65 20 72 65 67 69 73 74 65 72 20 70 72  same register pr
aca0: 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 56 46  ior to the OP_VF
acb0: 69 6c 74 65 72 2c 20 62 75 74 0a 20 20 20 20 20  ilter, but.     
acc0: 20 20 20 2a 2a 20 74 68 65 20 78 46 69 6c 74 65     ** the xFilte
acd0: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
ace0: 20 6d 69 67 68 74 20 68 61 76 65 20 63 68 61 6e   might have chan
acf0: 67 65 64 20 74 68 65 20 64 61 74 61 74 79 70 65  ged the datatype
ad00: 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   or.        ** e
ad10: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 76  ncoding of the v
ad20: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 65 67 69  alue in the regi
ad30: 73 74 65 72 2c 20 73 6f 20 69 74 20 2a 6d 75 73  ster, so it *mus
ad40: 74 2a 20 62 65 20 72 65 6c 6f 61 64 65 64 2e 20  t* be reloaded. 
ad50: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ad60: 74 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  t( pLevel->u.in.
ad70: 61 49 6e 4c 6f 6f 70 21 3d 30 20 7c 7c 20 64 62  aInLoop!=0 || db
ad80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ad90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
ada0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
adb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
adc0: 65 72 74 28 20 69 49 6e 3e 30 20 29 3b 0a 20 20  ert( iIn>0 );.  
add0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
ade0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
adf0: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
ae00: 49 6e 4c 6f 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64  InLoop[--iIn].ad
ae10: 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
ae20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
ae30: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
ae40: 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  mn || pOp->opcod
ae50: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20  e==OP_Rowid );. 
ae60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ae70: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
ae80: 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e  _Column || pOp->
ae90: 70 33 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p3==iReg+j+2 );.
aea0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
aeb0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
aec0: 50 5f 52 6f 77 69 64 20 7c 7c 20 70 4f 70 2d 3e  P_Rowid || pOp->
aed0: 70 32 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p2==iReg+j+2 );.
aee0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
aef0: 73 65 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  se( pOp->opcode=
af00: 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20  =OP_Rowid );.   
af10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af20: 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4f 70 2d  beAddOp3(v, pOp-
af30: 3e 6f 70 63 6f 64 65 2c 20 70 4f 70 2d 3e 70 31  >opcode, pOp->p1
af40: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
af50: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  p3);.        }..
af60: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
af70: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
af80: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74  ll continue to t
af90: 68 65 20 6e 65 78 74 20 72 6f 77 20 69 66 20 0a  he next row if .
afa0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 49          ** the I
afb0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  N constraint is 
afc0: 6e 6f 74 20 73 61 74 69 73 66 69 65 64 20 2a 2f  not satisfied */
afd0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72  .        pCompar
afe0: 65 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  e = sqlite3PExpr
aff0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
b000: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b010: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6d 70 61    assert( pCompa
b020: 72 65 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  re!=0 || db->mal
b030: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
b040: 20 20 20 20 20 69 66 28 20 70 43 6f 6d 70 61 72       if( pCompar
b050: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
b060: 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66 74 20 3d  Compare->pLeft =
b070: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
b080: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
b090: 70 43 6f 6d 70 61 72 65 2d 3e 70 52 69 67 68 74  pCompare->pRight
b0a0: 20 3d 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69   = pRight = sqli
b0b0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 52  te3Expr(db, TK_R
b0c0: 45 47 49 53 54 45 52 2c 20 30 29 3b 0a 20 20 20  EGISTER, 0);.   
b0d0: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
b0e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
b0f0: 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 20   pRight->iTable 
b100: 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20  = iReg+j+2;.    
b110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b120: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
b130: 65 2c 20 70 43 6f 6d 70 61 72 65 2c 20 70 4c 65  e, pCompare, pLe
b140: 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 2c 20 30  vel->addrCont, 0
b150: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
b160: 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72           pCompar
b170: 65 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  e->pLeft = 0;.  
b180: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b190: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
b1a0: 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20 20 20 20  ompare);.       
b1b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b1c0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 72 65  .    /* These re
b1d0: 67 69 73 74 65 72 73 20 6e 65 65 64 20 74 6f 20  gisters need to 
b1e0: 62 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20  be preserved in 
b1f0: 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61 6e  case there is an
b200: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20   IN operator.   
b210: 20 2a 2a 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65   ** loop.  So we
b220: 20 63 6f 75 6c 64 20 64 65 61 6c 6c 6f 63 61 74   could deallocat
b230: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 73 20  e the registers 
b240: 68 65 72 65 20 28 61 6e 64 20 70 6f 74 65 6e 74  here (and potent
b250: 69 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 72 65 75  ially.    ** reu
b260: 73 65 20 74 68 65 6d 20 6c 61 74 65 72 29 20 69  se them later) i
b270: 66 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f (pLoop->wsFlag
b280: 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
b290: 45 29 3d 3d 30 2e 20 20 42 75 74 20 69 74 20 73  E)==0.  But it s
b2a0: 65 65 6d 73 0a 20 20 20 20 2a 2a 20 73 69 6d 70  eems.    ** simp
b2b0: 6c 65 72 20 61 6e 64 20 73 61 66 65 72 20 74 6f  ler and safer to
b2c0: 20 73 69 6d 70 6c 79 20 6e 6f 74 20 72 65 75 73   simply not reus
b2d0: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 73 2e  e the registers.
b2e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
b2f0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b300: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b310: 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
b320: 69 6e 74 2b 32 29 3b 0a 20 20 20 20 2a 2f 0a 20  int+2);.    */. 
b330: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b340: 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
b350: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
b360: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
b370: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
b380: 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
b390: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
b3a0: 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
b3b0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
b3c0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
b3d0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
b3e0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
b3f0: 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
b400: 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
b410: 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
b420: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
b430: 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
b440: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
b450: 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
b460: 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
b470: 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
b480: 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
b490: 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
b4a0: 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
b4b0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
b4c0: 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
b4d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
b4e0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
b4f0: 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20   );.    pTerm = 
b500: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
b510: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
b520: 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
b530: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
b540: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
b550: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
b560: 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
b570: 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
b580: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
b590: 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
b5a0: 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
b5b0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64  nMem;.    iRowid
b5c0: 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
b5d0: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
b5e0: 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
b5f0: 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
b600: 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f  eg);.    if( iRo
b610: 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65  widReg!=iRelease
b620: 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  Reg ) sqlite3Rel
b630: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b640: 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
b650: 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
b660: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
b670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b680: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b690: 6b 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 61 64  kRowid, iCur, ad
b6a0: 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
b6b0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
b6c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
b6d0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
b6e0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
b6f0: 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
b700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
b710: 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
b720: 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
b730: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
b740: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
b750: 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
b760: 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
b770: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
b780: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
b790: 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
b7a0: 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
b7b0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
b7c0: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
b7d0: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
b7e0: 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
b7f0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
b800: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
b810: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
b820: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
b830: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
b840: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
b850: 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
b860: 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
b870: 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
b880: 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
b890: 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
b8a0: 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
b8b0: 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
b8c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
b8d0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
b8e0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
b8f0: 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
b900: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
b910: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
b920: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
b930: 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
b940: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
b950: 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
b960: 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
b970: 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
b980: 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
b990: 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
b9a0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
b9b0: 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
b9c0: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
b9d0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
b9e0: 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f  pTabItem, pWInfo
b9f0: 2c 20 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  , pLevel, pEnd);
ba00: 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
ba10: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ba20: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  X;             /
ba30: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ba40: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
ba50: 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f  e start bound */
ba60: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
ba70: 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Temp;        /* 
ba80: 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f  Registers for ho
ba90: 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  lding the start 
baa0: 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 20 20 20 20  boundary */.    
bab0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
bac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
bad0: 72 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  r seek operation
bae0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
baf0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
bb00: 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
bb10: 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
bb20: 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
bb30: 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
bb40: 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
bb50: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
bb60: 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
bb70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
bb80: 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
bb90: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
bba0: 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
bbb0: 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20  SeekGT,.        
bbc0: 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
bbd0: 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20  OP_SeekLE,.     
bbe0: 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
bbf0: 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20  /  OP_SeekLT,.  
bc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
bc10: 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a  E */  OP_SeekGE.
bc20: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
bc30: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
bc40: 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
bc50: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
bc60: 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
bc70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
bc80: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
bc90: 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
bca0: 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
bcb0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
bcc0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
bcd0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
bce0: 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
bcf0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
bd00: 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  (pStart->wtFlags
bd10: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
bd20: 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
bd30: 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
bd40: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
bd50: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20  UAL );.      pX 
bd60: 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
bd70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bd80: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  X!=0 );.      te
bd90: 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
bda0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
bdb0: 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76   ); /* transitiv
bdc0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
bdd0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
bde0: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
bdf0: 58 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20  X->pRight) ){.  
be00: 20 20 20 20 20 20 72 31 20 3d 20 72 54 65 6d 70        r1 = rTemp
be10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
be20: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
be30: 20 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72        codeExprOr
be40: 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70  Vector(pParse, p
be50: 58 2d 3e 70 52 69 67 68 74 2c 20 72 31 2c 20 31  X->pRight, r1, 1
be60: 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
be70: 61 4d 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f 70 20  aMoveOp[(pX->op 
be80: 2d 20 54 4b 5f 47 54 29 20 7c 20 30 78 30 30 30  - TK_GT) | 0x000
be90: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
bea0: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
beb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
bec0: 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
bed0: 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
bee0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
bef0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
bf00: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  t);.        op =
bf10: 20 61 4d 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f 70   aMoveOp[(pX->op
bf20: 20 2d 20 54 4b 5f 47 54 29 5d 3b 0a 20 20 20 20   - TK_GT)];.    
bf30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
bf40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
bf50: 70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  p, iCur, addrBrk
bf60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
bf70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
bf80: 22 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  "));.      VdbeC
bf90: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
bfa0: 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20  >op==TK_GT);.   
bfb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
bfc0: 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
bfd0: 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LE);.      VdbeC
bfe0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
bff0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20  >op==TK_LT);.   
c000: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
c010: 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
c020: 47 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  GE);.      sqlit
c030: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
c040: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
c050: 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
c060: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
c070: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
c080: 65 6d 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  emp);.    }else{
c090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c0a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
c0b0: 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
c0c0: 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
c0d0: 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  drBrk);.      Vd
c0e0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
c0f0: 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20  bRev==0);.      
c100: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
c110: 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
c120: 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
c130: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
c140: 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
c150: 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
c160: 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
c170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
c180: 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
c190: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
c1a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c1b0: 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
c1c0: 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
c1d0: 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
c1e0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
c1f0: 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
c200: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
c210: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
c220: 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
c230: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c240: 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63     codeExprOrVec
c250: 74 6f 72 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  tor(pParse, pX->
c260: 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61  pRight, memEndVa
c270: 6c 75 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  lue, 1);.      i
c280: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
c290: 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52  rIsVector(pX->pR
c2a0: 69 67 68 74 29 20 0a 20 20 20 20 20 20 20 26 26  ight) .       &&
c2b0: 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20   (pX->op==TK_LT 
c2c0: 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
c2d0: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
c2e0: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
c2f0: 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
c300: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
c310: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
c320: 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
c330: 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
c340: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
c350: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
c360: 70 58 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20  pX->pRight) ){. 
c370: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
c380: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
c390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c3a0: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
c3b0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
c3c0: 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
c3d0: 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
c3e0: 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
c3f0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
c400: 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
c410: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
c420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
c430: 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
c440: 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
c450: 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
c460: 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61  RowidReg = ++pPa
c470: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c490: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
c4a0: 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
c4b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c4c0: 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
c4d0: 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
c4e0: 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
c4f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c500: 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
c510: 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
c520: 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
c530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
c540: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
c550: 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Le);.      V
c560: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
c570: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b   testOp==OP_Lt);
c580: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
c590: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
c5a0: 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ge);.      V
c5b0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
c5c0: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b   testOp==OP_Gt);
c5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c5e0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
c5f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c600: 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
c610: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
c620: 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
c630: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
c640: 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
c650: 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
c660: 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
c670: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
c680: 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
c690: 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
c6a0: 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
c6b0: 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
c6c0: 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
c6d0: 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
c6e0: 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
c6f0: 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
c700: 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
c710: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
c720: 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
c730: 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
c740: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
c750: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
c760: 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
c770: 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
c780: 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
c790: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
c7a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
c7b0: 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
c7c0: 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
c7d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
c7e0: 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
c7f0: 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
c800: 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
c810: 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
c820: 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
c830: 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
c840: 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
c850: 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
c860: 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
c870: 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
c880: 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
c890: 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
c8a0: 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
c8b0: 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
c8c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
c8d0: 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
c8e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
c8f0: 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
c900: 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
c910: 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
c920: 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
c930: 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
c940: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
c950: 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
c960: 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
c970: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
c980: 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
c990: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
c9a0: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
c9b0: 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
c9c0: 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
c9d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
c9e0: 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
c9f0: 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
ca00: 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
ca10: 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
ca20: 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
ca30: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
ca40: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
ca50: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
ca60: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
ca70: 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
ca80: 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
ca90: 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
caa0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
cab0: 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
cac0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
cad0: 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
cae0: 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
caf0: 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
cb00: 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
cb10: 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
cb20: 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
cb30: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
cb40: 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
cb50: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
cb60: 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
cb70: 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
cb80: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
cb90: 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
cba0: 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
cbb0: 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
cbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
cbd0: 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
cbe0: 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
cbf0: 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
cc00: 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
cc10: 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
cc20: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
cc30: 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
cc40: 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
cc50: 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20 20   OP_SeekGT,     
cc60: 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
cc70: 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
cc80: 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
cc90: 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
cca0: 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20 20  P_SeekLT,       
ccb0: 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
ccc0: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
ccd0: 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
cce0: 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
ccf0: 53 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20 20  SeekGE,         
cd00: 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
cd10: 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
cd20: 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
cd30: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
cd40: 65 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ekLE            
cd50: 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
cd60: 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
cd70: 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
cd80: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
cd90: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
cda0: 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
cdb0: 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
cdc0: 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64        /* 0: (end
cdd0: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
cde0: 21 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29  !bRev && !endEq)
cdf0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
ce00: 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GT,            /
ce10: 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
ce20: 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
ce30: 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  &  endEq) */.   
ce40: 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20     OP_IdxLE,    
ce50: 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
ce60: 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
ce70: 26 20 20 62 52 65 76 20 26 26 20 21 65 6e 64 45  &  bRev && !endE
ce80: 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
ce90: 64 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20  dxLT,           
cea0: 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 3: (end_cons
ceb0: 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
cec0: 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20   &&  endEq) */. 
ced0: 20 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45     };.    u16 nE
cee0: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
cef0: 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e  ee.nEq;     /* N
cf00: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
cf10: 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 75  N terms */.    u
cf20: 31 36 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d  16 nBtm = pLoop-
cf30: 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 20 20  >u.btree.nBtm;  
cf40: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 42 54   /* Length of BT
cf50: 4d 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20  M vector */.    
cf60: 75 31 36 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70  u16 nTop = pLoop
cf70: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 20  ->u.btree.nTop; 
cf80: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 54    /* Length of T
cf90: 4f 50 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20  OP vector */.   
cfa0: 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfc0: 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
cfd0: 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
cfe0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
cff0: 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
d000: 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20  eStart = 0;  /* 
d010: 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
d020: 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73  raint at range s
d030: 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72  tart */.    Wher
d040: 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64  eTerm *pRangeEnd
d050: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71   = 0;    /* Ineq
d060: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
d070: 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a  t at range end *
d080: 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45  /.    int startE
d090: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
d0a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
d0b0: 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d  nge start uses =
d0c0: 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
d0d0: 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20     int endEq;   
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
d100: 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d   end uses ==, >=
d110: 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
d120: 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
d130: 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
d140: 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
d150: 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
d160: 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
d170: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
d180: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
d190: 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f  straint terms */
d1a0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1c0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
d1d0: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
d1e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
d1f0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
d200: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
d210: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
d220: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
d230: 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20  nExtraReg = 0;  
d240: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d250: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
d260: 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a  sters needed */.
d270: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
d2a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68  opcode */.    ch
d2b0: 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20  ar *zStartAff;  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
d2d0: 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74  finity for start
d2e0: 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
d2f0: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  aint */.    char
d300: 20 2a 7a 45 6e 64 41 66 66 20 3d 20 30 3b 20 20   *zEndAff = 0;  
d310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
d320: 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20  nity for end of 
d330: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
d340: 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65 6b   */.    u8 bSeek
d350: 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20  PastNull = 0;   
d360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
d370: 73 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69 61  seek past initia
d380: 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75  l nulls */.    u
d390: 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20  8 bStopAtNull = 
d3a0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0;          /* A
d3b0: 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  dd condition to 
d3c0: 74 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c  terminate at NUL
d3d0: 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  Ls */..    pIdx 
d3e0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d3f0: 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64  .pIndex;.    iId
d400: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
d410: 49 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65  IdxCur;.    asse
d420: 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e  rt( nEq>=pLoop->
d430: 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  nSkip );..    /*
d440: 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
d450: 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
d460: 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
d470: 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
d480: 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
d490: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
d4a0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
d4b0: 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
d4c0: 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
d4d0: 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
d4e0: 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
d4f0: 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
d500: 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
d510: 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d530: 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
d540: 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
d550: 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
d560: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
d570: 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
d580: 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
d590: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
d5a0: 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
d5b0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
d5c0: 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
d5d0: 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
d5e0: 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
d5f0: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
d600: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
d610: 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
d620: 42 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  By==0.         |
d630: 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  | pWInfo->pOrder
d640: 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20  By->nExpr==1.   
d650: 20 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f        || (pWInfo
d660: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
d670: 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
d680: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
d690: 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
d6a0: 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
d6b0: 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
d6c0: 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30  pWInfo->nOBSat>0
d6d0: 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e  .     && (pIdx->
d6e0: 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20  nKeyCol>nEq).   
d6f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d700: 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d  ( pLoop->nSkip==
d710: 30 20 29 3b 0a 20 20 20 20 20 20 62 53 65 65 6b  0 );.      bSeek
d720: 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  PastNull = 1;.  
d730: 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
d740: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
d750: 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61   Find any inequa
d760: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
d770: 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74  terms for the st
d780: 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20  art and end .   
d790: 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
d7a0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20  . .    */.    j 
d7b0: 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
d7c0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
d7d0: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
d7e0: 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53  ){.      pRangeS
d7f0: 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
d800: 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
d810: 20 6e 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58   nExtraReg = MAX
d820: 28 6e 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f  (nExtraReg, pLoo
d830: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 29  p->u.btree.nBtm)
d840: 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 69 6b 65 20  ;.      /* Like 
d850: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e  optimization ran
d860: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
d870: 6c 77 61 79 73 20 6f 63 63 75 72 20 69 6e 20 70  lways occur in p
d880: 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 61 73  airs */.      as
d890: 73 65 72 74 28 20 28 70 52 61 6e 67 65 53 74 61  sert( (pRangeSta
d8a0: 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
d8b0: 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d 3d 30 20 7c  RM_LIKEOPT)==0 |
d8c0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
d8d0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
d8e0: 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
d8f0: 49 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  IT)!=0 );.    }.
d900: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
d910: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
d920: 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
d930: 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
d940: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
d950: 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
d960: 67 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52 65  g = MAX(nExtraRe
d970: 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  g, pLoop->u.btre
d980: 65 2e 6e 54 6f 70 29 3b 0a 23 69 66 6e 64 65 66  e.nTop);.#ifndef
d990: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
d9a0: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
d9b0: 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
d9c0: 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
d9d0: 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 21 3d 30  TERM_LIKEOPT)!=0
d9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d9f0: 72 74 28 20 70 52 61 6e 67 65 53 74 61 72 74 21  rt( pRangeStart!
da00: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
da10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
da20: 45 20 6f 70 74 20 63 6f 6e 73 74 72 61 69 6e 74  E opt constraint
da30: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
da40: 65 72 74 28 20 70 52 61 6e 67 65 53 74 61 72 74  ert( pRangeStart
da50: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
da60: 5f 4c 49 4b 45 4f 50 54 20 29 3b 20 20 20 2f 2a  _LIKEOPT );   /*
da70: 20 6f 63 63 75 72 20 69 6e 20 70 61 69 72 73 20   occur in pairs 
da80: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  */.        pLeve
da90: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20  l->iLikeRepCntr 
daa0: 3d 20 28 75 33 32 29 2b 2b 70 50 61 72 73 65 2d  = (u32)++pParse-
dab0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
dac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dad0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
dae0: 31 2c 20 28 69 6e 74 29 70 4c 65 76 65 6c 2d 3e  1, (int)pLevel->
daf0: 69 4c 69 6b 65 52 65 70 43 6e 74 72 29 3b 0a 20  iLikeRepCntr);. 
db00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
db10: 6e 74 28 28 76 2c 20 22 4c 49 4b 45 20 6c 6f 6f  nt((v, "LIKE loo
db20: 70 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  p counter"));.  
db30: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
db40: 64 72 4c 69 6b 65 52 65 70 20 3d 20 73 71 6c 69  drLikeRep = sqli
db50: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
db60: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 2f  dr(v);.        /
db70: 2a 20 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 61  * iLikeRepCntr a
db80: 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 73 20 32  ctually stores 2
db90: 78 20 74 68 65 20 63 6f 75 6e 74 65 72 20 72 65  x the counter re
dba0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 20 20  gister number.  
dbb0: 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  The.        ** b
dbc0: 6f 74 74 6f 6d 20 62 69 74 20 69 6e 64 69 63 61  ottom bit indica
dbd0: 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  tes whether the 
dbe0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
dbf0: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 2a 2f 0a  ASC or DESC. */.
dc00: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
dc10: 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
dc20: 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
dc30: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
dc40: 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  ]==SQLITE_SO_DES
dc50: 43 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  C );.        ass
dc60: 65 72 74 28 20 28 62 52 65 76 20 26 20 7e 31 29  ert( (bRev & ~1)
dc70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
dc80: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
dc90: 6e 74 72 20 3c 3c 3d 31 3b 0a 20 20 20 20 20 20  ntr <<=1;.      
dca0: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
dcb0: 65 70 43 6e 74 72 20 7c 3d 20 62 52 65 76 20 5e  epCntr |= bRev ^
dcc0: 20 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64   (pIdx->aSortOrd
dcd0: 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
dce0: 53 4f 5f 44 45 53 43 29 3b 0a 20 20 20 20 20 20  SO_DESC);.      
dcf0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
dd00: 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d  f( pRangeStart==
dd10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
dd20: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
dd30: 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  nEq];.        if
dd40: 28 20 28 6a 3e 3d 30 20 26 26 20 70 49 64 78 2d  ( (j>=0 && pIdx-
dd50: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
dd60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 20 7c 7c 20  .notNull==0) || 
dd70: 6a 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  j==XN_EXPR ){.  
dd80: 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61 73          bSeekPas
dd90: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
dda0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ddb0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
ddc0: 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28  RangeEnd==0 || (
ddd0: 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
dde0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
ddf0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
de00: 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
de10: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
de20: 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
de30: 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
de40: 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
de50: 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
de60: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
de70: 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
de80: 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
de90: 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
dea0: 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
deb0: 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
dec0: 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49  .    if( (nEq<pI
ded0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62  dx->nKeyCol && b
dee0: 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
def0: 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
df00: 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20  ITE_SO_ASC)).   
df10: 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49    || (bRev && pI
df20: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71  dx->nKeyCol==nEq
df30: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
df40: 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
df50: 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
df60: 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  geStart);.      
df70: 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61  SWAP(u8, bSeekPa
df80: 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e  stNull, bStopAtN
df90: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 53 57 41 50  ull);.      SWAP
dfa0: 28 75 38 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29  (u8, nBtm, nTop)
dfb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dfc0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
dfd0: 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
dfe0: 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
dff0: 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
e000: 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
e010: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
e020: 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
e030: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
e040: 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
e050: 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
e060: 20 20 2a 2f 0a 20 20 20 20 63 6f 64 65 43 75 72    */.    codeCur
e070: 73 6f 72 48 69 6e 74 28 70 54 61 62 49 74 65 6d  sorHint(pTabItem
e080: 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c  , pWInfo, pLevel
e090: 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
e0a0: 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
e0b0: 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
e0c0: 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62  (pParse,pLevel,b
e0d0: 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a  Rev,nExtraReg,&z
e0e0: 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
e0f0: 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66 66  ssert( zStartAff
e100: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
e110: 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66  rlen30(zStartAff
e120: 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66  )>=nEq );.    if
e130: 28 20 7a 53 74 61 72 74 41 66 66 20 26 26 20 6e  ( zStartAff && n
e140: 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 7a 45 6e  Top ){.      zEn
e150: 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
e160: 53 74 72 44 75 70 28 64 62 2c 20 26 7a 53 74 61  StrDup(db, &zSta
e170: 72 74 41 66 66 5b 6e 45 71 5d 29 3b 0a 20 20 20  rtAff[nEq]);.   
e180: 20 7d 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d   }.    addrNxt =
e190: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
e1a0: 3b 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ;..    testcase(
e1b0: 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
e1c0: 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
e1d0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
e1e0: 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
e1f0: 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
e200: 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
e210: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
e220: 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _GE)!=0 );.    t
e230: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
e240: 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
e250: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
e260: 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
e270: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
e280: 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
e290: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
e2a0: 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73  _GE)!=0 );.    s
e2b0: 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
e2c0: 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
e2d0: 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
e2e0: 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
e2f0: 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
e300: 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
e310: 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
e320: 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
e330: 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
e340: 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
e350: 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
e360: 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
e370: 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
e380: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
e390: 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
e3a0: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
e3b0: 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
e3c0: 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
e3d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
e3e0: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
e3f0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
e400: 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74    codeExprOrVect
e410: 6f 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  or(pParse, pRigh
e420: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
e430: 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20 77 68 65  nBtm);.      whe
e440: 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69  reLikeOptimizati
e450: 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c  onStringFixup(v,
e460: 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53   pLevel, pRangeS
e470: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tart);.      if(
e480: 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
e490: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
e4a0: 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ULL)==0.       &
e4b0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
e4c0: 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20  BeNull(pRight). 
e4d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e4e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4f0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
e500: 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
e510: 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56  rNxt);.        V
e520: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e540: 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
e550: 20 20 20 20 20 20 20 75 70 64 61 74 65 52 61 6e         updateRan
e560: 67 65 41 66 66 69 6e 69 74 79 53 74 72 28 70 52  geAffinityStr(pR
e570: 69 67 68 74 2c 20 6e 42 74 6d 2c 20 26 7a 53 74  ight, nBtm, &zSt
e580: 61 72 74 41 66 66 5b 6e 45 71 5d 29 3b 0a 20 20  artAff[nEq]);.  
e590: 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
e5a0: 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20 6e 42 74  onstraint += nBt
e5b0: 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  m;.      testcas
e5c0: 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
e5d0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
e5e0: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
e5f0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
e600: 73 56 65 63 74 6f 72 28 70 52 69 67 68 74 29 3d  sVector(pRight)=
e610: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
e620: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
e630: 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
e640: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e650: 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 31       startEq = 1
e660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e670: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
e680: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
e690: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29   bSeekPastNull )
e6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e6b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e6c0: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
e6d0: 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f  +nEq);.      nCo
e6e0: 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
e6f0: 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
e700: 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74       start_const
e710: 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20  raints = 1;.    
e720: 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41  }.    codeApplyA
e730: 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
e740: 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
e750: 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74  aint - bSeekPast
e760: 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29  Null, zStartAff)
e770: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
e780: 3e 6e 53 6b 69 70 3e 30 20 26 26 20 6e 43 6f 6e  >nSkip>0 && nCon
e790: 73 74 72 61 69 6e 74 3d 3d 70 4c 6f 6f 70 2d 3e  straint==pLoop->
e7a0: 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 2f  nSkip ){.      /
e7b0: 2a 20 54 68 65 20 73 6b 69 70 2d 73 63 61 6e 20  * The skip-scan 
e7c0: 6c 6f 67 69 63 20 69 6e 73 69 64 65 20 74 68 65  logic inside the
e7d0: 20 63 61 6c 6c 20 74 6f 20 63 6f 64 65 41 6c 6c   call to codeAll
e7e0: 45 71 75 61 6c 69 74 79 43 6f 6e 73 74 72 61 69  EqualityConstrai
e7f0: 6e 74 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 61  nts().      ** a
e800: 62 6f 76 65 20 68 61 73 20 61 6c 72 65 61 64 79  bove has already
e810: 20 6c 65 66 74 20 74 68 65 20 63 75 72 73 6f 72   left the cursor
e820: 20 73 69 74 74 69 6e 67 20 6f 6e 20 74 68 65 20   sitting on the 
e830: 63 6f 72 72 65 63 74 20 72 6f 77 2c 0a 20 20 20  correct row,.   
e840: 20 20 20 2a 2a 20 73 6f 20 6e 6f 20 66 75 72 74     ** so no furt
e850: 68 65 72 20 73 65 65 6b 69 6e 67 20 69 73 20 6e  her seeking is n
e860: 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 7d 65 6c  eeded */.    }el
e870: 73 65 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61  se{.      op = a
e880: 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
e890: 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
e8a0: 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
e8b0: 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73  bRev];.      ass
e8c0: 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8e0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
e8f0: 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
e900: 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
e910: 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 56  traint);.      V
e920: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e930: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
e940: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52  geIf(v, op==OP_R
e950: 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73  ewind);  testcas
e960: 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
e970: 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
e980: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
e990: 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73  OP_Last);    tes
e9a0: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
e9b0: 73 74 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  st );.      Vdbe
e9c0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
e9d0: 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74  ==OP_SeekGT);  t
e9e0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
e9f0: 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 20 20  SeekGT );.      
ea00: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
ea10: 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29  , op==OP_SeekGE)
ea20: 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
ea30: 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20  =OP_SeekGE );.  
ea40: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ea50: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
ea60: 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
ea70: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
ea80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ea90: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
eaa0: 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63  _SeekLT);  testc
eab0: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
eac0: 4c 54 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LT );.    }..   
ead0: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
eae0: 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
eaf0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
eb00: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
eb10: 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
eb20: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
eb30: 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
eb40: 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
eb50: 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
eb60: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
eb70: 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
eb80: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
eb90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
eba0: 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
ebb0: 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
ebc0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78 70 72  ;.      codeExpr
ebd0: 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  OrVector(pParse,
ebe0: 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
ebf0: 2b 6e 45 71 2c 20 6e 54 6f 70 29 3b 0a 20 20 20  +nEq, nTop);.   
ec00: 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69     whereLikeOpti
ec10: 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69  mizationStringFi
ec20: 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20 70  xup(v, pLevel, p
ec30: 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 20  RangeEnd);.     
ec40: 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
ec50: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ec60: 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20  VNULL)==0.      
ec70: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
ec80: 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29  anBeNull(pRight)
ec90: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
eca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ecb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
ecc0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
ecd0: 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20  ddrNxt);.       
ece0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ecf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed00: 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
ed10: 20 20 20 20 20 20 20 75 70 64 61 74 65 52 61 6e         updateRan
ed20: 67 65 41 66 66 69 6e 69 74 79 53 74 72 28 70 52  geAffinityStr(pR
ed30: 69 67 68 74 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64  ight, nTop, zEnd
ed40: 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  Aff);.        co
ed50: 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
ed60: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
ed70: 6e 45 71 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64 41  nEq, nTop, zEndA
ed80: 66 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ff);.      }else
ed90: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
eda0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
edb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
edc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f 6e      }.      nCon
edd0: 73 74 72 61 69 6e 74 20 2b 3d 20 6e 54 6f 70 3b  straint += nTop;
ede0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
edf0: 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
ee00: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
ee10: 41 4c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  AL );..      if(
ee20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
ee30: 63 74 6f 72 28 70 52 69 67 68 74 29 3d 3d 30 20  ctor(pRight)==0 
ee40: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
ee50: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
ee60: 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 20  RangeEnd);.     
ee70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ee80: 65 6e 64 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  endEq = 1;.     
ee90: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
eea0: 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
eeb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
eed0: 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
eee0: 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
eef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
ef00: 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
ef10: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ef20: 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
ef30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
ef40: 46 72 65 65 28 64 62 2c 20 7a 45 6e 64 41 66 66  Free(db, zEndAff
ef50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
ef60: 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
ef70: 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
ef80: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
ef90: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
efa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
efb0: 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
efc0: 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
efd0: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
efe0: 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
eff0: 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
f000: 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
f010: 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
f020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f030: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
f040: 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
f050: 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
f060: 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
f070: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
f080: 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
f090: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
f0a0: 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
f0b0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
f0c0: 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
f0d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
f0e0: 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
f0f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
f100: 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
f110: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
f120: 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
f130: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f140: 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
f150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
f160: 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
f170: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f180: 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
f190: 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
f1a0: 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  red */.    if( o
f1b0: 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
f1c0: 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63    /* pIdx is a c
f1d0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
f1e0: 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73  No need to acces
f1f0: 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  s the main table
f200: 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  . */.    }else i
f210: 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78  f( HasRowid(pIdx
f220: 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  ->pTable) ){.   
f230: 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
f240: 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
f250: 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29 21 3d  RE_SEEK_TABLE)!=
f260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f  0 ){.        iRo
f270: 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
f280: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
f290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f2a0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
f2b0: 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
f2c0: 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  idReg);.        
f2d0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f2e0: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
f2f0: 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
f300: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
f310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f320: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
f330: 43 75 72 2c 20 30 2c 20 69 52 6f 77 69 64 52 65  Cur, 0, iRowidRe
f340: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
f350: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f370: 20 20 63 6f 64 65 44 65 66 65 72 72 65 64 53 65    codeDeferredSe
f380: 65 6b 28 70 57 49 6e 66 6f 2c 20 70 49 64 78 2c  ek(pWInfo, pIdx,
f390: 20 69 43 75 72 2c 20 69 49 64 78 43 75 72 29 3b   iCur, iIdxCur);
f3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f3b0: 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49 64  se if( iCur!=iId
f3c0: 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49 6e  xCur ){.      In
f3d0: 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
f3e0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
f3f0: 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
f400: 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
f410: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f420: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
f430: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
f440: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
f450: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
f460: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
f470: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
f480: 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
f490: 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
f4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
f4c0: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
f4d0: 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20   iRowidReg+j);. 
f4e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f4f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
f500: 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
f510: 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74  , iCur, addrCont
f520: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52 6f               iRo
f540: 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65  widReg, pPk->nKe
f550: 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
f560: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  age(v);.    }.. 
f570: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
f580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
f590: 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
f5a0: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  he loop. */.    
f5b0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
f5c0: 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
f5d0: 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  W ){.      pLeve
f5e0: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
f5f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
f600: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  Rev ){.      pLe
f610: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
f620: 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
f630: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
f640: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   OP_Next;.    }.
f650: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
f660: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c   iIdxCur;.    pL
f670: 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f  evel->p3 = (pLoo
f680: 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
f690: 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20  _UNQ_WANTED)!=0 
f6a0: 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28  ? 1:0;.    if( (
f6b0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
f6c0: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
f6d0: 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  T)==0 ){.      p
f6e0: 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
f6f0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
f700: 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
f710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
f720: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
f730: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
f740: 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
f750: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
f760: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
f770: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
f780: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
f790: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35  ){.    /* Case 5
f7a0: 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73  :  Two or more s
f7b0: 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65  eparately indexe
f7c0: 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
f7d0: 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20  d by OR.    **. 
f7e0: 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
f7f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
f800: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
f810: 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20  ,b,c,d);.    ** 
f820: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
f830: 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
f840: 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
f850: 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i2 ON t1(b);. 
f860: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
f870: 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29  NDEX i3 ON t1(c)
f880: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
f890: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
f8a0: 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20  t1 WHERE a=5 OR 
f8b0: 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44  b=7 OR (c=11 AND
f8c0: 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20   d=13).    **.  
f8d0: 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d    ** In the exam
f8e0: 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74  ple, there are t
f8f0: 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72  hree indexed ter
f900: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
f910: 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74  OR..    ** The t
f920: 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c  op of the loop l
f930: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
f940: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
f950: 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
f960: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f970: 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
f980: 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
f990: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e    **.    ** Then
f9a0: 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  , for each index
f9b0: 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c  ed term, the fol
f9c0: 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75  lowing. The argu
f9d0: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ments to.    ** 
f9e0: 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73  RowSetTest are s
f9f0: 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77  uch that the row
fa00: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
fa10: 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  t row is inserte
fa20: 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  d.    ** into th
fa30: 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20  e RowSet. If it 
fa40: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
fa50: 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70  nt, control skip
fa60: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73  s the.    ** Gos
fa70: 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75  ub opcode and ju
fa80: 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20  mps straight to 
fa90: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
faa0: 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29  ed by WhereEnd()
fab0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
fac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
fad0: 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29  ereBegin(<term>)
fae0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
faf0: 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20   RowSetTest     
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49               # I
fb10: 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f  nsert rowid into
fb20: 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20   rowset.    **  
fb30: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20          Gosub   
fb40: 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20     2 A.    **   
fb50: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
fb60: 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20  eEnd().    **.  
fb70: 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74    ** Following t
fb80: 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74  he above, code t
fb90: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
fba0: 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74  loop. Label A, t
fbb0: 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
fbc0: 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62   of the Gosub ab
fbd0: 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68  ove, jumps to th
fbe0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69  e instruction ri
fbf0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f  ght after the Go
fc00: 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  to..    **.    *
fc10: 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
fc20: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
fc30: 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
fc40: 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
fc50: 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
fc60: 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20    Goto       B  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
fc80: 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69  The loop is fini
fc90: 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  shed..    **.   
fca0: 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f   **       A: <lo
fcb0: 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20  op body>        
fcc0: 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72           # Retur
fcd0: 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72  n data, whatever
fce0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
fcf0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
fd00: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
fd10: 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b       # Jump back
fd20: 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20   to the Gosub.  
fd30: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
fd40: 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20    B: <after the 
fd50: 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop>.    **.   
fd60: 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30   ** Added 2014-0
fd70: 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62  5-26: If the tab
fd80: 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  le is a WITHOUT 
fd90: 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65  ROWID table, the
fda0: 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20  n.    ** use an 
fdb0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
fdc0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77  instead of a Row
fdd0: 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68  Set to record th
fde0: 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a  e primary.    **
fdf0: 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77   keys of the row
fe00: 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  s we have alread
fe10: 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20  y seen..    **. 
fe20: 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
fe30: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
fe40: 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
fe50: 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
fe60: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
fe70: 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
fe80: 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
fe90: 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
fea0: 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
feb0: 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
fec0: 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fee0: 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
fef0: 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
ff00: 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
ff10: 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
ff20: 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
ff30: 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
ff40: 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
ff50: 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
ff60: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
ff70: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
ff80: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
ff90: 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
ffa0: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
ffb0: 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
ffe0: 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
fff0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
10000 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
10030 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
10040 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
10050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10060 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
10070 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
10080 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
10090 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
100c0 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
100d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
100e0 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
100f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
10100 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
10110 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
10120 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10150 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
10160 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20  u16 wctrlFlags; 
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
10190 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
101a0 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41   */.    Expr *pA
101b0 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20  ndExpr = 0;     
101c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
101d0 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20   ".. AND (...)" 
101e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
101f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10200 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
10210 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
10220 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
10230 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
10240 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
10250 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
10260 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20  tor & WO_OR );. 
10270 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
10280 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
10290 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
102a0 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
102b0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
102c0 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
102d0 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
102e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
102f0 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
10300 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
10310 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
10320 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
10330 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
10340 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
10350 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
10360 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
10370 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
10380 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
10390 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
103a0 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
103b0 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
103c0 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
103d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
103e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
103f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
10400 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
10410 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
10420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10430 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
10440 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
10450 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
10460 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
10470 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
10480 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
10490 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
104a0 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
104b0 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
104c0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
104d0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
104e0 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20  ocRaw(db,.      
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
10510 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
10520 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
10530 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
10540 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
10550 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
10560 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
10570 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52  loc = (u8)(nNotR
10580 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
10590 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
105a0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
105b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
105c0 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
105d0 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
105e0 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
105f0 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
10600 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
10610 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
10620 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
10630 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
10640 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
10650 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
10660 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
10670 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
10680 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10690 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
106a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
106b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
106c0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
106d0 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
106e0 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
106f0 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
10700 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
10710 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
10720 77 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74  wset.  Or, creat
10730 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
10740 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61  ndex.    ** capa
10750 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70  ble of holding p
10760 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
10770 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  he case of a WIT
10780 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20  HOUT ROWID..    
10790 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
107a0 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
107b0 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
107c0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
107d0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
107e0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
107f0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
10800 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
10810 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
10820 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
10830 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
10840 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
10850 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
10860 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
10870 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
10880 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
10890 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
108a0 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
108b0 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
108c0 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
108d0 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
108e0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
108f0 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
10900 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
10910 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
10920 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
10930 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
10940 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
10950 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
10960 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
10970 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
10980 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
10990 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
109a0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
109b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
109c0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
109d0 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
109e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
109f0 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
10a00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10a10 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
10a20 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  owset);.      }e
10a30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  lse{.        Ind
10a40 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
10a50 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
10a60 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
10a70 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72  regRowset = pPar
10a80 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10a90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10aa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
10ab0 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f  Ephemeral, regRo
10ac0 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  wset, pPk->nKeyC
10ad0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10ae0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
10af0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b  Info(pParse, pPk
10b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10b10 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
10b20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
10b30 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
10b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10b60 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
10b70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
10b80 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
10b90 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
10ba0 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
10bb0 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
10bc0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
10bd0 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
10be0 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
10bf0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
10c00 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
10c10 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
10c20 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
10c30 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
10c40 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
10c50 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
10c60 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
10c70 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
10c80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10c90 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
10ca0 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
10cb0 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
10cc0 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
10cd0 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
10ce0 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
10cf0 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
10d00 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
10d10 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
10d20 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
10d30 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
10d40 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
10d50 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
10d60 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
10d70 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
10d80 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
10d90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
10da0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
10db0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
10dc0 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
10dd0 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
10de0 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
10df0 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
10e00 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
10e10 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
10e20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
10e30 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
10e40 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
10e50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10e60 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
10e70 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
10e80 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
10e90 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
10ea0 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
10eb0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
10ec0 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
10ed0 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
10ee0 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69     if( &pWC->a[i
10ef0 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29  Term] == pTerm )
10f00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10f10 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
10f20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
10f30 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
10f40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
10f50 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
10f60 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
10f70 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
10f80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10f90 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
10fa0 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
10fb0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20  CODED );.       
10fc0 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
10fd0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
10fe0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10ff0 5f 43 4f 44 45 44 29 29 21 3d 30 20 29 20 63 6f  _CODED))!=0 ) co
11000 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
11010 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
11020 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
11030 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
11040 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
11050 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
11060 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
11070 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
11080 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
11090 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
110a0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
110b0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
110c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
110d0 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
110e0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
110f0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
11100 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
11110 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
11120 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
11130 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46 4f 4c 44  D|TKFLG_DONTFOLD
11140 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
11150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11160 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 20 73  ..    /* Run a s
11170 65 70 61 72 61 74 65 20 57 48 45 52 45 20 63 6c  eparate WHERE cl
11180 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 65  ause for each te
11190 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61  rm of the OR cla
111a0 75 73 65 2e 20 20 41 66 74 65 72 0a 20 20 20 20  use.  After.    
111b0 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64  ** eliminating d
111c0 75 70 6c 69 63 61 74 65 73 20 66 72 6f 6d 20 6f  uplicates from o
111d0 74 68 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ther WHERE claus
111e0 65 73 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 66  es, the action f
111f0 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 73  or each.    ** s
11200 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
11210 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20  is to to invoke 
11220 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
11230 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
11240 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ne..    */.    w
11250 63 74 72 6c 46 6c 61 67 73 20 3d 20 20 57 48 45  ctrlFlags =  WHE
11260 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
11270 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
11280 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 45  Flags & WHERE_SE
11290 45 4b 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20 66  EK_TABLE);.    f
112a0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
112b0 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
112c0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
112d0 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
112e0 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
112f0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
11300 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
11310 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  | (pOrTerm->eOpe
11320 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
11330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  =0 ){.        Wh
11340 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e  ereInfo *pSubWIn
11350 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
11360 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
11370 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
11380 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
11390 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
113a0 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72  ->pExpr; /* Curr
113b0 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65  ent OR clause te
113c0 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  rm */.        in
113d0 74 20 6a 6d 70 31 20 3d 20 30 3b 20 20 20 20 20  t jmp1 = 0;     
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113f0 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70   Address of jump
11400 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
11410 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
11420 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
11430 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
11440 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
11450 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
11460 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
11470 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
11480 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
11490 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
114a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
114b0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
114c0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
114d0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
114e0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
114f0 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62 70  E(0xffff, ("Subp
11500 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73  lan for OR-claus
11510 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  e:\n"));.       
11520 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
11530 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
11540 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
11550 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20      wctrlFlags, 
11590 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
115a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
115b0 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
115c0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
115d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
115e0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
115f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
11600 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
11610 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  p;.          int
11620 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
11630 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
11640 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
11650 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
11660 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
11670 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
11680 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
11690 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
116a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
116b0 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53 74  e3WhereAddScanSt
116c0 61 74 75 73 28 76 2c 20 70 4f 72 54 61 62 2c 20  atus(v, pOrTab, 
116d0 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
116e0 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
116f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
11700 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57 48  is is the sub-WH
11710 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79 2e  ERE clause body.
11720 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76 65    First skip ove
11730 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  r.          ** d
11740 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66 72  uplicate rows fr
11750 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
11760 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 20  RE clauses, and 
11770 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20 20  record the.     
11780 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28 6f       ** rowid (o
11790 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 66  r PRIMARY KEY) f
117a0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
117b0 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ow so that the s
117c0 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
117d0 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b 69   row will be ski
117e0 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75 65  pped in subseque
117f0 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  nt sub-WHERE cla
11800 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20  uses..          
11810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
11820 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
11830 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
11840 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
11850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
11860 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
11870 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
11880 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
11890 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
118a0 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
118b0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
118c0 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
118d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
118e0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
118f0 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 72  Tab, -1, iCur, r
11900 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
11910 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 31 20             jmp1 
11920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11930 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
11940 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
11950 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  et, 0,.         
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20    r,iSet);.     
11990 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
119a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
119b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
119c0 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
119d0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
119e0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
119f0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
11a00 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50      int nPk = pP
11a10 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
11a20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
11a30 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  k;..            
11a40 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b    /* Read the PK
11a50 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
11a60 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  f temp registers
11a70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
11a80 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65     r = sqlite3Ge
11a90 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
11aa0 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  e, nPk);.       
11ab0 20 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30         for(iPk=0
11ac0 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b  ; iPk<nPk; iPk++
11ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11ae0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
11af0 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d  k->aiColumn[iPk]
11b00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11b10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11b20 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
11b30 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
11b40 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b 29  ol, iCur, r+iPk)
11b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11b60 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
11b70 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
11b80 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c 72 65   temp table alre
11b90 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  ady contains thi
11ba0 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20  s key. If so,.  
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
11bc0 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72 65 61  he row has alrea
11bd0 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64 65 64  dy been included
11be0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
11bf0 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  et and.         
11c00 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 69       ** can be i
11c10 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d 70 69  gnored (by jumpi
11c20 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f 73 75  ng past the Gosu
11c30 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77  b below). Otherw
11c40 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ise,.           
11c50 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65     ** insert the
11c60 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65   key into the te
11c70 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70 72 6f  mp table and pro
11c80 63 65 65 64 20 77 69 74 68 20 70 72 6f 63 65 73  ceed with proces
11c90 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  sing.           
11ca0 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20     ** the row.. 
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a               **.
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
11cd0 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65   Use some of the
11ce0 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69   same optimizati
11cf0 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53 65 74  ons as OP_RowSet
11d00 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a 20 20  Test: If iSet.  
11d10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
11d20 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65 20 74  s zero, assume t
11d30 68 61 74 20 74 68 65 20 6b 65 79 20 63 61 6e 6e  hat the key cann
11d40 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20 70 72  ot already be pr
11d50 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20 20  esent in.       
11d60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 65         ** the te
11d70 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20 69 66  mp table. And if
11d80 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61 73 73   iSet is -1, ass
11d90 75 6d 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ume that there i
11da0 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20  s no .          
11db0 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69      ** need to i
11dc0 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e  nsert the key in
11dd0 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
11de0 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 65  e, as it will ne
11df0 76 65 72 20 0a 20 20 20 20 20 20 20 20 20 20 20  ver .           
11e00 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65 64 20     ** be tested 
11e10 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20  for.  */ .      
11e20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
11e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11e40 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c 69 74      jmp1 = sqlit
11e50 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
11e60 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65 67  v, OP_Found, reg
11e70 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e 50  Rowset, 0, r, nP
11e80 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
11e90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11ea0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
11eb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11ec0 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20 29     if( iSet>=0 )
11ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ef0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
11f00 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72 65  cord, r, nPk, re
11f10 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
11f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11f40 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52  _IdxInsert, regR
11f50 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c  owset, regRowid,
11f60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
11f70 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 20       if( iSet ) 
11f80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11f90 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
11fa0 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11fd0 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72 61  Release the arra
11fe0 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74  y of temp regist
11ff0 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ers */.         
12000 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
12010 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
12020 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20  rse, r, nPk);.  
12030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12040 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
12050 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65     /* Invoke the
12060 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
12070 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  as a subroutine 
12080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
12090 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
120a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
120b0 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
120c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
120d0 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69 70   Jump here (skip
120e0 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f  ping the main lo
120f0 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74 69  op body subrouti
12100 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20 20  ne) if the.     
12110 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
12120 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69 73  sub-WHERE row is
12130 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72 6f   a duplicate fro
12140 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52  m prior sub-WHER
12150 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  Es. */.         
12160 20 69 66 28 20 6a 6d 70 31 20 29 20 73 71 6c 69   if( jmp1 ) sqli
12170 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12180 76 2c 20 6a 6d 70 31 29 3b 0a 0a 20 20 20 20 20  v, jmp1);..     
12190 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
121a0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
121b0 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
121c0 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
121d0 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
121e0 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
121f0 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
12200 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
12210 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
12220 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
12230 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
12240 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
12250 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
12260 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
12270 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
12280 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
12290 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
122a0 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
122b0 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
122c0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
122d0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
122e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
122f0 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
12300 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
12310 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
12320 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
12330 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
12340 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
12350 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
12360 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
12370 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
12380 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
12390 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
123a0 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
123b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
123c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
123d0 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
123e0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
123f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
12400 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
12410 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
12420 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
12430 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
12440 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
12450 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
12460 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
12470 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
12480 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
12490 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
124a0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
124b0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
124c0 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
124d0 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
124e0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
124f0 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
12500 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
12510 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
12520 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
12530 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
12540 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
12550 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
12560 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
12570 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
12580 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
12590 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
125a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
125b0 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62   pSubLoop = pSub
125c0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
125d0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  op;.          as
125e0 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d  sert( (pSubLoop-
125f0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
12600 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
12610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
12620 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
12630 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
12640 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20  XED)!=0.        
12650 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
12660 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
12670 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a  e.pIndex==pCov).
12680 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48             && (H
12690 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
126a0 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
126b0 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  dex(pSubLoop->u.
126c0 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20  btree.pIndex)). 
126d0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
126e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
126f0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
12700 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
12710 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
12720 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
12730 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
12740 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
12750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
12760 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
12770 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
12780 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
12790 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
127a0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
127b0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
127c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
127d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
127e0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
127f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12800 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
12810 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
12820 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
12830 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
12840 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
12850 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
12860 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
12870 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
12880 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
12890 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
128a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
128b0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
128c0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
128d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
128e0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
128f0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c  e3VdbeGoto(v, pL
12900 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
12910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12920 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
12930 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
12940 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
12950 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
12960 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
12970 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
12980 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
12990 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
129a0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
129b0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
129c0 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
129d0 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
129e0 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
129f0 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
12a00 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
12a10 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
12a20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
12a30 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
12a40 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
12a50 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
12a60 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
12a70 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
12a80 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
12a90 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
12aa0 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
12ab0 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
12ac0 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
12ad0 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
12ae0 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
12af0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
12b00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ){.      /* Tabl
12b10 65 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75  es marked isRecu
12b20 72 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20  rsive have only 
12b30 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61  a single row tha
12b40 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20  t is stored in. 
12b50 20 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f       ** a pseudo
12b60 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65  -cursor.  No nee
12b70 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e  d to Rewind or N
12b80 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72 73  ext such cursors
12b90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65  . */.      pLeve
12ba0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
12bb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12bc0 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74    codeCursorHint
12bd0 28 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66  (pTabItem, pWInf
12be0 6f 2c 20 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20  o, pLevel, 0);. 
12bf0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
12c00 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
12c10 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
12c20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
12c30 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
12c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c50 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
12c60 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
12c70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
12c80 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
12c90 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
12ca0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
12cb0 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  !=0);.      pLev
12cc0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
12cd0 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
12ce0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a  CAN_STEP;.    }.
12cf0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
12d00 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
12d10 43 41 4e 53 54 41 54 55 53 0a 20 20 70 4c 65 76  CANSTATUS.  pLev
12d20 65 6c 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  el->addrVisit = 
12d30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12d40 6e 74 41 64 64 72 28 76 29 3b 0a 23 65 6e 64 69  ntAddr(v);.#endi
12d50 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  f..  /* Insert c
12d60 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
12d70 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
12d80 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
12d90 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
12da0 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
12db0 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
12dc0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
12dd0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
12de0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
12df0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
12e00 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
12e10 20 20 20 69 6e 74 20 73 6b 69 70 4c 69 6b 65 41     int skipLikeA
12e20 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 74 65 73  ddr = 0;.    tes
12e30 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
12e40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
12e50 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
12e60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
12e70 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
12e80 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
12e90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
12ea0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
12eb0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
12ec0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
12ed0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
12ee0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
12ef0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
12f00 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
12f10 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
12f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f30 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
12f40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
12f50 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
12f60 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
12f70 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
12f80 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
12f90 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
12fa0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
12fb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
12fc0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
12fd0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
12fe0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
12ff0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
13000 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
13010 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
13020 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
13030 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
13040 43 4f 4e 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  COND ){.      /*
13050 20 49 66 20 74 68 65 20 54 45 52 4d 5f 4c 49 4b   If the TERM_LIK
13060 45 43 4f 4e 44 20 66 6c 61 67 20 69 73 20 73 65  ECOND flag is se
13070 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
13080 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 65 61  at the range sea
13090 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  rch.      ** is 
130a0 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 67 75  sufficient to gu
130b0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
130c0 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69   LIKE operator i
130d0 73 20 74 72 75 65 2c 20 73 6f 20 77 65 0a 20 20  s true, so we.  
130e0 20 20 20 20 2a 2a 20 63 61 6e 20 73 6b 69 70 20      ** can skip 
130f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  the call to the 
13100 6c 69 6b 65 28 41 2c 42 29 20 66 75 6e 63 74 69  like(A,B) functi
13110 6f 6e 2e 20 20 42 75 74 20 74 68 69 73 20 6f 6e  on.  But this on
13120 6c 79 20 77 6f 72 6b 73 0a 20 20 20 20 20 20 2a  ly works.      *
13130 2a 20 66 6f 72 20 73 74 72 69 6e 67 73 2e 20 20  * for strings.  
13140 53 6f 20 64 6f 20 6e 6f 74 20 73 6b 69 70 20 74  So do not skip t
13150 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 66  he call to the f
13160 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70  unction on the p
13170 61 73 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ass.      ** tha
13180 74 20 63 6f 6d 70 61 72 65 73 20 42 4c 4f 42 73  t compares BLOBs
13190 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
131a0 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
131b0 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20  ATCH_BLOBS.     
131c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
131d0 0a 20 20 20 20 20 20 75 33 32 20 78 20 3d 20 70  .      u32 x = p
131e0 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
131f0 6e 74 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ntr;.      asser
13200 74 28 20 78 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( x>0 );.      
13210 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73  skipLikeAddr = s
13220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13230 28 76 2c 20 28 78 26 31 29 3f 20 4f 50 5f 49 66  (v, (x&1)? OP_If
13240 4e 6f 74 20 3a 20 4f 50 5f 49 66 2c 20 28 69 6e  Not : OP_If, (in
13250 74 29 28 78 3e 3e 31 29 29 3b 0a 20 20 20 20 20  t)(x>>1));.     
13260 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
13280 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
13290 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
132a0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
132b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
132c0 20 20 20 20 69 66 28 20 73 6b 69 70 4c 69 6b 65      if( skipLike
132d0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
132e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 6b  beJumpHere(v, sk
132f0 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20 20 20  ipLikeAddr);.   
13300 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
13310 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
13320 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
13330 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72  code to test for
13340 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61   implied constra
13350 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72  ints based on tr
13360 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20  ansitivity.  ** 
13370 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72  of the "==" oper
13380 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
13390 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
133a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
133b0 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62  tains "t1.a=t2.b
133c0 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22  " and "t2.b=123"
133d0 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
133e0 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c   coding the t1 l
133f0 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c  oop and the t2 l
13400 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20  oop has not yet 
13410 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  coded,.  ** then
13420 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74   we cannot use t
13430 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63  he "t1.a=t2.b" c
13440 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77  onstraint, but w
13450 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20  e can code.  ** 
13460 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e  the implied "t1.
13470 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e  a=123" constrain
13480 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  t..  */.  for(pT
13490 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
134a0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
134b0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
134c0 20 20 45 78 70 72 20 2a 70 45 2c 20 73 45 41 6c    Expr *pE, sEAl
134d0 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
134e0 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20   *pAlt;.    if( 
134f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13500 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
13510 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
13520 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13530 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13540 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   & (WO_EQ|WO_IS)
13550 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
13560 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13570 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13580 45 51 55 49 56 29 3d 3d 30 20 29 20 63 6f 6e 74  EQUIV)==0 ) cont
13590 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
135a0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
135b0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
135c0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
135d0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f  ->iLeftJoin ) co
135e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
135f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
13600 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
13610 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
13620 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
13630 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
13640 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
13650 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
13660 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
13670 6c 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lt = sqlite3Wher
13680 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
13690 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
136a0 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
136b0 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
136c0 20 20 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f          WO_EQ|WO
136d0 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _IN|WO_IS, 0);. 
136e0 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
136f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13700 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
13710 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
13720 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13730 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
13740 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
13750 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
13760 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
13770 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
13780 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
13790 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
137a0 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d  _IN );.    VdbeM
137b0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
137c0 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
137d0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
137e0 3b 0a 20 20 20 20 73 45 41 6c 74 20 3d 20 2a 70  ;.    sEAlt = *p
137f0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
13800 73 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20 70 45  sEAlt.pLeft = pE
13810 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c  ->pLeft;.    sql
13820 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
13830 70 50 61 72 73 65 2c 20 26 73 45 41 6c 74 2c 20  pParse, &sEAlt, 
13840 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
13850 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
13860 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
13870 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
13880 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
13890 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
138a0 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
138b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
138c0 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
138d0 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
138e0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
138f0 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
13900 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
13910 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
13920 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
13930 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13940 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
13950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13960 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
13970 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
13980 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
13990 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
139a0 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
139b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
139c0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
139d0 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
139e0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
139f0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
13a00 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
13a10 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
13a20 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13a30 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
13a40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13a50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
13a60 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
13a70 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
13a80 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
13a90 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
13aa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13ab0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13ac0 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
13ad0 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
13ae0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13af0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
13b00 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
13b10 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13b20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
13b30 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
13b40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13b50 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
13b60 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
13b70 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
13b80 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
13b90 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
13ba0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
13bb0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
13bc0 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e   return pLevel->
13bd0 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a              notReady;.}.