/ Hex Artifact Content
Login

Artifact 943e32e9dccd0af802e0683ae11071c8bd808364e5908a5fb66758bd404c8681:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 36  /*.** 2015-06-06
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44  hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  BE code used to 
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57  process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53  HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77  *.** This file w
01f0: 61 73 20 73 70 6c 69 74 20 6f 66 66 20 66 72 6f  as split off fro
0200: 6d 20 77 68 65 72 65 2e 63 20 6f 6e 20 32 30 31  m where.c on 201
0210: 35 2d 30 36 2d 30 36 20 69 6e 20 6f 72 64 65 72  5-06-06 in order
0220: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 0a 2a   to reduce the.*
0230: 2a 20 73 69 7a 65 20 6f 66 20 77 68 65 72 65 2e  * size of where.
0240: 63 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 65 61  c and make it ea
0250: 73 69 65 72 20 74 6f 20 65 64 69 74 2e 20 20 54  sier to edit.  T
0260: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
0270: 73 20 74 68 65 20 72 6f 75 74 69 6e 65 73 0a 2a  s the routines.*
0280: 2a 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  * that actually 
0290: 67 65 6e 65 72 61 74 65 20 74 68 65 20 62 75 6c  generate the bul
02a0: 6b 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  k of the WHERE l
02b0: 6f 6f 70 20 63 6f 64 65 2e 20 20 54 68 65 20 6f  oop code.  The o
02c0: 72 69 67 69 6e 61 6c 20 77 68 65 72 65 2e 63 0a  riginal where.c.
02d0: 2a 2a 20 66 69 6c 65 20 72 65 74 61 69 6e 73 20  ** file retains 
02e0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 64 6f  the code that do
02f0: 65 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e  es query plannin
0300: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 2e 0a  g and analysis..
0310: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0320: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0330: 64 65 20 22 77 68 65 72 65 49 6e 74 2e 68 22 0a  de "whereInt.h".
0340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0350: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 0a 2f 2a  OMIT_EXPLAIN../*
0360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0370: 61 6d 65 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ame of the i-th 
0380: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 49  column of the pI
0390: 64 78 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  dx index..*/.sta
03a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
03b0: 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75  explainIndexColu
03c0: 6d 6e 4e 61 6d 65 28 49 6e 64 65 78 20 2a 70 49  mnName(Index *pI
03d0: 64 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 20  dx, int i){.  i 
03e0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
03f0: 5b 69 5d 3b 0a 20 20 69 66 28 20 69 3d 3d 58 4e  [i];.  if( i==XN
0400: 5f 45 58 50 52 20 29 20 72 65 74 75 72 6e 20 22  _EXPR ) return "
0410: 3c 65 78 70 72 3e 22 3b 0a 20 20 69 66 28 20 69  <expr>";.  if( i
0420: 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 20 72 65 74  ==XN_ROWID ) ret
0430: 75 72 6e 20 22 72 6f 77 69 64 22 3b 0a 20 20 72  urn "rowid";.  r
0440: 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54 61 62  eturn pIdx->pTab
0450: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
0460: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
0470: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
0480: 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
0490: 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
04a0: 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
04b0: 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
04c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
04d0: 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
04e0: 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
04f0: 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
0500: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
0510: 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
0520: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
0530: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
0540: 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
0550: 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
0560: 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
0570: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
0580: 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
0590: 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
05a0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
05b0: 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
05c0: 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
05d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
05e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
05f0: 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 49 6e  ng built */.  In
0600: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
0610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0620: 65 78 20 74 6f 20 72 65 61 64 20 63 6f 6c 75 6d  ex to read colum
0630: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 2a 2f 0a  n names from */.
0640: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0660: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
0670: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 2f 2a 20 5a 65 72 6f 2d 62 61 73 65 64 20    /* Zero-based 
06a0: 69 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  index of first t
06b0: 65 72 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 41  erm. */.  int bA
06c0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
06d0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
06e0: 6f 20 74 6f 20 61 70 70 65 6e 64 20 22 20 41 4e  o to append " AN
06f0: 44 20 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  D " */.  const c
0700: 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
0710: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0720: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
0730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  ){.  int i;..  a
0740: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 3d 31 20  ssert( nTerm>=1 
0750: 29 3b 0a 20 20 69 66 28 20 62 41 6e 64 20 29 20  );.  if( bAnd ) 
0760: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
0770: 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
0780: 44 20 22 2c 20 35 29 3b 0a 0a 20 20 69 66 28 20  D ", 5);..  if( 
0790: 6e 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65  nTerm>1 ) sqlite
07a0: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
07b0: 70 53 74 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20  pStr, "(", 1);. 
07c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
07d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
07e0: 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
07f0: 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
0800: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 73 71   ",", 1);.    sq
0810: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
0820: 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 65 78 70  endAll(pStr, exp
0830: 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e  lainIndexColumnN
0840: 61 6d 65 28 70 49 64 78 2c 20 69 54 65 72 6d 2b  ame(pIdx, iTerm+
0850: 69 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  i));.  }.  if( n
0860: 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33  Term>1 ) sqlite3
0870: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0880: 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a 0a 20  Str, ")", 1);.. 
0890: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
08a0: 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
08b0: 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 54 65  , 1);..  if( nTe
08c0: 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  rm>1 ) sqlite3St
08d0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
08e0: 72 2c 20 22 28 22 2c 20 31 29 3b 0a 20 20 66 6f  r, "(", 1);.  fo
08f0: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
0900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
0910: 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
0920: 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 2c  mAppend(pStr, ",
0930: 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 1);.    sqlit
0940: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0950: 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
0960: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3e    }.  if( nTerm>
0970: 31 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  1 ) sqlite3StrAc
0980: 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
0990: 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ")", 1);.}../*.*
09a0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
09b0: 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
09c0: 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
09d0: 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
09e0: 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
09f0: 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20 74  n appends text t
0a00: 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73 63  o pStr that desc
0a10: 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65 74  ribes the subset
0a20: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77   of table.** row
0a30: 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
0a40: 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
0a50: 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c 20   form of an SQL 
0a60: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0a70: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
0a80: 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
0a90: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
0aa0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
0ab0: 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
0ac0: 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
0ad0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
0ae0: 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
0af0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0b00: 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
0b10: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
0b20: 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
0b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
0b40: 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
0b50: 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c  (StrAccum *pStr,
0b60: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
0b70: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  p){.  Index *pIn
0b80: 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
0b90: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
0ba0: 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
0bb0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
0bc0: 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
0bd0: 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69  ->nSkip;.  int i
0be0: 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d  , j;..  if( nEq=
0bf0: 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73  =0 && (pLoop->ws
0c00: 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  Flags&(WHERE_BTM
0c10: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
0c20: 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65  _LIMIT))==0 ) re
0c30: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
0c40: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
0c50: 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  tr, " (", 2);.  
0c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
0c70: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
0c80: 63 68 61 72 20 2a 7a 20 3d 20 65 78 70 6c 61 69  char *z = explai
0c90: 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65  nIndexColumnName
0ca0: 28 70 49 6e 64 65 78 2c 20 69 29 3b 0a 20 20 20  (pIndex, i);.   
0cb0: 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
0cc0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
0cd0: 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
0ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  ;.    sqlite3XPr
0cf0: 69 6e 74 66 28 70 53 74 72 2c 20 69 3e 3d 6e 53  intf(pStr, i>=nS
0d00: 6b 69 70 20 3f 20 22 25 73 3d 3f 22 20 3a 20 22  kip ? "%s=?" : "
0d10: 41 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20  ANY(%s)", z);.  
0d20: 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
0d30: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
0d40: 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
0d50: 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41   ){.    explainA
0d60: 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
0d70: 70 49 6e 64 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75  pIndex, pLoop->u
0d80: 2e 62 74 72 65 65 2e 6e 42 74 6d 2c 20 6a 2c 20  .btree.nBtm, j, 
0d90: 69 2c 20 22 3e 22 29 3b 0a 20 20 20 20 69 20 3d  i, ">");.    i =
0da0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
0db0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
0dc0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
0dd0: 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
0de0: 64 54 65 72 6d 28 70 53 74 72 2c 20 70 49 6e 64  dTerm(pStr, pInd
0df0: 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ex, pLoop->u.btr
0e00: 65 65 2e 6e 54 6f 70 2c 20 6a 2c 20 69 2c 20 22  ee.nTop, j, i, "
0e10: 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
0e20: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
0e30: 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
0e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0e50: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
0e60: 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
0e70: 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
0e80: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0e90: 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
0ea0: 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
0eb0: 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
0ec0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
0ed0: 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
0ee0: 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
0ef0: 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
0f00: 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
0f10: 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
0f20: 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
0f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
0f40: 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
0f50: 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
0f60: 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
0f70: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
0f80: 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
0f90: 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
0fa0: 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
0fb0: 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
0fc0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
0fd0: 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
0fe0: 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
0ff0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1000: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nt sqlite3WhereE
1010: 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1050: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1060: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1070: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1080: 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1090: 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
10a0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
10b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10c0: 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
10d0: 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
10e0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
10f0: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1110: 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1120: 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1130: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1160: 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1170: 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1180: 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
11b0: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
11c0: 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  gin() */.){.  in
11d0: 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21  t ret = 0;.#if !
11e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11f0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
1200: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1210: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
1220: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1230: 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
1240: 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  if.  {.    struc
1250: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1260: 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
1270: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1280: 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
1290: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12a0: 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
12b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
12c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
12d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
12e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12f0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  handle */.    in
1300: 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
1310: 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
1320: 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
1330: 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
1340: 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
1350: 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
1360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1370: 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
1380: 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
1390: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
13a0: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
13b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
13c0: 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
13d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
13e0: 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1400: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
1410: 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
1420: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1450: 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1460: 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 73  /.    StrAccum s
1470: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
1480: 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75      /* EQP outpu
1490: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  t string */.    
14a0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20  char zBuf[100]; 
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c0: 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66   Initial space f
14d0: 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20 73 74  or EQP output st
14e0: 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  ring */..    pLo
14f0: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1500: 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1510: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1520: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1530: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1540: 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1550: 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
1560: 45 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  E) ) return 0;..
1570: 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
1580: 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
1590: 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
15a0: 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
15b0: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
15c0: 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
15d0: 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
15e0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
15f0: 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
1600: 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
1610: 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
1620: 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
1630: 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c  _MAX));..    sql
1640: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
1650: 28 26 73 74 72 2c 20 64 62 2c 20 7a 42 75 66 2c  (&str, db, zBuf,
1660: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53   sizeof(zBuf), S
1670: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  );.    sqlite3St
1690: 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
16a0: 26 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f  &str, isSearch ?
16b0: 20 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41   "SEARCH" : "SCA
16c0: 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
16d0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
16e0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
16f0: 6e 74 66 28 26 73 74 72 2c 20 22 20 53 55 42 51  ntf(&str, " SUBQ
1700: 55 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d  UERY %d", pItem-
1710: 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
1720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1730: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1740: 72 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20  r, " TABLE %s", 
1750: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1760: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1770: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1780: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1790: 6e 74 66 28 26 73 74 72 2c 20 22 20 41 53 20 25  ntf(&str, " AS %
17a0: 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
17b0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
17c0: 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
17d0: 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
17e0: 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20 29 7b  UALTABLE))==0 ){
17f0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1800: 72 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20 20 20  r *zFmt = 0;.   
1810: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1830: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1840: 6e 64 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  ndex!=0 );.     
1850: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
1860: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1870: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
1880: 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f  lags&WHERE_AUTO_
1890: 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73  INDEX) || (flags
18a0: 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
18b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
18c0: 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
18d0: 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
18e0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
18f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1900: 73 53 65 61 72 63 68 20 29 7b 0a 20 20 20 20 20  sSearch ){.     
1910: 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 50 52 49       zFmt = "PRI
1920: 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20 20 20 20  MARY KEY";.     
1930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1940: 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45   if( flags & WHE
1950: 52 45 5f 50 41 52 54 49 41 4c 49 44 58 20 29 7b  RE_PARTIALIDX ){
1960: 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
1970: 22 41 55 54 4f 4d 41 54 49 43 20 50 41 52 54 49  "AUTOMATIC PARTI
1980: 41 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  AL COVERING INDE
1990: 58 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  X";.      }else 
19a0: 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
19b0: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a  E_AUTO_INDEX ){.
19c0: 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
19d0: 41 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49  AUTOMATIC COVERI
19e0: 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
19f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1a00: 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1a10: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  Y ){.        zFm
1a20: 74 20 3d 20 22 43 4f 56 45 52 49 4e 47 20 49 4e  t = "COVERING IN
1a30: 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
1a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46  else{.        zF
1a50: 6d 74 20 3d 20 22 49 4e 44 45 58 20 25 73 22 3b  mt = "INDEX %s";
1a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a70: 66 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20 20 20  f( zFmt ){.     
1a80: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1a90: 75 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22  umAppend(&str, "
1aa0: 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a 20 20   USING ", 7);.  
1ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1ac0: 69 6e 74 66 28 26 73 74 72 2c 20 7a 46 6d 74 2c  intf(&str, zFmt,
1ad0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
1ae0: 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 49 6e         explainIn
1af0: 64 65 78 52 61 6e 67 65 28 26 73 74 72 2c 20 70  dexRange(&str, p
1b00: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Loop);.      }. 
1b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1b20: 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1b30: 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=0 && (flags & 
1b40: 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1b50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
1b60: 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 67 65  nst char *zRange
1b70: 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  Op;.      if( fl
1b80: 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
1b90: 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1ba0: 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
1bb0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3d 22 3b   zRangeOp = "=";
1bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1bd0: 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
1be0: 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
1bf0: 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
1c00: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1c10: 3d 20 22 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  = ">? AND rowid<
1c20: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1c30: 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
1c40: 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c50: 20 20 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22      zRangeOp = "
1c60: 3e 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  >";.      }else{
1c70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c80: 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
1c90: 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20 20 20  _LIMIT);.       
1ca0: 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3c 22 3b   zRangeOp = "<";
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cc0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1cd0: 74 72 2c 20 22 20 55 53 49 4e 47 20 49 4e 54 45  tr, " USING INTE
1ce0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
1cf0: 28 72 6f 77 69 64 25 73 3f 29 22 2c 7a 52 61 6e  (rowid%s?)",zRan
1d00: 67 65 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 69 66  geOp);.    }.#if
1d10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d30: 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1d40: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1d50: 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1d70: 74 66 28 26 73 74 72 2c 20 22 20 56 49 52 54 55  tf(&str, " VIRTU
1d80: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1d90: 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d:%s",.         
1da0: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1db0: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1dc0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1dd0: 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1de0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1df0: 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54  _EXPLAIN_ESTIMAT
1e00: 45 44 5f 52 4f 57 53 0a 20 20 20 20 69 66 28 20  ED_ROWS.    if( 
1e10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20  pLoop->nOut>=10 
1e20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e30: 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 22 20  XPrintf(&str, " 
1e40: 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 20 73  (~%llu rows)", s
1e50: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
1e60: 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  t(pLoop->nOut));
1e70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e80: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1e90: 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20  mAppend(&str, " 
1ea0: 28 7e 31 20 72 6f 77 29 22 2c 20 39 29 3b 0a 20  (~1 row)", 9);. 
1eb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ec0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 53 74  zMsg = sqlite3St
1ed0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74  rAccumFinish(&st
1ee0: 72 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  r);.    ret = sq
1ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1f00: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1f10: 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1f20: 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59 4e 41 4d  m, zMsg,P4_DYNAM
1f30: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
1f40: 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  n ret;.}.#endif 
1f50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1f60: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1f70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f80: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1f90: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1fa0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1fb0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1fc0: 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1fd0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1fe0: 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1ff0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2000: 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
2010: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
2020: 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
2030: 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
2040: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2050: 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
2060: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
2070: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
2080: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
2090: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
20a0: 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
20b0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
20c0: 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
20d0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
20e0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
20f0: 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
2100: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2110: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
2120: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
2150: 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
2160: 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
2170: 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
2180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
2190: 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
21a0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
21b0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
21c0: 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
21d0: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
21e0: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
21f0: 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
2200: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2230: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
2240: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
2250: 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
2260: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2270: 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
2280: 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
2290: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
22a0: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
22b0: 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
22c0: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
22d0: 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
22e0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22f0: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
2300: 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
2310: 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
2320: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
2330: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
2340: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
2350: 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
2360: 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
2370: 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
2380: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
2390: 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69  Obj.  );.}.#endi
23a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  f.../*.** Disabl
23b0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
23c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
23d0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
23e0: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
23f0: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
2400: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2410: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
2420: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2430: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
2440: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
2450: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
2460: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
2470: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
2480: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
2490: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
24a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24b0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
24c0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
24d0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
24e0: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
24f0: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2500: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
2510: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
2520: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
2530: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2540: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
2550: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
2560: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
2570: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2580: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
2590: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
25a0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
25b0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
25c0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
25d0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
25e0: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
25f0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
2600: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
2610: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
2620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
2630: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
2640: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
2650: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
2660: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2670: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2680: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
2690: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
26a0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
26b0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
26c0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
26d0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
26e0: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
26f0: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
2700: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
2710: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
2720: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
2730: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
2740: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
2750: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
2760: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
2770: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
2780: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
2790: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
27a0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
27b0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
27c0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
27d0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
27e0: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
27f0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
2800: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  3..**.** If all 
2810: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  the children of 
2820: 61 20 74 65 72 6d 20 61 72 65 20 64 69 73 61 62  a term are disab
2830: 6c 65 64 2c 20 74 68 65 6e 20 74 68 61 74 20 74  led, then that t
2840: 65 72 6d 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  erm is also.** a
2850: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 69 73  utomatically dis
2860: 61 62 6c 65 64 2e 20 20 49 6e 20 74 68 69 73 20  abled.  In this 
2870: 77 61 79 2c 20 74 65 72 6d 73 20 67 65 74 20 64  way, terms get d
2880: 69 73 61 62 6c 65 64 20 69 66 20 64 65 72 69 76  isabled if deriv
2890: 65 64 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ed.** virtual te
28a0: 72 6d 73 20 61 72 65 20 74 65 73 74 65 64 20 66  rms are tested f
28b0: 69 72 73 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  irst.  For examp
28c0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  le:.**.**      x
28d0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 41 4e 44   GLOB 'abc*' AND
28e0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
28f0: 27 61 63 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f  'acd'.**      \_
2900: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
2910: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  \______/     \__
2920: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
2930: 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  parent          
2940: 63 68 69 6c 64 31 20 20 20 20 20 20 20 63 68 69  child1       chi
2950: 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ld2.**.** Only t
2960: 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20 77  he parent term w
2970: 61 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  as in the origin
2980: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
2990: 20 20 54 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20    The child1.** 
29a0: 61 6e 64 20 63 68 69 6c 64 32 20 74 65 72 6d 73  and child2 terms
29b0: 20 77 65 72 65 20 61 64 64 65 64 20 62 79 20 74   were added by t
29c0: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
29d0: 74 69 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f  tion.  If both o
29e0: 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c  f.** the virtual
29f0: 20 63 68 69 6c 64 20 74 65 72 6d 73 20 61 72 65   child terms are
2a00: 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 65 73   valid, then tes
2a10: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 65  ting of the pare
2a20: 6e 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b  nt can be .** sk
2a30: 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  ipped..**.** Usu
2a40: 61 6c 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  ally the parent 
2a50: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 61  term is marked a
2a60: 73 20 54 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42  s TERM_CODED.  B
2a70: 75 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ut if the parent
2a80: 0a 2a 2a 20 74 65 72 6d 20 77 61 73 20 6f 72 69  .** term was ori
2a90: 67 69 6e 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b  ginally TERM_LIK
2aa0: 45 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65  E, then the pare
2ab0: 6e 74 20 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b  nt gets TERM_LIK
2ac0: 45 43 4f 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a  ECOND instead..*
2ad0: 2a 20 54 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43  * The TERM_LIKEC
2ae0: 4f 4e 44 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69  OND marking indi
2af0: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
2b00: 65 72 6d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  erm should be co
2b10: 64 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20  ded inside.** a 
2b20: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 75 63 68  conditional such
2b30: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 65 76   that is only ev
2b40: 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
2b50: 65 63 6f 6e 64 20 70 61 73 73 20 6f 66 20 61 0a  econd pass of a.
2b60: 2a 2a 20 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61  ** LIKE-optimiza
2b70: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20  tion loop, when 
2b80: 73 63 61 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69  scanning BLOBs i
2b90: 6e 73 74 65 61 64 20 6f 66 20 73 74 72 69 6e 67  nstead of string
2ba0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2bb0: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
2bc0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2bd0: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
2be0: 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  rm){.  int nLoop
2bf0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 41   = 0;.  while( A
2c00: 4c 57 41 59 53 28 70 54 65 72 6d 21 3d 30 29 0a  LWAYS(pTerm!=0).
2c10: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
2c20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2c30: 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
2c40: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
2c50: 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
2c60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
2c70: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
2c80: 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26  mJoin)).      &&
2c90: 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61   (pLevel->notRea
2ca0: 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72  dy & pTerm->prer
2cb0: 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20  eqAll)==0.  ){. 
2cc0: 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20     if( nLoop && 
2cd0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
2ce0: 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20  & TERM_LIKE)!=0 
2cf0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
2d00: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2d10: 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65  LIKECOND;.    }e
2d20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
2d30: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2d40: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
2d50: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
2d60: 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b  arent<0 ) break;
2d70: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 54  .    pTerm = &pT
2d80: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
2d90: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
2da0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
2db0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2dc0: 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
2dd0: 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
2de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2df0: 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
2e00: 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
2e10: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
2e20: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
2e30: 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
2e40: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
2e50: 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
2e60: 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
2e70: 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
2e80: 42 4c 4f 42 20 65 6e 74 72 69 65 73 20 28 77 68  BLOB entries (wh
2e90: 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
2ea0: 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
2eb0: 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
2ec0: 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
2ed0: 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
2ee0: 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
2ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
2f00: 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
2f10: 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
2f20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f30: 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
2f40: 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
2f50: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
2f60: 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
2f70: 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
2f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2f90: 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
2fa0: 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
2fb0: 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
2fc0: 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
2fd0: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
2fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3000: 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
3010: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3020: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
3030: 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
3040: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3050: 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
3060: 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
3070: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
3080: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 65 6e  LITE_AFF_BLOB en
3090: 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
30a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
30b0: 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
30c0: 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
30d0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
30e0: 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
30f0: 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
3100: 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
3110: 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
3120: 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
3130: 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
3140: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
3150: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
3160: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
3170: 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
3180: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
3190: 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
31a0: 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
31b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
31d0: 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 2c 20 30  nity, base, n, 0
31e0: 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
31f0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
3200: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
3210: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
3230: 70 72 65 73 73 69 6f 6e 20 70 52 69 67 68 74 2c  pression pRight,
3240: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 48   which is the RH
3250: 53 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  S of a compariso
3260: 6e 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 73 20  n operation, is 
3270: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 76 65 63  .** either a vec
3280: 74 6f 72 20 6f 66 20 6e 20 65 6c 65 6d 65 6e 74  tor of n element
3290: 73 20 6f 72 2c 20 69 66 20 6e 3d 3d 31 2c 20 61  s or, if n==1, a
32a0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
32b0: 6f 6e 2e 0a 2a 2a 20 42 65 66 6f 72 65 20 74 68  on..** Before th
32c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
32d0: 72 61 74 69 6f 6e 2c 20 61 66 66 69 6e 69 74 79  ration, affinity
32e0: 20 7a 41 66 66 20 69 73 20 74 6f 20 62 65 20 61   zAff is to be a
32f0: 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pplied.** to the
3300: 20 70 52 69 67 68 74 20 76 61 6c 75 65 73 2e 20   pRight values. 
3310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
3320: 64 69 66 69 65 73 20 63 68 61 72 61 63 74 65 72  difies character
3330: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
3340: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
3350: 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  to SQLITE_AFF_BL
3360: 4f 42 20 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a  OB if either:.**
3370: 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63 6f 6d 70  .**   * the comp
3380: 61 72 69 73 6f 6e 20 77 69 6c 6c 20 62 65 20 70  arison will be p
3390: 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
33a0: 20 61 66 66 69 6e 69 74 79 2c 20 6f 72 0a 2a 2a   affinity, or.**
33b0: 20 20 20 2a 20 74 68 65 20 61 66 66 69 6e 69 74     * the affinit
33c0: 79 20 63 68 61 6e 67 65 20 69 6e 20 7a 41 66 66  y change in zAff
33d0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
33e0: 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ot to change the
33f0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
3400: 63 20 76 6f 69 64 20 75 70 64 61 74 65 52 61 6e  c void updateRan
3410: 67 65 41 66 66 69 6e 69 74 79 53 74 72 28 0a 20  geAffinityStr(. 
3420: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 2f 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61   /* RHS of compa
3450: 72 69 73 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  rison */.  int n
3460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3480: 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
3490: 6c 65 6d 65 6e 74 73 20 69 6e 20 63 6f 6d 70 61  lements in compa
34a0: 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  rison */.  char 
34b0: 2a 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 20  *zAff           
34c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
34d0: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
34e0: 20 6d 6f 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20   modify */.){.  
34f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3500: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3510: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3520: 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
3530: 65 78 70 72 28 70 52 69 67 68 74 2c 20 69 29 3b  expr(pRight, i);
3540: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3550: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
3560: 70 2c 20 7a 41 66 66 5b 69 5d 29 3d 3d 53 51 4c  p, zAff[i])==SQL
3570: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 20 20 20  ITE_AFF_BLOB.   
3580: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
3590: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
35a0: 68 61 6e 67 65 28 70 2c 20 7a 41 66 66 5b 69 5d  hange(p, zAff[i]
35b0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 7a  ).    ){.      z
35c0: 41 66 66 5b 69 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[i] = SQLITE_
35d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
35e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
35f0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
3600: 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
3610: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
3620: 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
3630: 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
3640: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
3650: 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
3660: 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
3670: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
3680: 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
3690: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
36a0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
36b0: 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 61  int is left in a
36c0: 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 20 69   register, the i
36d0: 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69 63 68  ndex.** of which
36e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
36f0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
3700: 65 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  e store the resu
3710: 6c 74 20 69 6e 20 69 54 61 72 67 65 74 20 62 75  lt in iTarget bu
3720: 74 0a 2a 2a 20 74 68 69 73 20 69 73 20 6f 6e 6c  t.** this is onl
3730: 79 20 67 75 61 72 61 6e 74 65 65 64 20 66 6f 72  y guaranteed for
3740: 20 54 4b 5f 49 53 4e 55 4c 4c 20 61 6e 64 20 54   TK_ISNULL and T
3750: 4b 5f 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  K_IN constraints
3760: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e  .  If the.** con
3770: 73 74 72 61 69 6e 74 20 69 73 20 61 20 54 4b 5f  straint is a TK_
3780: 45 51 20 6f 72 20 54 4b 5f 49 53 2c 20 74 68 65  EQ or TK_IS, the
3790: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
37a0: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  lue might be lef
37b0: 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  t in.** some oth
37c0: 65 72 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  er register and 
37d0: 69 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  it is the caller
37e0: 27 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  's responsibilit
37f0: 79 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74 65 2e  y to compensate.
3800: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
3810: 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
3820: 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
3830: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
3840: 61 6c 75 61 74 65 64 20 69 6e 0a 2a 2a 20 73 74  aluated in.** st
3850: 72 61 69 67 68 74 2d 6c 69 6e 65 20 63 6f 64 65  raight-line code
3860: 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
3870: 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
3880: 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
3890: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
38a0: 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
38b0: 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
38c0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
38d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
38e0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
38f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3900: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
3910: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3920: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3930: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
3940: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
3950: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
3960: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
3970: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54  el *pLevel, /* T
3980: 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
3990: 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
39a0: 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
39b0: 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20  .  int iEq,     
39c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
39d0: 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
39e0: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73  term within this
39f0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
3a00: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
3a10: 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65  /* True for reve
3a20: 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65  rse-order IN ope
3a30: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
3a40: 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
3a50: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
3a60: 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
3a70: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
3a80: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
3a90: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
3aa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3ab0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3ac0: 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
3ad0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
3ae0: 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
3af0: 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
3b00: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
3b10: 3e 61 4c 54 65 72 6d 5b 69 45 71 5d 3d 3d 70 54  >aLTerm[iEq]==pT
3b20: 65 72 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  erm );.  assert(
3b30: 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
3b40: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
3b50: 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  Q || pX->op==TK_
3b60: 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  IS ){.    iReg =
3b70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3b80: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
3b90: 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
3ba0: 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
3bb0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
3bc0: 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
3bd0: 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
3be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bf0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
3c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
3c10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3c20: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
3c30: 69 6e 74 20 65 54 79 70 65 20 3d 20 49 4e 5f 49  int eType = IN_I
3c40: 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 20 20 69  NDEX_NOOP;.    i
3c50: 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
3c60: 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
3c70: 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
3c80: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
3c90: 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  pWLoop;.    int 
3ca0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  i;.    int nEq =
3cb0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 4d   0;.    int *aiM
3cc0: 61 70 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ap = 0;..    if(
3cd0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
3ce0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
3cf0: 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
3d00: 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
3d10: 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
3d20: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
3d30: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
3d40: 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
3d50: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
3d60: 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
3d70: 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
3d80: 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
3d90: 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
3da0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
3db0: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
3dc0: 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
3dd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3de0: 69 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  iEq; i++){.     
3df0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   if( pLoop->aLTe
3e00: 72 6d 5b 69 5d 20 26 26 20 70 4c 6f 6f 70 2d 3e  rm[i] && pLoop->
3e10: 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72  aLTerm[i]->pExpr
3e20: 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ==pX ){.        
3e30: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
3e40: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  el, pTerm);.    
3e50: 20 20 20 20 72 65 74 75 72 6e 20 69 54 61 72 67      return iTarg
3e60: 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
3e70: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 45 71 3b  }.    for(i=iEq;
3e80: 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  i<pLoop->nLTerm;
3e90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3ea0: 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 61   ALWAYS(pLoop->a
3eb0: 4c 54 65 72 6d 5b 69 5d 29 20 26 26 20 70 4c 6f  LTerm[i]) && pLo
3ec0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
3ed0: 45 78 70 72 3d 3d 70 58 20 29 20 6e 45 71 2b 2b  Expr==pX ) nEq++
3ee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
3ef0: 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
3f00: 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 20 7c  _xIsSelect)==0 |
3f10: 7c 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  | pX->x.pSelect-
3f20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
3f30: 31 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  1 ){.      eType
3f40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
3f50: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
3f60: 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
3f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
3f80: 65 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  e{.      Select 
3f90: 2a 70 53 65 6c 65 63 74 20 3d 20 70 58 2d 3e 78  *pSelect = pX->x
3fa0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
3fb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3fc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
3fd0: 75 31 36 20 73 61 76 65 64 44 62 4f 70 74 46 6c  u16 savedDbOptFl
3fe0: 61 67 73 20 3d 20 64 62 2d 3e 64 62 4f 70 74 46  ags = db->dbOptF
3ff0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 45 78 70 72  lags;.      Expr
4000: 4c 69 73 74 20 2a 70 4f 72 69 67 52 68 73 20 3d  List *pOrigRhs =
4010: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
4020: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
4030: 20 2a 70 4f 72 69 67 4c 68 73 20 3d 20 70 58 2d   *pOrigLhs = pX-
4040: 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 3b  >pLeft->x.pList;
4050: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
4060: 2a 70 52 68 73 20 3d 20 30 3b 20 20 20 20 20 20  *pRhs = 0;      
4070: 20 20 20 2f 2a 20 4e 65 77 20 53 65 6c 65 63 74     /* New Select
4080: 2e 70 45 4c 69 73 74 20 66 6f 72 20 52 48 53 20  .pEList for RHS 
4090: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
40a0: 74 20 2a 70 4c 68 73 20 3d 20 30 3b 20 20 20 20  t *pLhs = 0;    
40b0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 58 2d 3e       /* New pX->
40c0: 70 4c 65 66 74 20 76 65 63 74 6f 72 20 2a 2f 0a  pLeft vector */.
40d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 45 71  .      for(i=iEq
40e0: 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  ;i<pLoop->nLTerm
40f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4100: 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
4110: 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
4120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4130: 20 69 46 69 65 6c 64 20 3d 20 70 4c 6f 6f 70 2d   iField = pLoop-
4140: 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 69 46 69 65  >aLTerm[i]->iFie
4150: 6c 64 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld - 1;.        
4160: 20 20 45 78 70 72 20 2a 70 4e 65 77 52 68 73 20    Expr *pNewRhs 
4170: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4180: 28 64 62 2c 20 70 4f 72 69 67 52 68 73 2d 3e 61  (db, pOrigRhs->a
4190: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 2c 20  [iField].pExpr, 
41a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  0);.          Ex
41b0: 70 72 20 2a 70 4e 65 77 4c 68 73 20 3d 20 73 71  pr *pNewLhs = sq
41c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
41d0: 20 70 4f 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69   pOrigLhs->a[iFi
41e0: 65 6c 64 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  eld].pExpr, 0);.
41f0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 68 73 20  .          pRhs 
4200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4210: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
4220: 70 52 68 73 2c 20 70 4e 65 77 52 68 73 29 3b 0a  pRhs, pNewRhs);.
4230: 20 20 20 20 20 20 20 20 20 20 70 4c 68 73 20 3d            pLhs =
4240: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4250: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
4260: 4c 68 73 2c 20 70 4e 65 77 4c 68 73 29 3b 0a 20  Lhs, pNewLhs);. 
4270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4280: 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
4290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
42a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
42b0: 65 66 74 20 3d 20 70 58 2d 3e 70 4c 65 66 74 3b  eft = pX->pLeft;
42c0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ..        if( pS
42d0: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20  elect->pOrderBy 
42e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
42f0: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
4300: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6e 20 4f  atement has an O
4310: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
4320: 7a 65 72 6f 20 74 68 65 20 0a 20 20 20 20 20 20  zero the .      
4330: 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43      ** iOrderByC
4340: 6f 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 54 68  ol variables. Th
4350: 65 73 65 20 61 72 65 20 73 65 74 20 74 6f 20 6e  ese are set to n
4360: 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 61 6e 20  on-zero when an 
4370: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  .          ** OR
4380: 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 61 63  DER BY term exac
4390: 74 6c 79 20 6d 61 74 63 68 65 73 20 6f 6e 65 20  tly matches one 
43a0: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  of the terms of 
43b0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  the .          *
43c0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 2e 20 53 69  * result-set. Si
43d0: 6e 63 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73  nce the result-s
43e0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
43f0: 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 0a 20   statement may. 
4400: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
4410: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 6f   been modified o
4420: 72 20 72 65 6f 72 64 65 72 65 64 2c 20 74 68 65  r reordered, the
4430: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
4440: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
4450: 20 20 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72        ** set cor
4460: 72 65 63 74 6c 79 2e 20 20 53 69 6e 63 65 20 73  rectly.  Since s
4470: 65 74 74 69 6e 67 20 74 68 65 6d 20 69 73 20 6a  etting them is j
4480: 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  ust an optimizat
4490: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
44a0: 2a 2a 20 69 74 27 73 20 65 61 73 69 65 73 74 20  ** it's easiest 
44b0: 6a 75 73 74 20 74 6f 20 7a 65 72 6f 20 74 68 65  just to zero the
44c0: 6d 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20  m here.  */.    
44d0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
44e0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65  pOrderBy = pSele
44f0: 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ct->pOrderBy;.  
4500: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4510: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
4520: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4530: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
4540: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
4550: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
4560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4570: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65  .        /* Take
4580: 20 63 61 72 65 20 68 65 72 65 20 6e 6f 74 20 74   care here not t
4590: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  o generate a TK_
45a0: 56 45 43 54 4f 52 20 63 6f 6e 74 61 69 6e 69 6e  VECTOR containin
45b0: 67 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20  g only a.       
45c0: 20 2a 2a 20 73 69 6e 67 6c 65 20 76 61 6c 75 65   ** single value
45d0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 72 73  . Since the pars
45e0: 65 72 20 6e 65 76 65 72 20 63 72 65 61 74 65 73  er never creates
45f0: 20 73 75 63 68 20 61 20 76 65 63 74 6f 72 2c 20   such a vector, 
4600: 73 6f 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  some.        ** 
4610: 6f 66 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  of the subroutin
4620: 65 73 20 64 6f 20 6e 6f 74 20 68 61 6e 64 6c 65  es do not handle
4630: 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
4640: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 68 73          if( pLhs
4650: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ->nExpr==1 ){.  
4660: 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66          pX->pLef
4670: 74 20 3d 20 70 4c 68 73 2d 3e 61 5b 30 5d 2e 70  t = pLhs->a[0].p
4680: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
4690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
46a0: 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  Left->x.pList = 
46b0: 70 4c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  pLhs;.          
46c0: 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
46d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
46e0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
46f0: 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 45 71 29  zeof(int) * nEq)
4700: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
4710: 63 61 73 65 28 20 61 69 4d 61 70 3d 3d 30 20 29  case( aiMap==0 )
4720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4730: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c      pSelect->pEL
4740: 69 73 74 20 3d 20 70 52 68 73 3b 0a 20 20 20 20  ist = pRhs;.    
4750: 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
4760: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 51 75 65  gs |= SQLITE_Que
4770: 72 79 46 6c 61 74 74 65 6e 65 72 3b 0a 20 20 20  ryFlattener;.   
4780: 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c       eType = sql
4790: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
47a0: 70 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49  pParse, pX, IN_I
47b0: 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c 20 61 69  NDEX_LOOP, 0, ai
47c0: 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62  Map);.        db
47d0: 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 73  ->dbOptFlags = s
47e0: 61 76 65 64 44 62 4f 70 74 46 6c 61 67 73 3b 0a  avedDbOptFlags;.
47f0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
4800: 28 20 61 69 4d 61 70 21 3d 30 20 26 26 20 61 69  ( aiMap!=0 && ai
4810: 4d 61 70 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  Map[0]!=0 );.   
4820: 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45       pSelect->pE
4830: 4c 69 73 74 20 3d 20 70 4f 72 69 67 52 68 73 3b  List = pOrigRhs;
4840: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e  .        pLeft->
4850: 78 2e 70 4c 69 73 74 20 3d 20 70 4f 72 69 67 4c  x.pList = pOrigL
4860: 68 73 3b 0a 20 20 20 20 20 20 20 20 70 58 2d 3e  hs;.        pX->
4870: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
4880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4890: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
48a0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
48b0: 4c 68 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Lhs);.      sqli
48c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
48d0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 52  e(pParse->db, pR
48e0: 68 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hs);.    }..    
48f0: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
4900: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
4910: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
4920: 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
4930: 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20  bRev = !bRev;.  
4940: 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70    }.    iTab = p
4950: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
4960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4970: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
4980: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
4990: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64  iTab, 0);.    Vd
49a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
49b0: 62 52 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43  bRev);.    VdbeC
49c0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 21 62 52  overageIf(v, !bR
49d0: 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev);.    assert(
49e0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
49f0: 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
4a00: 52 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 4c  R)==0 );..    pL
4a10: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
4a20: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
4a30: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
4a40: 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
4a50: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
4a60: 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
4a70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4a80: 20 20 20 7d 0a 0a 20 20 20 20 69 20 3d 20 70 4c     }..    i = pL
4a90: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a  evel->u.in.nIn;.
4aa0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
4ab0: 2e 6e 49 6e 20 2b 3d 20 6e 45 71 3b 0a 20 20 20  .nIn += nEq;.   
4ac0: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
4ad0: 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
4ae0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
4af0: 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
4b00: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
4b10: 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
4b40: 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
4b50: 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
4b60: 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
4b70: 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
4b80: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
4b90: 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e   pIn ){.      in
4ba0: 74 20 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  t iMap = 0;     
4bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4bc0: 65 78 20 69 6e 20 61 69 4d 61 70 5b 5d 20 2a 2f  ex in aiMap[] */
4bd0: 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 69 3b  .      pIn += i;
4be0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 45 71  .      for(i=iEq
4bf0: 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  ;i<pLoop->nLTerm
4c00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4c10: 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
4c20: 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
4c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4c40: 20 69 4f 75 74 20 3d 20 69 52 65 67 20 2b 20 69   iOut = iReg + i
4c50: 20 2d 20 69 45 71 3b 0a 20 20 20 20 20 20 20 20   - iEq;.        
4c60: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
4c70: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
4c80: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
4c90: 61 73 65 28 20 6e 45 71 3e 31 20 29 3b 20 20 2f  ase( nEq>1 );  /
4ca0: 2a 20 48 61 70 70 65 6e 73 20 77 69 74 68 20 61  * Happens with a
4cb0: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 6f 6e   UNIQUE index on
4cc0: 20 52 4f 57 49 44 20 2a 2f 0a 20 20 20 20 20 20   ROWID */.      
4cd0: 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
4ce0: 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
4cf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4d00: 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 4f 75 74  owid, iTab, iOut
4d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
4d20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4d30: 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 4d 61 70  int iCol = aiMap
4d40: 20 3f 20 61 69 4d 61 70 5b 69 4d 61 70 2b 2b 5d   ? aiMap[iMap++]
4d50: 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
4d60: 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
4d70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4d80: 64 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  dOp3(v,OP_Column
4d90: 2c 69 54 61 62 2c 20 69 43 6f 6c 2c 20 69 4f 75  ,iTab, iCol, iOu
4da0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
4db0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4dc0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4dd0: 50 5f 49 73 4e 75 6c 6c 2c 20 69 4f 75 74 29 3b  P_IsNull, iOut);
4de0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4e00: 69 3d 3d 69 45 71 20 29 7b 0a 20 20 20 20 20 20  i==iEq ){.      
4e10: 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
4e20: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = iTab;.        
4e30: 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
4e40: 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
4e50: 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f  PrevIfOpen : OP_
4e60: 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20  NextIfOpen;.    
4e70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4e80: 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 65 45           pIn->eE
4e90: 6e 64 4c 6f 6f 70 4f 70 20 3d 20 4f 50 5f 4e 6f  ndLoopOp = OP_No
4ea0: 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  op;.          }.
4eb0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2b 2b 3b            pIn++;
4ec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ed0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
4ee0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
4ef0: 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
4f00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4f10: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
4f20: 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Map);.#endif.  }
4f30: 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
4f40: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
4f50: 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
4f60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4f70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
4f80: 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
4f90: 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
4fa0: 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
4fb0: 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  x scan..**.** Fo
4fc0: 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
4fd0: 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
4fe0: 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
4ff0: 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
5000: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
5010: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
5020: 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
5030: 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
5040: 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
5050: 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
5060: 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
5070: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5080: 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
5090: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
50a0: 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
50b0: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
50c0: 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
50d0: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
50e0: 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
50f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
5100: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
5110: 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
5120: 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
5130: 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
5140: 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
5150: 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
5160: 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
5170: 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
5180: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5190: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
51a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
51b0: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
51c0: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
51d0: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
51e0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
51f0: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
5200: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
5210: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
5220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
5230: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
5240: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
5250: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
5260: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
5270: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
5280: 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
5290: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
52a0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  ng..**.** The nE
52b0: 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74 65  xtraReg paramete
52c0: 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74  r is 0 or 1.  It
52d0: 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45   is 0 if all WHE
52e0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
52f0: 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20  aints.** are == 
5300: 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f  or IN and are co
5310: 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45 71  vered by the nEq
5320: 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73 20  .  nExtraReg is 
5330: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
5340: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
5350: 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68 20  onstraint (such 
5360: 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44  as the "c>=5 AND
5370: 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78   c<10" in the ex
5380: 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f  ample) that.** o
5390: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
53a0: 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73  nEq quality cons
53b0: 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  traints..**.** T
53c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
53d0: 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66  cates a range of
53e0: 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d   nEq+nExtraReg m
53f0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
5400: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
5410: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
5420: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
5430: 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65   that range. The
5440: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
5450: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
5460: 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
5470: 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73  emory range to s
5480: 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a  tore keys for.**
5490: 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69   start and termi
54a0: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
54b0: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
54c0: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
54d0: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
54e0: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
54f0: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
5500: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
5510: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
5520: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
5530: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
5540: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
5550: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
5560: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
5570: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
5580: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
5590: 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
55a0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
55b0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
55c0: 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
55d0: 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
55e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
55f0: 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
5600: 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
5610: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
5620: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
5630: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5640: 6e 74 73 20 74 68 61 74 20 75 73 65 20 42 4c 4f  nts that use BLO
5650: 42 20 6f 72 20 4e 4f 4e 45 20 61 66 66 69 6e 69  B or NONE affini
5660: 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
5670: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
5680: 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
5690: 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
56a0: 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
56b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
56c0: 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
56d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
56e0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
56f0: 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
5700: 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
5710: 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
5720: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
5730: 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
5740: 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
5750: 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
5760: 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
5780: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
5790: 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
57a0: 42 4c 4f 42 2f 4e 4f 4e 45 20 61 66 66 69 6e 69  BLOB/NONE affini
57b0: 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
57c0: 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
57d0: 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
57e0: 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
57f0: 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
5800: 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
5810: 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
5820: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
5830: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
5840: 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
5850: 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
5860: 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
5870: 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42   to SQLITE_AFF_B
5880: 4c 4f 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOB..*/.static i
5890: 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
58a0: 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
58b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
58c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
58d0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
58e0: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
58f0: 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
5900: 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
5910: 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
5920: 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
5930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
5940: 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  rse the order of
5950: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
5960: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
5970: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
5980: 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
5990: 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
59a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
59b0: 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
59c0: 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
59d0: 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
59e0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ring */.){.  u16
59f0: 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5a10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
5a20: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
5a30: 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31   to code */.  u1
5a40: 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  6 nSkip;        
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5a60: 75 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f  umber of left-mo
5a70: 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b  st columns to sk
5a80: 69 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ip */.  Vdbe *v 
5a90: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5aa0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
5ab0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5ac0: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
5ad0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
5af0: 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
5b00: 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
5b10: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
5b20: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
5b30: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
5b40: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
5b50: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
5b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5b70: 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
5b80: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
5b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5bb0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5bc0: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5be0: 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
5bf0: 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
5c20: 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
5c30: 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
5c40: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5c50: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
5c60: 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
5c70: 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
5c80: 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
5c90: 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
5ca0: 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
5cb0: 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
5cc0: 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
5cd0: 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
5ce0: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
5cf0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
5d00: 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
5d10: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
5d20: 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20  ee.nEq;.  nSkip 
5d30: 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a  = pLoop->nSkip;.
5d40: 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
5d50: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
5d60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
5d70: 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
5d80: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
5d90: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
5da0: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
5db0: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
5dc0: 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
5dd0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
5de0: 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
5df0: 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
5e00: 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
5e10: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
5e20: 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
5e30: 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
5e40: 65 2d 3e 64 62 2c 73 71 6c 69 74 65 33 49 6e 64  e->db,sqlite3Ind
5e50: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 70 50  exAffinityStr(pP
5e60: 61 72 73 65 2d 3e 64 62 2c 70 49 64 78 29 29 3b  arse->db,pIdx));
5e70: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 21  .  assert( zAff!
5e80: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
5e90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5ea0: 3b 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  ;..  if( nSkip )
5eb0: 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
5ec0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
5ed0: 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
5ee0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
5ef0: 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
5f00: 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
5f10: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5f20: 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
5f30: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5f40: 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
5f50: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
5f60: 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
5f70: 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
5f80: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
5f90: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
5fa0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
5fb0: 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
5fc0: 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
5fd0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5fe0: 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
5ff0: 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a  kLT:OP_SeekGT),.
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
6020: 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
6030: 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62   nSkip);.    Vdb
6040: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
6050: 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
6060: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
6070: 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c  Rev!=0);.    sql
6080: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
6090: 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
60a0: 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
60b0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
60c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
60d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
60e0: 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
60f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6100: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
6110: 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52 20 29 3b 0a  [j]==XN_EXPR );.
6120: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
6130: 74 28 28 76 2c 20 22 25 73 22 2c 20 65 78 70 6c  t((v, "%s", expl
6140: 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61  ainIndexColumnNa
6150: 6d 65 28 70 49 64 78 2c 20 6a 29 29 29 3b 0a 20  me(pIdx, j)));. 
6160: 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20     }.  }    ..  
6170: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
6180: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
6190: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
61a0: 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28  rt( zAff==0 || (
61b0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29  int)strlen(zAff)
61c0: 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
61d0: 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a  =nSkip; j<nEq; j
61e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
61f0: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
6200: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
6210: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
6220: 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
6230: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
6240: 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f 72  case is true for
6250: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
6260: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
6270: 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
6280: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
6290: 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
62a0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
62b0: 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
62c0: 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
62d0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
62e0: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
62f0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
6300: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
6310: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6320: 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
6330: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
6340: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
6350: 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67  el, j, bRev, reg
6360: 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
6370: 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
6380: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
6390: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
63a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
63b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
63c0: 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
63d0: 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
63e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6400: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
6410: 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
6420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6430: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
6440: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
6450: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
6460: 72 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73  rm->pExpr->flags
6470: 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
6480: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
6490: 20 61 66 66 69 6e 69 74 79 20 65 76 65 72 20 6e   affinity ever n
64a0: 65 65 64 73 20 74 6f 20 62 65 20 28 6f 72 20 73  eeds to be (or s
64b0: 68 6f 75 6c 64 20 62 65 29 20 61 70 70 6c 69 65  hould be) applie
64c0: 64 20 74 6f 20 61 20 76 61 6c 75 65 0a 20 20 20  d to a value.   
64d0: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
64e0: 20 52 48 53 20 6f 66 20 61 6e 20 22 3f 20 49 4e   RHS of an "? IN
64f0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 65   (SELECT ...)" e
6500: 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 65 20 0a  xpression. The .
6510: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
6520: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
6530: 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65  routine has alre
6540: 61 64 79 20 65 6e 73 75 72 65 64 20 74 68 61 74  ady ensured that
6550: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
6560: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
6570: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 68 61 73 20   comparison has 
6580: 62 65 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20  been applied to 
6590: 74 68 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  the value.  */. 
65a0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20         if( zAff 
65b0: 29 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49  ) zAff[j] = SQLI
65c0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
65d0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
65e0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
65f0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
6600: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
6610: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
6620: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
6630: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  t;.      if( (pT
6640: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
6650: 45 52 4d 5f 49 53 29 3d 3d 30 20 26 26 20 73 71  ERM_IS)==0 && sq
6660: 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
6670: 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ll(pRight) ){.  
6680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6690: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
66a0: 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c  Null, regBase+j,
66b0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
66c0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
66d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
66e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41    }.      if( zA
66f0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
6700: 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
6710: 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
6720: 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
6730: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20  E_AFF_BLOB ){.  
6740: 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
6750: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
6760: 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
6770: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6780: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
6790: 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
67a0: 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
67b0: 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
67c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
67d0: 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
67e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
67f0: 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
6800: 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
6810: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
6820: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
6830: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 2f 2a 0a 2a  MATCH_BLOBS./*.*
6840: 2a 20 49 66 20 74 68 65 20 6d 6f 73 74 20 72 65  * If the most re
6850: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
6860: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  truction is a co
6870: 6e 73 74 61 6e 74 20 72 61 6e 67 65 20 63 6f 6e  nstant range con
6880: 73 74 72 61 69 6e 74 0a 2a 2a 20 28 61 20 73 74  straint.** (a st
6890: 72 69 6e 67 20 6c 69 74 65 72 61 6c 29 20 74 68  ring literal) th
68a0: 61 74 20 6f 72 69 67 69 6e 61 74 65 64 20 66 72  at originated fr
68b0: 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  om the LIKE opti
68c0: 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 0a  mization, then .
68d0: 2a 2a 20 73 65 74 20 50 33 20 61 6e 64 20 50 35  ** set P3 and P5
68e0: 20 6f 6e 20 74 68 65 20 4f 50 5f 53 74 72 69 6e   on the OP_Strin
68f0: 67 20 6f 70 63 6f 64 65 20 73 6f 20 74 68 61 74  g opcode so that
6900: 20 74 68 65 20 73 74 72 69 6e 67 20 77 69 6c 6c   the string will
6910: 20 62 65 20 63 61 73 74 0a 2a 2a 20 74 6f 20 61   be cast.** to a
6920: 20 42 4c 4f 42 20 61 74 20 61 70 70 72 6f 70 72   BLOB at appropr
6930: 69 61 74 65 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a  iate times..**.*
6940: 2a 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  * The LIKE optim
6950: 69 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f 20  ization trys to 
6960: 65 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b 45  evaluate "x LIKE
6970: 20 27 61 62 63 25 27 22 20 61 73 20 61 20 72 61   'abc%'" as a ra
6980: 6e 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nge.** expressio
6990: 6e 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e 44  n: "x>='ABC' AND
69a0: 20 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74 20   x<'abd'".  But 
69b0: 74 68 69 73 20 72 65 71 75 69 72 65 73 20 74 68  this requires th
69c0: 61 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  at the range.** 
69d0: 73 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77  scan loop run tw
69e0: 69 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74  ice, once for st
69f0: 72 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63 6f  rings and a seco
6a00: 6e 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42  nd time for BLOB
6a10: 73 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72  s..** The OP_Str
6a20: 69 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  ing opcodes on t
6a30: 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63  he second pass c
6a40: 6f 6e 76 65 72 74 20 74 68 65 20 75 70 70 65 72  onvert the upper
6a50: 20 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f   and lower.** bo
6a60: 75 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  und string const
6a70: 61 6e 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20  ants to blobs.  
6a80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
6a90: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
6aa0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74   changes.** to t
6ab0: 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63  he OP_String opc
6ac0: 6f 64 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f  odes for that to
6ad0: 20 68 61 70 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45   happen..**.** E
6ae0: 78 63 65 70 74 2c 20 6f 66 20 63 6f 75 72 73 65  xcept, of course
6af0: 2c 20 69 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45  , if SQLITE_LIKE
6b00: 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c  _DOESNT_MATCH_BL
6b10: 4f 42 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20  OBS is defined, 
6b20: 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65  then.** only the
6b30: 20 6f 6e 65 20 70 61 73 73 20 74 68 72 6f 75 67   one pass throug
6b40: 68 20 74 68 65 20 73 74 72 69 6e 67 20 73 70 61  h the string spa
6b50: 63 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  ce is required, 
6b60: 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  so this routine.
6b70: 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d  ** becomes a no-
6b80: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
6b90: 69 64 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69  id whereLikeOpti
6ba0: 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69  mizationStringFi
6bb0: 78 75 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  xup(.  Vdbe *v, 
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6bd0: 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  * prepared state
6be0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
6bf0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
6c00: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
6c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
6c20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6c30: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
6c40: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
6c50: 2a 70 54 65 72 6d 20 20 20 20 20 20 20 20 2f 2a  *pTerm        /*
6c60: 20 54 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   The upper or lo
6c70: 77 65 72 20 62 6f 75 6e 64 20 6a 75 73 74 20 63  wer bound just c
6c80: 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  oded */.){.  if(
6c90: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
6ca0: 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
6cb0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
6cc0: 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  p;.    assert( p
6cd0: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
6ce0: 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70  ntr>0 );.    pOp
6cf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6d00: 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  tOp(v, -1);.    
6d10: 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30 20 29  assert( pOp!=0 )
6d20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
6d30: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  p->opcode==OP_St
6d40: 72 69 6e 67 38 20 0a 20 20 20 20 20 20 20 20 20  ring8 .         
6d50: 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 57 43     || pTerm->pWC
6d60: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
6d70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6d80: 65 64 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  ed );.    pOp->p
6d90: 33 20 3d 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  3 = (int)(pLevel
6da0: 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
6db0: 31 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72  1);  /* Register
6dc0: 20 68 6f 6c 64 69 6e 67 20 63 6f 75 6e 74 65 72   holding counter
6dd0: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 35 20   */.    pOp->p5 
6de0: 3d 20 28 75 38 29 28 70 4c 65 76 65 6c 2d 3e 69  = (u8)(pLevel->i
6df0: 4c 69 6b 65 52 65 70 43 6e 74 72 26 31 29 3b 20  LikeRepCntr&1); 
6e00: 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
6e10: 43 20 2a 2f 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  C */.  }.}.#else
6e20: 0a 23 20 64 65 66 69 6e 65 20 77 68 65 72 65 4c  .# define whereL
6e30: 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
6e40: 74 72 69 6e 67 46 69 78 75 70 28 41 2c 42 2c 43  tringFixup(A,B,C
6e50: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ).#endif..#ifdef
6e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
6e70: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
6e80: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * Information is
6e90: 20 70 61 73 73 65 64 20 66 72 6f 6d 20 63 6f 64   passed from cod
6ea0: 65 43 75 72 73 6f 72 48 69 6e 74 28 29 20 64 6f  eCursorHint() do
6eb0: 77 6e 20 74 6f 20 69 6e 64 69 76 69 64 75 61 6c  wn to individual
6ec0: 20 6e 6f 64 65 73 20 6f 66 0a 2a 2a 20 74 68 65   nodes of.** the
6ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6ee0: 20 28 62 79 20 73 71 6c 69 74 65 33 57 61 6c 6b   (by sqlite3Walk
6ef0: 45 78 70 72 28 29 29 20 75 73 69 6e 67 20 61 6e  Expr()) using an
6f00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6f10: 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  s.** structure..
6f20: 2a 2f 0a 73 74 72 75 63 74 20 43 43 75 72 48 69  */.struct CCurHi
6f30: 6e 74 20 7b 0a 20 20 69 6e 74 20 69 54 61 62 43  nt {.  int iTabC
6f40: 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur;    /* Cursor
6f50: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61   for the main ta
6f60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ble */.  int iId
6f70: 78 43 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73  xCur;    /* Curs
6f80: 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
6f90: 2c 20 69 66 20 70 49 64 78 21 3d 30 2e 20 20 55  , if pIdx!=0.  U
6fa0: 6e 75 73 65 64 20 6f 74 68 65 72 77 69 73 65 20  nused otherwise 
6fb0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
6fc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ;    /* The inde
6fd0: 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
6fe0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
6ff0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7000: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7010: 66 6f 72 20 65 76 65 72 79 20 6e 6f 64 65 20 6f  for every node o
7020: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
7030: 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
7040: 61 74 65 0a 2a 2a 20 66 6f 72 20 61 20 63 75 72  ate.** for a cur
7050: 73 6f 72 20 68 69 6e 74 20 6f 6e 20 61 6e 20 69  sor hint on an i
7060: 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 20 46 6f  ndex cursor.  Fo
7070: 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  r TK_COLUMN node
7080: 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
7090: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 43 43  .** the table CC
70a0: 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20  urHint.iTabCur, 
70b0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
70c0: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  same column can 
70d0: 62 65 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 74  be.** accessed t
70e0: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78  hrough the index
70f0: 2e 20 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 2c  .  If it cannot,
7100: 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65   then set pWalke
7110: 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 2e 0a 2a  r->eCode to 1..*
7120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
7130: 65 43 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b  eCursorHintCheck
7140: 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  Expr(Walker *pWa
7150: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
7160: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 43 43 75  r){.  struct CCu
7170: 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70  rHint *pHint = p
7180: 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48  Walker->u.pCCurH
7190: 69 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  int;.  assert( p
71a0: 48 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20 29 3b  Hint->pIdx!=0 );
71b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
71c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
71d0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
71e0: 3d 70 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 0a  =pHint->iTabCur.
71f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
7200: 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69 6e 74  umnOfIndex(pHint
7210: 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
7220: 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
7230: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
7240: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
7250: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
7260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
7270: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65  whether or not e
7280: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2c  xpression pExpr,
7290: 20 77 68 69 63 68 20 77 61 73 20 70 61 72 74 20   which was part 
72a0: 6f 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  of a WHERE claus
72b0: 65 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  e,.** should be 
72c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
72d0: 63 75 72 73 6f 72 2d 68 69 6e 74 20 66 6f 72 20  cursor-hint for 
72e0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  a table that is 
72f0: 6f 6e 20 74 68 65 20 72 68 73 0a 2a 2a 20 6f 66  on the rhs.** of
7300: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 65   a LEFT JOIN. Se
7310: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 74  t Walker.eCode t
7320: 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 62 65 66 6f 72  o non-zero befor
7330: 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74  e returning if t
7340: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
7350: 6e 20 69 73 20 6e 6f 74 20 73 75 69 74 61 62 6c  n is not suitabl
7360: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 72  e..**.** An expr
7370: 65 73 73 69 6f 6e 20 69 73 20 75 6e 73 75 69 74  ession is unsuit
7380: 61 62 6c 65 20 69 66 20 69 74 20 6d 69 67 68 74  able if it might
7390: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 6e 6f 6e   evaluate to non
73a0: 20 4e 55 4c 4c 20 65 76 65 6e 20 69 66 0a 2a 2a   NULL even if.**
73b0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64   a TK_COLUMN nod
73c0: 65 20 74 68 61 74 20 64 6f 65 73 20 61 66 66 65  e that does affe
73d0: 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
73e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
73f0: 73 20 73 65 74 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  s set.** to NULL
7400: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
7410: 2a 0a 2a 2a 20 20 20 63 6f 6c 20 49 53 20 4e 55  *.**   col IS NU
7420: 4c 4c 0a 2a 2a 20 20 20 63 6f 6c 20 49 53 20 4e  LL.**   col IS N
7430: 4f 54 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f 61  OT NULL.**   coa
7440: 6c 65 73 63 65 28 63 6f 6c 2c 20 31 29 0a 2a 2a  lesce(col, 1).**
7450: 20 20 20 43 41 53 45 20 57 48 45 4e 20 63 6f 6c     CASE WHEN col
7460: 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20 45   THEN 0 ELSE 1 E
7470: 4e 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ND.*/.static int
7480: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49   codeCursorHintI
7490: 73 4f 72 46 75 6e 63 74 69 6f 6e 28 57 61 6c 6b  sOrFunction(Walk
74a0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
74b0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
74c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
74d0: 53 20 0a 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e  S .   || pExpr->
74e0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op==TK_ISNULL ||
74f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
7500: 53 4e 4f 54 20 0a 20 20 20 7c 7c 20 70 45 78 70  SNOT .   || pExp
7510: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
7520: 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  L || pExpr->op==
7530: 54 4b 5f 43 41 53 45 20 0a 20 20 29 7b 0a 20 20  TK_CASE .  ){.  
7540: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
7550: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
7560: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7570: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
7580: 69 6e 74 20 64 31 3b 0a 20 20 20 20 63 68 61 72  int d1;.    char
7590: 20 64 32 5b 33 5d 3b 0a 20 20 20 20 69 66 28 20   d2[3];.    if( 
75a0: 30 3d 3d 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  0==sqlite3IsLike
75b0: 46 75 6e 63 74 69 6f 6e 28 70 57 61 6c 6b 65 72  Function(pWalker
75c0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  ->pParse->db, pE
75d0: 78 70 72 2c 20 26 64 31 2c 20 64 32 29 20 29 7b  xpr, &d1, d2) ){
75e0: 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  .      pWalker->
75f0: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 7d  eCode = 1;.    }
7600: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57  .  }..  return W
7610: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
7620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7630: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
7640: 6e 20 65 76 65 72 79 20 6e 6f 64 65 20 6f 66 20  n every node of 
7650: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
7660: 65 65 20 75 73 65 64 20 61 73 20 61 6e 0a 2a 2a  ee used as an.**
7670: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
7680: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 69   OP_CursorHint i
7690: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 49 66 20 74  nstruction. If t
76a0: 68 65 20 6e 6f 64 65 20 69 73 20 61 20 54 4b 5f  he node is a TK_
76b0: 43 4f 4c 55 4d 4e 0a 2a 2a 20 74 68 61 74 20 61  COLUMN.** that a
76c0: 63 63 65 73 73 65 73 20 61 6e 79 20 74 61 62 6c  ccesses any tabl
76d0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  e other than the
76e0: 20 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 64 20   one identified 
76f0: 62 79 0a 2a 2a 20 43 43 75 72 48 69 6e 74 2e 69  by.** CCurHint.i
7700: 54 61 62 43 75 72 2c 20 74 68 65 6e 20 64 6f 20  TabCur, then do 
7710: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
7720: 2a 0a 2a 2a 20 20 20 31 29 20 61 6c 6c 6f 63 61  *.**   1) alloca
7730: 74 65 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  te a register an
7740: 64 20 63 6f 64 65 20 61 6e 20 4f 50 5f 43 6f 6c  d code an OP_Col
7750: 75 6d 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  umn instruction 
7760: 74 6f 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  to read .**     
7770: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
7780: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 74 68 65 20 6e  olumn into the n
7790: 65 77 20 72 65 67 69 73 74 65 72 2c 20 61 6e 64  ew register, and
77a0: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 74 72 61 6e  .**.**   2) tran
77b0: 73 66 6f 72 6d 20 74 68 65 20 65 78 70 72 65 73  sform the expres
77c0: 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
77d0: 4b 5f 52 45 47 49 53 54 45 52 20 6e 6f 64 65 20  K_REGISTER node 
77e0: 74 68 61 74 20 72 65 61 64 73 20 0a 2a 2a 20 20  that reads .**  
77f0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 6e 65 77      from the new
7800: 6c 79 20 70 6f 70 75 6c 61 74 65 64 20 72 65 67  ly populated reg
7810: 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ister..**.** Als
7820: 6f 2c 20 69 66 20 74 68 65 20 6e 6f 64 65 20 69  o, if the node i
7830: 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  s a TK_COLUMN th
7840: 61 74 20 64 6f 65 73 20 61 63 63 65 73 73 20 74  at does access t
7850: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 69 66 69  he table idenifi
7860: 65 64 0a 2a 2a 20 62 79 20 70 43 43 75 72 48 69  ed.** by pCCurHi
7870: 6e 74 2e 69 54 61 62 43 75 72 2c 20 61 6e 64 20  nt.iTabCur, and 
7880: 61 6e 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  an index is bein
7890: 67 20 75 73 65 64 20 28 77 68 69 63 68 20 77 65  g used (which we
78a0: 20 77 69 6c 6c 0a 2a 2a 20 6b 6e 6f 77 20 62 65   will.** know be
78b0: 63 61 75 73 65 20 43 43 75 72 48 69 6e 74 2e 70  cause CCurHint.p
78c0: 49 64 78 21 3d 30 29 20 74 68 65 6e 20 74 72 61  Idx!=0) then tra
78d0: 6e 73 66 6f 72 6d 20 74 68 65 20 54 4b 5f 43 4f  nsform the TK_CO
78e0: 4c 55 4d 4e 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  LUMN into.** an 
78f0: 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 69 6e  access of the in
7900: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 20  dex rather than 
7910: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62  the original tab
7920: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7930: 74 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  t codeCursorHint
7940: 46 69 78 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  FixExpr(Walker *
7950: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
7960: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  Expr){.  int rc 
7970: 3d 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  = WRC_Continue;.
7980: 20 20 73 74 72 75 63 74 20 43 43 75 72 48 69 6e    struct CCurHin
7990: 74 20 2a 70 48 69 6e 74 20 3d 20 70 57 61 6c 6b  t *pHint = pWalk
79a0: 65 72 2d 3e 75 2e 70 43 43 75 72 48 69 6e 74 3b  er->u.pCCurHint;
79b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
79c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
79d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
79e0: 61 62 6c 65 21 3d 70 48 69 6e 74 2d 3e 69 54 61  able!=pHint->iTa
79f0: 62 43 75 72 20 29 7b 0a 20 20 20 20 20 20 56 64  bCur ){.      Vd
7a00: 62 65 20 2a 76 20 3d 20 70 57 61 6c 6b 65 72 2d  be *v = pWalker-
7a10: 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
7a20: 20 20 20 20 20 20 69 6e 74 20 72 65 67 20 3d 20        int reg = 
7a30: 2b 2b 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  ++pWalker->pPars
7a40: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f 2a 20 52 65  e->nMem;   /* Re
7a50: 67 69 73 74 65 72 20 66 6f 72 20 63 6f 6c 75 6d  gister for colum
7a60: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  n value */.     
7a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7a80: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
7a90: 28 0a 20 20 20 20 20 20 20 20 20 20 76 2c 20 70  (.          v, p
7aa0: 45 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78 70  Expr->pTab, pExp
7ab0: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
7ac0: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72 65 67 0a 20  ->iColumn, reg. 
7ad0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 45       );.      pE
7ae0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
7af0: 49 53 54 45 52 3b 0a 20 20 20 20 20 20 70 45 78  ISTER;.      pEx
7b00: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 65 67  pr->iTable = reg
7b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7b20: 70 48 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20 29  pHint->pIdx!=0 )
7b30: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
7b40: 54 61 62 6c 65 20 3d 20 70 48 69 6e 74 2d 3e 69  Table = pHint->i
7b50: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 45  IdxCur;.      pE
7b60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 73  xpr->iColumn = s
7b70: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
7b80: 64 65 78 28 70 48 69 6e 74 2d 3e 70 49 64 78 2c  dex(pHint->pIdx,
7b90: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
7ba0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7bb0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7bc0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
7bd0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
7be0: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
7bf0: 4e 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 61  N ){.    /* An a
7c00: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7c10: 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  n in the WHERE c
7c20: 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79  lause of a query
7c30: 20 6d 65 61 6e 73 20 74 68 69 73 20 6d 75 73 74   means this must
7c40: 0a 20 20 20 20 2a 2a 20 62 65 20 61 20 63 6f 72  .    ** be a cor
7c50: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
7c60: 79 2c 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  y, and expressio
7c70: 6e 20 70 45 78 70 72 20 69 73 20 61 6e 20 61 67  n pExpr is an ag
7c80: 67 72 65 67 61 74 65 20 66 72 6f 6d 0a 20 20 20  gregate from.   
7c90: 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 63   ** the parent c
7ca0: 6f 6e 74 65 78 74 2e 20 44 6f 20 6e 6f 74 20 77  ontext. Do not w
7cb0: 61 6c 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  alk the function
7cc0: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68   arguments in th
7cd0: 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
7ce0: 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 49 74 20      ** todo: It 
7cf0: 73 68 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62  should be possib
7d00: 6c 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  le to replace th
7d10: 69 73 20 6e 6f 64 65 20 77 69 74 68 20 61 20 54  is node with a T
7d20: 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 20 2a  K_REGISTER.    *
7d30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 61 73  * expression, as
7d40: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
7d50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  he expression mu
7d60: 73 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  st be stored in 
7d70: 61 20 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  a .    ** regist
7d80: 65 72 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  er at this point
7d90: 2e 20 54 68 65 20 73 61 6d 65 20 68 6f 6c 64 73  . The same holds
7da0: 20 66 6f 72 20 54 4b 5f 41 47 47 5f 43 4f 4c 55   for TK_AGG_COLU
7db0: 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f 0a 20 20 20  MN nodes. */.   
7dc0: 20 72 63 20 3d 20 57 52 43 5f 50 72 75 6e 65 3b   rc = WRC_Prune;
7dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
7df0: 74 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  t an OP_CursorHi
7e00: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
7e10: 66 20 69 74 20 69 73 20 61 70 70 72 6f 70 72 69  f it is appropri
7e20: 61 74 65 20 74 6f 20 64 6f 20 73 6f 2e 0a 2a 2f  ate to do so..*/
7e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
7e40: 65 43 75 72 73 6f 72 48 69 6e 74 28 0a 20 20 73  eCursorHint(.  s
7e50: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7e60: 65 6d 20 2a 70 54 61 62 49 74 65 6d 2c 20 20 2f  em *pTabItem,  /
7e70: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 74  * FROM clause it
7e80: 65 6d 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  em */.  WhereInf
7e90: 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
7ea0: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
7eb0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
7ec0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
7ed0: 57 68 69 63 68 20 6c 6f 6f 70 20 74 6f 20 70 72  Which loop to pr
7ee0: 6f 76 69 64 65 20 68 69 6e 74 73 20 66 6f 72 20  ovide hints for 
7ef0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7f00: 70 45 6e 64 52 61 6e 67 65 20 20 2f 2a 20 48 69  pEndRange  /* Hi
7f10: 6e 74 20 74 68 69 73 20 65 6e 64 2d 6f 66 2d 73  nt this end-of-s
7f20: 63 61 6e 20 62 6f 75 6e 64 61 72 79 20 74 65 72  can boundary ter
7f30: 6d 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  m if not NULL */
7f40: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
7f50: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
7f60: 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
7f70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7f80: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
7f90: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
7fa0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 30 3b 0a  xpr *pExpr = 0;.
7fb0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
7fc0: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
7fd0: 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
7fe0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7ff0: 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
8000: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
8010: 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 43 43  , j;.  struct CC
8020: 75 72 48 69 6e 74 20 73 48 69 6e 74 3b 0a 20 20  urHint sHint;.  
8030: 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a  Walker sWalker;.
8040: 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
8050: 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
8060: 53 51 4c 49 54 45 5f 43 75 72 73 6f 72 48 69 6e  SQLITE_CursorHin
8070: 74 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ts) ) return;.  
8080: 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
8090: 54 61 62 43 75 72 3b 0a 20 20 61 73 73 65 72 74  TabCur;.  assert
80a0: 28 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e  ( iCur==pWInfo->
80b0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
80c0: 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
80d0: 6f 72 20 29 3b 0a 20 20 73 48 69 6e 74 2e 69 54  or );.  sHint.iT
80e0: 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
80f0: 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20 3d 20  sHint.iIdxCur = 
8100: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
8110: 0a 20 20 73 48 69 6e 74 2e 70 49 64 78 20 3d 20  .  sHint.pIdx = 
8120: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
8130: 49 6e 64 65 78 3b 0a 20 20 6d 65 6d 73 65 74 28  Index;.  memset(
8140: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
8150: 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
8160: 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
8170: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
8180: 6b 65 72 2e 75 2e 70 43 43 75 72 48 69 6e 74 20  ker.u.pCCurHint 
8190: 3d 20 26 73 48 69 6e 74 3b 0a 20 20 70 57 43 20  = &sHint;.  pWC 
81a0: 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
81b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43    for(i=0; i<pWC
81c0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
81d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
81e0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  >a[i];.    if( p
81f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8200: 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
8210: 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
8220: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8230: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
8240: 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
8250: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  y ) continue;.. 
8260: 20 20 20 2f 2a 20 41 6e 79 20 74 65 72 6d 73 20     /* Any terms 
8270: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
8280: 74 20 6f 66 20 74 68 65 20 4f 4e 28 2e 2e 2e 29  t of the ON(...)
8290: 20 63 6c 61 75 73 65 20 66 6f 72 20 61 6e 79 20   clause for any 
82a0: 4c 45 46 54 20 0a 20 20 20 20 2a 2a 20 4a 4f 49  LEFT .    ** JOI
82b0: 4e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  N for which the 
82c0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 69 73  current table is
82d0: 20 6e 6f 74 20 74 68 65 20 72 68 73 20 61 72 65   not the rhs are
82e0: 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 2a 2a 20   omitted.    ** 
82f0: 66 72 6f 6d 20 74 68 65 20 63 75 72 73 6f 72 2d  from the cursor-
8300: 68 69 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  hint. .    **.  
8310: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 74 61 62    ** If this tab
8320: 6c 65 20 69 73 20 74 68 65 20 72 68 73 20 6f 66  le is the rhs of
8330: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 22 49   a LEFT JOIN, "I
8340: 53 22 20 6f 72 20 22 49 53 20 4e 55 4c 4c 22 20  S" or "IS NULL" 
8350: 74 65 72 6d 73 20 0a 20 20 20 20 2a 2a 20 74 68  terms .    ** th
8360: 61 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65  at were specifie
8370: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
8380: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 75   WHERE clause mu
8390: 73 74 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  st be excluded..
83a0: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 74      ** This is t
83b0: 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 66 6f  o address the fo
83c0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  llowing:.    **.
83d0: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
83e0: 2e 2e 2e 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ... t1 LEFT JOIN
83f0: 20 74 32 20 4f 4e 20 28 74 31 2e 61 3d 74 32 2e   t2 ON (t1.a=t2.
8400: 62 29 20 57 48 45 52 45 20 74 32 2e 63 20 49 53  b) WHERE t2.c IS
8410: 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a 2a 0a 20 20   NULL;.    **.  
8420: 20 20 2a 2a 20 53 61 79 20 74 68 65 72 65 20 69    ** Say there i
8430: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  s a single row i
8440: 6e 20 74 32 20 74 68 61 74 20 6d 61 74 63 68 65  n t2 that matche
8450: 73 20 28 74 31 2e 61 3d 74 32 2e 62 29 2c 20 62  s (t1.a=t2.b), b
8460: 75 74 20 69 74 73 0a 20 20 20 20 2a 2a 20 74 32  ut its.    ** t2
8470: 2e 63 20 76 61 6c 75 65 73 20 69 73 20 6e 6f 74  .c values is not
8480: 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 28 74   NULL. If the (t
8490: 32 2e 63 20 49 53 20 4e 55 4c 4c 29 20 63 6f 6e  2.c IS NULL) con
84a0: 73 74 72 61 69 6e 74 20 69 73 20 0a 20 20 20 20  straint is .    
84b0: 2a 2a 20 70 75 73 68 65 64 20 64 6f 77 6e 20 74  ** pushed down t
84c0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  o the cursor, th
84d0: 69 73 20 72 6f 77 20 69 73 20 66 69 6c 74 65 72  is row is filter
84e0: 65 64 20 6f 75 74 2c 20 63 61 75 73 69 6e 67 0a  ed out, causing.
84f0: 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 74 6f      ** SQLite to
8500: 20 73 79 6e 74 68 65 73 69 7a 65 20 61 20 72 6f   synthesize a ro
8510: 77 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  w of NULL values
8520: 2e 20 57 68 69 63 68 20 64 6f 65 73 20 6d 61 74  . Which does mat
8530: 63 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48  ch the.    ** WH
8540: 45 52 45 20 63 6c 61 75 73 65 2c 20 61 6e 64 20  ERE clause, and 
8550: 73 6f 20 74 68 65 20 71 75 65 72 79 20 72 65 74  so the query ret
8560: 75 72 6e 73 20 61 20 72 6f 77 2e 20 57 68 69 63  urns a row. Whic
8570: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
8580: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
8590: 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f  r the same reaso
85a0: 6e 2c 20 57 48 45 52 45 20 74 65 72 6d 73 20 73  n, WHERE terms s
85b0: 75 63 68 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20  uch as:.    **. 
85c0: 20 20 20 2a 2a 20 20 20 57 48 45 52 45 20 31 20     **   WHERE 1 
85d0: 3d 20 28 74 32 2e 63 20 49 53 20 4e 55 4c 4c 29  = (t2.c IS NULL)
85e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 61  .    **.    ** a
85f0: 72 65 20 61 6c 73 6f 20 65 78 63 6c 75 64 65 64  re also excluded
8600: 2e 20 53 65 65 20 63 6f 64 65 43 75 72 73 6f 72  . See codeCursor
8610: 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e  HintIsOrFunction
8620: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
8630: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8640: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  TabItem->fg.join
8650: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
8660: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
8670: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
8680: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  pr;.      if( !E
8690: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86a0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
86b0: 6e 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  n) .       || pE
86c0: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
86d0: 61 62 6c 65 21 3d 70 54 61 62 49 74 65 6d 2d 3e  able!=pTabItem->
86e0: 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 29 7b  iCursor.      ){
86f0: 0a 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65 72  .        sWalker
8700: 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  .eCode = 0;.    
8710: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
8720: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
8730: 43 75 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75  CursorHintIsOrFu
8740: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  nction;.        
8750: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
8760: 26 73 57 61 6c 6b 65 72 2c 20 70 54 65 72 6d 2d  &sWalker, pTerm-
8770: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
8780: 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f   if( sWalker.eCo
8790: 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
87a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
87b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  {.      if( Expr
87c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
87d0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
87e0: 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
87f0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
8800: 20 41 6c 6c 20 74 65 72 6d 73 20 69 6e 20 70 57   All terms in pW
8810: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 65  Loop->aLTerm[] e
8820: 78 63 65 70 74 20 70 45 6e 64 52 61 6e 67 65 20  xcept pEndRange 
8830: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6e 69 74  are used to init
8840: 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 74 68  ialize.    ** th
8850: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 73 65  e cursor.  These
8860: 20 74 65 72 6d 73 20 61 72 65 20 6e 6f 74 20 6e   terms are not n
8870: 65 65 64 65 64 20 61 73 20 68 69 6e 74 73 20 66  eeded as hints f
8880: 6f 72 20 61 20 70 75 72 65 20 72 61 6e 67 65 0a  or a pure range.
8890: 20 20 20 20 2a 2a 20 73 63 61 6e 20 28 74 68 61      ** scan (tha
88a0: 74 20 68 61 73 20 6e 6f 20 3d 3d 20 74 65 72 6d  t has no == term
88b0: 73 29 20 73 6f 20 6f 6d 69 74 20 74 68 65 6d 2e  s) so omit them.
88c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
88d0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  p->u.btree.nEq==
88e0: 30 20 26 26 20 70 54 65 72 6d 21 3d 70 45 6e 64  0 && pTerm!=pEnd
88f0: 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 66  Range ){.      f
8900: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d  or(j=0; j<pLoop-
8910: 3e 6e 4c 54 65 72 6d 20 26 26 20 70 4c 6f 6f 70  >nLTerm && pLoop
8920: 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21 3d 70 54 65  ->aLTerm[j]!=pTe
8930: 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  rm; j++){}.     
8940: 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c   if( j<pLoop->nL
8950: 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
8960: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
8970: 6f 20 73 75 62 71 75 65 72 69 65 73 20 6f 72 20  o subqueries or 
8980: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
8990: 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  c functions allo
89a0: 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  wed */.    if( s
89b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69  qlite3ExprContai
89c0: 6e 73 53 75 62 71 75 65 72 79 28 70 54 65 72 6d  nsSubquery(pTerm
89d0: 2d 3e 70 45 78 70 72 29 20 29 20 63 6f 6e 74 69  ->pExpr) ) conti
89e0: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  nue;..    /* For
89f0: 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
8a00: 6d 61 6b 65 20 73 75 72 65 20 72 65 66 65 72 65  make sure refere
8a10: 6e 63 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  nced columns are
8a20: 20 61 63 74 75 61 6c 6c 79 20 69 6e 0a 20 20 20   actually in.   
8a30: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   ** the index. *
8a40: 2f 0a 20 20 20 20 69 66 28 20 73 48 69 6e 74 2e  /.    if( sHint.
8a50: 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
8a60: 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 3d   sWalker.eCode =
8a70: 20 30 3b 0a 20 20 20 20 20 20 73 57 61 6c 6b 65   0;.      sWalke
8a80: 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
8a90: 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  = codeCursorHint
8aa0: 43 68 65 63 6b 45 78 70 72 3b 0a 20 20 20 20 20  CheckExpr;.     
8ab0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
8ac0: 28 26 73 57 61 6c 6b 65 72 2c 20 70 54 65 72 6d  (&sWalker, pTerm
8ad0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
8ae0: 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64  if( sWalker.eCod
8af0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77    }..    /* If w
8b10: 65 20 73 75 72 76 69 76 65 20 61 6c 6c 20 70 72  e survive all pr
8b20: 69 6f 72 20 74 65 73 74 73 2c 20 74 68 61 74 20  ior tests, that 
8b30: 6d 65 61 6e 73 20 74 68 69 73 20 74 65 72 6d 20  means this term 
8b40: 69 73 20 77 6f 72 74 68 20 68 69 6e 74 69 6e 67  is worth hinting
8b50: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 20 3d 20   */.    pExpr = 
8b60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
8b70: 62 2c 20 70 45 78 70 72 2c 20 73 71 6c 69 74 65  b, pExpr, sqlite
8b80: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 65  3ExprDup(db, pTe
8b90: 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 29 3b 0a  rm->pExpr, 0));.
8ba0: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 21    }.  if( pExpr!
8bb0: 3d 30 20 29 7b 0a 20 20 20 20 73 57 61 6c 6b 65  =0 ){.    sWalke
8bc0: 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
8bd0: 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  = codeCursorHint
8be0: 46 69 78 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  FixExpr;.    sql
8bf0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57  ite3WalkExpr(&sW
8c00: 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 20  alker, pExpr);. 
8c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c20: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 75 72 73 6f  dOp4(v, OP_Curso
8c30: 72 48 69 6e 74 2c 20 0a 20 20 20 20 20 20 20 20  rHint, .        
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
8c50: 48 69 6e 74 2e 70 49 64 78 20 3f 20 73 48 69 6e  Hint.pIdx ? sHin
8c60: 74 2e 69 49 64 78 43 75 72 20 3a 20 73 48 69 6e  t.iIdxCur : sHin
8c70: 74 2e 69 54 61 62 43 75 72 29 2c 20 30 2c 20 30  t.iTabCur), 0, 0
8c80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c90: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
8ca0: 68 61 72 2a 29 70 45 78 70 72 2c 20 50 34 5f 45  har*)pExpr, P4_E
8cb0: 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  XPR);.  }.}.#els
8cc0: 65 0a 23 20 64 65 66 69 6e 65 20 63 6f 64 65 43  e.# define codeC
8cd0: 75 72 73 6f 72 48 69 6e 74 28 41 2c 42 2c 43 2c  ursorHint(A,B,C,
8ce0: 44 29 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a  D)  /* No-op */.
8cf0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8d00: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8d10: 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  INTS */../*.** C
8d20: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
8d30: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
8d40: 62 2d 74 72 65 65 20 28 61 20 74 61 62 6c 65 29  b-tree (a table)
8d50: 2e 20 52 65 67 69 73 74 65 72 20 69 52 6f 77 69  . Register iRowi
8d60: 64 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  d contains.** a 
8d70: 72 6f 77 69 64 20 76 61 6c 75 65 20 6a 75 73 74  rowid value just
8d80: 20 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f   read from curso
8d90: 72 20 69 49 64 78 43 75 72 2c 20 6f 70 65 6e 20  r iIdxCur, open 
8da0: 6f 6e 20 69 6e 64 65 78 20 70 49 64 78 2e 20 54  on index pIdx. T
8db0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8dc0: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
8dd0: 6f 20 64 6f 20 61 20 64 65 66 65 72 72 65 64 20  o do a deferred 
8de0: 73 65 65 6b 20 6f 66 20 63 75 72 73 6f 72 20 69  seek of cursor i
8df0: 43 75 72 20 74 6f 20 74 68 65 20 0a 2a 2a 20 72  Cur to the .** r
8e00: 6f 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20 72  owid stored in r
8e10: 65 67 69 73 74 65 72 20 69 52 6f 77 69 64 2e 0a  egister iRowid..
8e20: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
8e30: 74 68 69 73 20 69 73 20 6a 75 73 74 3a 0a 2a 2a  this is just:.**
8e40: 0a 2a 2a 20 20 20 4f 50 5f 53 65 65 6b 20 24 69  .**   OP_Seek $i
8e50: 43 75 72 20 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a  Cur $iRowid.**.*
8e60: 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
8e70: 65 20 73 63 61 6e 20 63 75 72 72 65 6e 74 6c 79  e scan currently
8e80: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73 20   being coded is 
8e90: 61 20 62 72 61 6e 63 68 20 6f 66 20 61 6e 20 4f  a branch of an O
8ea0: 52 2d 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20 74 68  R-loop and.** th
8eb0: 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
8ec0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 64 65  ently being code
8ed0: 64 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 74  d is a SELECT, t
8ee0: 68 65 6e 20 50 33 20 6f 66 20 74 68 65 20 4f 50  hen P3 of the OP
8ef0: 5f 53 65 65 6b 0a 2a 2a 20 69 73 20 73 65 74 20  _Seek.** is set 
8f00: 74 6f 20 69 49 64 78 43 75 72 20 61 6e 64 20 50  to iIdxCur and P
8f10: 34 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  4 is set to poin
8f20: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
8f30: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 63 6f 6e   integers.** con
8f40: 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e 74 72  taining one entr
8f50: 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  y for each colum
8f60: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  n of the table c
8f70: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
8f80: 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46 6f 72 20 65  en .** on. For e
8f90: 61 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ach table column
8fa0: 2c 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , if the column 
8fb0: 69 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  is the i'th colu
8fc0: 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  mn of the .** in
8fd0: 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  dex, then the co
8fe0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72 72 61  rresponding arra
8ff0: 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74  y entry is set t
9000: 6f 20 28 69 2b 31 29 2e 20 49 66 20 74 68 65 20  o (i+1). If the 
9010: 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f 65 73 20 6e  column.** does n
9020: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
9030: 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2c 20 74   index at all, t
9040: 68 65 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  he array entry i
9050: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
9060: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
9070: 65 66 65 72 72 65 64 53 65 65 6b 28 0a 20 20 57  eferredSeek(.  W
9080: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
9090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
90a0: 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 63  * Where clause c
90b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
90c0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
90e0: 6e 64 65 78 20 73 63 61 6e 20 69 73 20 75 73 69  ndex scan is usi
90f0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ng */.  int iCur
9100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9120: 72 20 66 6f 72 20 49 50 4b 20 62 2d 74 72 65 65  r for IPK b-tree
9130: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
9140: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
9150: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
9160: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 50 61  ursor */.){.  Pa
9170: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
9180: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 2f 2a  Info->pParse; /*
9190: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
91a0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
91b0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
91c0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 67      /* Vdbe to g
91d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 69 74  enerate code wit
91e0: 68 69 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hin */..  assert
91f0: 28 20 69 49 64 78 43 75 72 3e 30 20 29 3b 0a 20  ( iIdxCur>0 );. 
9200: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
9210: 69 43 6f 6c 75 6d 6e 5b 70 49 64 78 2d 3e 6e 43  iColumn[pIdx->nC
9220: 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31 20 29 3b 0a  olumn-1]==-1 );.
9230: 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65    .  sqlite3Vdbe
9240: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
9250: 6b 2c 20 69 49 64 78 43 75 72 2c 20 30 2c 20 69  k, iIdxCur, 0, i
9260: 43 75 72 29 3b 0a 20 20 69 66 28 20 28 70 57 49  Cur);.  if( (pWI
9270: 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
9280: 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
9290: 41 55 53 45 29 0a 20 20 20 26 26 20 44 62 4d 61  AUSE).   && DbMa
92a0: 73 6b 41 6c 6c 5a 65 72 6f 28 73 71 6c 69 74 65  skAllZero(sqlite
92b0: 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
92c0: 50 61 72 73 65 29 2d 3e 77 72 69 74 65 4d 61 73  Parse)->writeMas
92d0: 6b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  k).  ){.    int 
92e0: 69 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  i;.    Table *pT
92f0: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
9300: 65 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 20 3d  e;.    int *ai =
9310: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62   (int*)sqlite3Db
9320: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
9330: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  e->db, sizeof(in
9340: 74 29 2a 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  t)*(pTab->nCol+1
9350: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 69 20 29  ));.    if( ai )
9360: 7b 0a 20 20 20 20 20 20 61 69 5b 30 5d 20 3d 20  {.      ai[0] = 
9370: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
9380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
9390: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 2b  x->nColumn-1; i+
93a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
93b0: 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
93c0: 6d 6e 5b 69 5d 3c 70 54 61 62 2d 3e 6e 43 6f 6c  mn[i]<pTab->nCol
93d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
93e0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
93f0: 5d 3e 3d 30 20 29 20 61 69 5b 70 49 64 78 2d 3e  ]>=0 ) ai[pIdx->
9400: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2b 31 5d 20 3d  aiColumn[i]+1] =
9410: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
9420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9430: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
9440: 63 68 61 72 2a 29 61 69 2c 20 50 34 5f 49 4e 54  char*)ai, P4_INT
9450: 41 52 52 41 59 29 3b 0a 20 20 20 20 7d 0a 20 20  ARRAY);.    }.  
9460: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
9470: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  e expression pas
9480: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
9490: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
94a0: 76 65 63 74 6f 72 2c 20 67 65 6e 65 72 61 74 65  vector, generate
94b0: 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 77 72 69 74  .** code to writ
94c0: 65 20 74 68 65 20 66 69 72 73 74 20 6e 52 65 67  e the first nReg
94d0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
94e0: 20 76 65 63 74 6f 72 20 69 6e 74 6f 20 61 6e 20   vector into an 
94f0: 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69  array.** of regi
9500: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
9510: 69 74 68 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ith iReg..**.** 
9520: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9530: 6e 20 69 73 20 6e 6f 74 20 61 20 76 65 63 74 6f  n is not a vecto
9540: 72 2c 20 74 68 65 6e 20 6e 52 65 67 20 6d 75 73  r, then nReg mus
9550: 74 20 62 65 20 70 61 73 73 65 64 20 31 2e 20 49  t be passed 1. I
9560: 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 2c 20  n.** this case, 
9570: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
9580: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   evaluate the ex
9590: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
95a0: 76 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ve the.** result
95b0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
95c0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
95d0: 64 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74  d codeExprOrVect
95e0: 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
95f0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  , Expr *p, int i
9600: 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
9610: 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3e 30    assert( nReg>0
9620: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
9630: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 29  3ExprIsVector(p)
9640: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9650: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9660: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 6c 61  .    if( (p->fla
9670: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
9680: 74 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  t) ){.      Vdbe
9690: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
96a0: 64 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  dbe;.      int i
96b0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
96c0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
96d0: 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
96e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
96f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
9700: 70 79 2c 20 69 53 65 6c 65 63 74 2c 20 69 52 65  py, iSelect, iRe
9710: 67 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  g, nReg-1);.    
9720: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
9730: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
9740: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
9750: 70 4c 69 73 74 20 3d 20 70 2d 3e 78 2e 70 4c 69  pList = p->x.pLi
9760: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
9770: 28 20 6e 52 65 67 3c 3d 70 4c 69 73 74 2d 3e 6e  ( nReg<=pList->n
9780: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 66 6f  Expr );.      fo
9790: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69  r(i=0; i<nReg; i
97a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
97b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
97c0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
97d0: 2e 70 45 78 70 72 2c 20 69 52 65 67 2b 69 29 3b  .pExpr, iReg+i);
97e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
97f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9800: 72 74 28 20 6e 52 65 67 3d 3d 31 20 29 3b 0a 20  rt( nReg==1 );. 
9810: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9820: 64 65 28 70 50 61 72 73 65 2c 20 70 2c 20 69 52  de(pParse, p, iR
9830: 65 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41  eg);.  }.}../* A
9840: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9850: 65 20 49 64 78 45 78 70 72 54 72 61 6e 73 20 6f  e IdxExprTrans o
9860: 62 6a 65 63 74 20 63 61 72 72 69 65 73 20 69 6e  bject carries in
9870: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9880: 61 0a 2a 2a 20 6d 61 70 70 69 6e 67 20 66 72 6f  a.** mapping fro
9890: 6d 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  m an expression 
98a0: 6f 6e 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  on table columns
98b0: 20 69 6e 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69   into a column i
98c0: 6e 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 64 6f  n an index.** do
98d0: 77 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 57  wn through the W
98e0: 61 6c 6b 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  alker..*/.typede
98f0: 66 20 73 74 72 75 63 74 20 49 64 78 45 78 70 72  f struct IdxExpr
9900: 54 72 61 6e 73 20 7b 0a 20 20 45 78 70 72 20 2a  Trans {.  Expr *
9910: 70 49 64 78 45 78 70 72 3b 20 20 20 20 2f 2a 20  pIdxExpr;    /* 
9920: 54 68 65 20 69 6e 64 65 78 20 65 78 70 72 65 73  The index expres
9930: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sion */.  int iT
9940: 61 62 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  abCur;       /* 
9950: 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
9960: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9970: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
9980: 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a  IdxCur;       /*
9990: 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   The cursor for 
99a0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
99b0: 6e 74 20 69 49 64 78 43 6f 6c 3b 20 20 20 20 20  nt iIdxCol;     
99c0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
99d0: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
99e0: 0a 7d 20 49 64 78 45 78 70 72 54 72 61 6e 73 3b  .} IdxExprTrans;
99f0: 0a 0a 2f 2a 20 54 68 65 20 77 61 6c 6b 65 72 20  ../* The walker 
9a00: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 75 73  node callback us
9a10: 65 64 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ed to transform 
9a20: 6d 61 74 63 68 69 6e 67 20 65 78 70 72 65 73 73  matching express
9a30: 69 6f 6e 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 72  ions into.** a r
9a40: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 69  eference to an i
9a50: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 6f 72 20  ndex column for 
9a60: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65  an index on an e
9a70: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
9a80: 20 49 66 20 70 45 78 70 72 20 6d 61 74 63 68 65   If pExpr matche
9a90: 73 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72  s, then transfor
9aa0: 6d 20 69 74 20 69 6e 74 6f 20 61 20 72 65 66 65  m it into a refe
9ab0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64  rence to the ind
9ac0: 65 78 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 68 61  ex column.** tha
9ad0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
9ae0: 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a  alue of pExpr..*
9af0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
9b00: 72 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73  reIndexExprTrans
9b10: 4e 6f 64 65 28 57 61 6c 6b 65 72 20 2a 70 2c 20  Node(Walker *p, 
9b20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
9b30: 49 64 78 45 78 70 72 54 72 61 6e 73 20 2a 70 58  IdxExprTrans *pX
9b40: 20 3d 20 70 2d 3e 75 2e 70 49 64 78 54 72 61 6e   = p->u.pIdxTran
9b50: 73 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  s;.  if( sqlite3
9b60: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
9b70: 72 2c 20 70 58 2d 3e 70 49 64 78 45 78 70 72 2c  r, pX->pIdxExpr,
9b80: 20 70 58 2d 3e 69 54 61 62 43 75 72 29 3d 3d 30   pX->iTabCur)==0
9b90: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
9ba0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
9bb0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9bc0: 20 3d 20 70 58 2d 3e 69 49 64 78 43 75 72 3b 0a   = pX->iIdxCur;.
9bd0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
9be0: 6d 6e 20 3d 20 70 58 2d 3e 69 49 64 78 43 6f 6c  mn = pX->iIdxCol
9bf0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
9c00: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
9c10: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
9c20: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
9c30: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
9c40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20   }.}../*.** For 
9c50: 61 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20 65 78  an indexes on ex
9c60: 70 72 65 73 73 69 6f 6e 20 58 2c 20 6c 6f 63 61  pression X, loca
9c70: 74 65 20 65 76 65 72 79 20 69 6e 73 74 61 6e 63  te every instanc
9c80: 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  e of expression 
9c90: 58 20 69 6e 20 70 45 78 70 72 0a 2a 2a 20 61 6e  X in pExpr.** an
9ca0: 64 20 63 68 61 6e 67 65 20 74 68 61 74 20 73 75  d change that su
9cb0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f  bexpression into
9cc0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
9cd0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
9ce0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
9cf0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
9d00: 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 64 65  c void whereInde
9d10: 78 45 78 70 72 54 72 61 6e 73 28 0a 20 20 49 6e  xExprTrans(.  In
9d20: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
9d30: 2f 2a 20 54 68 65 20 49 6e 64 65 78 20 2a 2f 0a  /* The Index */.
9d40: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
9d50: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
9d60: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9d70: 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  is being indexed
9d80: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
9d90: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
9da0: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
9db0: 74 73 65 6c 66 20 2a 2f 0a 20 20 57 68 65 72 65  tself */.  Where
9dc0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 2f 2a 20  Info *pWInfo /* 
9dd0: 54 72 61 6e 73 66 6f 72 6d 20 65 78 70 72 65 73  Transform expres
9de0: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 57 48  sions in this WH
9df0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
9e00: 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 3b 20  .  int iIdxCol; 
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e20: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
9e30: 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
9e40: 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45   ExprList *aColE
9e50: 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr;        /* E
9e60: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
9e70: 61 72 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  are indexed */. 
9e80: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 49 64 78   Walker w;.  Idx
9e90: 45 78 70 72 54 72 61 6e 73 20 78 3b 0a 20 20 61  ExprTrans x;.  a
9ea0: 43 6f 6c 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  ColExpr = pIdx->
9eb0: 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 66 28 20  aColExpr;.  if( 
9ec0: 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 72 65  aColExpr==0 ) re
9ed0: 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 20 61 6e  turn;  /* Not an
9ee0: 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
9ef0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  sions */.  memse
9f00: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
9f10: 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
9f20: 6c 6c 62 61 63 6b 20 3d 20 77 68 65 72 65 49 6e  llback = whereIn
9f30: 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64 65  dexExprTransNode
9f40: 3b 0a 20 20 77 2e 75 2e 70 49 64 78 54 72 61 6e  ;.  w.u.pIdxTran
9f50: 73 20 3d 20 26 78 3b 0a 20 20 78 2e 69 54 61 62  s = &x;.  x.iTab
9f60: 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b 0a 20  Cur = iTabCur;. 
9f70: 20 78 2e 69 49 64 78 43 75 72 20 3d 20 69 49 64   x.iIdxCur = iId
9f80: 78 43 75 72 3b 0a 20 20 66 6f 72 28 69 49 64 78  xCur;.  for(iIdx
9f90: 43 6f 6c 3d 30 3b 20 69 49 64 78 43 6f 6c 3c 61  Col=0; iIdxCol<a
9fa0: 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3b 20  ColExpr->nExpr; 
9fb0: 69 49 64 78 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  iIdxCol++){.    
9fc0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
9fd0: 6d 6e 5b 69 49 64 78 43 6f 6c 5d 21 3d 58 4e 5f  mn[iIdxCol]!=XN_
9fe0: 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
9ff0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 43 6f  .    assert( aCo
a000: 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
a010: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
a020: 20 20 78 2e 69 49 64 78 43 6f 6c 20 3d 20 69 49    x.iIdxCol = iI
a030: 64 78 43 6f 6c 3b 0a 20 20 20 20 78 2e 70 49 64  dxCol;.    x.pId
a040: 78 45 78 70 72 20 3d 20 61 43 6f 6c 45 78 70 72  xExpr = aColExpr
a050: 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
a060: 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  pr;.    sqlite3W
a070: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 57 49 6e  alkExpr(&w, pWIn
a080: 66 6f 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  fo->pWhere);.   
a090: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a0a0: 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d  List(&w, pWInfo-
a0b0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
a0c0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
a0d0: 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e  ist(&w, pWInfo->
a0e0: 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 7d  pResultSet);.  }
a0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a100: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
a110: 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
a120: 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
a130: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
a140: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
a150: 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
a160: 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61 73  WInfo..*/.Bitmas
a170: 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  k sqlite3WhereCo
a180: 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
a190: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
a1a0: 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
a1b0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
a1c0: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
a1d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
a1e0: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
a1f0: 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
a200: 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
a210: 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
a220: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a230: 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
a240: 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
a250: 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
a260: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
a270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a280: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
a290: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
a2b0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
a2c0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
a2d0: 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
a2e0: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
a2f0: 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
a300: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
a310: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
a320: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
a330: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
a340: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
a350: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
a360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a370: 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
a380: 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
a390: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
a3a0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
a3b0: 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
a3c0: 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
a3d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
a3e0: 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
a3f0: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
a400: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
a410: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
a420: 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
a430: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
a440: 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
a450: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
a460: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
a480: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
a490: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
a4a0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
a4b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a4c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
a4d0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4f0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
a500: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
a510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a520: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a530: 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
a540: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a550: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
a560: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
a570: 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
a580: 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
a590: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
a5a0: 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
a5c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
a5d0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
a5e0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 48  p */.  int addrH
a5f0: 61 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  alt;            
a600: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 42 72         /* addrBr
a610: 6b 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 6d  k for the outerm
a620: 6f 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ost loop */.  in
a630: 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a650: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
a660: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
a670: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
a680: 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
a690: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
a6a0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
a6b0: 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
a6c0: 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
a6d0: 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
a6e0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
a6f0: 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
a700: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
a710: 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
a720: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
a730: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
a740: 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  be;.  pWC = &pWI
a750: 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d  nfo->sWC;.  db =
a760: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
a770: 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
a780: 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c  >a[iLevel];.  pL
a790: 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
a7a0: 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d  Loop;.  pTabItem
a7b0: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
a7c0: 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
a7d0: 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
a7e0: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
a7f0: 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f  or;.  pLevel->no
a800: 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
a810: 79 20 26 20 7e 73 71 6c 69 74 65 33 57 68 65 72  y & ~sqlite3Wher
a820: 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
a830: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
a840: 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49  );.  bRev = (pWI
a850: 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c  nfo->revMask>>iL
a860: 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54  evel)&1;.  omitT
a870: 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  able = (pLoop->w
a880: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
a890: 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
a8a0: 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
a8b0: 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
a8c0: 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
a8d0: 55 53 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d  USE)==0;.  VdbeM
a8e0: 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
a8f0: 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f   "Begin WHERE-lo
a900: 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c  op%d: %s",iLevel
a910: 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d  ,pTabItem->pTab-
a920: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
a930: 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
a940: 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
a950: 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
a960: 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
a970: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
a980: 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
a990: 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
a9a0: 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
a9b0: 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
a9c0: 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
a9d0: 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
a9e0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
a9f0: 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
aa00: 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
aa10: 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
aa20: 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
aa30: 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
aa40: 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
aa50: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
aa60: 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
aa70: 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
aa80: 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
aa90: 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
aaa0: 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
aab0: 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
aac0: 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
aad0: 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
aae0: 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
aaf0: 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
ab00: 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
ab10: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
ab20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ab30: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
ab40: 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
ab50: 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
ab60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ab70: 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
ab80: 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
ab90: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
aba0: 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
abb0: 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
abc0: 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
abd0: 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
abe0: 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
abf0: 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
ac00: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
ac10: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
ac20: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
ac30: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
ac40: 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
ac50: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
ac60: 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
ac70: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
ac80: 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
ac90: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
aca0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acb0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
acc0: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
acd0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ace0: 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
acf0: 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
ad00: 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
ad10: 20 43 6f 6d 70 75 74 65 20 61 20 73 61 66 65 20   Compute a safe 
ad20: 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  address to jump 
ad30: 74 6f 20 69 66 20 77 65 20 64 69 73 63 6f 76 65  to if we discove
ad40: 72 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  r that the table
ad50: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 69 73 20 6c   for.  ** this l
ad60: 6f 6f 70 20 69 73 20 65 6d 70 74 79 20 61 6e 64  oop is empty and
ad70: 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 72   can never contr
ad80: 69 62 75 74 65 20 63 6f 6e 74 65 6e 74 2e 20 2a  ibute content. *
ad90: 2f 0a 20 20 66 6f 72 28 6a 3d 69 4c 65 76 65 6c  /.  for(j=iLevel
ada0: 3b 20 6a 3e 30 20 26 26 20 70 57 49 6e 66 6f 2d  ; j>0 && pWInfo-
adb0: 3e 61 5b 6a 5d 2e 69 4c 65 66 74 4a 6f 69 6e 3d  >a[j].iLeftJoin=
adc0: 3d 30 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 61 64 64  =0; j--){}.  add
add0: 72 48 61 6c 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  rHalt = pWInfo->
ade0: 61 5b 6a 5d 2e 61 64 64 72 42 72 6b 3b 0a 0a 20  a[j].addrBrk;.. 
adf0: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
ae00: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
ae10: 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
ae20: 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
ae30: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
ae40: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
ae50: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
ae60: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
ae70: 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
ae80: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
ae90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aea0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
aeb0: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61  regYield, 0, pTa
aec0: 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
aed0: 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ub);.    pLevel-
aee0: 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
aef0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
af00: 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20  ield, regYield, 
af10: 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64  addrBrk);.    Vd
af20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
af30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
af40: 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
af50: 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65  \"%s\"", pTabIte
af60: 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
af70: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
af80: 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
af90: 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
afa0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
afb0: 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
afc0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
afd0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
afe0: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
aff0: 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
b000: 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
b010: 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
b020: 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
b030: 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
b040: 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
b050: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
b060: 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
b070: 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
b080: 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
b090: 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
b0a0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
b0b0: 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
b0c0: 54 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 69 49  Term;.    int iI
b0d0: 6e 3b 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72  n;    /* Counter
b0e0: 20 66 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69   for IN constrai
b0f0: 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  nts */..    sqli
b100: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
b110: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
b120: 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
b130: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b140: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
b150: 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
b160: 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
b170: 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
b180: 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
b190: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
b1a0: 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
b1b0: 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
b1c0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
b1d0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 4e  [j];.      if( N
b1e0: 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29  EVER(pTerm==0) )
b1f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b200: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
b210: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
b220: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75  .        codeEqu
b230: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
b240: 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
b250: 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65   j, bRev, iTarge
b260: 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  t);.        addr
b270: 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
b280: 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
b290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b2a0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
b2b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
b2c0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 63 6f  ight;.        co
b2d0: 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70  deExprOrVector(p
b2e0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
b2f0: 54 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  Target, 1);.    
b300: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
b310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b320: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
b330: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
b340: 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b370: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
b380: 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b3a0: 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
b3b0: 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
b3c0: 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
b3e0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
b3f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b400: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
b410: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
b420: 20 50 34 5f 44 59 4e 41 4d 49 43 20 3a 20 50 34   P4_DYNAMIC : P4
b430: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64  _STATIC);.    Vd
b440: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b450: 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
b460: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
b470: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
b480: 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
b490: 2d 3e 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 65  ->op = pWInfo->e
b4a0: 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4e 6f 6f  OnePass ? OP_Noo
b4b0: 70 20 3a 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p : OP_VNext;.  
b4c0: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
b4d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b4e0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 49  tAddr(v);.    iI
b4f0: 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
b500: 2e 6e 49 6e 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  .nIn;.    for(j=
b510: 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 3b 20 6a  nConstraint-1; j
b520: 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
b530: 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
b540: 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
b550: 20 69 66 28 20 6a 3c 31 36 20 26 26 20 28 70 4c   if( j<16 && (pL
b560: 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  oop->u.vtab.omit
b570: 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20  Mask>>j)&1 ){.  
b580: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
b590: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
b5a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b5b0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
b5c0: 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
b5d0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
b5e0: 2a 70 43 6f 6d 70 61 72 65 3b 20 20 2f 2a 20 54  *pCompare;  /* T
b5f0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
b600: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
b610: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 20    Expr *pRight; 
b620: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65     /* RHS of the
b630: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20   comparison */. 
b640: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
b650: 4f 70 3b 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  Op;     /* Opcod
b660: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
b670: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 4e 20  value of the IN 
b680: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
b690: 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 6f 61 64         /* Reload
b6a0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b6b0: 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 5b 69  value into reg[i
b6c0: 52 65 67 2b 6a 2b 32 5d 2e 20 20 54 68 65 20 73  Reg+j+2].  The s
b6d0: 61 6d 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ame value.      
b6e0: 20 20 2a 2a 20 77 61 73 20 6c 6f 61 64 65 64 20    ** was loaded 
b6f0: 69 6e 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65  into the same re
b700: 67 69 73 74 65 72 20 70 72 69 6f 72 20 74 6f 20  gister prior to 
b710: 74 68 65 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  the OP_VFilter, 
b720: 62 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  but.        ** t
b730: 68 65 20 78 46 69 6c 74 65 72 20 69 6d 70 6c 65  he xFilter imple
b740: 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 20  mentation might 
b750: 68 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 65  have changed the
b760: 20 64 61 74 61 74 79 70 65 20 6f 72 0a 20 20 20   datatype or.   
b770: 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67       ** encoding
b780: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   of the value in
b790: 20 74 68 65 20 72 65 67 69 73 74 65 72 2c 20 73   the register, s
b7a0: 6f 20 69 74 20 2a 6d 75 73 74 2a 20 62 65 20 72  o it *must* be r
b7b0: 65 6c 6f 61 64 65 64 2e 20 2a 2f 0a 20 20 20 20  eloaded. */.    
b7c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
b7d0: 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
b7e0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
b7f0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
b800: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
b810: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
b830: 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n>0 );.         
b840: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
b850: 62 65 47 65 74 4f 70 28 76 2c 20 70 4c 65 76 65  beGetOp(v, pLeve
b860: 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
b870: 2d 2d 69 49 6e 5d 2e 61 64 64 72 49 6e 54 6f 70  --iIn].addrInTop
b880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
b890: 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
b8a0: 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70  ==OP_Column || p
b8b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
b8c0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
b8d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
b8e0: 70 63 6f 64 65 21 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode!=OP_Column
b8f0: 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 69 52 65   || pOp->p3==iRe
b900: 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20 20 20 20  g+j+2 );.       
b910: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
b920: 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 69 64  opcode!=OP_Rowid
b930: 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 69 52 65   || pOp->p2==iRe
b940: 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20 20 20 20  g+j+2 );.       
b950: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
b960: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
b970: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  id );.          
b980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b990: 33 28 76 2c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  3(v, pOp->opcode
b9a0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
b9b0: 70 32 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20  p2, pOp->p3);.  
b9c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b9d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
b9e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74  e that will cont
b9f0: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
ba00: 20 72 6f 77 20 69 66 20 0a 20 20 20 20 20 20 20   row if .       
ba10: 20 2a 2a 20 74 68 65 20 49 4e 20 63 6f 6e 73 74   ** the IN const
ba20: 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
ba30: 69 73 66 69 65 64 20 2a 2f 0a 20 20 20 20 20 20  isfied */.      
ba40: 20 20 70 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c    pCompare = sql
ba50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
ba60: 2c 20 54 4b 5f 45 51 2c 20 30 2c 20 30 29 3b 0a  , TK_EQ, 0, 0);.
ba70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ba80: 70 43 6f 6d 70 61 72 65 21 3d 30 20 7c 7c 20 64  pCompare!=0 || d
ba90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
baa0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
bab0: 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20  Compare ){.     
bac0: 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70       pCompare->p
bad0: 4c 65 66 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Left = pTerm->pE
bae0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
baf0: 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e        pCompare->
bb00: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 20  pRight = pRight 
bb10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
bb20: 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30  , TK_REGISTER, 0
bb30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
bb40: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
bb50: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
bb60: 54 61 62 6c 65 20 3d 20 69 52 65 67 2b 6a 2b 32  Table = iReg+j+2
bb70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
bb80: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
bb90: 28 70 50 61 72 73 65 2c 20 70 43 6f 6d 70 61 72  (pParse, pCompar
bba0: 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  e, pLevel->addrC
bbb0: 6f 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ont, 0);.       
bbc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
bbd0: 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66 74 20 3d  Compare->pLeft =
bbe0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
bbf0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
bc00: 64 62 2c 20 70 43 6f 6d 70 61 72 65 29 3b 0a 20  db, pCompare);. 
bc10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bc20: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68  .    }.    /* Th
bc30: 65 73 65 20 72 65 67 69 73 74 65 72 73 20 6e 65  ese registers ne
bc40: 65 64 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  ed to be preserv
bc50: 65 64 20 69 6e 20 63 61 73 65 20 74 68 65 72 65  ed in case there
bc60: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
bc70: 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 20  or.    ** loop. 
bc80: 20 53 6f 20 77 65 20 63 6f 75 6c 64 20 64 65 61   So we could dea
bc90: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 67 69  llocate the regi
bca0: 73 74 65 72 73 20 68 65 72 65 20 28 61 6e 64 20  sters here (and 
bcb0: 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
bcc0: 2a 2a 20 72 65 75 73 65 20 74 68 65 6d 20 6c 61  ** reuse them la
bcd0: 74 65 72 29 20 69 66 20 28 70 4c 6f 6f 70 2d 3e  ter) if (pLoop->
bce0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
bcf0: 49 4e 5f 41 42 4c 45 29 3d 3d 30 2e 20 20 42 75  IN_ABLE)==0.  Bu
bd00: 74 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 2a  t it seems.    *
bd10: 2a 20 73 69 6d 70 6c 65 72 20 61 6e 64 20 73 61  * simpler and sa
bd20: 66 65 72 20 74 6f 20 73 69 6d 70 6c 79 20 6e 6f  fer to simply no
bd30: 74 20 72 65 75 73 65 20 74 68 65 20 72 65 67 69  t reuse the regi
bd40: 73 74 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  sters..    **.  
bd50: 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 52    **    sqlite3R
bd60: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
bd70: 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
bd80: 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
bd90: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
bda0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
bdb0: 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rse);.  }else.#e
bdc0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bdd0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bde0: 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
bdf0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
be00: 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
be10: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
be20: 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
be30: 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
be40: 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
be50: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
be60: 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
be70: 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
be80: 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
be90: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
bea0: 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
beb0: 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
bec0: 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
bed0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
bee0: 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
bef0: 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
bf00: 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
bf10: 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
bf20: 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
bf30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bf40: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
bf50: 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  nEq==1 );.    pT
bf60: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
bf70: 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
bf80: 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
bf90: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
bfa0: 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
bfb0: 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
bfc0: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
bfd0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
bfe0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
bff0: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
c000: 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50  eleaseReg = ++pP
c010: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c020: 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
c030: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
c040: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
c050: 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
c060: 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69  leaseReg);.    i
c070: 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52  f( iRowidReg!=iR
c080: 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69  eleaseReg ) sqli
c090: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
c0a0: 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
c0b0: 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
c0c0: 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
c0d0: 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
c0e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c0f0: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43  OP_SeekRowid, iC
c100: 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
c110: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
c120: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
c140: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
c150: 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52  (pParse, iRowidR
c160: 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
c170: 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
c180: 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
c190: 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
c1a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c1b0: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
c1c0: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
c1d0: 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
c1e0: 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
c1f0: 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
c200: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
c210: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c220: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
c230: 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  GE)!=0.  ){.    
c240: 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68  /* Case 3:  We h
c250: 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
c260: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
c270: 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
c280: 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
c290: 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
c2a0: 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
c2b0: 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
c2c0: 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
c2d0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
c2e0: 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
c2f0: 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
c300: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20  ble==0 );.    j 
c310: 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
c320: 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  = pEnd = 0;.    
c330: 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
c340: 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
c350: 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20  IMIT ) pStart = 
c360: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
c370: 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  +];.    if( pLoo
c380: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
c390: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70  RE_TOP_LIMIT ) p
c3a0: 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
c3b0: 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73  erm[j++];.    as
c3c0: 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20  sert( pStart!=0 
c3d0: 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  || pEnd!=0 );.  
c3e0: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
c3f0: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
c400: 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
c410: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
c420: 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
c430: 20 7d 0a 20 20 20 20 63 6f 64 65 43 75 72 73 6f   }.    codeCurso
c440: 72 48 69 6e 74 28 70 54 61 62 49 74 65 6d 2c 20  rHint(pTabItem, 
c450: 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20  pWInfo, pLevel, 
c460: 70 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70  pEnd);.    if( p
c470: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
c480: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
c490: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c4a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
c4b0: 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
c4c0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
c4d0: 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
c4e0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
c4f0: 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
c500: 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
c510: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20  /.      int op; 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c530: 20 43 75 72 73 6f 72 20 73 65 65 6b 20 6f 70 65   Cursor seek ope
c540: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20  ration */..     
c550: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
c560: 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
c570: 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
c580: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
c590: 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
c5a0: 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
c5b0: 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
c5c0: 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
c5d0: 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
c5e0: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
c5f0: 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
c600: 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
c610: 2f 20 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20  /  OP_SeekGT,.  
c620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
c630: 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c  E */  OP_SeekLE,
c640: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
c650: 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
c660: 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  LT,.           /
c670: 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
c680: 65 65 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGE.      };. 
c690: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c6a0: 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
c6b0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
c6c0: 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
c6d0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
c6e0: 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
c6f0: 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
c700: 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
c710: 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
c720: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
c730: 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
c740: 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
c750: 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ct. */..      as
c760: 73 65 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77  sert( (pStart->w
c770: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
c780: 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
c790: 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
c7a0: 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
c7b0: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
c7c0: 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
c7d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
c7e0: 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
c7f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
c800: 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
c810: 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61  !=iCur ); /* tra
c820: 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
c830: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nts */.      if(
c840: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
c850: 63 74 6f 72 28 70 58 2d 3e 70 52 69 67 68 74 29  ctor(pX->pRight)
c860: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   ){.        r1 =
c870: 20 72 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   rTemp = sqlite3
c880: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
c890: 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  e);.        code
c8a0: 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61  ExprOrVector(pPa
c8b0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
c8c0: 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
c8d0: 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70 5b 28 70   op = aMoveOp[(p
c8e0: 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54 29 20 7c  X->op - TK_GT) |
c8f0: 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 20 20   0x0001];.      
c900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
c910: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
c920: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
c930: 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65  pX->pRight, &rTe
c940: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  mp);.        dis
c950: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
c960: 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   pStart);.      
c970: 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70 5b 28    op = aMoveOp[(
c980: 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54 29 5d  pX->op - TK_GT)]
c990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c9a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c9b0: 33 28 76 2c 20 6f 70 2c 20 69 43 75 72 2c 20 61  3(v, op, iCur, a
c9c0: 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
c9d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c9e0: 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
c9f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
ca00: 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  v, pX->op==TK_GT
ca10: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
ca20: 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
ca30: 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  p==TK_LE);.     
ca40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
ca50: 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  v, pX->op==TK_LT
ca60: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
ca70: 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
ca80: 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20  p==TK_GE);.     
ca90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
caa0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
cab0: 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
cac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
cad0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
cae0: 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
caf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
cb00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cb10: 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
cb20: 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
cb30: 75 72 2c 20 61 64 64 72 48 61 6c 74 29 3b 0a 20  ur, addrHalt);. 
cb40: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
cb50: 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b  eIf(v, bRev==0);
cb60: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
cb70: 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
cb80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cb90: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
cba0: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
cbb0: 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
cbc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cbd0: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
cbe0: 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46  sert( (pEnd->wtF
cbf0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
cc00: 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
cc10: 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c  estcase( pEnd->l
cc20: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
cc30: 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65  ); /* Transitive
cc40: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
cc50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc60: 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
cc70: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
cc80: 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
cc90: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
cca0: 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78  em;.      codeEx
ccb0: 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73  prOrVector(pPars
ccc0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d  e, pX->pRight, m
ccd0: 65 6d 45 6e 64 56 61 6c 75 65 2c 20 31 29 3b 0a  emEndValue, 1);.
cce0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
ccf0: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
cd00: 28 70 58 2d 3e 70 52 69 67 68 74 29 20 0a 20 20  (pX->pRight) .  
cd10: 20 20 20 20 20 26 26 20 28 70 58 2d 3e 6f 70 3d       && (pX->op=
cd20: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
cd30: 3d 3d 54 4b 5f 47 54 29 20 0a 20 20 20 20 20 20  ==TK_GT) .      
cd40: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
cd50: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
cd60: 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
cd70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
cd80: 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
cd90: 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
cda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cdb0: 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 73  0==sqlite3ExprIs
cdc0: 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69 67 68  Vector(pX->pRigh
cdd0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  t) ){.        di
cde0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
cdf0: 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d  , pEnd);.      }
ce00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
ce10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
ce20: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
ce30: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
ce40: 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
ce50: 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
ce60: 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
ce70: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
ce80: 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65   start;.    asse
ce90: 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
cea0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73  0 );.    if( tes
ceb0: 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
cec0: 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
ced0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
cee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cef0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cf00: 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f  Rowid, iCur, iRo
cf10: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
cf20: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
cf30: 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
cf40: 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
cf50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cf60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65  VdbeAddOp3(v, te
cf70: 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  stOp, memEndValu
cf80: 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77  e, addrBrk, iRow
cf90: 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  idReg);.      Vd
cfa0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
cfb0: 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  testOp==OP_Le);.
cfc0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
cfd0: 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
cfe0: 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64  OP_Lt);.      Vd
cff0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
d000: 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  testOp==OP_Ge);.
d010: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
d020: 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
d030: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71  OP_Gt);.      sq
d040: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d050: 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  5(v, SQLITE_AFF_
d060: 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45  NUMERIC | SQLITE
d070: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
d080: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d090: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
d0a0: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
d0b0: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a  {.    /* Case 4:
d0c0: 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e   A scan using an
d0d0: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
d0e0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
d0f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d  e WHERE clause m
d100: 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20  ay contain zero 
d110: 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79  or more equality
d120: 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
d130: 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20   terms ("==" or 
d140: 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20  "IN" operators) 
d150: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
d160: 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  e N.    **      
d170: 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c     left-most col
d180: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
d190: 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63  x. It may also c
d1a0: 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20  ontain.    **   
d1b0: 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79        inequality
d1c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c   constraints (>,
d1d0: 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e   <, >= or <=) on
d1e0: 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20   the indexed.   
d1f0: 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
d200: 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  mn that immediat
d210: 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ely follows the 
d220: 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e  N equalities. On
d230: 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ly .    **      
d240: 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73     the right-mos
d250: 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
d260: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
d270: 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
d280: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
d290: 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
d2a0: 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f  N" operators. Fo
d2b0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
d2c0: 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  e .    **       
d2d0: 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78    index is on (x
d2e0: 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20  ,y,z), then the 
d2f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65  following clause
d300: 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a  s are all .    *
d310: 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69  *         optimi
d320: 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  zed:.    **.    
d330: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
d340: 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  5.    **        
d350: 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30      x=5 AND y=10
d360: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
d370: 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a     x=5 AND y<10.
d380: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
d390: 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e    x=5 AND y>5 AN
d3a0: 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
d3b0: 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
d3c0: 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20   y=5 AND z<=10. 
d3d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
d3e0: 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65       The z<10 te
d3f0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  rm of the follow
d400: 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ing cannot be us
d410: 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  ed, only.    ** 
d420: 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20          the x=5 
d430: 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  term:.    **.   
d440: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
d450: 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20  =5 AND z<10.    
d460: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
d470: 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20    N may be zero 
d480: 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  if there are ine
d490: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d4a0: 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20  nts..    **     
d4b0: 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65      If there are
d4c0: 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   no inequality c
d4d0: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e  onstraints, then
d4e0: 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20   N is at.    ** 
d4f0: 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e          least on
d500: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
d510: 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61           This ca
d520: 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  se is also used 
d530: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
d540: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
d550: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
d560: 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
d570: 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
d580: 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
d590: 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  der.    **      
d5a0: 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
d5b0: 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
d5c0: 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
d5d0: 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20  DER BY..    */  
d5e0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
d5f0: 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20  t u8 aStartOp[] 
d600: 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20  = {.      0,.   
d610: 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52     0,.      OP_R
d620: 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20  ewind,          
d630: 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63   /* 2: (!start_c
d640: 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
d650: 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29  artEq &&  !bRev)
d660: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73   */.      OP_Las
d670: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
d680: 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 3: (!start_con
d690: 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
d6a0: 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a  tEq &&   bRev) *
d6b0: 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
d6c0: 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
d6d0: 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  4: (start_constr
d6e0: 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
d6f0: 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
d700: 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c        OP_SeekLT,
d710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a             /* 5:
d720: 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
d730: 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
d740: 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
d750: 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20      OP_SeekGE,  
d760: 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28           /* 6: (
d770: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
d780: 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
d790: 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
d7a0: 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20    OP_SeekLE     
d7b0: 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74         /* 7: (st
d7c0: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
d7d0: 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
d7e0: 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
d7f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
d800: 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20  t u8 aEndOp[] = 
d810: 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  {.      OP_IdxGE
d820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d830: 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  0: (end_constrai
d840: 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20  nts && !bRev && 
d850: 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20  !endEq) */.     
d860: 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20   OP_IdxGT,      
d870: 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
d880: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
d890: 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29  !bRev &&  endEq)
d8a0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
d8b0: 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  LE,            /
d8c0: 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
d8d0: 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26  aints &&  bRev &
d8e0: 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
d8f0: 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20     OP_IdxLT,    
d900: 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65          /* 3: (e
d910: 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
d920: 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64 45  &  bRev &&  endE
d930: 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  q) */.    };.   
d940: 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   u16 nEq = pLoop
d950: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20  ->u.btree.nEq;  
d960: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d970: 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a  == or IN terms *
d980: 2f 0a 20 20 20 20 75 31 36 20 6e 42 74 6d 20 3d  /.    u16 nBtm =
d990: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
d9a0: 6e 42 74 6d 3b 20 20 20 2f 2a 20 4c 65 6e 67 74  nBtm;   /* Lengt
d9b0: 68 20 6f 66 20 42 54 4d 20 76 65 63 74 6f 72 20  h of BTM vector 
d9c0: 2a 2f 0a 20 20 20 20 75 31 36 20 6e 54 6f 70 20  */.    u16 nTop 
d9d0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
d9e0: 2e 6e 54 6f 70 3b 20 20 20 2f 2a 20 4c 65 6e 67  .nTop;   /* Leng
d9f0: 74 68 20 6f 66 20 54 4f 50 20 76 65 63 74 6f 72  th of TOP vector
da00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
da10: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
da20: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
da30: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
da40: 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
da50: 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
da60: 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
da70: 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
da80: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
da90: 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
daa0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
dab0: 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
dac0: 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
dad0: 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
dae0: 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
daf0: 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
db00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
db10: 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
db20: 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
db30: 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
db40: 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
db50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
db60: 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
db70: 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
db80: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
db90: 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
dba0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
dbb0: 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
dbc0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
dbd0: 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
dbe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dbf0: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
dc00: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
dc10: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dc30: 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
dc40: 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
dc50: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
dc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dc70: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
dc80: 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
dc90: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
dca0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
dcb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
dcc0: 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
dcd0: 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
dce0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
dcf0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
dd00: 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
dd10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
dd20: 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
dd30: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
dd40: 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
dd50: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
dd60: 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
dd70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
dd80: 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
dd90: 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
dda0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
ddb0: 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
ddc0: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
ddd0: 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
dde0: 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
ddf0: 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
de00: 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
de10: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
de20: 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
de30: 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
de40: 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
de50: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
de60: 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
de70: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
de80: 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
de90: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
dea0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
deb0: 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
dec0: 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
ded0: 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
dee0: 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
def0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
df00: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
df10: 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
df20: 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
df30: 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
df40: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
df50: 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
df60: 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
df70: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
df80: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
df90: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
dfa0: 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
dfb0: 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
dfc0: 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
dfd0: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
dfe0: 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
dff0: 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
e000: 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
e010: 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
e020: 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
e030: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
e040: 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
e050: 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
e060: 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
e070: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
e080: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
e090: 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
e0a0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
e0b0: 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
e0c0: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
e0d0: 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
e0e0: 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
e0f0: 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
e100: 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
e110: 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
e120: 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
e130: 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
e140: 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
e150: 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
e160: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
e170: 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
e180: 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
e190: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
e1a0: 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
e1b0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
e1c0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
e1d0: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
e1e0: 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
e1f0: 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
e200: 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
e210: 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
e220: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
e230: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
e240: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
e250: 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
e260: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
e270: 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
e280: 67 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52 65  g = MAX(nExtraRe
e290: 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  g, pLoop->u.btre
e2a0: 65 2e 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20 2f  e.nBtm);.      /
e2b0: 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  * Like optimizat
e2c0: 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
e2d0: 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63  aints always occ
e2e0: 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
e2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
e300: 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
e310: 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
e320: 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  T)==0 || .      
e330: 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e          (pLoop->
e340: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
e350: 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b  TOP_LIMIT)!=0 );
e360: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e370: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
e380: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
e390: 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
e3a0: 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
e3b0: 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
e3c0: 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28 6e  ExtraReg = MAX(n
e3d0: 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70 2d  ExtraReg, pLoop-
e3e0: 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 29 3b 0a  >u.btree.nTop);.
e3f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
e400: 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
e410: 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 69 66 28  _BLOBS.      if(
e420: 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
e430: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
e440: 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OPT)!=0 ){.     
e450: 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
e460: 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20 20  eStart!=0 );    
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f 6e   /* LIKE opt con
e490: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
e4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
e4b0: 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
e4c0: 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
e4d0: 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69 6e  );   /* occur in
e4e0: 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20   pairs */.      
e4f0: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
e500: 65 70 43 6e 74 72 20 3d 20 28 75 33 32 29 2b 2b  epCntr = (u32)++
e510: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e530: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e540: 74 65 67 65 72 2c 20 31 2c 20 28 69 6e 74 29 70  teger, 1, (int)p
e550: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
e560: 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ntr);.        Vd
e570: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e580: 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  IKE loop counter
e590: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  "));.        pLe
e5a0: 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
e5b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
e5c0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
e5d0: 20 20 20 20 20 20 2f 2a 20 69 4c 69 6b 65 52 65        /* iLikeRe
e5e0: 70 43 6e 74 72 20 61 63 74 75 61 6c 6c 79 20 73  pCntr actually s
e5f0: 74 6f 72 65 73 20 32 78 20 74 68 65 20 63 6f 75  tores 2x the cou
e600: 6e 74 65 72 20 72 65 67 69 73 74 65 72 20 6e 75  nter register nu
e610: 6d 62 65 72 2e 20 20 54 68 65 0a 20 20 20 20 20  mber.  The.     
e620: 20 20 20 2a 2a 20 62 6f 74 74 6f 6d 20 62 69 74     ** bottom bit
e630: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
e640: 65 72 20 74 68 65 20 73 65 61 72 63 68 20 6f 72  er the search or
e650: 64 65 72 20 69 73 20 41 53 43 20 6f 72 20 44 45  der is ASC or DE
e660: 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  SC. */.        t
e670: 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
e680: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
e690: 65 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  e( pIdx->aSortOr
e6a0: 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
e6b0: 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20 20  _SO_DESC );.    
e6c0: 20 20 20 20 61 73 73 65 72 74 28 20 28 62 52 65      assert( (bRe
e6d0: 76 20 26 20 7e 31 29 3d 3d 30 20 29 3b 0a 20 20  v & ~1)==0 );.  
e6e0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
e6f0: 69 6b 65 52 65 70 43 6e 74 72 20 3c 3c 3d 31 3b  ikeRepCntr <<=1;
e700: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
e710: 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 7c 3d  >iLikeRepCntr |=
e720: 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e 61   bRev ^ (pIdx->a
e730: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
e740: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29 3b  SQLITE_SO_DESC);
e750: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
e760: 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
e770: 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Start==0 ){.    
e780: 20 20 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69      j = pIdx->ai
e790: 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
e7a0: 20 20 20 20 20 69 66 28 20 28 6a 3e 3d 30 20 26       if( (j>=0 &
e7b0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
e7c0: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
e7d0: 3d 30 29 20 7c 7c 20 6a 3d 3d 58 4e 5f 45 58 50  =0) || j==XN_EXP
e7e0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  R ){.          b
e7f0: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31  SeekPastNull = 1
e800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e810: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e820: 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
e830: 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
e840: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
e850: 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
e860: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
e870: 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
e880: 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
e890: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
e8a0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
e8b0: 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
e8c0: 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
e8d0: 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
e8e0: 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
e8f0: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
e900: 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
e910: 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
e920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e930: 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
e940: 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
e950: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
e960: 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
e970: 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
e980: 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
e990: 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
e9a0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
e9b0: 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
e9c0: 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
e9d0: 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20  .      SWAP(u8, 
e9e0: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62  bSeekPastNull, b
e9f0: 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20  StopAtNull);.   
ea00: 20 20 20 53 57 41 50 28 75 38 2c 20 6e 42 74 6d     SWAP(u8, nBtm
ea10: 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 0a  , nTop);.    }..
ea20: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
ea30: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
ea40: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
ea50: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
ea60: 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
ea70: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
ea80: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
ea90: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
eaa0: 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
eab0: 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
eac0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
ead0: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70  codeCursorHint(p
eae0: 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c  TabItem, pWInfo,
eaf0: 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45   pLevel, pRangeE
eb00: 6e 64 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65  nd);.    regBase
eb10: 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
eb20: 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
eb30: 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
eb40: 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
eb50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53  ;.    assert( zS
eb60: 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71  tartAff==0 || sq
eb70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
eb80: 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b  tartAff)>=nEq );
eb90: 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41  .    if( zStartA
eba0: 66 66 20 26 26 20 6e 54 6f 70 20 29 7b 0a 20 20  ff && nTop ){.  
ebb0: 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71      zEndAff = sq
ebc0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ebd0: 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  , &zStartAff[nEq
ebe0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  ]);.    }.    ad
ebf0: 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
ec00: 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 74 65  addrNxt;..    te
ec10: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
ec20: 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
ec30: 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
ec40: 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
ec50: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
ec60: 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
ec70: 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
ec80: 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
ec90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
eca0: 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
ecb0: 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
ecc0: 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
ecd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ece0: 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
ecf0: 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
ed00: 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
ed10: 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
ed20: 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
ed30: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
ed40: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
ed50: 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
ed60: 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
ed70: 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
ed80: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
ed90: 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
eda0: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
edb0: 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
edc0: 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
edd0: 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
ede0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
edf0: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
ee00: 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
ee10: 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
ee20: 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
ee30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
ee40: 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
ee50: 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
ee60: 74 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78 70  t;.      codeExp
ee70: 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73 65  rOrVector(pParse
ee80: 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
ee90: 65 2b 6e 45 71 2c 20 6e 42 74 6d 29 3b 0a 20 20  e+nEq, nBtm);.  
eea0: 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
eeb0: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
eec0: 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
eed0: 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
eee0: 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
eef0: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
ef00: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
ef10: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
ef20: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
ef30: 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
ef40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ef60: 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
ef70: 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
ef80: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
ef90: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
efa0: 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
efb0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70  ff ){.        up
efc0: 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69 74  dateRangeAffinit
efd0: 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 42 74  yStr(pRight, nBt
efe0: 6d 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45  m, &zStartAff[nE
eff0: 71 5d 29 3b 0a 20 20 20 20 20 20 7d 20 20 0a 20  q]);.      }  . 
f000: 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
f010: 20 2b 3d 20 6e 42 74 6d 3b 0a 20 20 20 20 20 20   += nBtm;.      
f020: 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
f030: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
f040: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
f050: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f060: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
f070: 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20  Right)==0 ){.   
f080: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
f090: 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
f0a0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tart);.      }el
f0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 72  se{.        star
f0c0: 74 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  tEq = 1;.      }
f0d0: 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74  .      bSeekPast
f0e0: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
f0f0: 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73  lse if( bSeekPas
f100: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  tNull ){.      s
f110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f120: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
f130: 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
f140: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
f150: 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
f160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
f170: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
f180: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
f190: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
f1a0: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
f1b0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53  nConstraint - bS
f1c0: 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74  eekPastNull, zSt
f1d0: 61 72 74 41 66 66 29 3b 0a 20 20 20 20 69 66 28  artAff);.    if(
f1e0: 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3e 30 20   pLoop->nSkip>0 
f1f0: 26 26 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3d 3d  && nConstraint==
f200: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a  pLoop->nSkip ){.
f210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6b 69        /* The ski
f220: 70 2d 73 63 61 6e 20 6c 6f 67 69 63 20 69 6e 73  p-scan logic ins
f230: 69 64 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ide the call to 
f240: 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 43  codeAllEqualityC
f250: 6f 6e 73 74 72 61 69 6e 74 73 28 29 0a 20 20 20  onstraints().   
f260: 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
f270: 61 6c 72 65 61 64 79 20 6c 65 66 74 20 74 68 65  already left the
f280: 20 63 75 72 73 6f 72 20 73 69 74 74 69 6e 67 20   cursor sitting 
f290: 6f 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  on the correct r
f2a0: 6f 77 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20  ow,.      ** so 
f2b0: 6e 6f 20 66 75 72 74 68 65 72 20 73 65 65 6b 69  no further seeki
f2c0: 6e 67 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ng is needed */.
f2d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f2e0: 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
f2f0: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
f300: 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
f310: 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
f320: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
f330: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
f340: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
f350: 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
f360: 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
f370: 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
f380: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
f390: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
f3a0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
f3b0: 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20  p==OP_Rewind);  
f3c0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
f3d0: 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 20  _Rewind );.     
f3e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
f3f0: 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b  v, op==OP_Last);
f400: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
f410: 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
f420: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
f430: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
f440: 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GT);  testcase( 
f450: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b  op==OP_SeekGT );
f460: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f470: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
f480: 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61  SeekGE);  testca
f490: 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
f4a0: 45 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  E );.      VdbeC
f4b0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
f4c0: 3d 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65  =OP_SeekLE);  te
f4d0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
f4e0: 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 56  eekLE );.      V
f4f0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
f500: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b   op==OP_SeekLT);
f510: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
f520: 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 20 20 20  OP_SeekLT );.   
f530: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20   }..    /* Load 
f540: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
f550: 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
f560: 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
f570: 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
f580: 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
f590: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
f5a0: 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
f5b0: 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
f5c0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
f5d0: 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
f5e0: 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
f5f0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f600: 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
f610: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
f620: 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63  nEq, 1);.      c
f630: 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28  odeExprOrVector(
f640: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
f650: 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f  regBase+nEq, nTo
f660: 70 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  p);.      whereL
f670: 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
f680: 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
f690: 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
f6a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
f6b0: 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
f6c0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
f6d0: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
f6e0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
f6f0: 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
f700: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f710: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f720: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
f730: 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
f740: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
f750: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
f760: 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41  .      if( zEndA
f770: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70  ff ){.        up
f780: 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69 74  dateRangeAffinit
f790: 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 54 6f  yStr(pRight, nTo
f7a0: 70 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20  p, zEndAff);.   
f7b0: 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
f7c0: 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
f7d0: 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f 70  egBase+nEq, nTop
f7e0: 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20  , zEndAff);.    
f7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f800: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
f810: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
f820: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
f830: 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2b     nConstraint +
f840: 3d 20 6e 54 6f 70 3b 0a 20 20 20 20 20 20 74 65  = nTop;.      te
f850: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
f860: 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
f870: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 0a 20 20  M_VIRTUAL );..  
f880: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f890: 78 70 72 49 73 56 65 63 74 6f 72 28 70 52 69 67  xprIsVector(pRig
f8a0: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
f8b0: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
f8c0: 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
f8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f8e0: 20 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 31         endEq = 1
f8f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f900: 6c 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e  lse if( bStopAtN
f910: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
f920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f930: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
f940: 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
f950: 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20    endEq = 0;.   
f960: 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
f970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f980: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
f990: 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71  tartAff);.    sq
f9a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f9b0: 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f  zEndAff);..    /
f9c0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
f9d0: 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
f9e0: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
f9f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fa00: 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
fa10: 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
fa20: 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
fa30: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
fa40: 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ange. */.    if(
fa50: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a   nConstraint ){.
fa60: 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f        op = aEndO
fa70: 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71  p[bRev*2 + endEq
fa80: 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
fa90: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
faa0: 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
fab0: 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
fac0: 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
fad0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
fae0: 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56  ==OP_IdxGT );  V
faf0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
fb00: 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b   op==OP_IdxGT );
fb10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fb20: 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
fb30: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
fb40: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  (v, op==OP_IdxGE
fb50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
fb60: 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
fb70: 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
fb80: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
fb90: 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  xLT );.      tes
fba0: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
fbb0: 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xLE );  VdbeCove
fbc0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
fbd0: 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a  _IdxLE );.    }.
fbe0: 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
fbf0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
fc00: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
fc10: 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20    if( omitTable 
fc20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78  ){.      /* pIdx
fc30: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
fc40: 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74  ndex.  No need t
fc50: 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61 69  o access the mai
fc60: 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  n table. */.    
fc70: 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77  }else if( HasRow
fc80: 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29  id(pIdx->pTable)
fc90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
fca0: 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
fcb0: 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b 5f 54  s & WHERE_SEEK_T
fcc0: 41 42 4c 45 29 20 7c 7c 20 28 0a 20 20 20 20 20  ABLE) || (.     
fcd0: 20 20 20 20 20 28 70 57 49 6e 66 6f 2d 3e 77 63       (pWInfo->wc
fce0: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
fcf0: 5f 53 45 45 4b 5f 55 4e 49 51 5f 54 41 42 4c 45  _SEEK_UNIQ_TABLE
fd00: 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 57  ) .       && (pW
fd10: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
fd20: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 29 0a  ONEPASS_SINGLE).
fd30: 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20        )){.      
fd40: 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b    iRowidReg = ++
fd50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
fd80: 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
fd90: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
fda0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fdb0: 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
fdc0: 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
fdd0: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20  widReg);.       
fde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fdf0: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
fe00: 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 69 52 6f  ts, iCur, 0, iRo
fe10: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20  widReg);.       
fe20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fe30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fe40: 20 20 20 20 20 20 20 63 6f 64 65 44 65 66 65 72         codeDefer
fe50: 72 65 64 53 65 65 6b 28 70 57 49 6e 66 6f 2c 20  redSeek(pWInfo, 
fe60: 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49 64 78  pIdx, iCur, iIdx
fe70: 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
fe80: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
fe90: 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
fea0: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
feb0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
fec0: 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
fed0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
fee0: 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
fef0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
ff00: 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
ff10: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
ff20: 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
ff30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
ff40: 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
ff50: 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
ff60: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
ff70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ff80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ff90: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
ffa0: 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
ffb0: 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ffd0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
ffe0: 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
fff0: 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
10020 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
10030 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10040 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 49   }..    /* If pI
10050 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
10060 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65 78  n one or more ex
10070 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20  pressions, then 
10080 6c 6f 6f 6b 20 74 68 72 6f 75 67 68 0a 20 20 20  look through.   
10090 20 2a 2a 20 61 6c 6c 20 74 68 65 20 65 78 70 72   ** all the expr
100a0 65 73 73 69 6f 6e 73 20 69 6e 20 70 57 49 6e 66  essions in pWInf
100b0 6f 20 61 6e 64 20 74 72 79 20 74 6f 20 74 72 61  o and try to tra
100c0 6e 73 66 6f 72 6d 20 6d 61 74 63 68 69 6e 67 20  nsform matching 
100d0 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20 20 20  expressions.    
100e0 2a 2a 20 69 6e 74 6f 20 72 65 66 65 72 65 6e 63  ** into referenc
100f0 65 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  e to index colum
10100 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ns..    */.    w
10110 68 65 72 65 49 6e 64 65 78 45 78 70 72 54 72 61  hereIndexExprTra
10120 6e 73 28 70 49 64 78 2c 20 69 43 75 72 2c 20 69  ns(pIdx, iCur, i
10130 49 64 78 43 75 72 2c 20 70 57 49 6e 66 6f 29 3b  IdxCur, pWInfo);
10140 0a 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ...    /* Record
10150 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
10160 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
10170 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  te the loop. */.
10180 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
10190 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
101a0 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
101b0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
101c0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
101d0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
101e0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
101f0 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
10200 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
10210 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
10220 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
10230 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
10240 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
10250 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
10260 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
10270 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
10280 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
10290 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
102a0 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
102b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
102c0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
102d0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
102e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
102f0 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
10300 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
10310 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
10320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
10330 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
10340 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
10350 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
10360 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
10370 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
10380 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
10390 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
103a0 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
103b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
103c0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
103d0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
103e0 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
103f0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
10400 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
10410 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
10420 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
10430 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
10440 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
10450 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
10460 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
10470 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
10480 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
10490 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
104a0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
104b0 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
104c0 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
104d0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
104e0 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
104f0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
10500 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
10510 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
10520 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
10530 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
10540 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
10550 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
10560 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
10570 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
10580 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
10590 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
105a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
105b0 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
105c0 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
105d0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
105e0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
105f0 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
10600 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
10610 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
10620 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
10630 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
10640 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
10650 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
10660 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
10670 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
10680 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
10690 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
106a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
106b0 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
106c0 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
106f0 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
10700 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
10710 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
10720 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
10730 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
10740 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
10750 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
10760 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
10770 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
10780 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
10790 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
107a0 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
107b0 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
107c0 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
107d0 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
107e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
107f0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
10800 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
10810 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
10820 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
10830 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
10840 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
10850 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
10860 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
10870 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
10880 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
108a0 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
108b0 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
108c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
108d0 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
108e0 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
108f0 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
10900 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
10910 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
10920 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
10930 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
10940 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
10950 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
10960 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
10970 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
10980 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
10990 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61  dex instead of a
109a0 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72   RowSet to recor
109b0 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  d the primary.  
109c0 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65    ** keys of the
109d0 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c   rows we have al
109e0 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20  ready seen..    
109f0 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
10a00 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
10a10 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
10a20 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
10a30 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
10a40 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
10a50 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
10a60 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
10a70 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
10a80 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
10a90 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
10aa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10ab0 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
10ac0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
10ad0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
10ae0 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
10af0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
10b00 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
10b10 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
10b20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
10b30 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
10b40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
10b50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10b60 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
10b70 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
10b80 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10bb0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
10bc0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
10bd0 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10c00 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
10c10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
10c20 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
10c30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
10c40 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
10c50 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
10c60 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10c90 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
10ca0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
10cb0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
10cc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10cd0 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
10ce0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
10cf0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
10d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
10d30 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
10d40 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
10d50 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
10d60 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  for sub-WHERE cl
10d70 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ause */.    Expr
10d80 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10da0 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
10db0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
10dc0 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
10dd0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
10de0 61 62 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d  ab;..    pTerm =
10df0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
10e00 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
10e10 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
10e20 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
10e30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
10e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
10e50 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
10e60 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
10e70 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
10e80 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
10e90 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
10ea0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
10eb0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
10ec0 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
10ed0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
10ee0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
10ef0 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
10f00 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
10f10 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
10f20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
10f30 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
10f40 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
10f50 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
10f60 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
10f70 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
10f80 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
10f90 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
10fa0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10fb0 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
10fc0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
10fd0 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
10fe0 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11000 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
11010 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
11020 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
11030 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
11040 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
11050 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
11060 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
11070 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
11080 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
11090 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
110a0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
110b0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(db,.  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
110e0 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
110f0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
11100 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
11110 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
11120 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
11130 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
11140 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
11150 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
11160 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
11170 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
11180 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
11190 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
111a0 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
111b0 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
111c0 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
111d0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
111e0 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
111f0 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
11200 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
11210 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
11220 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
11230 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
11240 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
11250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11260 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
11270 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
11280 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
11290 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
112a0 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
112b0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
112c0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
112d0 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
112e0 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
112f0 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63  y rowset.  Or, c
11300 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
11310 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  al index.    ** 
11320 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69  capable of holdi
11330 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20  ng primary keys 
11340 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61  in the case of a
11350 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a   WITHOUT ROWID..
11360 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
11370 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
11380 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
11390 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
113a0 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
113b0 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
113c0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
113d0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
113e0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
113f0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
11400 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
11410 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
11420 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
11430 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
11440 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
11450 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
11460 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
11470 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
11480 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
11490 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
114a0 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
114b0 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
114c0 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
114d0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
114e0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
114f0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
11500 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
11510 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
11520 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
11530 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
11540 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
11550 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
11560 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
11570 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
11580 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
11590 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
115a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f  ){.        regRo
115b0 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
115c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
115d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
115e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
115f0 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
11600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11610 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
11620 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
11630 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
11640 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
11650 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11680 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72  OpenEphemeral, r
11690 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e  egRowset, pPk->n
116a0 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  KeyCol);.       
116b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
116c0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
116d0 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pPk);.      }. 
116e0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
116f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11700 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
11710 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
11720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11730 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
11740 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
11750 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
11760 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
11770 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
11780 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
11790 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
117a0 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
117b0 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
117c0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
117d0 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
117e0 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
117f0 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
11800 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
11810 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
11820 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
11830 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
11840 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
11850 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
11860 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
11870 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
11880 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
11890 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
118a0 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
118b0 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
118c0 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
118d0 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
118e0 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
118f0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
11900 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
11910 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
11920 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
11930 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
11940 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
11950 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
11960 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
11970 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
11980 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
11990 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
119a0 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
119b0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
119c0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
119d0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
119e0 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
119f0 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
11a00 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
11a10 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
11a20 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
11a30 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
11a40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
11a50 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
11a60 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
11a70 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
11a80 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
11a90 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
11aa0 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
11ab0 20 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d         if( &pWC-
11ac0 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65  >a[iTerm] == pTe
11ad0 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
11ae0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
11af0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
11b00 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
11b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11b20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43     testcase( pWC
11b30 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
11b40 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
11b50 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  L );.        tes
11b60 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54  tcase( pWC->a[iT
11b70 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54  erm].wtFlags & T
11b80 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
11b90 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
11ba0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
11bb0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
11bc0 54 45 52 4d 5f 43 4f 44 45 44 29 29 21 3d 30 20  TERM_CODED))!=0 
11bd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11be0 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
11bf0 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
11c00 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
11c10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11c20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
11c30 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
11c40 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  s & TERM_ORINFO 
11c50 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
11c60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11c70 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
11c80 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
11c90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
11ca0 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c  nd(db, pAndExpr,
11cb0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
11cc0 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45  .      if( pAndE
11cd0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
11ce0 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
11cf0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
11d00 4b 5f 41 4e 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54  K_AND|TKFLG_DONT
11d10 46 4f 4c 44 2c 20 30 2c 20 70 41 6e 64 45 78 70  FOLD, 0, pAndExp
11d20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11d30 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 20  }..    /* Run a 
11d40 73 65 70 61 72 61 74 65 20 57 48 45 52 45 20 63  separate WHERE c
11d50 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  lause for each t
11d60 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
11d70 61 75 73 65 2e 20 20 41 66 74 65 72 0a 20 20 20  ause.  After.   
11d80 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20   ** eliminating 
11d90 64 75 70 6c 69 63 61 74 65 73 20 66 72 6f 6d 20  duplicates from 
11da0 6f 74 68 65 72 20 57 48 45 52 45 20 63 6c 61 75  other WHERE clau
11db0 73 65 73 2c 20 74 68 65 20 61 63 74 69 6f 6e 20  ses, the action 
11dc0 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
11dd0 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
11de0 20 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65   is to to invoke
11df0 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62   the main loop b
11e00 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74  ody as a subrout
11e10 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
11e20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 20 57 48  wctrlFlags =  WH
11e30 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
11e40 20 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72   | (pWInfo->wctr
11e50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
11e60 45 45 4b 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20  EEK_TABLE);.    
11e70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
11e80 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
11e90 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
11ea0 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
11eb0 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
11ec0 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
11ed0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
11ee0 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
11ef0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
11f00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
11f10 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
11f20 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
11f30 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
11f40 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
11f50 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
11f60 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
11f70 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72  m->pExpr; /* Cur
11f80 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74  rent OR clause t
11f90 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  erm */.        i
11fa0 6e 74 20 6a 6d 70 31 20 3d 20 30 3b 20 20 20 20  nt jmp1 = 0;    
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
11fd0 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  p operation */. 
11fe0 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
11ff0 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
12000 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
12010 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
12020 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
12030 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
12040 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
12050 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
12060 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
12070 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
12080 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
12090 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
120a0 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
120b0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
120c0 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62  CE(0xffff, ("Sub
120d0 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75  plan for OR-clau
120e0 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  se:\n"));.      
120f0 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
12100 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12110 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
12120 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20  pOrExpr, 0, 0,. 
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c       wctrlFlags,
12160 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20   iCovCur);.     
12170 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
12180 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Info || pParse->
12190 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
121a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
121b0 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
121c0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
121d0 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
121e0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  op;.          in
121f0 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  t addrExplain = 
12200 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c  sqlite3WhereExpl
12210 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
12220 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
12230 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
12240 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
12250 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
12260 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
12270 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12280 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
12290 74 61 74 75 73 28 76 2c 20 70 4f 72 54 61 62 2c  tatus(v, pOrTab,
122a0 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
122b0 5d 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b  ], addrExplain);
122c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
122d0 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57  his is the sub-W
122e0 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79  HERE clause body
122f0 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76  .  First skip ov
12300 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
12310 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66  duplicate rows f
12320 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
12330 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64  ERE clauses, and
12340 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20   record the.    
12350 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28        ** rowid (
12360 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  or PRIMARY KEY) 
12370 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
12380 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20  row so that the 
12390 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
123a0 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b  * row will be sk
123b0 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75  ipped in subsequ
123c0 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ent sub-WHERE cl
123d0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20  auses..         
123e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
123f0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
12400 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
12410 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
12420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
12430 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
12440 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
12450 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
12460 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
12470 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
12480 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
12490 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
124a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
124b0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
124c0 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
124d0 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  regRowid, 0);.  
124e0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 31              jmp1
124f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12500 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
12510 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
12520 73 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  set, 0,.        
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20     r,iSet);.    
12560 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
12570 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12580 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12590 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
125a0 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
125b0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
125c0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
125d0 20 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70       int nPk = p
125e0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
125f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
12600 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  Pk;..           
12610 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50     /* Read the P
12620 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  K into an array 
12630 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72  of temp register
12640 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
12650 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47      r = sqlite3G
12660 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
12670 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20  se, nPk);.      
12680 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d          for(iPk=
12690 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b  0; iPk<nPk; iPk+
126a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
126b0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
126c0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b  Pk->aiColumn[iPk
126d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
126e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
126f0 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
12700 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
12710 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b  Col, iCur, r+iPk
12720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12730 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
12740 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
12750 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c 72  e temp table alr
12760 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  eady contains th
12770 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a 20  is key. If so,. 
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
12790 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72 65  the row has alre
127a0 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64 65  ady been include
127b0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
127c0 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20 20  set and.        
127d0 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
127e0 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d 70  ignored (by jump
127f0 69 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f 73  ing past the Gos
12800 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65 72  ub below). Other
12810 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  wise,.          
12820 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68      ** insert th
12830 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74  e key into the t
12840 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70 72  emp table and pr
12850 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f 63 65  oceed with proce
12860 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ssing.          
12870 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e 0a      ** the row..
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
12890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
128a0 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74 68  * Use some of th
128b0 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61 74  e same optimizat
128c0 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53 65  ions as OP_RowSe
128d0 74 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a 20  tTest: If iSet. 
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
128f0 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65 20  is zero, assume 
12900 74 68 61 74 20 74 68 65 20 6b 65 79 20 63 61 6e  that the key can
12910 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20 70  not already be p
12920 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20  resent in.      
12930 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
12940 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20 69  emp table. And i
12950 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61 73  f iSet is -1, as
12960 73 75 6d 65 20 74 68 61 74 20 74 68 65 72 65 20  sume that there 
12970 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20 20  is no .         
12980 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
12990 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69  insert the key i
129a0 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
129b0 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20 6e  le, as it will n
129c0 65 76 65 72 20 0a 20 20 20 20 20 20 20 20 20 20  ever .          
129d0 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65 64      ** be tested
129e0 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20 20   for.  */ .     
129f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65           if( iSe
12a00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
12a10 20 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c 69       jmp1 = sqli
12a20 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
12a30 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72 65  (v, OP_Found, re
12a40 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20 6e  gRowset, 0, r, n
12a50 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
12a60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12a70 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
12a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12a90 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30 20      if( iSet>=0 
12aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12ac0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
12ad0 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20 72  ecord, r, nPk, r
12ae0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
12af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12b00 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
12b10 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
12b20 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f  regRowset, regRo
12b30 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 20 20 20 20 20 20 20 20 20 20 72 2c 20 6e 50 6b            r, nPk
12b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12b70 20 20 20 69 66 28 20 69 53 65 74 20 29 20 73 71     if( iSet ) sq
12b80 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12b90 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
12ba0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20  EEKRESULT);.    
12bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
12bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12bd0 6c 65 61 73 65 20 74 68 65 20 61 72 72 61 79 20  lease the array 
12be0 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74 65 72  of temp register
12bf0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
12c00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12c10 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
12c20 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  e, r, nPk);.    
12c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
12c50 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d   /* Invoke the m
12c60 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73  ain loop body as
12c70 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
12c80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12ca0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
12cb0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
12cc0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  ..          /* J
12cd0 75 6d 70 20 68 65 72 65 20 28 73 6b 69 70 70 69  ump here (skippi
12ce0 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  ng the main loop
12cf0 20 62 6f 64 79 20 73 75 62 72 6f 75 74 69 6e 65   body subroutine
12d00 29 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 20  ) if the.       
12d10 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 75     ** current su
12d20 62 2d 57 48 45 52 45 20 72 6f 77 20 69 73 20 61  b-WHERE row is a
12d30 20 64 75 70 6c 69 63 61 74 65 20 66 72 6f 6d 20   duplicate from 
12d40 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 73  prior sub-WHEREs
12d50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
12d60 66 28 20 6a 6d 70 31 20 29 20 73 71 6c 69 74 65  f( jmp1 ) sqlite
12d70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12d80 20 6a 6d 70 31 29 3b 0a 0a 20 20 20 20 20 20 20   jmp1);..       
12d90 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49     /* The pSubWI
12da0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
12db0 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ms flag means th
12dc0 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a  at this OR term.
12dd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
12de0 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  tained one or mo
12df0 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d  re AND term from
12e00 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c   a notReady tabl
12e10 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
12e20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20    ** terms from 
12e30 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62  the notReady tab
12e40 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
12e50 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a  tested and will.
12e60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
12e70 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c  d to be tested l
12e80 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20  ater..          
12e90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
12ea0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
12eb0 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65  stedTerms ) unte
12ec0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a  stedTerms = 1;..
12ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12ee0 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f  all of the OR-co
12ef0 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72  nnected terms ar
12f00 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
12f10 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  g the same.     
12f20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61       ** index, a
12f30 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  nd the index is 
12f40 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
12f50 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d   same cursor num
12f60 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ber.          **
12f70 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f   by each call to
12f80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
12f90 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69  in() made by thi
12fa0 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20  s loop, it may. 
12fb0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70           ** be p
12fc0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74  ossible to use t
12fd0 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63  hat index as a c
12fe0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
12ff0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
13000 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
13010 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
13020 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76  hereBegin() abov
13030 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20  e resulted in a 
13040 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20  scan that.      
13050 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69      ** uses an i
13060 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69  ndex, and this i
13070 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72  s either the fir
13080 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  st OR-connected 
13090 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
130a0 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74  * processed or t
130b0 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  he index is the 
130c0 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65  same as that use
130d0 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75  d by all previou
130e0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
130f0 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74  erms, set pCov t
13100 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  o the candidate 
13110 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
13120 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a  Otherwise, set .
13130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f            ** pCo
13140 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64  v to NULL to ind
13150 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61  icate that no ca
13160 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
13170 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20   index will .   
13180 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61         ** be ava
13190 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  ilable..        
131a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
131b0 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49  SubLoop = pSubWI
131c0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
131d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
131e0 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  rt( (pSubLoop->w
131f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
13200 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
13210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
13220 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
13230 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
13240 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  D)!=0.          
13250 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53   && (ii==0 || pS
13260 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
13270 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20  pIndex==pCov).  
13280 20 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73           && (Has
13290 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
132a0 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
132b0 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  x(pSubLoop->u.bt
132c0 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20  ree.pIndex)).   
132d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
132e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
132f0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
13300 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
13310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
13320 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  ov = pSubLoop->u
13330 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
13340 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
13350 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
13360 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13370 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
13380 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
13390 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
133a0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
133b0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
133c0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
133d0 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
133e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
133f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13400 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
13410 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
13420 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
13430 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
13440 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
13450 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
13460 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
13470 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
13480 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
13490 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20  b, pAndExpr);.  
134a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
134b0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69  dbeChangeP1(v, i
134c0 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33  RetInit, sqlite3
134d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
134e0 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
134f0 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
13500 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
13510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
13530 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
13540 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
13550 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
13560 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
13570 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
13580 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
13590 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
135a0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
135b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
135c0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
135d0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
135e0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
135f0 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
13600 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
13610 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
13620 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
13630 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
13640 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
13650 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13660 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
13670 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
13680 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
13690 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
136a0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
136b0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
136c0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
136d0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
136e0 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
136f0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  g.isRecursive ){
13700 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73  .      /* Tables
13710 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73   marked isRecurs
13720 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  ive have only a 
13730 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20  single row that 
13740 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20  is stored in.   
13750 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63     ** a pseudo-c
13760 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20  ursor.  No need 
13770 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78  to Rewind or Nex
13780 74 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20  t such cursors. 
13790 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
137a0 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
137b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137c0 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70  codeCursorHint(p
137d0 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c  TabItem, pWInfo,
137e0 20 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20   pLevel, 0);.   
137f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
13800 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
13810 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
13820 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
13830 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
13840 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13850 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
13860 69 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29 3b  iCur, addrHalt);
13870 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
13880 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
13890 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
138a0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21  erageIf(v, bRev!
138b0 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  =0);.      pLeve
138c0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
138d0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
138e0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20  AN_STEP;.    }. 
138f0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
13900 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
13910 41 4e 53 54 41 54 55 53 0a 20 20 70 4c 65 76 65  ANSTATUS.  pLeve
13920 6c 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 73  l->addrVisit = s
13930 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13940 74 41 64 64 72 28 76 29 3b 0a 23 65 6e 64 69 66  tAddr(v);.#endif
13950 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
13960 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
13970 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
13980 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
13990 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
139a0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
139b0 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
139c0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
139d0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
139e0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
139f0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
13a00 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
13a10 20 20 69 6e 74 20 73 6b 69 70 4c 69 6b 65 41 64    int skipLikeAd
13a20 64 72 20 3d 20 30 3b 0a 20 20 20 20 74 65 73 74  dr = 0;.    test
13a30 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
13a40 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
13a50 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
13a60 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
13a70 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
13a80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
13a90 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
13aa0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
13ab0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
13ac0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
13ad0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
13ae0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
13af0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
13b00 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
13b10 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13b30 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
13b40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
13b50 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29  _SUBCLAUSE)!=0 )
13b60 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
13b70 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
13b80 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
13b90 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20  e;.    }.    pE 
13ba0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
13bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
13bc0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
13bd0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
13be0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
13bf0 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
13c00 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  in) ){.      con
13c10 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13c20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
13c30 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43  ags & TERM_LIKEC
13c40 4f 4e 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  OND ){.      /* 
13c50 49 66 20 74 68 65 20 54 45 52 4d 5f 4c 49 4b 45  If the TERM_LIKE
13c60 43 4f 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  COND flag is set
13c70 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
13c80 74 20 74 68 65 20 72 61 6e 67 65 20 73 65 61 72  t the range sear
13c90 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ch.      ** is s
13ca0 75 66 66 69 63 69 65 6e 74 20 74 6f 20 67 75 61  ufficient to gua
13cb0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
13cc0 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73  LIKE operator is
13cd0 20 74 72 75 65 2c 20 73 6f 20 77 65 0a 20 20 20   true, so we.   
13ce0 20 20 20 2a 2a 20 63 61 6e 20 73 6b 69 70 20 74     ** can skip t
13cf0 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6c  he call to the l
13d00 69 6b 65 28 41 2c 42 29 20 66 75 6e 63 74 69 6f  ike(A,B) functio
13d10 6e 2e 20 20 42 75 74 20 74 68 69 73 20 6f 6e 6c  n.  But this onl
13d20 79 20 77 6f 72 6b 73 0a 20 20 20 20 20 20 2a 2a  y works.      **
13d30 20 66 6f 72 20 73 74 72 69 6e 67 73 2e 20 20 53   for strings.  S
13d40 6f 20 64 6f 20 6e 6f 74 20 73 6b 69 70 20 74 68  o do not skip th
13d50 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 66 75  e call to the fu
13d60 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61  nction on the pa
13d70 73 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ss.      ** that
13d80 20 63 6f 6d 70 61 72 65 73 20 42 4c 4f 42 73 2e   compares BLOBs.
13d90 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
13da0 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41  E_LIKE_DOESNT_MA
13db0 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20  TCH_BLOBS.      
13dc0 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a  continue;.#else.
13dd0 20 20 20 20 20 20 75 33 32 20 78 20 3d 20 70 4c        u32 x = pL
13de0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
13df0 74 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  tr;.      assert
13e00 28 20 78 3e 30 20 29 3b 0a 20 20 20 20 20 20 73  ( x>0 );.      s
13e10 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73 71  kipLikeAddr = sq
13e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13e30 76 2c 20 28 78 26 31 29 3f 20 4f 50 5f 49 66 4e  v, (x&1)? OP_IfN
13e40 6f 74 20 3a 20 4f 50 5f 49 66 2c 20 28 69 6e 74  ot : OP_If, (int
13e50 29 28 78 3e 3e 31 29 29 3b 0a 20 20 20 20 20 20  )(x>>1));.      
13e60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13e70 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13e80 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13e90 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
13ea0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
13eb0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
13ec0 20 20 20 69 66 28 20 73 6b 69 70 4c 69 6b 65 41     if( skipLikeA
13ed0 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
13ee0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 6b 69  eJumpHere(v, ski
13ef0 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20 20 20 20  pLikeAddr);.    
13f00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
13f10 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
13f20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
13f30 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
13f40 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
13f50 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
13f60 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
13f70 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
13f80 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
13f90 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
13fa0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
13fb0 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
13fc0 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
13fd0 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
13fe0 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
13ff0 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
14000 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
14010 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
14020 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
14030 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
14040 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
14050 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
14060 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
14070 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
14080 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
14090 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
140a0 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
140b0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
140c0 20 45 78 70 72 20 2a 70 45 2c 20 73 45 41 6c 74   Expr *pE, sEAlt
140d0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
140e0 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70  *pAlt;.    if( p
140f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14100 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
14110 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
14120 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
14130 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
14140 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29  & (WO_EQ|WO_IS))
14150 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
14160 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
14170 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
14180 51 55 49 56 29 3d 3d 30 20 29 20 63 6f 6e 74 69  QUIV)==0 ) conti
14190 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
141a0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
141b0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
141c0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
141d0 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e  >iLeftJoin ) con
141e0 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
141f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
14200 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
14210 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
14220 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20  P_FromJoin) );. 
14230 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
14240 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
14250 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
14260 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c  y)!=0 );.    pAl
14270 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
14280 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
14290 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ur, pTerm->u.lef
142a0 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64  tColumn, notRead
142b0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
142c0 20 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f         WO_EQ|WO_
142d0 49 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  IN|WO_IS, 0);.  
142e0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
142f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14300 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
14310 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
14320 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
14330 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
14340 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
14350 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14360 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
14370 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
14380 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
14390 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
143a0 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
143b0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
143c0 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
143d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
143e0 0a 20 20 20 20 73 45 41 6c 74 20 3d 20 2a 70 41  .    sEAlt = *pA
143f0 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73  lt->pExpr;.    s
14400 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20 70 45 2d  EAlt.pLeft = pE-
14410 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69  >pLeft;.    sqli
14420 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14430 50 61 72 73 65 2c 20 26 73 45 41 6c 74 2c 20 61  Parse, &sEAlt, a
14440 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
14450 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
14460 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
14470 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
14480 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
14490 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
144a0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
144b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
144c0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
144d0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
144e0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
144f0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
14500 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
14510 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
14520 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
14530 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14540 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
14550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14560 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
14570 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
14580 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
14590 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
145a0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
145b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
145c0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
145d0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
145e0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
145f0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
14600 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
14610 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14620 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
14630 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
14640 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14650 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14660 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
14670 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
14680 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
14690 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
146a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
146b0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
146c0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
146d0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
146e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
146f0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
14700 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
14710 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
14720 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
14730 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
14740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14750 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14760 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
14770 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
14780 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
14790 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
147a0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
147b0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
147c0 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e  return pLevel->n
147d0 6f 74 52 65 61 64 79 3b 0a 7d 0a                 otReady;.}.