/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4a117dd5886616d074f7b6589c23bf742f5a9858d6ffdaf8b9d1f76ab06245d2:


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 61 73 73 65 72 74 28 20   = 0;.  assert( 
2c00: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 77 68  pTerm!=0 );.  wh
2c10: 69 6c 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ile( (pTerm->wtF
2c20: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
2c30: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
2c40: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2c50: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
2c60: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
2c70: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2c80: 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c  n)).      && (pL
2c90: 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26  evel->notReady &
2ca0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
2cb0: 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  l)==0.  ){.    i
2cc0: 66 28 20 6e 4c 6f 6f 70 20 26 26 20 28 70 54 65  f( nLoop && (pTe
2cd0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2ce0: 52 4d 5f 4c 49 4b 45 29 21 3d 30 20 29 7b 0a 20  RM_LIKE)!=0 ){. 
2cf0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2d00: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45  ags |= TERM_LIKE
2d10: 43 4f 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  COND;.    }else{
2d20: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
2d30: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2d40: 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  DED;.    }.    i
2d50: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
2d60: 74 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  t<0 ) break;.   
2d70: 20 70 54 65 72 6d 20 3d 20 26 70 54 65 72 6d 2d   pTerm = &pTerm-
2d80: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
2d90: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 61 73 73  Parent];.    ass
2da0: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
2db0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
2dc0: 6c 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 54  ld--;.    if( pT
2dd0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 21 3d 30 20 29  erm->nChild!=0 )
2de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f   break;.    nLoo
2df0: 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p++;.  }.}../*.*
2e00: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66  * Code an OP_Aff
2e10: 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20  inity opcode to 
2e20: 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e  apply the column
2e30: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
2e40: 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20   zAff.** to the 
2e50: 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
2e60: 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a  ting at base. .*
2e70: 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d  *.** As an optim
2e80: 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f  ization, SQLITE_
2e90: 41 46 46 5f 42 4c 4f 42 20 65 6e 74 72 69 65 73  AFF_BLOB entries
2ea0: 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f   (which are no-o
2eb0: 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65  ps) at the.** be
2ec0: 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
2ed0: 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f  of zAff are igno
2ee0: 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74  red.  If all ent
2ef0: 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65  ries in zAff are
2f00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  .** SQLITE_AFF_B
2f10: 4c 4f 42 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64  LOB, then no cod
2f20: 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64  e gets generated
2f30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2f40: 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f  tine makes its o
2f50: 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20  wn copy of zAff 
2f60: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  so that the call
2f70: 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f  er is free.** to
2f80: 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74   modify zAff aft
2f90: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2fa0: 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
2fb0: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
2fc0: 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
2fd0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
2fe0: 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  e, int n, char *
2ff0: 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76  zAff){.  Vdbe *v
3000: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3010: 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
3020: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3030: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
3040: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
3050: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3060: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20  ert( v!=0 );..  
3070: 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61  /* Adjust base a
3080: 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65  nd n to skip ove
3090: 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  r SQLITE_AFF_BLO
30a0: 42 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65  B entries at the
30b0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
30c0: 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61  and end of the a
30d0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
30e0: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e    */.  while( n>
30f0: 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51  0 && zAff[0]==SQ
3100: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b  LITE_AFF_BLOB ){
3110: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61  .    n--;.    ba
3120: 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b  se++;.    zAff++
3130: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  ;.  }.  while( n
3140: 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d  >1 && zAff[n-1]=
3150: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
3160: 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d   ){.    n--;.  }
3170: 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
3180: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
3190: 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  de if there is a
31a0: 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20  nything left to 
31b0: 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30  do. */.  if( n>0
31c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
31d0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
31e0: 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20  Affinity, base, 
31f0: 6e 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a  n, 0, zAff, n);.
3200: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3210: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
3220: 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
3230: 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   n);.  }.}../*.*
3240: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 52 69  * Expression pRi
3250: 67 68 74 2c 20 77 68 69 63 68 20 69 73 20 74 68  ght, which is th
3260: 65 20 52 48 53 20 6f 66 20 61 20 63 6f 6d 70 61  e RHS of a compa
3270: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2c  rison operation,
3280: 20 69 73 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   is .** either a
3290: 20 76 65 63 74 6f 72 20 6f 66 20 6e 20 65 6c 65   vector of n ele
32a0: 6d 65 6e 74 73 20 6f 72 2c 20 69 66 20 6e 3d 3d  ments or, if n==
32b0: 31 2c 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  1, a scalar expr
32c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 42 65 66 6f 72  ession..** Befor
32d0: 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
32e0: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 66 66 69   operation, affi
32f0: 6e 69 74 79 20 7a 41 66 66 20 69 73 20 74 6f 20  nity zAff is to 
3300: 62 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f  be applied.** to
3310: 20 74 68 65 20 70 52 69 67 68 74 20 76 61 6c 75   the pRight valu
3320: 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  es. This functio
3330: 6e 20 6d 6f 64 69 66 69 65 73 20 63 68 61 72 61  n modifies chara
3340: 63 74 65 72 73 20 77 69 74 68 69 6e 20 74 68 65  cters within the
3350: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72  .** affinity str
3360: 69 6e 67 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  ing to SQLITE_AF
3370: 46 5f 42 4c 4f 42 20 69 66 20 65 69 74 68 65 72  F_BLOB if either
3380: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
3390: 63 6f 6d 70 61 72 69 73 6f 6e 20 77 69 6c 6c 20  comparison will 
33a0: 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
33b0: 68 20 6e 6f 20 61 66 66 69 6e 69 74 79 2c 20 6f  h no affinity, o
33c0: 72 0a 2a 2a 20 20 20 2a 20 74 68 65 20 61 66 66  r.**   * the aff
33d0: 69 6e 69 74 79 20 63 68 61 6e 67 65 20 69 6e 20  inity change in 
33e0: 7a 41 66 66 20 69 73 20 67 75 61 72 61 6e 74 65  zAff is guarante
33f0: 65 64 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65  ed not to change
3400: 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
3410: 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
3420: 65 52 61 6e 67 65 41 66 66 69 6e 69 74 79 53 74  eRangeAffinitySt
3430: 72 28 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  r(.  Expr *pRigh
3440: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3450: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 63       /* RHS of c
3460: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 69  omparison */.  i
3470: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3490: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 65 63 74  * Number of vect
34a0: 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 63  or elements in c
34b0: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
34c0: 68 61 72 20 2a 7a 41 66 66 20 20 20 20 20 20 20  har *zAff       
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34e0: 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
34f0: 67 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 29  g to modify */.)
3500: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
3510: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
3520: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
3530: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
3540: 64 53 75 62 65 78 70 72 28 70 52 69 67 68 74 2c  dSubexpr(pRight,
3550: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   i);.    if( sql
3560: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3570: 69 74 79 28 70 2c 20 7a 41 66 66 5b 69 5d 29 3d  ity(p, zAff[i])=
3580: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
3590: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
35a0: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
35b0: 69 74 79 43 68 61 6e 67 65 28 70 2c 20 7a 41 66  ityChange(p, zAf
35c0: 66 5b 69 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20  f[i]).    ){.   
35d0: 20 20 20 7a 41 66 66 5b 69 5d 20 3d 20 53 51 4c     zAff[i] = SQL
35e0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
35f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3600: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
3610: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
3620: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
3630: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
3640: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
3650: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
3660: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
3670: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
3680: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
3690: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
36a0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
36b0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
36c0: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
36d0: 69 6e 20 61 20 72 65 67 69 73 74 65 72 2c 20 74  in a register, t
36e0: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 77  he index.** of w
36f0: 68 69 63 68 20 69 73 20 72 65 74 75 72 6e 65 64  hich is returned
3700: 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
3710: 20 6d 61 64 65 20 73 74 6f 72 65 20 74 68 65 20   made store the 
3720: 72 65 73 75 6c 74 20 69 6e 20 69 54 61 72 67 65  result in iTarge
3730: 74 20 62 75 74 0a 2a 2a 20 74 68 69 73 20 69 73  t but.** this is
3740: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64   only guaranteed
3750: 20 66 6f 72 20 54 4b 5f 49 53 4e 55 4c 4c 20 61   for TK_ISNULL a
3760: 6e 64 20 54 4b 5f 49 4e 20 63 6f 6e 73 74 72 61  nd TK_IN constra
3770: 69 6e 74 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a  ints.  If the.**
3780: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 61   constraint is a
3790: 20 54 4b 5f 45 51 20 6f 72 20 54 4b 5f 49 53 2c   TK_EQ or TK_IS,
37a0: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
37b0: 74 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  t value might be
37c0: 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65   left in.** some
37d0: 20 6f 74 68 65 72 20 72 65 67 69 73 74 65 72 20   other register 
37e0: 61 6e 64 20 69 74 20 69 73 20 74 68 65 20 63 61  and it is the ca
37f0: 6c 6c 65 72 27 73 20 72 65 73 70 6f 6e 73 69 62  ller's responsib
3800: 69 6c 69 74 79 20 74 6f 20 63 6f 6d 70 65 6e 73  ility to compens
3810: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ate..**.** For a
3820: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
3830: 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
3840: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3850: 73 20 65 76 61 6c 75 61 74 65 64 20 69 6e 0a 2a  s evaluated in.*
3860: 2a 20 73 74 72 61 69 67 68 74 2d 6c 69 6e 65 20  * straight-line 
3870: 63 6f 64 65 2e 20 20 46 6f 72 20 63 6f 6e 73 74  code.  For const
3880: 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
3890: 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
38a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
38b0: 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
38c0: 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
38d0: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
38e0: 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
38f0: 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
3900: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
3910: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
3920: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
3930: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
3940: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
3950: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
3960: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
3970: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
3980: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
3990: 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
39a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
39b0: 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
39c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
39d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
39e0: 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
39f0: 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
3a00: 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
3a10: 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
3a20: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3a30: 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e  reverse-order IN
3a40: 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
3a50: 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
3a60: 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
3a70: 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
3a80: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
3a90: 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
3aa0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ab0: 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
3ac0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3ad0: 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
3ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3af0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3b00: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
3b10: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  ert( pLevel->pWL
3b20: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 45 71 5d  oop->aLTerm[iEq]
3b30: 3d 3d 70 54 65 72 6d 20 29 3b 0a 20 20 61 73 73  ==pTerm );.  ass
3b40: 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
3b50: 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
3b60: 54 4b 5f 45 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_EQ || pX->op=
3b70: 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 69 52  =TK_IS ){.    iR
3b80: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
3b90: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
3ba0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
3bb0: 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
3bc0: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
3bd0: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
3be0: 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
3bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3c00: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
3c10: 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
3c20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3c30: 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
3c40: 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
3c50: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
3c60: 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
3c70: 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
3c80: 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
3c90: 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
3ca0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
3cb0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
3cc0: 45 71 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Eq = 0;.    int 
3cd0: 2a 61 69 4d 61 70 20 3d 20 30 3b 0a 0a 20 20 20  *aiMap = 0;..   
3ce0: 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
3cf0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
3d00: 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
3d10: 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
3d20: 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
3d30: 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
3d40: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
3d50: 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
3d60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
3d70: 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
3d80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
3d90: 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
3da0: 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
3db0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3dc0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
3dd0: 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
3de0: 65 74 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  et;..    for(i=0
3df0: 3b 20 69 3c 69 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<iEq; i++){. 
3e00: 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
3e10: 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4c 6f  aLTerm[i] && pLo
3e20: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  op->aLTerm[i]->p
3e30: 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20  Expr==pX ){.    
3e40: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
3e50: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
3e60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
3e70: 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  Target;.      }.
3e80: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
3e90: 69 45 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54  iEq;i<pLoop->nLT
3ea0: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
3eb0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 6f 6f   if( ALWAYS(pLoo
3ec0: 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 29 20 26 26  p->aLTerm[i]) &&
3ed0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69   pLoop->aLTerm[i
3ee0: 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 20 6e  ]->pExpr==pX ) n
3ef0: 45 71 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Eq++;.    }..   
3f00: 20 69 66 28 20 28 70 58 2d 3e 66 6c 61 67 73 20   if( (pX->flags 
3f10: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3d  & EP_xIsSelect)=
3f20: 3d 30 20 7c 7c 20 70 58 2d 3e 78 2e 70 53 65 6c  =0 || pX->x.pSel
3f30: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3f40: 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 65  pr==1 ){.      e
3f50: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
3f60: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
3f70: 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c  , pX, IN_INDEX_L
3f80: 4f 4f 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  OOP, 0, 0);.    
3f90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65 6c  }else{.      Sel
3fa0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
3fb0: 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  X->x.pSelect;.  
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
3fd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
3fe0: 20 20 20 20 75 31 36 20 73 61 76 65 64 44 62 4f      u16 savedDbO
3ff0: 70 74 46 6c 61 67 73 20 3d 20 64 62 2d 3e 64 62  ptFlags = db->db
4000: 4f 70 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  OptFlags;.      
4010: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 69 67 52  ExprList *pOrigR
4020: 68 73 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  hs = pSelect->pE
4030: 4c 69 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72  List;.      Expr
4040: 4c 69 73 74 20 2a 70 4f 72 69 67 4c 68 73 20 3d  List *pOrigLhs =
4050: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c   pX->pLeft->x.pL
4060: 69 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  ist;.      ExprL
4070: 69 73 74 20 2a 70 52 68 73 20 3d 20 30 3b 20 20  ist *pRhs = 0;  
4080: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 53 65         /* New Se
4090: 6c 65 63 74 2e 70 45 4c 69 73 74 20 66 6f 72 20  lect.pEList for 
40a0: 52 48 53 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  RHS */.      Exp
40b0: 72 4c 69 73 74 20 2a 70 4c 68 73 20 3d 20 30 3b  rList *pLhs = 0;
40c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
40d0: 70 58 2d 3e 70 4c 65 66 74 20 76 65 63 74 6f 72  pX->pLeft vector
40e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
40f0: 3d 69 45 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c  =iEq;i<pLoop->nL
4100: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
4110: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
4120: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
4130: 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
4140: 20 69 6e 74 20 69 46 69 65 6c 64 20 3d 20 70 4c   int iField = pL
4150: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
4160: 69 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 20 20  iField - 1;.    
4170: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
4180: 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Rhs = sqlite3Exp
4190: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 52 68  rDup(db, pOrigRh
41a0: 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  s->a[iField].pEx
41b0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
41c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 4c 68 73 20    Expr *pNewLhs 
41d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
41e0: 28 64 62 2c 20 70 4f 72 69 67 4c 68 73 2d 3e 61  (db, pOrigLhs->a
41f0: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 2c 20  [iField].pExpr, 
4200: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 70  0);..          p
4210: 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Rhs = sqlite3Exp
4220: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
4230: 73 65 2c 20 70 52 68 73 2c 20 70 4e 65 77 52 68  se, pRhs, pNewRh
4240: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  s);.          pL
4250: 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  hs = sqlite3Expr
4260: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
4270: 65 2c 20 70 4c 68 73 2c 20 70 4e 65 77 4c 68 73  e, pLhs, pNewLhs
4280: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4290: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
42a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
42b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
42c0: 20 2a 70 4c 65 66 74 20 3d 20 70 58 2d 3e 70 4c   *pLeft = pX->pL
42d0: 65 66 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  eft;..        if
42e0: 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  ( pSelect->pOrde
42f0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
4300: 20 2f 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43   /* If the SELEC
4310: 54 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  T statement has 
4320: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
4330: 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 0a 20 20  se, zero the .  
4340: 20 20 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65          ** iOrde
4350: 72 42 79 43 6f 6c 20 76 61 72 69 61 62 6c 65 73  rByCol variables
4360: 2e 20 54 68 65 73 65 20 61 72 65 20 73 65 74 20  . These are set 
4370: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  to non-zero when
4380: 20 61 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a   an .          *
4390: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
43a0: 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
43b0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73  one of the terms
43c0: 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 20   of the .       
43d0: 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
43e0: 2e 20 53 69 6e 63 65 20 74 68 65 20 72 65 73 75  . Since the resu
43f0: 6c 74 2d 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt-set of the SE
4400: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
4410: 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
4420: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
4430: 65 64 20 6f 72 20 72 65 6f 72 64 65 72 65 64 2c  ed or reordered,
4440: 20 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   these variables
4450: 20 61 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a   are no longer .
4460: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
4470: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6e   correctly.  Sin
4480: 63 65 20 73 65 74 74 69 6e 67 20 74 68 65 6d 20  ce setting them 
4490: 69 73 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d  is just an optim
44a0: 69 7a 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20  ization, .      
44b0: 20 20 20 20 2a 2a 20 69 74 27 73 20 65 61 73 69      ** it's easi
44c0: 65 73 74 20 6a 75 73 74 20 74 6f 20 7a 65 72 6f  est just to zero
44d0: 20 74 68 65 6d 20 68 65 72 65 2e 20 20 2a 2f 0a   them here.  */.
44e0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
44f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
4500: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
4510: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
4520: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
4530: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4540: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
4550: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
4560: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
4570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4580: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
4590: 54 61 6b 65 20 63 61 72 65 20 68 65 72 65 20 6e  Take care here n
45a0: 6f 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ot to generate a
45b0: 20 54 4b 5f 56 45 43 54 4f 52 20 63 6f 6e 74 61   TK_VECTOR conta
45c0: 69 6e 69 6e 67 20 6f 6e 6c 79 20 61 0a 20 20 20  ining only a.   
45d0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 76       ** single v
45e0: 61 6c 75 65 2e 20 53 69 6e 63 65 20 74 68 65 20  alue. Since the 
45f0: 70 61 72 73 65 72 20 6e 65 76 65 72 20 63 72 65  parser never cre
4600: 61 74 65 73 20 73 75 63 68 20 61 20 76 65 63 74  ates such a vect
4610: 6f 72 2c 20 73 6f 6d 65 0a 20 20 20 20 20 20 20  or, some.       
4620: 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 72 6f   ** of the subro
4630: 75 74 69 6e 65 73 20 64 6f 20 6e 6f 74 20 68 61  utines do not ha
4640: 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2e 20  ndle this case. 
4650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
4660: 70 4c 68 73 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  pLhs->nExpr==1 )
4670: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e  {.          pX->
4680: 70 4c 65 66 74 20 3d 20 70 4c 68 73 2d 3e 61 5b  pLeft = pLhs->a[
4690: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
46a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
46b0: 20 20 20 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73     pLeft->x.pLis
46c0: 74 20 3d 20 70 4c 68 73 3b 0a 20 20 20 20 20 20  t = pLhs;.      
46d0: 20 20 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74      aiMap = (int
46e0: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
46f0: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
4700: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20  , sizeof(int) * 
4710: 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nEq);.          
4720: 74 65 73 74 63 61 73 65 28 20 61 69 4d 61 70 3d  testcase( aiMap=
4730: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =0 );.        }.
4740: 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
4750: 3e 70 45 4c 69 73 74 20 3d 20 70 52 68 73 3b 0a  >pEList = pRhs;.
4760: 20 20 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70          db->dbOp
4770: 74 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  tFlags |= SQLITE
4780: 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 3b  _QueryFlattener;
4790: 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
47a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
47b0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
47c0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30  IN_INDEX_LOOP, 0
47d0: 2c 20 61 69 4d 61 70 29 3b 0a 20 20 20 20 20 20  , aiMap);.      
47e0: 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73    db->dbOptFlags
47f0: 20 3d 20 73 61 76 65 64 44 62 4f 70 74 46 6c 61   = savedDbOptFla
4800: 67 73 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  gs;.        test
4810: 63 61 73 65 28 20 61 69 4d 61 70 21 3d 30 20 26  case( aiMap!=0 &
4820: 26 20 61 69 4d 61 70 5b 30 5d 21 3d 30 20 29 3b  & aiMap[0]!=0 );
4830: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74  .        pSelect
4840: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4f 72 69 67  ->pEList = pOrig
4850: 52 68 73 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  Rhs;.        pLe
4860: 66 74 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4f  ft->x.pList = pO
4870: 72 69 67 4c 68 73 3b 0a 20 20 20 20 20 20 20 20  rigLhs;.        
4880: 70 58 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  pX->pLeft = pLef
4890: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
48a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
48b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
48c0: 62 2c 20 70 4c 68 73 29 3b 0a 20 20 20 20 20 20  b, pLhs);.      
48d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
48e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
48f0: 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 7d 0a 0a  , pRhs);.    }..
4900: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
4910: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
4920: 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  SC ){.      test
4930: 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
4940: 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
4950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62  ;.    }.    iTab
4960: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
4970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4980: 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
4990: 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
49a0: 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
49b0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
49c0: 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56  (v, bRev);.    V
49d0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
49e0: 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73   !bRev);.    ass
49f0: 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
4a00: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
4a10: 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 0a 20 20  TI_OR)==0 );..  
4a20: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
4a30: 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c   |= WHERE_IN_ABL
4a40: 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  E;.    if( pLeve
4a50: 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
4a60: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
4a70: 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
4a80: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4a90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 20  );.    }..    i 
4aa0: 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
4ab0: 49 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  In;.    pLevel->
4ac0: 75 2e 69 6e 2e 6e 49 6e 20 2b 3d 20 6e 45 71 3b  u.in.nIn += nEq;
4ad0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
4ae0: 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
4af0: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
4b00: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
4b10: 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
4b20: 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
4b50: 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
4b60: 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
4b70: 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
4b80: 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
4b90: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
4ba0: 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
4bb0: 20 20 69 6e 74 20 69 4d 61 70 20 3d 20 30 3b 20    int iMap = 0; 
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bd0: 20 49 6e 64 65 78 20 69 6e 20 61 69 4d 61 70 5b   Index in aiMap[
4be0: 5d 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 20 2b  ] */.      pIn +
4bf0: 3d 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = i;.      for(i
4c00: 3d 69 45 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c  =iEq;i<pLoop->nL
4c10: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
4c20: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
4c30: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
4c40: 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
4c50: 20 69 6e 74 20 69 4f 75 74 20 3d 20 69 52 65 67   int iOut = iReg
4c60: 20 2b 20 69 20 2d 20 69 45 71 3b 0a 20 20 20 20   + i - iEq;.    
4c70: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
4c80: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
4c90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
4ca0: 65 73 74 63 61 73 65 28 20 6e 45 71 3e 31 20 29  estcase( nEq>1 )
4cb0: 3b 20 20 2f 2a 20 48 61 70 70 65 6e 73 20 77 69  ;  /* Happens wi
4cc0: 74 68 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65  th a UNIQUE inde
4cd0: 78 20 6f 6e 20 52 4f 57 49 44 20 2a 2f 0a 20 20  x on ROWID */.  
4ce0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61            pIn->a
4cf0: 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
4d00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4d10: 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
4d20: 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iOut);.         
4d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4d40: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61      int iCol = a
4d50: 69 4d 61 70 20 3f 20 61 69 4d 61 70 5b 69 4d 61  iMap ? aiMap[iMa
4d60: 70 2b 2b 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  p++] : 0;.      
4d70: 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
4d80: 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
4d90: 62 65 41 64 64 4f 70 33 28 76 2c 4f 50 5f 43 6f  beAddOp3(v,OP_Co
4da0: 6c 75 6d 6e 2c 69 54 61 62 2c 20 69 43 6f 6c 2c  lumn,iTab, iCol,
4db0: 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20   iOut);.        
4dc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
4dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4de0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 4f  v, OP_IsNull, iO
4df0: 75 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ut); VdbeCoverag
4e00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
4e10: 69 66 28 20 69 3d 3d 69 45 71 20 29 7b 0a 20 20  if( i==iEq ){.  
4e20: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
4e30: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
4e40: 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e          pIn->eEn
4e50: 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
4e60: 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a   OP_PrevIfOpen :
4e70: 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a   OP_NextIfOpen;.
4e80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
4ea0: 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 4f  ->eEndLoopOp = O
4eb0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
4ec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 49    }.          pI
4ed0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n++;.        }. 
4ee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4ef0: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
4f00: 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
4f10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4f20: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
4f30: 2c 20 61 69 4d 61 70 29 3b 0a 23 65 6e 64 69 66  , aiMap);.#endif
4f40: 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
4f50: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
4f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
4f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
4f80: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
4f90: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
4fa0: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
4fb0: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
4fc0: 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a  index scan..**.*
4fd0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
4fe0: 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
4ff0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
5000: 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
5010: 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
5020: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5030: 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
5040: 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
5050: 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
5060: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
5070: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
5080: 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
5090: 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
50a0: 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
50b0: 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
50c0: 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
50d0: 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
50e0: 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
50f0: 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
5100: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5110: 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
5120: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
5130: 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
5140: 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
5150: 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
5160: 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
5170: 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
5180: 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
5190: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
51a0: 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
51b0: 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
51c0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
51d0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
51e0: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
51f0: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
5200: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
5210: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
5220: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
5230: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5240: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
5250: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
5260: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
5270: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
5280: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
5290: 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
52a0: 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
52b0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
52c0: 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72 61  e nExtraReg para
52d0: 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e  meter is 0 or 1.
52e0: 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c    It is 0 if all
52f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
5300: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65  nstraints.** are
5310: 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72   == or IN and ar
5320: 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 65  e covered by the
5330: 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67   nEq.  nExtraReg
5340: 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20 69   is 1 if there i
5350: 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69  s.** an inequali
5360: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73  ty constraint (s
5370: 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35  uch as the "c>=5
5380: 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68   AND c<10" in th
5390: 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a  e example) that.
53a0: 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
53b0: 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20  the nEq quality 
53c0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
53d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
53e0: 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67  allocates a rang
53f0: 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52  e of nEq+nExtraR
5400: 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  eg memory cells 
5410: 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
5420: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5430: 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c  first memory cel
5440: 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e  l in that range.
5450: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
5460: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
5470: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
5480: 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20  at memory range 
5490: 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f  to store keys fo
54a0: 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74  r.** start and t
54b0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
54c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
54d0: 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  p..** key value 
54e0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
54f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
5500: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
5510: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
5520: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
5530: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
5540: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
5550: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
5560: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
5570: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
5580: 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
5590: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
55a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
55b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
55c0: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
55d0: 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
55e0: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
55f0: 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
5600: 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
5610: 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
5620: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
5630: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
5640: 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
5650: 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
5660: 20 42 4c 4f 42 20 6f 72 20 4e 4f 4e 45 20 61 66   BLOB or NONE af
5670: 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
5680: 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
5690: 42 4c 4f 42 2e 20 54 68 69 73 20 69 73 20 74 6f  BLOB. This is to
56a0: 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
56b0: 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
56c0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
56d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
56e0: 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
56f0: 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
5700: 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
5710: 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
5720: 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
5730: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
5740: 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
5750: 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
5760: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
5770: 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
5780: 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
5790: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
57a0: 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
57b0: 68 61 73 20 42 4c 4f 42 2f 4e 4f 4e 45 20 61 66  has BLOB/NONE af
57c0: 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
57d0: 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
57e0: 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
57f0: 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
5800: 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
5810: 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
5820: 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
5830: 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
5840: 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
5850: 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
5860: 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
5870: 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
5880: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
5890: 46 46 5f 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61 74  FF_BLOB..*/.stat
58a0: 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
58b0: 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
58c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
58d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
58e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
58f0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
5900: 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
5910: 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
5920: 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
5930: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5950: 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
5960: 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
5970: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
5980: 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
5990: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
59a0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
59b0: 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
59c0: 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
59d0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
59e0: 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
59f0: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
5a00: 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20   u16 nEq;       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a20: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
5a30: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
5a40: 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
5a50: 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20    u16 nSkip;    
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66  /* Number of lef
5a80: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74  t-most columns t
5a90: 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65  o skip */.  Vdbe
5aa0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5ab0: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
5ac0: 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
5ad0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
5ae0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
5af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5b00: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
5b10: 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
5b20: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5b30: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
5b40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
5b50: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
5b60: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
5b70: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
5b80: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
5b90: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
5ba0: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bc0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5bd0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
5c00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5c30: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
5c40: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
5c50: 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20   *zAff;         
5c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
5c70: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20  inity string to 
5c80: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
5c90: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
5ca0: 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
5cb0: 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
5cc0: 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
5cd0: 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
5ce0: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65  ->pWLoop;.  asse
5cf0: 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
5d00: 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
5d10: 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
5d20: 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75    nEq = pLoop->u
5d30: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53  .btree.nEq;.  nS
5d40: 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b  kip = pLoop->nSk
5d50: 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  ip;.  pIdx = pLo
5d60: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
5d70: 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
5d80: 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
5d90: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
5da0: 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
5db0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
5dc0: 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
5dd0: 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
5de0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
5df0: 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
5e00: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
5e10: 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
5e20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
5e30: 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
5e40: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
5e50: 50 61 72 73 65 2d 3e 64 62 2c 73 71 6c 69 74 65  Parse->db,sqlite
5e60: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
5e70: 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 49 64  r(pParse->db,pId
5e80: 78 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  x));.  assert( z
5e90: 41 66 66 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Aff!=0 || pParse
5ea0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5eb0: 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 6b  ed );..  if( nSk
5ec0: 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
5ed0: 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
5ee0: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
5ef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5f00: 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
5f10: 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
5f20: 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
5f30: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
5f40: 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
5f50: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
5f60: 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  !=0);.    VdbeCo
5f70: 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
5f80: 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
5f90: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
5fa0: 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
5fb0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
5fc0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
5fd0: 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
5fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ff0: 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
6000: 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47  _SeekLT:OP_SeekG
6010: 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T),.            
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
6040: 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
6050: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
6060: 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
6070: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
6080: 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
6090: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
60a0: 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
60b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
60c0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
60d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
60e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
60f0: 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
6100: 65 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65 73 74  e+j);.      test
6110: 63 61 73 65 28 20 70 49 64 78 2d 3e 61 69 43 6f  case( pIdx->aiCo
6120: 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52  lumn[j]==XN_EXPR
6130: 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
6140: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6150: 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75  explainIndexColu
6160: 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a 29 29  mnName(pIdx, j))
6170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20  );.    }.  }    
6180: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
6190: 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
61a0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
61b0: 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
61c0: 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
61d0: 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
61e0: 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45  or(j=nSkip; j<nE
61f0: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
6200: 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
6210: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
6220: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
6230: 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
6240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
6250: 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65  testcase is true
6260: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
6270: 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
6280: 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
6290: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
62a0: 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
62b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
62c0: 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
62d0: 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
62e0: 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
62f0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
6300: 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
6310: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
6320: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
6330: 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
6340: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
6350: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
6360: 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
6370: 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
6380: 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
6390: 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
63a0: 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
63b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
63c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
63d0: 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
63e0: 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
63f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
6420: 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
6430: 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
6440: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
6450: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6460: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _IN ){.      if(
6470: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 66   pTerm->pExpr->f
6480: 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
6490: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
64a0: 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79 20 65 76  * No affinity ev
64b0: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 28  er needs to be (
64c0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 29 20 61 70  or should be) ap
64d0: 70 6c 69 65 64 20 74 6f 20 61 20 76 61 6c 75 65  plied to a value
64e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  .        ** from
64f0: 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 22   the RHS of an "
6500: 3f 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  ? IN (SELECT ...
6510: 29 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  )" expression. T
6520: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
6530: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
6540: 78 28 29 20 72 6f 75 74 69 6e 65 20 68 61 73 20  x() routine has 
6550: 61 6c 72 65 61 64 79 20 65 6e 73 75 72 65 64 20  already ensured 
6560: 74 68 61 74 20 74 68 65 20 0a 20 20 20 20 20 20  that the .      
6570: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66    ** affinity of
6580: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
6590: 68 61 73 20 62 65 65 6e 20 61 70 70 6c 69 65 64  has been applied
65a0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 2e 20 20   to the value.  
65b0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
65c0: 41 66 66 20 29 20 7a 41 66 66 5b 6a 5d 20 3d 20  Aff ) zAff[j] = 
65d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
65e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
65f0: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
6600: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
6610: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
6620: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
6630: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
6640: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
6650: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6660: 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d 30 20 26   & TERM_IS)==0 &
6670: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
6680: 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29  BeNull(pRight) )
6690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
66a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
66b0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
66c0: 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
66d0: 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  rBrk);.        V
66e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
66f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6700: 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
6710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
6720: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
6730: 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
6740: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
6750: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
6760: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
6770: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
6780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6790: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
67a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
67b0: 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
67c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
67d0: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
67e0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
67f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6800: 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
6810: 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
6820: 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
6830: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
6840: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
6850: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f 73  /*.** If the mos
6860: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
6870: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
6880: 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67 65  a constant range
6890: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 28   constraint.** (
68a0: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
68b0: 29 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  ) that originate
68c0: 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  d from the LIKE 
68d0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
68e0: 65 6e 20 0a 2a 2a 20 73 65 74 20 50 33 20 61 6e  en .** set P3 an
68f0: 64 20 50 35 20 6f 6e 20 74 68 65 20 4f 50 5f 53  d P5 on the OP_S
6900: 74 72 69 6e 67 20 6f 70 63 6f 64 65 20 73 6f 20  tring opcode so 
6910: 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
6920: 77 69 6c 6c 20 62 65 20 63 61 73 74 0a 2a 2a 20  will be cast.** 
6930: 74 6f 20 61 20 42 4c 4f 42 20 61 74 20 61 70 70  to a BLOB at app
6940: 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73 2e 0a  ropriate times..
6950: 2a 2a 0a 2a 2a 20 54 68 65 20 4c 49 4b 45 20 6f  **.** The LIKE o
6960: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 79 73  ptimization trys
6970: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 78 20   to evaluate "x 
6980: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 61 73 20  LIKE 'abc%'" as 
6990: 61 20 72 61 6e 67 65 0a 2a 2a 20 65 78 70 72 65  a range.** expre
69a0: 73 73 69 6f 6e 3a 20 22 78 3e 3d 27 41 42 43 27  ssion: "x>='ABC'
69b0: 20 41 4e 44 20 78 3c 27 61 62 64 27 22 2e 20 20   AND x<'abd'".  
69c0: 42 75 74 20 74 68 69 73 20 72 65 71 75 69 72 65  But this require
69d0: 73 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65  s that the range
69e0: 0a 2a 2a 20 73 63 61 6e 20 6c 6f 6f 70 20 72 75  .** scan loop ru
69f0: 6e 20 74 77 69 63 65 2c 20 6f 6e 63 65 20 66 6f  n twice, once fo
6a00: 72 20 73 74 72 69 6e 67 73 20 61 6e 64 20 61 20  r strings and a 
6a10: 73 65 63 6f 6e 64 20 74 69 6d 65 20 66 6f 72 20  second time for 
6a20: 42 4c 4f 42 73 2e 0a 2a 2a 20 54 68 65 20 4f 50  BLOBs..** The OP
6a30: 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20  _String opcodes 
6a40: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  on the second pa
6a50: 73 73 20 63 6f 6e 76 65 72 74 20 74 68 65 20 75  ss convert the u
6a60: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 0a 2a  pper and lower.*
6a70: 2a 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 63  * bound string c
6a80: 6f 6e 73 74 61 6e 74 73 20 74 6f 20 62 6c 6f 62  onstants to blob
6a90: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
6aa0: 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
6ab0: 73 61 72 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20  sary changes.** 
6ac0: 74 6f 20 74 68 65 20 4f 50 5f 53 74 72 69 6e 67  to the OP_String
6ad0: 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 74 68 61   opcodes for tha
6ae0: 74 20 74 6f 20 68 61 70 70 65 6e 2e 0a 2a 2a 0a  t to happen..**.
6af0: 2a 2a 20 45 78 63 65 70 74 2c 20 6f 66 20 63 6f  ** Except, of co
6b00: 75 72 73 65 2c 20 69 66 20 53 51 4c 49 54 45 5f  urse, if SQLITE_
6b10: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
6b20: 48 5f 42 4c 4f 42 53 20 69 73 20 64 65 66 69 6e  H_BLOBS is defin
6b30: 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79  ed, then.** only
6b40: 20 74 68 65 20 6f 6e 65 20 70 61 73 73 20 74 68   the one pass th
6b50: 72 6f 75 67 68 20 74 68 65 20 73 74 72 69 6e 67  rough the string
6b60: 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
6b70: 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ed, so this rout
6b80: 69 6e 65 0a 2a 2a 20 62 65 63 6f 6d 65 73 20 61  ine.** becomes a
6b90: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
6ba0: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b 65  c void whereLike
6bb0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
6bc0: 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65 20  ngFixup(.  Vdbe 
6bd0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
6be0: 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20 73     /* prepared s
6bf0: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
6c00: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
6c10: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
6c20: 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  vel,     /* The 
6c30: 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69  loop that contai
6c40: 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ns the LIKE oper
6c50: 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54  ator */.  WhereT
6c60: 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20  erm *pTerm      
6c70: 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20 6f    /* The upper o
6c80: 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a 75  r lower bound ju
6c90: 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  st coded */.){. 
6ca0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
6cb0: 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
6cc0: 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  PT ){.    VdbeOp
6cd0: 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65 72   *pOp;.    asser
6ce0: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t( pLevel->iLike
6cf0: 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20  RepCntr>0 );.   
6d00: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
6d10: 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a  beGetOp(v, -1);.
6d20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 21      assert( pOp!
6d30: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
6d40: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
6d50: 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20 20  P_String8 .     
6d60: 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
6d70: 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  >pWC->pWInfo->pP
6d80: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
6d90: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4f  Failed );.    pO
6da0: 70 2d 3e 70 33 20 3d 20 28 69 6e 74 29 28 70 4c  p->p3 = (int)(pL
6db0: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
6dc0: 74 72 3e 3e 31 29 3b 20 20 2f 2a 20 52 65 67 69  tr>>1);  /* Regi
6dd0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 75  ster holding cou
6de0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4f 70 2d  nter */.    pOp-
6df0: 3e 70 35 20 3d 20 28 75 38 29 28 70 4c 65 76 65  >p5 = (u8)(pLeve
6e00: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 26  l->iLikeRepCntr&
6e10: 31 29 3b 20 20 20 20 2f 2a 20 41 53 43 20 6f 72  1);    /* ASC or
6e20: 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 7d 0a 23   DESC */.  }.}.#
6e30: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 68  else.# define wh
6e40: 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74  ereLikeOptimizat
6e50: 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 41  ionStringFixup(A
6e60: 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 23 69  ,B,C).#endif..#i
6e70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6e80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
6e90: 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
6ea0: 6e 20 69 73 20 70 61 73 73 65 64 20 66 72 6f 6d  n is passed from
6eb0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
6ec0: 29 20 64 6f 77 6e 20 74 6f 20 69 6e 64 69 76 69  ) down to indivi
6ed0: 64 75 61 6c 20 6e 6f 64 65 73 20 6f 66 0a 2a 2a  dual nodes of.**
6ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6ef0: 74 72 65 65 20 28 62 79 20 73 71 6c 69 74 65 33  tree (by sqlite3
6f00: 57 61 6c 6b 45 78 70 72 28 29 29 20 75 73 69 6e  WalkExpr()) usin
6f10: 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  g an instance of
6f20: 20 74 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75   this.** structu
6f30: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43 43  re..*/.struct CC
6f40: 75 72 48 69 6e 74 20 7b 0a 20 20 69 6e 74 20 69  urHint {.  int i
6f50: 54 61 62 43 75 72 3b 20 20 20 20 2f 2a 20 43 75  TabCur;    /* Cu
6f60: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d 61 69  rsor for the mai
6f70: 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  n table */.  int
6f80: 20 69 49 64 78 43 75 72 3b 20 20 20 20 2f 2a 20   iIdxCur;    /* 
6f90: 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  Cursor for the i
6fa0: 6e 64 65 78 2c 20 69 66 20 70 49 64 78 21 3d 30  ndex, if pIdx!=0
6fb0: 2e 20 20 55 6e 75 73 65 64 20 6f 74 68 65 72 77  .  Unused otherw
6fc0: 69 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ise */.  Index *
6fd0: 70 49 64 78 3b 20 20 20 20 2f 2a 20 54 68 65 20  pIdx;    /* The 
6fe0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
6ff0: 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a  cess the table *
7000: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
7010: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7020: 6c 65 64 20 66 6f 72 20 65 76 65 72 79 20 6e 6f  led for every no
7030: 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  de of an express
7040: 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 63 61  ion that is a ca
7050: 6e 64 69 64 61 74 65 0a 2a 2a 20 66 6f 72 20 61  ndidate.** for a
7060: 20 63 75 72 73 6f 72 20 68 69 6e 74 20 6f 6e 20   cursor hint on 
7070: 61 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e  an index cursor.
7080: 20 20 46 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20    For TK_COLUMN 
7090: 6e 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72  nodes that refer
70a0: 65 6e 63 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ence.** the tabl
70b0: 65 20 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43  e CCurHint.iTabC
70c0: 75 72 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  ur, verify that 
70d0: 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
70e0: 63 61 6e 20 62 65 0a 2a 2a 20 61 63 63 65 73 73  can be.** access
70f0: 65 64 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ed through the i
7100: 6e 64 65 78 2e 20 20 49 66 20 69 74 20 63 61 6e  ndex.  If it can
7110: 6e 6f 74 2c 20 74 68 65 6e 20 73 65 74 20 70 57  not, then set pW
7120: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
7130: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
7140: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 43   codeCursorHintC
7150: 68 65 63 6b 45 78 70 72 28 57 61 6c 6b 65 72 20  heckExpr(Walker 
7160: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
7170: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
7180: 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69 6e 74   CCurHint *pHint
7190: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43   = pWalker->u.pC
71a0: 43 75 72 48 69 6e 74 3b 0a 20 20 61 73 73 65 72  CurHint;.  asser
71b0: 74 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21 3d  t( pHint->pIdx!=
71c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
71d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
71e0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
71f0: 62 6c 65 3d 3d 70 48 69 6e 74 2d 3e 69 54 61 62  ble==pHint->iTab
7200: 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
7210: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
7220: 48 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70  Hint->pIdx, pExp
7230: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
7240: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
7250: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  eCode = 1;.  }. 
7260: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
7270: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
7280: 65 73 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e  est whether or n
7290: 6f 74 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ot expression pE
72a0: 78 70 72 2c 20 77 68 69 63 68 20 77 61 73 20 70  xpr, which was p
72b0: 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63  art of a WHERE c
72c0: 6c 61 75 73 65 2c 0a 2a 2a 20 73 68 6f 75 6c 64  lause,.** should
72d0: 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   be included in 
72e0: 74 68 65 20 63 75 72 73 6f 72 2d 68 69 6e 74 20  the cursor-hint 
72f0: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
7300: 20 69 73 20 6f 6e 20 74 68 65 20 72 68 73 0a 2a   is on the rhs.*
7310: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  * of a LEFT JOIN
7320: 2e 20 53 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  . Set Walker.eCo
7330: 64 65 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 62  de to non-zero b
7340: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
7350: 69 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  if the .** expre
7360: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 73 75 69  ssion is not sui
7370: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  table..**.** An 
7380: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
7390: 73 75 69 74 61 62 6c 65 20 69 66 20 69 74 20 6d  suitable if it m
73a0: 69 67 68 74 20 65 76 61 6c 75 61 74 65 20 74 6f  ight evaluate to
73b0: 20 6e 6f 6e 20 4e 55 4c 4c 20 65 76 65 6e 20 69   non NULL even i
73c0: 66 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  f.** a TK_COLUMN
73d0: 20 6e 6f 64 65 20 74 68 61 74 20 64 6f 65 73 20   node that does 
73e0: 61 66 66 65 63 74 20 74 68 65 20 76 61 6c 75 65  affect the value
73f0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
7400: 6f 6e 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  on is set.** to 
7410: 4e 55 4c 4c 2e 20 46 6f 72 20 65 78 61 6d 70 6c  NULL. For exampl
7420: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 6f 6c 20 49  e:.**.**   col I
7430: 53 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f 6c 20  S NULL.**   col 
7440: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2a 20 20  IS NOT NULL.**  
7450: 20 63 6f 61 6c 65 73 63 65 28 63 6f 6c 2c 20 31   coalesce(col, 1
7460: 29 0a 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e  ).**   CASE WHEN
7470: 20 63 6f 6c 20 54 48 45 4e 20 30 20 45 4c 53 45   col THEN 0 ELSE
7480: 20 31 20 45 4e 44 0a 2a 2f 0a 73 74 61 74 69 63   1 END.*/.static
7490: 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72 48   int codeCursorH
74a0: 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e 28  intIsOrFunction(
74b0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
74c0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
74d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
74e0: 54 4b 5f 49 53 20 0a 20 20 20 7c 7c 20 70 45 78  TK_IS .   || pEx
74f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pr->op==TK_ISNUL
7500: 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  L || pExpr->op==
7510: 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 7c 7c 20  TK_ISNOT .   || 
7520: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
7530: 54 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72 2d 3e  TNULL || pExpr->
7540: 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 0a 20 20 29  op==TK_CASE .  )
7550: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
7560: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Code = 1;.  }els
7570: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
7580: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
7590: 20 20 20 20 69 6e 74 20 64 31 3b 0a 20 20 20 20      int d1;.    
75a0: 63 68 61 72 20 64 32 5b 34 5d 3b 0a 20 20 20 20  char d2[4];.    
75b0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 49 73  if( 0==sqlite3Is
75c0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 70 57 61  LikeFunction(pWa
75d0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
75e0: 2c 20 70 45 78 70 72 2c 20 26 64 31 2c 20 64 32  , pExpr, &d1, d2
75f0: 29 20 29 7b 0a 20 20 20 20 20 20 70 57 61 6c 6b  ) ){.      pWalk
7600: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
7610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
7620: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
7630: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
7640: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
7650: 65 64 20 6f 6e 20 65 76 65 72 79 20 6e 6f 64 65  ed on every node
7660: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7670: 6e 20 74 72 65 65 20 75 73 65 64 20 61 73 20 61  n tree used as a
7680: 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  n.** argument to
7690: 20 74 68 65 20 4f 50 5f 43 75 72 73 6f 72 48 69   the OP_CursorHi
76a0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  nt instruction. 
76b0: 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 61  If the node is a
76c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 74 68   TK_COLUMN.** th
76d0: 61 74 20 61 63 63 65 73 73 65 73 20 61 6e 79 20  at accesses any 
76e0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
76f0: 20 74 68 65 20 6f 6e 65 20 69 64 65 6e 74 69 66   the one identif
7700: 69 65 64 20 62 79 0a 2a 2a 20 43 43 75 72 48 69  ied by.** CCurHi
7710: 6e 74 2e 69 54 61 62 43 75 72 2c 20 74 68 65 6e  nt.iTabCur, then
7720: 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
7730: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 61 6c  g:.**.**   1) al
7740: 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
7750: 72 20 61 6e 64 20 63 6f 64 65 20 61 6e 20 4f 50  r and code an OP
7760: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
7770: 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a 2a 2a 20  ion to read .** 
7780: 20 20 20 20 20 74 68 65 20 73 70 65 63 69 66 69       the specifi
7790: 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 74  ed column into t
77a0: 68 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 2c  he new register,
77b0: 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20   and.**.**   2) 
77c0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 65 78  transform the ex
77d0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
77e0: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6e   a TK_REGISTER n
77f0: 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20 0a  ode that reads .
7800: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
7810: 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61 74 65 64   newly populated
7820: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
7830: 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 6e 6f   Also, if the no
7840: 64 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d  de is a TK_COLUM
7850: 4e 20 74 68 61 74 20 64 6f 65 73 20 61 63 63 65  N that does acce
7860: 73 73 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  ss the table ide
7870: 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 43 43  nified.** by pCC
7880: 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20  urHint.iTabCur, 
7890: 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20  and an index is 
78a0: 62 65 69 6e 67 20 75 73 65 64 20 28 77 68 69 63  being used (whic
78b0: 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 6b 6e 6f  h we will.** kno
78c0: 77 20 62 65 63 61 75 73 65 20 43 43 75 72 48 69  w because CCurHi
78d0: 6e 74 2e 70 49 64 78 21 3d 30 29 20 74 68 65 6e  nt.pIdx!=0) then
78e0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 54   transform the T
78f0: 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f 0a 2a 2a  K_COLUMN into.**
7900: 20 61 6e 20 61 63 63 65 73 73 20 6f 66 20 74 68   an access of th
7910: 65 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  e index rather t
7920: 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  han the original
7930: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
7940: 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72  c int codeCursor
7950: 48 69 6e 74 46 69 78 45 78 70 72 28 57 61 6c 6b  HintFixExpr(Walk
7960: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
7970: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
7980: 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e 74 69 6e   rc = WRC_Contin
7990: 75 65 3b 0a 20 20 73 74 72 75 63 74 20 43 43 75  ue;.  struct CCu
79a0: 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70  rHint *pHint = p
79b0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48  Walker->u.pCCurH
79c0: 69 6e 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  int;.  if( pExpr
79d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
79e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
79f0: 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69 6e 74 2d  ->iTable!=pHint-
7a00: 3e 69 54 61 62 43 75 72 20 29 7b 0a 20 20 20 20  >iTabCur ){.    
7a10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 61 6c    Vdbe *v = pWal
7a20: 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  ker->pParse->pVd
7a30: 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  be;.      int re
7a40: 67 20 3d 20 2b 2b 70 57 61 6c 6b 65 72 2d 3e 70  g = ++pWalker->p
7a50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f  Parse->nMem;   /
7a60: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 63  * Register for c
7a70: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olumn value */. 
7a80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7a90: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
7aa0: 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  able(.          
7ab0: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
7ac0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
7ad0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72  Expr->iColumn, r
7ae0: 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  eg.      );.    
7af0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
7b00: 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
7b10: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7b20: 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20   reg;.    }else 
7b30: 69 66 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21  if( pHint->pIdx!
7b40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
7b50: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 48 69 6e  r->iTable = pHin
7b60: 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  t->iIdxCur;.    
7b70: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
7b80: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
7b90: 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70  OfIndex(pHint->p
7ba0: 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
7bb0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  umn);.      asse
7bc0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
7bd0: 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  mn>=0 );.    }. 
7be0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
7bf0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
7c00: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  CTION ){.    /* 
7c10: 41 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  An aggregate fun
7c20: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 57 48 45  ction in the WHE
7c30: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  RE clause of a q
7c40: 75 65 72 79 20 6d 65 61 6e 73 20 74 68 69 73 20  uery means this 
7c50: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 61  must.    ** be a
7c60: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
7c70: 71 75 65 72 79 2c 20 61 6e 64 20 65 78 70 72 65  query, and expre
7c80: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
7c90: 6e 20 61 67 67 72 65 67 61 74 65 20 66 72 6f 6d  n aggregate from
7ca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 65  .    ** the pare
7cb0: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44 6f 20 6e  nt context. Do n
7cc0: 6f 74 20 77 61 6c 6b 20 74 68 65 20 66 75 6e 63  ot walk the func
7cd0: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
7ce0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
7cf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a   **.    ** todo:
7d00: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 6f   It should be po
7d10: 73 73 69 62 6c 65 20 74 6f 20 72 65 70 6c 61 63  ssible to replac
7d20: 65 20 74 68 69 73 20 6e 6f 64 65 20 77 69 74 68  e this node with
7d30: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20   a TK_REGISTER. 
7d40: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
7d50: 2c 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  , as the result 
7d60: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
7d70: 6e 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  n must be stored
7d80: 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a 20 72 65   in a .    ** re
7d90: 67 69 73 74 65 72 20 61 74 20 74 68 69 73 20 70  gister at this p
7da0: 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d 65 20 68  oint. The same h
7db0: 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41 47 47 5f  olds for TK_AGG_
7dc0: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f  COLUMN nodes. */
7dd0: 0a 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72  .    rc = WRC_Pr
7de0: 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
7df0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
7e00: 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43 75 72 73  nsert an OP_Curs
7e10: 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69  orHint instructi
7e20: 6f 6e 20 69 66 20 69 74 20 69 73 20 61 70 70 72  on if it is appr
7e30: 6f 70 72 69 61 74 65 20 74 6f 20 64 6f 20 73 6f  opriate to do so
7e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e50: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
7e60: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7e70: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
7e80: 2c 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ,  /* FROM claus
7e90: 65 20 69 74 65 6d 20 2a 2f 0a 20 20 57 68 65 72  e item */.  Wher
7ea0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
7eb0: 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 63    /* The where c
7ec0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
7ed0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
7ee0: 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 74   /* Which loop t
7ef0: 6f 20 70 72 6f 76 69 64 65 20 68 69 6e 74 73 20  o provide hints 
7f00: 66 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  for */.  WhereTe
7f10: 72 6d 20 2a 70 45 6e 64 52 61 6e 67 65 20 20 2f  rm *pEndRange  /
7f20: 2a 20 48 69 6e 74 20 74 68 69 73 20 65 6e 64 2d  * Hint this end-
7f30: 6f 66 2d 73 63 61 6e 20 62 6f 75 6e 64 61 72 79  of-scan boundary
7f40: 20 74 65 72 6d 20 69 66 20 6e 6f 74 20 4e 55 4c   term if not NUL
7f50: 4c 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  L */.){.  Parse 
7f60: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
7f70: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
7f80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7f90: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
7fa0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7fb0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7fc0: 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   0;.  WhereLoop 
7fd0: 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d  *pLoop = pLevel-
7fe0: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69  >pWLoop;.  int i
7ff0: 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
8000: 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
8010: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
8020: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
8030: 74 20 43 43 75 72 48 69 6e 74 20 73 48 69 6e 74  t CCurHint sHint
8040: 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  ;.  Walker sWalk
8050: 65 72 3b 0a 0a 20 20 69 66 28 20 4f 70 74 69 6d  er;..  if( Optim
8060: 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
8070: 64 62 2c 20 53 51 4c 49 54 45 5f 43 75 72 73 6f  db, SQLITE_Curso
8080: 72 48 69 6e 74 73 29 20 29 20 72 65 74 75 72 6e  rHints) ) return
8090: 3b 0a 20 20 69 43 75 72 20 3d 20 70 4c 65 76 65  ;.  iCur = pLeve
80a0: 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 61 73  l->iTabCur;.  as
80b0: 73 65 72 74 28 20 69 43 75 72 3d 3d 70 57 49 6e  sert( iCur==pWIn
80c0: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
80d0: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
80e0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 48 69 6e  Cursor );.  sHin
80f0: 74 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  t.iTabCur = iCur
8100: 3b 0a 20 20 73 48 69 6e 74 2e 69 49 64 78 43 75  ;.  sHint.iIdxCu
8110: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
8120: 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e 70 49 64  Cur;.  sHint.pId
8130: 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
8140: 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 6d 65 6d  ee.pIndex;.  mem
8150: 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
8160: 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29   sizeof(sWalker)
8170: 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  );.  sWalker.pPa
8180: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
8190: 73 57 61 6c 6b 65 72 2e 75 2e 70 43 43 75 72 48  sWalker.u.pCCurH
81a0: 69 6e 74 20 3d 20 26 73 48 69 6e 74 3b 0a 20 20  int = &sHint;.  
81b0: 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
81c0: 57 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  WC;.  for(i=0; i
81d0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
81e0: 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  ){.    pTerm = &
81f0: 70 57 43 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69  pWC->a[i];.    i
8200: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
8210: 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
8220: 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
8230: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8240: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ( pTerm->prereqA
8250: 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
8260: 52 65 61 64 79 20 29 20 63 6f 6e 74 69 6e 75 65  Ready ) continue
8270: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 74 65  ;..    /* Any te
8280: 72 6d 73 20 73 70 65 63 69 66 69 65 64 20 61 73  rms specified as
8290: 20 70 61 72 74 20 6f 66 20 74 68 65 20 4f 4e 28   part of the ON(
82a0: 2e 2e 2e 29 20 63 6c 61 75 73 65 20 66 6f 72 20  ...) clause for 
82b0: 61 6e 79 20 4c 45 46 54 20 0a 20 20 20 20 2a 2a  any LEFT .    **
82c0: 20 4a 4f 49 4e 20 66 6f 72 20 77 68 69 63 68 20   JOIN for which 
82d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
82e0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 72 68 73  e is not the rhs
82f0: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20   are omitted.   
8300: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75 72   ** from the cur
8310: 73 6f 72 2d 68 69 6e 74 2e 20 0a 20 20 20 20 2a  sor-hint. .    *
8320: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
8330: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 68   table is the rh
8340: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
8350: 2c 20 22 49 53 22 20 6f 72 20 22 49 53 20 4e 55  , "IS" or "IS NU
8360: 4c 4c 22 20 74 65 72 6d 73 20 0a 20 20 20 20 2a  LL" terms .    *
8370: 2a 20 74 68 61 74 20 77 65 72 65 20 73 70 65 63  * that were spec
8380: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
8390: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
83a0: 65 20 6d 75 73 74 20 62 65 20 65 78 63 6c 75 64  e must be exclud
83b0: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ed..    ** This 
83c0: 69 73 20 74 6f 20 61 64 64 72 65 73 73 20 74 68  is to address th
83d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
83e0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
83f0: 45 43 54 20 2e 2e 2e 20 74 31 20 4c 45 46 54 20  ECT ... t1 LEFT 
8400: 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 74 31 2e 61  JOIN t2 ON (t1.a
8410: 3d 74 32 2e 62 29 20 57 48 45 52 45 20 74 32 2e  =t2.b) WHERE t2.
8420: 63 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a  c IS NULL;.    *
8430: 2a 0a 20 20 20 20 2a 2a 20 53 61 79 20 74 68 65  *.    ** Say the
8440: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72  re is a single r
8450: 6f 77 20 69 6e 20 74 32 20 74 68 61 74 20 6d 61  ow in t2 that ma
8460: 74 63 68 65 73 20 28 74 31 2e 61 3d 74 32 2e 62  tches (t1.a=t2.b
8470: 29 2c 20 62 75 74 20 69 74 73 0a 20 20 20 20 2a  ), but its.    *
8480: 2a 20 74 32 2e 63 20 76 61 6c 75 65 73 20 69 73  * t2.c values is
8490: 20 6e 6f 74 20 4e 55 4c 4c 2e 20 49 66 20 74 68   not NULL. If th
84a0: 65 20 28 74 32 2e 63 20 49 53 20 4e 55 4c 4c 29  e (t2.c IS NULL)
84b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 0a   constraint is .
84c0: 20 20 20 20 2a 2a 20 70 75 73 68 65 64 20 64 6f      ** pushed do
84d0: 77 6e 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  wn to the cursor
84e0: 2c 20 74 68 69 73 20 72 6f 77 20 69 73 20 66 69  , this row is fi
84f0: 6c 74 65 72 65 64 20 6f 75 74 2c 20 63 61 75 73  ltered out, caus
8500: 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ing.    ** SQLit
8510: 65 20 74 6f 20 73 79 6e 74 68 65 73 69 7a 65 20  e to synthesize 
8520: 61 20 72 6f 77 20 6f 66 20 4e 55 4c 4c 20 76 61  a row of NULL va
8530: 6c 75 65 73 2e 20 57 68 69 63 68 20 64 6f 65 73  lues. Which does
8540: 20 6d 61 74 63 68 20 74 68 65 0a 20 20 20 20 2a   match the.    *
8550: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  * WHERE clause, 
8560: 61 6e 64 20 73 6f 20 74 68 65 20 71 75 65 72 79  and so the query
8570: 20 72 65 74 75 72 6e 73 20 61 20 72 6f 77 2e 20   returns a row. 
8580: 57 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  Which is incorre
8590: 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
85a0: 2a 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  * For the same r
85b0: 65 61 73 6f 6e 2c 20 57 48 45 52 45 20 74 65 72  eason, WHERE ter
85c0: 6d 73 20 73 75 63 68 20 61 73 3a 0a 20 20 20 20  ms such as:.    
85d0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 57 48 45 52  **.    **   WHER
85e0: 45 20 31 20 3d 20 28 74 32 2e 63 20 49 53 20 4e  E 1 = (t2.c IS N
85f0: 55 4c 4c 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ULL).    **.    
8600: 2a 2a 20 61 72 65 20 61 6c 73 6f 20 65 78 63 6c  ** are also excl
8610: 75 64 65 64 2e 20 53 65 65 20 63 6f 64 65 43 75  uded. See codeCu
8620: 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e 63  rsorHintIsOrFunc
8630: 74 69 6f 6e 28 29 20 66 6f 72 20 64 65 74 61 69  tion() for detai
8640: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
8650: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
8660: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
8670: 46 54 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  FT ){.      Expr
8680: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
8690: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
86a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
86b0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
86c0: 6d 4a 6f 69 6e 29 20 0a 20 20 20 20 20 20 20 7c  mJoin) .       |
86d0: 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
86e0: 6f 69 6e 54 61 62 6c 65 21 3d 70 54 61 62 49 74  oinTable!=pTabIt
86f0: 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20 20  em->iCursor.    
8700: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 57 61    ){.        sWa
8710: 6c 6b 65 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  lker.eCode = 0;.
8720: 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65 72 2e          sWalker.
8730: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
8740: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73  codeCursorHintIs
8750: 4f 72 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20  OrFunction;.    
8760: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
8770: 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 54  xpr(&sWalker, pT
8780: 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
8790: 20 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72       if( sWalker
87a0: 2e 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75  .eCode ) continu
87b0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
87c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
87d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
87e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
87f0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
8800: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
8810: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 69    /* All terms i
8820: 6e 20 70 57 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  n pWLoop->aLTerm
8830: 5b 5d 20 65 78 63 65 70 74 20 70 45 6e 64 52 61  [] except pEndRa
8840: 6e 67 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  nge are used to 
8850: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
8860: 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  * the cursor.  T
8870: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e  hese terms are n
8880: 6f 74 20 6e 65 65 64 65 64 20 61 73 20 68 69 6e  ot needed as hin
8890: 74 73 20 66 6f 72 20 61 20 70 75 72 65 20 72 61  ts for a pure ra
88a0: 6e 67 65 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20  nge.    ** scan 
88b0: 28 74 68 61 74 20 68 61 73 20 6e 6f 20 3d 3d 20  (that has no == 
88c0: 74 65 72 6d 73 29 20 73 6f 20 6f 6d 69 74 20 74  terms) so omit t
88d0: 68 65 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  hem. */.    if( 
88e0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
88f0: 45 71 3d 3d 30 20 26 26 20 70 54 65 72 6d 21 3d  Eq==0 && pTerm!=
8900: 70 45 6e 64 52 61 6e 67 65 20 29 7b 0a 20 20 20  pEndRange ){.   
8910: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
8920: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
8930: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21  Loop->aLTerm[j]!
8940: 3d 70 54 65 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20  =pTerm; j++){}. 
8950: 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
8960: 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69  ->nLTerm ) conti
8970: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
8980: 2f 2a 20 4e 6f 20 73 75 62 71 75 65 72 69 65 73  /* No subqueries
8990: 20 6f 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   or non-determin
89a0: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  istic functions 
89b0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69  allowed */.    i
89c0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
89d0: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 70  ntainsSubquery(p
89e0: 54 65 72 6d 2d 3e 70 45 78 70 72 29 20 29 20 63  Term->pExpr) ) c
89f0: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
8a00: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
8a10: 61 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  an, make sure re
8a20: 66 65 72 65 6e 63 65 64 20 63 6f 6c 75 6d 6e 73  ferenced columns
8a30: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 69 6e   are actually in
8a40: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
8a50: 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 48  x. */.    if( sH
8a60: 69 6e 74 2e 70 49 64 78 21 3d 30 20 29 7b 0a 20  int.pIdx!=0 ){. 
8a70: 20 20 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f       sWalker.eCo
8a80: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 57  de = 0;.      sW
8a90: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
8aa0: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
8ab0: 48 69 6e 74 43 68 65 63 6b 45 78 70 72 3b 0a 20  HintCheckExpr;. 
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
8ad0: 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
8ae0: 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
8af0: 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e      if( sWalker.
8b00: 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  eCode ) continue
8b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8b20: 49 66 20 77 65 20 73 75 72 76 69 76 65 20 61 6c  If we survive al
8b30: 6c 20 70 72 69 6f 72 20 74 65 73 74 73 2c 20 74  l prior tests, t
8b40: 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 74  hat means this t
8b50: 65 72 6d 20 69 73 20 77 6f 72 74 68 20 68 69 6e  erm is worth hin
8b60: 74 69 6e 67 20 2a 2f 0a 20 20 20 20 70 45 78 70  ting */.    pExp
8b70: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
8b80: 6e 64 28 64 62 2c 20 70 45 78 70 72 2c 20 73 71  nd(db, pExpr, sq
8b90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8ba0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
8bb0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  ));.  }.  if( pE
8bc0: 78 70 72 21 3d 30 20 29 7b 0a 20 20 20 20 73 57  xpr!=0 ){.    sW
8bd0: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
8be0: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
8bf0: 48 69 6e 74 46 69 78 45 78 70 72 3b 0a 20 20 20  HintFixExpr;.   
8c00: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
8c10: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  (&sWalker, pExpr
8c20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8c30: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
8c40: 75 72 73 6f 72 48 69 6e 74 2c 20 0a 20 20 20 20  ursorHint, .    
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 28 73 48 69 6e 74 2e 70 49 64 78 20 3f 20    (sHint.pIdx ? 
8c70: 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20 3a 20  sHint.iIdxCur : 
8c80: 73 48 69 6e 74 2e 69 54 61 62 43 75 72 29 2c 20  sHint.iTabCur), 
8c90: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
8cb0: 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2c 20  st char*)pExpr, 
8cc0: 50 34 5f 45 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a  P4_EXPR);.  }.}.
8cd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63  #else.# define c
8ce0: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 41 2c  odeCursorHint(A,
8cf0: 42 2c 43 2c 44 29 20 20 2f 2a 20 4e 6f 2d 6f 70  B,C,D)  /* No-op
8d00: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
8d10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
8d20: 4f 52 5f 48 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a  OR_HINTS */../*.
8d30: 2a 2a 20 43 75 72 73 6f 72 20 69 43 75 72 20 69  ** Cursor iCur i
8d40: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
8d50: 6b 65 79 20 62 2d 74 72 65 65 20 28 61 20 74 61  key b-tree (a ta
8d60: 62 6c 65 29 2e 20 52 65 67 69 73 74 65 72 20 69  ble). Register i
8d70: 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 0a 2a  Rowid contains.*
8d80: 2a 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 20  * a rowid value 
8d90: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 63  just read from c
8da0: 75 72 73 6f 72 20 69 49 64 78 43 75 72 2c 20 6f  ursor iIdxCur, o
8db0: 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 70 49 64  pen on index pId
8dc0: 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
8dd0: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ion generates co
8de0: 64 65 20 74 6f 20 64 6f 20 61 20 64 65 66 65 72  de to do a defer
8df0: 72 65 64 20 73 65 65 6b 20 6f 66 20 63 75 72 73  red seek of curs
8e00: 6f 72 20 69 43 75 72 20 74 6f 20 74 68 65 20 0a  or iCur to the .
8e10: 2a 2a 20 72 6f 77 69 64 20 73 74 6f 72 65 64 20  ** rowid stored 
8e20: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 6f 77  in register iRow
8e30: 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  id..**.** Normal
8e40: 6c 79 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74  ly, this is just
8e50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 50 5f 44 65 66  :.**.**   OP_Def
8e60: 65 72 72 65 64 53 65 65 6b 20 24 69 43 75 72 20  erredSeek $iCur 
8e70: 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f  $iRowid.**.** Ho
8e80: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 63  wever, if the sc
8e90: 61 6e 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  an currently bei
8ea0: 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20 62 72  ng coded is a br
8eb0: 61 6e 63 68 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f  anch of an OR-lo
8ec0: 6f 70 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 74  op and.** the st
8ed0: 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
8ee0: 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73  y being coded is
8ef0: 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20   a SELECT, then 
8f00: 50 33 20 6f 66 20 4f 50 5f 44 65 66 65 72 72 65  P3 of OP_Deferre
8f10: 64 53 65 65 6b 0a 2a 2a 20 69 73 20 73 65 74 20  dSeek.** is set 
8f20: 74 6f 20 69 49 64 78 43 75 72 20 61 6e 64 20 50  to iIdxCur and P
8f30: 34 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  4 is set to poin
8f40: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
8f50: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 63 6f 6e   integers.** con
8f60: 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e 74 72  taining one entr
8f70: 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  y for each colum
8f80: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  n of the table c
8f90: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
8fa0: 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46 6f 72 20 65  en .** on. For e
8fb0: 61 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ach table column
8fc0: 2c 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , if the column 
8fd0: 69 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  is the i'th colu
8fe0: 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  mn of the .** in
8ff0: 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  dex, then the co
9000: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72 72 61  rresponding arra
9010: 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74  y entry is set t
9020: 6f 20 28 69 2b 31 29 2e 20 49 66 20 74 68 65 20  o (i+1). If the 
9030: 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f 65 73 20 6e  column.** does n
9040: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
9050: 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2c 20 74   index at all, t
9060: 68 65 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  he array entry i
9070: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
9080: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
9090: 65 66 65 72 72 65 64 53 65 65 6b 28 0a 20 20 57  eferredSeek(.  W
90a0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
90b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
90c0: 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 63  * Where clause c
90d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
90e0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9100: 6e 64 65 78 20 73 63 61 6e 20 69 73 20 75 73 69  ndex scan is usi
9110: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ng */.  int iCur
9120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9130: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9140: 72 20 66 6f 72 20 49 50 4b 20 62 2d 74 72 65 65  r for IPK b-tree
9150: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
9160: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
9170: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
9180: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 50 61  ursor */.){.  Pa
9190: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
91a0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 2f 2a  Info->pParse; /*
91b0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
91c0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
91d0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
91e0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 67      /* Vdbe to g
91f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 69 74  enerate code wit
9200: 68 69 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hin */..  assert
9210: 28 20 69 49 64 78 43 75 72 3e 30 20 29 3b 0a 20  ( iIdxCur>0 );. 
9220: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
9230: 69 43 6f 6c 75 6d 6e 5b 70 49 64 78 2d 3e 6e 43  iColumn[pIdx->nC
9240: 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31 20 29 3b 0a  olumn-1]==-1 );.
9250: 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65    .  sqlite3Vdbe
9260: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 66  AddOp3(v, OP_Def
9270: 65 72 72 65 64 53 65 65 6b 2c 20 69 49 64 78 43  erredSeek, iIdxC
9280: 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a 20 20  ur, 0, iCur);.  
9290: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
92a0: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
92b0: 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a 20 20  OR_SUBCLAUSE).  
92c0: 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   && DbMaskAllZer
92d0: 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  o(sqlite3ParseTo
92e0: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 2d 3e  plevel(pParse)->
92f0: 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29 7b 0a  writeMask).  ){.
9300: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
9310: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
9320: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 69  x->pTable;.    i
9330: 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a 29 73  nt *ai = (int*)s
9340: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9350: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
9360: 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54 61 62  izeof(int)*(pTab
9370: 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  ->nCol+1));.    
9380: 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20 20 20  if( ai ){.      
9390: 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 43  ai[0] = pTab->nC
93a0: 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ol;.      for(i=
93b0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
93c0: 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn-1; i++){.    
93d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
93e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 70 54  ->aiColumn[i]<pT
93f0: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
9400: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9410: 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 20 61  Column[i]>=0 ) a
9420: 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  i[pIdx->aiColumn
9430: 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a 20 20  [i]+1] = i+1;.  
9440: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9450: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
9460: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 61 69  v, -1, (char*)ai
9470: 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
9480: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9490: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
94a0: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
94b0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
94c0: 6e 74 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  nt is a vector, 
94d0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
94e0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 66 69   to write the fi
94f0: 72 73 74 20 6e 52 65 67 20 65 6c 65 6d 65 6e 74  rst nReg element
9500: 73 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  s of the vector 
9510: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 0a 2a 2a  into an array.**
9520: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
9530: 61 72 74 69 6e 67 20 77 69 74 68 20 69 52 65 67  arting with iReg
9540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9550: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
9560: 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20   a vector, then 
9570: 6e 52 65 67 20 6d 75 73 74 20 62 65 20 70 61 73  nReg must be pas
9580: 73 65 64 20 31 2e 20 49 6e 0a 2a 2a 20 74 68 69  sed 1. In.** thi
9590: 73 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65  s case, generate
95a0: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
95b0: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
95c0: 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 0a 2a   and leave the.*
95d0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  * result in regi
95e0: 73 74 65 72 20 69 52 65 67 2e 0a 2a 2f 0a 73 74  ster iReg..*/.st
95f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 78  atic void codeEx
9600: 70 72 4f 72 56 65 63 74 6f 72 28 50 61 72 73 65  prOrVector(Parse
9610: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
9620: 70 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  p, int iReg, int
9630: 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
9640: 28 20 6e 52 65 67 3e 30 20 29 3b 0a 20 20 69 66  ( nReg>0 );.  if
9650: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 45 78  ( p && sqlite3Ex
9660: 70 72 49 73 56 65 63 74 6f 72 28 70 29 20 29 7b  prIsVector(p) ){
9670: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9680: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9690: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
96a0: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
96b0: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
96c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
96d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 6c  ;.      int iSel
96e0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ect = sqlite3Cod
96f0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
9700: 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, p, 0, 0);.   
9710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9720: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
9730: 20 69 53 65 6c 65 63 74 2c 20 69 52 65 67 2c 20   iSelect, iReg, 
9740: 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  nReg-1);.    }el
9750: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
9760: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9770: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9780: 73 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b  st = p->x.pList;
9790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
97a0: 52 65 67 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  Reg<=pList->nExp
97b0: 72 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r );.      for(i
97c0: 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29  =0; i<nReg; i++)
97d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
97e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
97f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
9800: 78 70 72 2c 20 69 52 65 67 2b 69 29 3b 0a 20 20  xpr, iReg+i);.  
9810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9820: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9830: 20 6e 52 65 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nReg==1 );.    
9840: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9850: 70 50 61 72 73 65 2c 20 70 2c 20 69 52 65 67 29  pParse, p, iReg)
9860: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 69  ;.  }.}../* An i
9870: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 49  nstance of the I
9880: 64 78 45 78 70 72 54 72 61 6e 73 20 6f 62 6a 65  dxExprTrans obje
9890: 63 74 20 63 61 72 72 69 65 73 20 69 6e 66 6f 72  ct carries infor
98a0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
98b0: 2a 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 61  * mapping from a
98c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  n expression on 
98d0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
98e0: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  to a column in a
98f0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 64 6f 77 6e 20  n index.** down 
9900: 74 68 72 6f 75 67 68 20 74 68 65 20 57 61 6c 6b  through the Walk
9910: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
9920: 74 72 75 63 74 20 49 64 78 45 78 70 72 54 72 61  truct IdxExprTra
9930: 6e 73 20 7b 0a 20 20 45 78 70 72 20 2a 70 49 64  ns {.  Expr *pId
9940: 78 45 78 70 72 3b 20 20 20 20 2f 2a 20 54 68 65  xExpr;    /* The
9950: 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
9960: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  n */.  int iTabC
9970: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
9980: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63   cursor of the c
9990: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
99a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  le */.  int iIdx
99b0: 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
99c0: 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
99d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
99e0: 69 49 64 78 43 6f 6c 3b 20 20 20 20 20 20 20 2f  iIdxCol;       /
99f0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  * The column for
9a00: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 20   the index */.} 
9a10: 49 64 78 45 78 70 72 54 72 61 6e 73 3b 0a 0a 2f  IdxExprTrans;../
9a20: 2a 20 54 68 65 20 77 61 6c 6b 65 72 20 6e 6f 64  * The walker nod
9a30: 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  e callback used 
9a40: 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74  to transform mat
9a50: 63 68 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ching expression
9a60: 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 66 65  s into.** a refe
9a70: 72 65 6e 63 65 20 74 6f 20 61 6e 20 69 6e 64 65  rence to an inde
9a80: 78 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6e 20  x column for an 
9a90: 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78 70 72  index on an expr
9aa0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
9ab0: 20 70 45 78 70 72 20 6d 61 74 63 68 65 73 2c 20   pExpr matches, 
9ac0: 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 69  then transform i
9ad0: 74 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e  t into a referen
9ae0: 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
9af0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 63  column.** that c
9b00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
9b10: 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  e of pExpr..*/.s
9b20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
9b30: 6e 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64  ndexExprTransNod
9b40: 65 28 57 61 6c 6b 65 72 20 2a 70 2c 20 45 78 70  e(Walker *p, Exp
9b50: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 49 64 78  r *pExpr){.  Idx
9b60: 45 78 70 72 54 72 61 6e 73 20 2a 70 58 20 3d 20  ExprTrans *pX = 
9b70: 70 2d 3e 75 2e 70 49 64 78 54 72 61 6e 73 3b 0a  p->u.pIdxTrans;.
9b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9b90: 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
9ba0: 72 2c 20 70 58 2d 3e 70 49 64 78 45 78 70 72 2c  r, pX->pIdxExpr,
9bb0: 20 70 58 2d 3e 69 54 61 62 43 75 72 29 3d 3d 30   pX->iTabCur)==0
9bc0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
9bd0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
9be0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9bf0: 20 3d 20 70 58 2d 3e 69 49 64 78 43 75 72 3b 0a   = pX->iIdxCur;.
9c00: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
9c10: 6d 6e 20 3d 20 70 58 2d 3e 69 49 64 78 43 6f 6c  mn = pX->iIdxCol
9c20: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
9c30: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
9c40: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
9c50: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
9c60: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
9c70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20   }.}../*.** For 
9c80: 61 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20 65 78  an indexes on ex
9c90: 70 72 65 73 73 69 6f 6e 20 58 2c 20 6c 6f 63 61  pression X, loca
9ca0: 74 65 20 65 76 65 72 79 20 69 6e 73 74 61 6e 63  te every instanc
9cb0: 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  e of expression 
9cc0: 58 0a 2a 2a 20 69 6e 20 70 45 78 70 72 20 61 6e  X.** in pExpr an
9cd0: 64 20 63 68 61 6e 67 65 20 74 68 61 74 20 73 75  d change that su
9ce0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f  bexpression into
9cf0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
9d00: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
9d10: 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ** column of the
9d20: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
9d30: 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 64 65  c void whereInde
9d40: 78 45 78 70 72 54 72 61 6e 73 28 0a 20 20 49 6e  xExprTrans(.  In
9d50: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
9d60: 2f 2a 20 54 68 65 20 49 6e 64 65 78 20 2a 2f 0a  /* The Index */.
9d70: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
9d80: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
9d90: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
9da0: 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  is being indexed
9db0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
9dc0: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
9dd0: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
9de0: 74 73 65 6c 66 20 2a 2f 0a 20 20 57 68 65 72 65  tself */.  Where
9df0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 2f 2a 20  Info *pWInfo /* 
9e00: 54 72 61 6e 73 66 6f 72 6d 20 65 78 70 72 65 73  Transform expres
9e10: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 57 48  sions in this WH
9e20: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
9e30: 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 3b 20  .  int iIdxCol; 
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e50: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
9e60: 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
9e70: 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45   ExprList *aColE
9e80: 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr;        /* E
9e90: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
9ea0: 61 72 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  are indexed */. 
9eb0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 49 64 78   Walker w;.  Idx
9ec0: 45 78 70 72 54 72 61 6e 73 20 78 3b 0a 20 20 61  ExprTrans x;.  a
9ed0: 43 6f 6c 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  ColExpr = pIdx->
9ee0: 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 66 28 20  aColExpr;.  if( 
9ef0: 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 72 65  aColExpr==0 ) re
9f00: 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 20 61 6e  turn;  /* Not an
9f10: 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
9f20: 73 69 6f 6e 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  sions */.  memse
9f30: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
9f40: 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
9f50: 6c 6c 62 61 63 6b 20 3d 20 77 68 65 72 65 49 6e  llback = whereIn
9f60: 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64 65  dexExprTransNode
9f70: 3b 0a 20 20 77 2e 75 2e 70 49 64 78 54 72 61 6e  ;.  w.u.pIdxTran
9f80: 73 20 3d 20 26 78 3b 0a 20 20 78 2e 69 54 61 62  s = &x;.  x.iTab
9f90: 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b 0a 20  Cur = iTabCur;. 
9fa0: 20 78 2e 69 49 64 78 43 75 72 20 3d 20 69 49 64   x.iIdxCur = iId
9fb0: 78 43 75 72 3b 0a 20 20 66 6f 72 28 69 49 64 78  xCur;.  for(iIdx
9fc0: 43 6f 6c 3d 30 3b 20 69 49 64 78 43 6f 6c 3c 61  Col=0; iIdxCol<a
9fd0: 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3b 20  ColExpr->nExpr; 
9fe0: 69 49 64 78 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  iIdxCol++){.    
9ff0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a000: 6d 6e 5b 69 49 64 78 43 6f 6c 5d 21 3d 58 4e 5f  mn[iIdxCol]!=XN_
a010: 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
a020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 43 6f  .    assert( aCo
a030: 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
a040: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
a050: 20 20 78 2e 69 49 64 78 43 6f 6c 20 3d 20 69 49    x.iIdxCol = iI
a060: 64 78 43 6f 6c 3b 0a 20 20 20 20 78 2e 70 49 64  dxCol;.    x.pId
a070: 78 45 78 70 72 20 3d 20 61 43 6f 6c 45 78 70 72  xExpr = aColExpr
a080: 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
a090: 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  pr;.    sqlite3W
a0a0: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 57 49 6e  alkExpr(&w, pWIn
a0b0: 66 6f 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  fo->pWhere);.   
a0c0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a0d0: 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d  List(&w, pWInfo-
a0e0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
a0f0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
a100: 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e  ist(&w, pWInfo->
a110: 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 7d  pResultSet);.  }
a120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a130: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
a140: 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
a150: 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
a160: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
a170: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
a180: 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
a190: 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61 73  WInfo..*/.Bitmas
a1a0: 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  k sqlite3WhereCo
a1b0: 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
a1c0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
a1d0: 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
a1e0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
a1f0: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
a200: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
a210: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
a220: 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
a230: 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
a240: 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
a250: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a260: 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
a270: 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
a280: 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
a290: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
a2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a2b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
a2c0: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
a2e0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
a2f0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
a300: 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
a310: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
a320: 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
a330: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
a340: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
a350: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
a360: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
a370: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
a380: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
a390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a3a0: 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
a3b0: 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
a3c0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
a3d0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
a3e0: 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
a3f0: 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
a400: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
a410: 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
a420: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
a430: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
a440: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
a450: 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
a460: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
a470: 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
a480: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
a490: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
a4b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
a4c0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
a4d0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
a4e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a4f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
a500: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a520: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
a530: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
a540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a560: 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
a570: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a580: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
a590: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
a5a0: 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
a5b0: 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
a5c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
a5d0: 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
a5f0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
a600: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
a610: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 48  p */.  int addrH
a620: 61 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  alt;            
a630: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 42 72         /* addrBr
a640: 6b 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 6d  k for the outerm
a650: 6f 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ost loop */.  in
a660: 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a680: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
a690: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
a6a0: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
a6b0: 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
a6c0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
a6d0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
a6e0: 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
a6f0: 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
a700: 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
a710: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
a720: 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
a730: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
a740: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
a750: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
a760: 2a 20 49 6e 64 65 78 20 75 73 65 64 20 62 79 20  * Index used by 
a770: 6c 6f 6f 70 20 28 69 66 20 61 6e 79 29 20 2a 2f  loop (if any) */
a780: 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7a0: 49 74 65 72 61 74 69 6f 6e 20 6f 66 20 63 6f 6e  Iteration of con
a7b0: 73 74 72 61 69 6e 74 20 67 65 6e 65 72 61 74 6f  straint generato
a7c0: 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 70 50 61  r loop */..  pPa
a7d0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
a7e0: 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
a7f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
a800: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
a810: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
a820: 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
a830: 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
a840: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
a850: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
a860: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
a870: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
a880: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
a890: 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
a8a0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
a8b0: 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
a8c0: 6e 6f 74 52 65 61 64 79 20 26 20 7e 73 71 6c 69  notReady & ~sqli
a8d0: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
a8e0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
a8f0: 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
a900: 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
a910: 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
a920: 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
a930: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
a940: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
a950: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
a960: 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
a970: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
a980: 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 3b 0a  _SUBCLAUSE)==0;.
a990: 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
a9a0: 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
a9b0: 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
a9c0: 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
a9d0: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
a9e0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
a9f0: 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
aa00: 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
aa10: 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
aa20: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
aa30: 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
aa40: 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
aa50: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
aa60: 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
aa70: 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
aa80: 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
aa90: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
aaa0: 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
aab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
aac0: 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
aad0: 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
aae0: 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
aaf0: 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
ab00: 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
ab10: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
ab20: 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
ab30: 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
ab40: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
ab50: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
ab60: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
ab70: 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
ab80: 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
ab90: 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
aba0: 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
abb0: 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
abc0: 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
abd0: 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
abe0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
abf0: 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
ac00: 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
ac10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ac20: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
ac30: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
ac40: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
ac50: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
ac60: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
ac70: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
ac80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
ac90: 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
aca0: 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
acb0: 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
acc0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
acd0: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
ace0: 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
acf0: 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
ad00: 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  tem[0].fg.jointy
ad10: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
ad20: 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
ad30: 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
ad40: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
ad50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad60: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ad70: 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
ad80: 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
ad90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
ada0: 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
adb0: 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
adc0: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
add0: 61 20 73 61 66 65 20 61 64 64 72 65 73 73 20 74  a safe address t
ade0: 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 77 65 20  o jump to if we 
adf0: 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
ae00: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a  e table for.  **
ae10: 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 6d   this loop is em
ae20: 70 74 79 20 61 6e 64 20 63 61 6e 20 6e 65 76 65  pty and can neve
ae30: 72 20 63 6f 6e 74 72 69 62 75 74 65 20 63 6f 6e  r contribute con
ae40: 74 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a  tent. */.  for(j
ae50: 3d 69 4c 65 76 65 6c 3b 20 6a 3e 30 20 26 26 20  =iLevel; j>0 && 
ae60: 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 69 4c 65  pWInfo->a[j].iLe
ae70: 66 74 4a 6f 69 6e 3d 3d 30 3b 20 6a 2d 2d 29 7b  ftJoin==0; j--){
ae80: 7d 0a 20 20 61 64 64 72 48 61 6c 74 20 3d 20 70  }.  addrHalt = p
ae90: 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 61 64 64 72  WInfo->a[j].addr
aea0: 42 72 6b 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69  Brk;..  /* Speci
aeb0: 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f  al case of a FRO
aec0: 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M clause subquer
aed0: 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  y implemented as
aee0: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
aef0: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
af00: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
af10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
af20: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
af30: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
af40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af50: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
af60: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
af70: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
af80: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
af90: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
afa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
afb0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
afc0: 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
afd0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
afe0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
aff0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
b000: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
b010: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
b020: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
b030: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
b040: 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
b050: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b060: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
b070: 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
b080: 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
b090: 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
b0a0: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
b0b0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
b0c0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
b0d0: 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
b0e0: 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
b0f0: 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
b100: 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
b110: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
b120: 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
b130: 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
b140: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
b150: 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
b160: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
b170: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20  oop->nLTerm;.   
b180: 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 2f 2a 20   int iIn;    /* 
b190: 43 6f 75 6e 74 65 72 20 66 6f 72 20 49 4e 20 63  Counter for IN c
b1a0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
b1b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b1c0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
b1d0: 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
b1e0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b1f0: 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
b200: 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72  int+2);.    addr
b210: 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
b220: 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20  l->addrBrk;.    
b230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
b240: 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
b250: 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
b260: 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20  = iReg+j+2;.    
b270: 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
b280: 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
b290: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72    if( NEVER(pTer
b2a0: 6d 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  m==0) ) continue
b2b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
b2c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
b2d0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
b2e0: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
b2f0: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
b300: 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
b310: 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
b320: 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
b330: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
b340: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
b350: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
b360: 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
b370: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
b380: 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56       codeExprOrV
b390: 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52  ector(pParse, pR
b3a0: 69 67 68 74 2c 20 69 54 61 72 67 65 74 2c 20 31  ight, iTarget, 1
b3b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b3d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b3e0: 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
b3f0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
b400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b410: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b420: 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
b430: 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
b440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b450: 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
b460: 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
b470: 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
b4a0: 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b4c0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
b4d0: 64 46 72 65 65 20 3f 20 50 34 5f 44 59 4e 41 4d  dFree ? P4_DYNAM
b4e0: 49 43 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  IC : P4_STATIC);
b4f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
b500: 65 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  e(v);.    pLoop-
b510: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
b520: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c   = 0;.    pLevel
b530: 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
b540: 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 70 57   pLevel->op = pW
b550: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3f  Info->eOnePass ?
b560: 20 4f 50 5f 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e   OP_Noop : OP_VN
b570: 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
b580: 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
b590: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
b5a0: 0a 20 20 20 20 69 49 6e 20 3d 20 70 4c 65 76 65  .    iIn = pLeve
b5b0: 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20  l->u.in.nIn;.   
b5c0: 20 66 6f 72 28 6a 3d 6e 43 6f 6e 73 74 72 61 69   for(j=nConstrai
b5d0: 6e 74 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  nt-1; j>=0; j--)
b5e0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
b5f0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
b600: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 31 36  ;.      if( j<16
b610: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74   && (pLoop->u.vt
b620: 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
b630: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
b640: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
b650: 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
b660: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
b670: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
b680: 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
b690: 20 20 45 78 70 72 20 2a 70 43 6f 6d 70 61 72 65    Expr *pCompare
b6a0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72  ;  /* The compar
b6b0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
b6c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
b6d0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 48 53  Right;    /* RHS
b6e0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
b6f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64  on */.        Vd
b700: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 2f  beOp *pOp;     /
b710: 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 63 63 65  * Opcode to acce
b720: 73 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ss the value of 
b730: 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  the IN constrain
b740: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
b750: 20 52 65 6c 6f 61 64 20 74 68 65 20 63 6f 6e 73   Reload the cons
b760: 74 72 61 69 6e 74 20 76 61 6c 75 65 20 69 6e 74  traint value int
b770: 6f 20 72 65 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e  o reg[iReg+j+2].
b780: 20 20 54 68 65 20 73 61 6d 65 20 76 61 6c 75 65    The same value
b790: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20  .        ** was 
b7a0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
b7b0: 73 61 6d 65 20 72 65 67 69 73 74 65 72 20 70 72  same register pr
b7c0: 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 56 46  ior to the OP_VF
b7d0: 69 6c 74 65 72 2c 20 62 75 74 0a 20 20 20 20 20  ilter, but.     
b7e0: 20 20 20 2a 2a 20 74 68 65 20 78 46 69 6c 74 65     ** the xFilte
b7f0: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
b800: 20 6d 69 67 68 74 20 68 61 76 65 20 63 68 61 6e   might have chan
b810: 67 65 64 20 74 68 65 20 64 61 74 61 74 79 70 65  ged the datatype
b820: 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   or.        ** e
b830: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 76  ncoding of the v
b840: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 65 67 69  alue in the regi
b850: 73 74 65 72 2c 20 73 6f 20 69 74 20 2a 6d 75 73  ster, so it *mus
b860: 74 2a 20 62 65 20 72 65 6c 6f 61 64 65 64 2e 20  t* be reloaded. 
b870: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
b880: 74 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  t( pLevel->u.in.
b890: 61 49 6e 4c 6f 6f 70 21 3d 30 20 7c 7c 20 64 62  aInLoop!=0 || db
b8a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b8b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
b8c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
b8e0: 65 72 74 28 20 69 49 6e 3e 30 20 29 3b 0a 20 20  ert( iIn>0 );.  
b8f0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
b900: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
b910: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
b920: 49 6e 4c 6f 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64  InLoop[--iIn].ad
b930: 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
b940: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
b950: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
b960: 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  mn || pOp->opcod
b970: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20  e==OP_Rowid );. 
b980: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b990: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
b9a0: 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e  _Column || pOp->
b9b0: 70 33 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p3==iReg+j+2 );.
b9c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b9d0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
b9e0: 50 5f 52 6f 77 69 64 20 7c 7c 20 70 4f 70 2d 3e  P_Rowid || pOp->
b9f0: 70 32 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p2==iReg+j+2 );.
ba00: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
ba10: 73 65 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  se( pOp->opcode=
ba20: 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20  =OP_Rowid );.   
ba30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ba40: 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4f 70 2d  beAddOp3(v, pOp-
ba50: 3e 6f 70 63 6f 64 65 2c 20 70 4f 70 2d 3e 70 31  >opcode, pOp->p1
ba60: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
ba70: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  p3);.        }..
ba80: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
ba90: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
baa0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74  ll continue to t
bab0: 68 65 20 6e 65 78 74 20 72 6f 77 20 69 66 20 0a  he next row if .
bac0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 49          ** the I
bad0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  N constraint is 
bae0: 6e 6f 74 20 73 61 74 69 73 66 69 65 64 20 2a 2f  not satisfied */
baf0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72  .        pCompar
bb00: 65 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  e = sqlite3PExpr
bb10: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
bb20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  0, 0);.        a
bb30: 73 73 65 72 74 28 20 70 43 6f 6d 70 61 72 65 21  ssert( pCompare!
bb40: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
bb50: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
bb60: 20 20 69 66 28 20 70 43 6f 6d 70 61 72 65 20 29    if( pCompare )
bb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d  {.          pCom
bb80: 70 61 72 65 2d 3e 70 4c 65 66 74 20 3d 20 70 54  pare->pLeft = pT
bb90: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
bba0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  t;.          pCo
bbb0: 6d 70 61 72 65 2d 3e 70 52 69 67 68 74 20 3d 20  mpare->pRight = 
bbc0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
bbd0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 52 45 47 49  Expr(db, TK_REGI
bbe0: 53 54 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  STER, 0);.      
bbf0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
bc00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  {.            pR
bc10: 69 67 68 74 2d 3e 69 54 61 62 6c 65 20 3d 20 69  ight->iTable = i
bc20: 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 20  Reg+j+2;.       
bc30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bc40: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
bc50: 70 43 6f 6d 70 61 72 65 2c 20 70 4c 65 76 65 6c  pCompare, pLevel
bc60: 2d 3e 61 64 64 72 43 6f 6e 74 2c 20 30 29 3b 0a  ->addrCont, 0);.
bc70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bc80: 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e        pCompare->
bc90: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
bca0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bcb0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6d 70  Delete(db, pComp
bcc0: 61 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  are);.        }.
bcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bce0: 20 20 2f 2a 20 54 68 65 73 65 20 72 65 67 69 73    /* These regis
bcf0: 74 65 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ters need to be 
bd00: 70 72 65 73 65 72 76 65 64 20 69 6e 20 63 61 73  preserved in cas
bd10: 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  e there is an IN
bd20: 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 2a 2a   operator.    **
bd30: 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 6f   loop.  So we co
bd40: 75 6c 64 20 64 65 61 6c 6c 6f 63 61 74 65 20 74  uld deallocate t
bd50: 68 65 20 72 65 67 69 73 74 65 72 73 20 68 65 72  he registers her
bd60: 65 20 28 61 6e 64 20 70 6f 74 65 6e 74 69 61 6c  e (and potential
bd70: 6c 79 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 20  ly.    ** reuse 
bd80: 74 68 65 6d 20 6c 61 74 65 72 29 20 69 66 20 28  them later) if (
bd90: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
bda0: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 3d   WHERE_IN_ABLE)=
bdb0: 3d 30 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d  =0.  But it seem
bdc0: 73 0a 20 20 20 20 2a 2a 20 73 69 6d 70 6c 65 72  s.    ** simpler
bdd0: 20 61 6e 64 20 73 61 66 65 72 20 74 6f 20 73 69   and safer to si
bde0: 6d 70 6c 79 20 6e 6f 74 20 72 65 75 73 65 20 74  mply not reuse t
bdf0: 68 65 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20  he registers..  
be00: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 73    **.    **    s
be10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
be20: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
be30: 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
be40: 2b 32 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +2);.    */.    
be50: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
be60: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Pop(pParse);.  }
be70: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
be80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
be90: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
bea0: 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
beb0: 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
bec0: 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
bed0: 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
bee0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
bef0: 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
bf00: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
bf10: 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
bf20: 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
bf30: 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
bf40: 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
bf50: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
bf60: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
bf70: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
bf80: 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
bf90: 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
bfa0: 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
bfb0: 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
bfc0: 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
bfd0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
bfe0: 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
bff0: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
c000: 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
c010: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
c020: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
c030: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
c040: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
c050: 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
c060: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
c070: 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
c080: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c090: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
c0a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
c0b0: 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
c0c0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
c0d0: 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  m;.    iRowidReg
c0e0: 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
c0f0: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
c100: 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
c110: 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
c120: 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
c130: 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67  Reg!=iReleaseReg
c140: 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
c150: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
c160: 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
c170: 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
c180: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
c190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1a0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
c1b0: 77 69 64 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  wid, iCur, addrN
c1c0: 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
c1d0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
c1e0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
c1f0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
c200: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
c210: 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
c220: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
c230: 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
c240: 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
c250: 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
c260: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
c270: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
c280: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
c290: 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
c2a0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
c2b0: 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
c2c0: 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
c2d0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
c2e0: 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
c2f0: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
c300: 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
c310: 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
c320: 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
c330: 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
c340: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
c350: 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
c360: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
c370: 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
c380: 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
c390: 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
c3a0: 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
c3b0: 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
c3c0: 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
c3d0: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
c3e0: 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
c3f0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
c400: 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
c410: 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
c420: 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
c430: 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
c440: 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
c450: 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
c460: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
c470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
c480: 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
c490: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
c4a0: 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
c4b0: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
c4c0: 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
c4d0: 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
c4e0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f  rm;.    }.    co
c4f0: 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70 54 61  deCursorHint(pTa
c500: 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70  bItem, pWInfo, p
c510: 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
c520: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
c530: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
c540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
c560: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
c570: 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
c580: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
c590: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
c5a0: 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
c5b0: 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
c5c0: 6e 64 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  ndary */.      i
c5d0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
c5e0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 73       /* Cursor s
c5f0: 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  eek operation */
c600: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ..      /* The f
c610: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
c620: 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64  t maps TK_xx cod
c630: 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f  es into correspo
c640: 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  nding .      ** 
c650: 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49  seek opcodes.  I
c660: 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70  t depends on a p
c670: 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69  articular orderi
c680: 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20  ng of TK_xx.    
c690: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
c6a0: 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20   u8 aMoveOp[] = 
c6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {.           /* 
c6c0: 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GT */  OP_See
c6d0: 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kGT,.           
c6e0: 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f  /* TK_LE */  OP_
c6f0: 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20  SeekLE,.        
c700: 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20     /* TK_LT */  
c710: 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20  OP_SeekLT,.     
c720: 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a        /* TK_GE *
c730: 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20  /  OP_SeekGE.   
c740: 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65     };.      asse
c750: 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54  rt( TK_LE==TK_GT
c760: 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61  +1 );      /* Ma
c770: 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65  ke sure the orde
c780: 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ring.. */.      
c790: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
c7a0: 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f  K_GT+2 );      /
c7b0: 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b  *  ... of the TK
c7c0: 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f  _xx values... */
c7d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c7e0: 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b  K_GE==TK_GT+3 );
c7f0: 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73        /*  ... is
c800: 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20   correcct. */.. 
c810: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
c820: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
c830: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
c840: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c850: 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ( pStart->wtFlag
c860: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
c870: 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70   );.      pX = p
c880: 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20  Start->pExpr;.  
c890: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
c8a0: 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
c8b0: 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ase( pStart->lef
c8c0: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b  tCursor!=iCur );
c8d0: 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63   /* transitive c
c8e0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
c8f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c900: 78 70 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e  xprIsVector(pX->
c910: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  pRight) ){.     
c920: 20 20 20 72 31 20 3d 20 72 54 65 6d 70 20 3d 20     r1 = rTemp = 
c930: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
c940: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
c950: 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63     codeExprOrVec
c960: 74 6f 72 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  tor(pParse, pX->
c970: 70 52 69 67 68 74 2c 20 72 31 2c 20 31 29 3b 0a  pRight, r1, 1);.
c980: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 61 4d 6f          op = aMo
c990: 76 65 4f 70 5b 28 70 58 2d 3e 6f 70 20 2d 20 54  veOp[(pX->op - T
c9a0: 4b 5f 47 54 29 20 7c 20 30 78 30 30 30 31 5d 3b  K_GT) | 0x0001];
c9b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c9c0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
c9d0: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
c9e0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
c9f0: 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
ca00: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
ca10: 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
ca20: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 61 4d  .        op = aM
ca30: 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f 70 20 2d 20  oveOp[(pX->op - 
ca40: 54 4b 5f 47 54 29 5d 3b 0a 20 20 20 20 20 20 7d  TK_GT)];.      }
ca50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ca60: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
ca70: 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
ca80: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
ca90: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
caa0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
cab0: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
cac0: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
cad0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
cae0: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
caf0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
cb00: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
cb10: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
cb20: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
cb30: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
cb40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cb50: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
cb60: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
cb70: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
cb80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
cb90: 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
cba0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cbc0: 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
cbd0: 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
cbe0: 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 48  ind, iCur, addrH
cbf0: 61 6c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  alt);.      Vdbe
cc00: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
cc10: 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
cc20: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
cc30: 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
cc40: 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
cc50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
cc60: 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
cc70: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
cc80: 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
cc90: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
cca0: 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
ccb0: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
ccc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccd0: 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
cce0: 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
ccf0: 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
cd00: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
cd10: 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
cd20: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
cd30: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
cd40: 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
cd50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
cd60: 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f   codeExprOrVecto
cd70: 72 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  r(pParse, pX->pR
cd80: 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
cd90: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
cda0: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
cdb0: 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69 67  sVector(pX->pRig
cdc0: 68 74 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  ht) .       && (
cdd0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
cde0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 20   pX->op==TK_GT) 
cdf0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ce00: 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
ce10: 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
ce20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ce30: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
ce40: 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
ce50: 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
ce60: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
ce70: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 58  3ExprIsVector(pX
ce80: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
ce90: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
cea0: 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
ceb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cec0: 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
ced0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
cee0: 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  (v);.    pLevel-
cef0: 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
cf00: 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
cf10: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
cf20: 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
cf30: 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
cf40: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
cf50: 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
cf60: 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
cf70: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  oop ){.      iRo
cf80: 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
cf90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
cfa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cfb0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
cfc0: 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
cfd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cfe0: 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
cff0: 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
d000: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
d010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d020: 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
d030: 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
d040: 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
d050: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
d060: 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
d070: 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Le);.      Vdb
d080: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
d090: 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  estOp==OP_Lt);. 
d0a0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
d0b0: 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
d0c0: 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ge);.      Vdb
d0d0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
d0e0: 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  estOp==OP_Gt);. 
d0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d100: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
d110: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
d120: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
d130: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
d140: 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
d150: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
d160: 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  DEXED ){.    /* 
d170: 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75  Case 4: A scan u
d180: 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
d190: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
d1a0: 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
d1b0: 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
d1c0: 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
d1d0: 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
d1e0: 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
d1f0: 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
d200: 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
d210: 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
d220: 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
d230: 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
d240: 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
d250: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
d260: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
d270: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d280: 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
d290: 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
d2a0: 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
d2b0: 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
d2c0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
d2d0: 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
d2e0: 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
d2f0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
d300: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
d310: 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
d320: 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
d330: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
d340: 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
d350: 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
d360: 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
d370: 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
d380: 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
d390: 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
d3a0: 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
d3b0: 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
d3c0: 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
d3d0: 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
d3e0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
d3f0: 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
d400: 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
d410: 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
d420: 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
d430: 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
d440: 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
d450: 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
d460: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
d470: 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
d480: 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
d490: 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
d4a0: 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
d4b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
d4c0: 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
d4d0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
d4e0: 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
d4f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
d500: 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
d510: 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
d520: 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
d530: 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
d540: 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
d550: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
d560: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
d570: 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
d580: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d590: 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
d5a0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
d5b0: 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
d5c0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
d5d0: 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
d5e0: 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
d5f0: 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
d600: 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
d610: 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
d620: 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
d630: 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
d640: 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
d650: 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
d660: 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
d670: 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
d680: 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
d690: 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
d6a0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
d6b0: 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
d6c0: 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
d6d0: 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
d6f0: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
d700: 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
d710: 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
d720: 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
d730: 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
d740: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
d750: 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
d760: 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
d770: 50 5f 53 65 65 6b 47 54 2c 20 20 20 20 20 20 20  P_SeekGT,       
d780: 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
d790: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
d7a0: 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
d7b0: 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
d7c0: 53 65 65 6b 4c 54 2c 20 20 20 20 20 20 20 20 20  SeekLT,         
d7d0: 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
d7e0: 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
d7f0: 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
d800: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
d810: 65 6b 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  ekGE,           
d820: 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
d830: 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
d840: 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
d850: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
d860: 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LE            /*
d870: 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
d880: 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
d890: 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
d8a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
d8b0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
d8c0: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
d8d0: 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
d8e0: 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63      /* 0: (end_c
d8f0: 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
d900: 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a  Rev && !endEq) *
d910: 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 54  /.      OP_IdxGT
d920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d930: 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
d940: 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20  nts && !bRev && 
d950: 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20   endEq) */.     
d960: 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20 20 20   OP_IdxLE,      
d970: 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
d980: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
d990: 20 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29   bRev && !endEq)
d9a0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
d9b0: 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT,            /
d9c0: 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 3: (end_constr
d9d0: 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26  aints &&  bRev &
d9e0: 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  &  endEq) */.   
d9f0: 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71 20   };.    u16 nEq 
da00: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
da10: 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  .nEq;     /* Num
da20: 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
da30: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 75 31 36  terms */.    u16
da40: 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nBtm = pLoop->u
da50: 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 20 20 20 2f  .btree.nBtm;   /
da60: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 42 54 4d 20  * Length of BTM 
da70: 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20 75 31  vector */.    u1
da80: 36 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  6 nTop = pLoop->
da90: 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 20 20 20  u.btree.nTop;   
daa0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 54 4f 50  /* Length of TOP
dab0: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20 69   vector */.    i
dac0: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dae0: 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
daf0: 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
db00: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57 68  values */.    Wh
db10: 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
db20: 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
db30: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
db40: 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
db50: 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
db60: 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
db70: 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
db80: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
db90: 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
dba0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
dbd0: 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
dbe0: 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
dbf0: 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc10: 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
dc20: 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
dc30: 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
dc40: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
dc50: 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
dc60: 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
dc70: 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
dc80: 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
dc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dca0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
dcb0: 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
dcc0: 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
dcf0: 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
dd00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
dd10: 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
dd20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dd30: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
dd40: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
dd50: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd70: 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
dd80: 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
dd90: 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
dda0: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
ddb0: 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
ddc0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
ddd0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
dde0: 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20  ndAff = 0;      
ddf0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
de00: 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
de10: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
de20: 20 20 20 20 75 38 20 62 53 65 65 6b 50 61 73 74      u8 bSeekPast
de30: 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
de40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 65 6b   /* True to seek
de50: 20 70 61 73 74 20 69 6e 69 74 69 61 6c 20 6e 75   past initial nu
de60: 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20 62 53  lls */.    u8 bS
de70: 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20  topAtNull = 0;  
de80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
de90: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d  ondition to term
dea0: 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a  inate at NULLs *
deb0: 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  /..    pIdx = pL
dec0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
ded0: 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72  dex;.    iIdxCur
dee0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
def0: 75 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ur;.    assert( 
df00: 6e 45 71 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  nEq>=pLoop->nSki
df10: 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  p );..    /* If 
df20: 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
df30: 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
df40: 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
df50: 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
df60: 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
df70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
df80: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
df90: 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
dfa0: 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
dfb0: 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
dfc0: 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
dfd0: 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
dfe0: 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
dff0: 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
e000: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
e010: 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
e020: 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
e030: 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
e040: 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
e050: 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
e060: 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
e070: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
e080: 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
e090: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
e0a0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
e0b0: 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
e0c0: 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
e0d0: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
e0e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  /.    assert( pW
e0f0: 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
e100: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
e110: 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
e120: 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20  nExpr==1.       
e130: 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63    || (pWInfo->wc
e140: 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
e150: 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29  RDERBY_MIN)==0 )
e160: 3b 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  ;.    if( (pWInf
e170: 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
e180: 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
e190: 21 3d 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e  !=0.     && pWIn
e1a0: 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20  fo->nOBSat>0.   
e1b0: 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79    && (pIdx->nKey
e1c0: 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  Col>nEq).    ){.
e1d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e1e0: 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b  oop->nSkip==0 );
e1f0: 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74  .      bSeekPast
e200: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  Null = 1;.      
e210: 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
e220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
e230: 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
e240: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
e250: 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
e260: 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
e270: 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
e280: 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45     */.    j = nE
e290: 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  q;.    if( pLoop
e2a0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
e2b0: 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
e2c0: 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
e2d0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
e2e0: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
e2f0: 74 72 61 52 65 67 20 3d 20 4d 41 58 28 6e 45 78  traReg = MAX(nEx
e300: 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70 2d 3e 75  traReg, pLoop->u
e310: 2e 62 74 72 65 65 2e 6e 42 74 6d 29 3b 0a 20 20  .btree.nBtm);.  
e320: 20 20 20 20 2f 2a 20 4c 69 6b 65 20 6f 70 74 69      /* Like opti
e330: 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63  mization range c
e340: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c 77 61 79  onstraints alway
e350: 73 20 6f 63 63 75 72 20 69 6e 20 70 61 69 72 73  s occur in pairs
e360: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e370: 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
e380: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
e390: 49 4b 45 4f 50 54 29 3d 3d 30 20 7c 7c 20 0a 20  IKEOPT)==0 || . 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4c               (pL
e3b0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
e3c0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21  HERE_TOP_LIMIT)!
e3d0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
e3e0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
e3f0: 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
e400: 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
e410: 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d  angeEnd = pLoop-
e420: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
e430: 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
e440: 4d 41 58 28 6e 45 78 74 72 61 52 65 67 2c 20 70  MAX(nExtraReg, p
e450: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  Loop->u.btree.nT
e460: 6f 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  op);.#ifndef SQL
e470: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
e480: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
e490: 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
e4a0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
e4b0: 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29 7b 0a  _LIKEOPT)!=0 ){.
e4c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e4d0: 70 52 61 6e 67 65 53 74 61 72 74 21 3d 30 20 29  pRangeStart!=0 )
e4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4f0: 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20 6f 70        /* LIKE op
e500: 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  t constraints */
e510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e520: 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
e530: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
e540: 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f 63 63  EOPT );   /* occ
e550: 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
e560: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
e570: 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d 20 28 75  LikeRepCntr = (u
e580: 33 32 29 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  32)++pParse->nMe
e590: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
e5a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e5b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 28  OP_Integer, 1, (
e5c0: 69 6e 74 29 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  int)pLevel->iLik
e5d0: 65 52 65 70 43 6e 74 72 29 3b 0a 20 20 20 20 20  eRepCntr);.     
e5e0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e5f0: 76 2c 20 22 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f  v, "LIKE loop co
e600: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
e610: 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69    pLevel->addrLi
e620: 6b 65 52 65 70 20 3d 20 73 71 6c 69 74 65 33 56  keRep = sqlite3V
e630: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e640: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 4c  );.        /* iL
e650: 69 6b 65 52 65 70 43 6e 74 72 20 61 63 74 75 61  ikeRepCntr actua
e660: 6c 6c 79 20 73 74 6f 72 65 73 20 32 78 20 74 68  lly stores 2x th
e670: 65 20 63 6f 75 6e 74 65 72 20 72 65 67 69 73 74  e counter regist
e680: 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  er number.  The.
e690: 20 20 20 20 20 20 20 20 2a 2a 20 62 6f 74 74 6f          ** botto
e6a0: 6d 20 62 69 74 20 69 6e 64 69 63 61 74 65 73 20  m bit indicates 
e6b0: 77 68 65 74 68 65 72 20 74 68 65 20 73 65 61 72  whether the sear
e6c0: 63 68 20 6f 72 64 65 72 20 69 73 20 41 53 43 20  ch order is ASC 
e6d0: 6f 72 20 44 45 53 43 2e 20 2a 2f 0a 20 20 20 20  or DESC. */.    
e6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
e6f0: 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ev );.        te
e700: 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 61 53  stcase( pIdx->aS
e710: 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
e720: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29 3b  QLITE_SO_DESC );
e730: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e740: 20 28 62 52 65 76 20 26 20 7e 31 29 3d 3d 30 20   (bRev & ~1)==0 
e750: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
e760: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20  l->iLikeRepCntr 
e770: 3c 3c 3d 31 3b 0a 20 20 20 20 20 20 20 20 70 4c  <<=1;.        pL
e780: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
e790: 74 72 20 7c 3d 20 62 52 65 76 20 5e 20 28 70 49  tr |= bRev ^ (pI
e7a0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
e7b0: 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  Eq]==SQLITE_SO_D
e7c0: 45 53 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ESC);.      }.#e
e7d0: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
e7e0: 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 20 29 7b  RangeStart==0 ){
e7f0: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
e800: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
e810: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
e820: 3e 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54 61  >=0 && pIdx->pTa
e830: 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
e840: 4e 75 6c 6c 3d 3d 30 29 20 7c 7c 20 6a 3d 3d 58  Null==0) || j==X
e850: 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20 20  N_EXPR ){.      
e860: 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
e870: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  l = 1;.        }
e880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e890: 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
e8a0: 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e  eEnd==0 || (pRan
e8b0: 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
e8c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
e8d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  );..    /* If we
e8e0: 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
e8f0: 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
e900: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
e910: 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
e920: 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
e930: 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
e940: 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
e950: 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
e960: 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
e970: 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
e980: 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
e990: 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
e9a0: 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e   if( (nEq<pIdx->
e9b0: 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d  nKeyCol && bRev=
e9c0: 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
e9d0: 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
e9e0: 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c  SO_ASC)).     ||
e9f0: 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e   (bRev && pIdx->
ea00: 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20  nKeyCol==nEq).  
ea10: 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28    ){.      SWAP(
ea20: 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
ea30: 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
ea40: 61 72 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50  art);.      SWAP
ea50: 28 75 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75  (u8, bSeekPastNu
ea60: 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29  ll, bStopAtNull)
ea70: 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c  ;.      SWAP(u8,
ea80: 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20   nBtm, nTop);.  
ea90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
eaa0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
eab0: 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
eac0: 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
ead0: 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
eae0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
eaf0: 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
eb00: 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
eb10: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
eb20: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
eb30: 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
eb40: 0a 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48  .    codeCursorH
eb50: 69 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57  int(pTabItem, pW
eb60: 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 52  Info, pLevel, pR
eb70: 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 72 65  angeEnd);.    re
eb80: 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
eb90: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
eba0: 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
ebb0: 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
ebc0: 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
ebd0: 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
ebe0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
ebf0: 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
ec00: 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
ec10: 74 61 72 74 41 66 66 20 26 26 20 6e 54 6f 70 20  tartAff && nTop 
ec20: 29 7b 0a 20 20 20 20 20 20 7a 45 6e 64 41 66 66  ){.      zEndAff
ec30: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ec40: 75 70 28 64 62 2c 20 26 7a 53 74 61 72 74 41 66  up(db, &zStartAf
ec50: 66 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 20  f[nEq]);.    }. 
ec60: 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
ec70: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
ec80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
ec90: 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
eca0: 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
ecb0: 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
ecc0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ecd0: 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
ece0: 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
ecf0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
ed00: 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
ed10: 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
ed20: 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
ed30: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
ed40: 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
ed50: 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
ed60: 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
ed70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
ed80: 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74  !=0 );.    start
ed90: 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
eda0: 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
edb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
edc0: 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
edd0: 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
ede0: 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
edf0: 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
ee00: 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
ee10: 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
ee20: 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
ee30: 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
ee40: 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
ee50: 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
ee60: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
ee70: 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
ee80: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
ee90: 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
eea0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
eeb0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
eec0: 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
eed0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
eee0: 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70  deExprOrVector(p
eef0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
ef00: 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 42 74 6d  egBase+nEq, nBtm
ef10: 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69  );.      whereLi
ef20: 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
ef30: 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65  ringFixup(v, pLe
ef40: 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
ef50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
ef60: 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
ef70: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
ef80: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 71  ==0.       && sq
ef90: 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
efa0: 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20 20  ll(pRight).     
efb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
efc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
efd0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
efe0: 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
f000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f010: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
f020: 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
f030: 20 20 20 75 70 64 61 74 65 52 61 6e 67 65 41 66     updateRangeAf
f040: 66 69 6e 69 74 79 53 74 72 28 70 52 69 67 68 74  finityStr(pRight
f050: 2c 20 6e 42 74 6d 2c 20 26 7a 53 74 61 72 74 41  , nBtm, &zStartA
f060: 66 66 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 20 20  ff[nEq]);.      
f070: 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
f080: 72 61 69 6e 74 20 2b 3d 20 6e 42 74 6d 3b 0a 20  raint += nBtm;. 
f090: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f0a0: 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
f0b0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
f0c0: 41 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  AL );.      if( 
f0d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
f0e0: 74 6f 72 28 70 52 69 67 68 74 29 3d 3d 30 20 29  tor(pRight)==0 )
f0f0: 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
f100: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
f110: 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 73 74 61 72 74 45 71 20 3d 20 31 3b 0a 20 20   startEq = 1;.  
f140: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 53 65 65      }.      bSee
f150: 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  kPastNull = 0;. 
f160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 65     }else if( bSe
f170: 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20  ekPastNull ){.  
f180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f190: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
f1a0: 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
f1b0: 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
f1c0: 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
f1d0: 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
f1e0: 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
f1f0: 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
f200: 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
f210: 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
f220: 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
f230: 20 2d 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c   - bSeekPastNull
f240: 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
f250: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b    if( pLoop->nSk
f260: 69 70 3e 30 20 26 26 20 6e 43 6f 6e 73 74 72 61  ip>0 && nConstra
f270: 69 6e 74 3d 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  int==pLoop->nSki
f280: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
f290: 65 20 73 6b 69 70 2d 73 63 61 6e 20 6c 6f 67 69  e skip-scan logi
f2a0: 63 20 69 6e 73 69 64 65 20 74 68 65 20 63 61 6c  c inside the cal
f2b0: 6c 20 74 6f 20 63 6f 64 65 41 6c 6c 45 71 75 61  l to codeAllEqua
f2c0: 6c 69 74 79 43 6f 6e 73 74 72 61 69 6e 74 73 28  lityConstraints(
f2d0: 29 0a 20 20 20 20 20 20 2a 2a 20 61 62 6f 76 65  ).      ** above
f2e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 65 66   has already lef
f2f0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 69 74  t the cursor sit
f300: 74 69 6e 67 20 6f 6e 20 74 68 65 20 63 6f 72 72  ting on the corr
f310: 65 63 74 20 72 6f 77 2c 0a 20 20 20 20 20 20 2a  ect row,.      *
f320: 2a 20 73 6f 20 6e 6f 20 66 75 72 74 68 65 72 20  * so no further 
f330: 73 65 65 6b 69 6e 67 20 69 73 20 6e 65 65 64 65  seeking is neede
f340: 64 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d */.    }else{.
f350: 20 20 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72        op = aStar
f360: 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
f370: 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
f380: 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
f390: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
f3a0: 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   op!=0 );.      
f3b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3c0: 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
f3d0: 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
f3e0: 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
f3f0: 6e 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nt);.      VdbeC
f400: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f410: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
f420: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  (v, op==OP_Rewin
f430: 64 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  d);  testcase( o
f440: 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
f450: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
f460: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c  geIf(v, op==OP_L
f470: 61 73 74 29 3b 20 20 20 20 74 65 73 74 63 61 73  ast);    testcas
f480: 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
f490: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
f4a0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
f4b0: 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73 74 63  _SeekGT);  testc
f4c0: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
f4d0: 47 54 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  GT );.      Vdbe
f4e0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
f4f0: 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20 20 74  ==OP_SeekGE);  t
f500: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
f510: 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 20 20  SeekGE );.      
f520: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
f530: 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29  , op==OP_SeekLE)
f540: 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
f550: 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
f560: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
f570: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
f580: 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLT);  testcase(
f590: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29   op==OP_SeekLT )
f5a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f5b0: 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
f5c0: 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
f5d0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
f5e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
f5f0: 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
f600: 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
f610: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
f620: 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
f630: 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
f640: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
f650: 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
f660: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
f670: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
f680: 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
f690: 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
f6a0: 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65      codeExprOrVe
f6b0: 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52 69  ctor(pParse, pRi
f6c0: 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
f6d0: 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 77  , nTop);.      w
f6e0: 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61  hereLikeOptimiza
f6f0: 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28  tionStringFixup(
f700: 76 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  v, pLevel, pRang
f710: 65 45 6e 64 29 3b 0a 20 20 20 20 20 20 69 66 28  eEnd);.      if(
f720: 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
f730: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
f740: 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  L)==0.       && 
f750: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
f760: 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20  Null(pRight).   
f770: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
f780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f790: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
f7a0: 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
f7b0: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  xt);.        Vdb
f7c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f7e0: 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
f7f0: 20 20 20 75 70 64 61 74 65 52 61 6e 67 65 41 66     updateRangeAf
f800: 66 69 6e 69 74 79 53 74 72 28 70 52 69 67 68 74  finityStr(pRight
f810: 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64 41 66 66 29  , nTop, zEndAff)
f820: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  ;.        codeAp
f830: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
f840: 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
f850: 20 6e 54 6f 70 2c 20 7a 45 6e 64 41 66 66 29 3b   nTop, zEndAff);
f860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f880: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
f890: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
f8a0: 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  }.      nConstra
f8b0: 69 6e 74 20 2b 3d 20 6e 54 6f 70 3b 0a 20 20 20  int += nTop;.   
f8c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
f8d0: 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
f8e0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
f8f0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
f900: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
f910: 28 70 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20  (pRight)==0 ){. 
f920: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
f930: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
f940: 65 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  eEnd);.      }el
f950: 73 65 7b 0a 20 20 20 20 20 20 20 20 65 6e 64 45  se{.        endE
f960: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  q = 1;.      }. 
f970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74     }else if( bSt
f980: 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  opAtNull ){.    
f990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
f9b0: 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
f9c0: 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30  .      endEq = 0
f9d0: 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
f9e0: 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  int++;.    }.   
f9f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fa00: 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
fa10: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fa20: 28 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a  (db, zEndAff);..
fa30: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
fa40: 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
fa50: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
fa60: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
fa70: 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
fa80: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
fa90: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
faa0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
fab0: 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
fac0: 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e    if( nConstrain
fad0: 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  t ){.      op = 
fae0: 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20  aEndOp[bRev*2 + 
faf0: 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71  endEq];.      sq
fb00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
fb10: 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
fb20: 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
fb30: 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
fb40: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fb50: 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20  e( op==OP_IdxGT 
fb60: 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
fb70: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
fb80: 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
fb90: 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
fba0: 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GE );  VdbeCover
fbb0: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
fbc0: 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74  IdxGE );.      t
fbd0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
fbe0: 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxLT );  VdbeCo
fbf0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
fc00: 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
fc10: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
fc20: 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62  OP_IdxLE );  Vdb
fc30: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
fc40: 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20  p==OP_IdxLE );. 
fc50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65     }..    /* See
fc60: 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
fc70: 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
fc80: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54  */.    if( omitT
fc90: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
fca0: 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65 72   pIdx is a cover
fcb0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e  ing index.  No n
fcc0: 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  eed to access th
fcd0: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f  e main table. */
fce0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48  .    }else if( H
fcf0: 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
fd00: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69  able) ){.      i
fd10: 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
fd20: 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
fd30: 45 45 4b 5f 54 41 42 4c 45 29 20 7c 7c 20 28 0a  EEK_TABLE) || (.
fd40: 20 20 20 20 20 20 20 20 20 20 28 70 57 49 6e 66            (pWInf
fd50: 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
fd60: 57 48 45 52 45 5f 53 45 45 4b 5f 55 4e 49 51 5f  WHERE_SEEK_UNIQ_
fd70: 54 41 42 4c 45 29 20 0a 20 20 20 20 20 20 20 26  TABLE) .       &
fd80: 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
fd90: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
fda0: 47 4c 45 29 0a 20 20 20 20 20 20 29 29 7b 0a 20  GLE).      )){. 
fdb0: 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67         iRowidReg
fdc0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
fdd0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
fde0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fdf0: 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
fe00: 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
fe10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fe20: 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
fe30: 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
fe40: 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
fe50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
fe70: 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 30  tExists, iCur, 0
fe80: 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
fe90: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
fea0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
feb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
fec0: 44 65 66 65 72 72 65 64 53 65 65 6b 28 70 57 49  DeferredSeek(pWI
fed0: 6e 66 6f 2c 20 70 49 64 78 2c 20 69 43 75 72 2c  nfo, pIdx, iCur,
fee0: 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20   iIdxCur);.     
fef0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
ff00: 20 69 43 75 72 21 3d 69 49 64 78 43 75 72 20 29   iCur!=iIdxCur )
ff10: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
ff20: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
ff30: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
ff40: 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->pTable);.     
ff50: 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c   iRowidReg = sql
ff60: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
ff70: 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b  (pParse, pPk->nK
ff80: 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f  eyCol);.      fo
ff90: 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
ffa0: 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
ffb0: 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33       k = sqlite3
ffc0: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
ffd0: 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
ffe0: 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  n[j]);.        s
fff0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10000 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
10010 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69  IdxCur, k, iRowi
10020 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  dReg+j);.      }
10030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10040 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
10050 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72  P_NotFound, iCur
10060 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20  , addrCont,.    
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67         iRowidReg
10090 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
100a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
100b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
100c0 49 66 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  If pIdx is an in
100d0 64 65 78 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dex on one or mo
100e0 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  re expressions, 
100f0 74 68 65 6e 20 6c 6f 6f 6b 20 74 68 72 6f 75 67  then look throug
10100 68 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  h.    ** all the
10110 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
10120 70 57 49 6e 66 6f 20 61 6e 64 20 74 72 79 20 74  pWInfo and try t
10130 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74 63  o transform matc
10140 68 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  hing expressions
10150 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 72 65 66  .    ** into ref
10160 65 72 65 6e 63 65 20 74 6f 20 69 6e 64 65 78 20  erence to index 
10170 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a  columns..    */.
10180 20 20 20 20 77 68 65 72 65 49 6e 64 65 78 45 78      whereIndexEx
10190 70 72 54 72 61 6e 73 28 70 49 64 78 2c 20 69 43  prTrans(pIdx, iC
101a0 75 72 2c 20 69 49 64 78 43 75 72 2c 20 70 57 49  ur, iIdxCur, pWI
101b0 6e 66 6f 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20 52  nfo);...    /* R
101c0 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
101d0 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
101e0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
101f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  . */.    if( pLo
10200 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
10210 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20  ERE_ONEROW ){.  
10220 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
10230 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
10240 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
10250 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
10260 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
10270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
10280 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
10290 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
102a0 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
102b0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
102c0 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  3 = (pLoop->wsFl
102d0 61 67 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41  ags&WHERE_UNQ_WA
102e0 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a  NTED)!=0 ? 1:0;.
102f0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
10300 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10310 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29  CONSTRAINT)==0 )
10320 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
10330 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
10340 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
10350 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
10360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10370 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
10380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6d      }.    if( om
10390 69 74 54 61 62 6c 65 20 29 20 70 49 64 78 20 3d  itTable ) pIdx =
103a0 20 30 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66   0;.  }else..#if
103b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
103c0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
103d0 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
103e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
103f0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
10400 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
10410 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
10420 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
10430 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
10440 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
10450 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
10460 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
10470 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
10480 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
10490 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
104a0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
104b0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
104c0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
104d0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
104e0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
104f0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
10500 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
10510 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
10520 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
10530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
10540 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
10550 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
10560 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
10570 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
10580 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
10590 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
105a0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
105b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
105c0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
105d0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
105e0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
105f0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
10600 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
10610 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
10620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
10630 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
10640 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
10650 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
10660 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
10670 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
10680 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
10690 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
106a0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
106b0 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
106c0 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
106d0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
106e0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
106f0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
10700 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
10710 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
10720 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
10730 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10740 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
10750 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
10760 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
10770 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
10780 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
10790 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
107a0 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
107b0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
107c0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
107d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
107e0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
107f0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
10800 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
10810 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
10820 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
10830 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
10840 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
10850 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
10860 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
10870 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
10880 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
108a0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
108b0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
108c0 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
108d0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
108e0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
108f0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
10900 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
10910 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10930 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
10940 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
10950 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
10960 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
10970 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
10980 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
10990 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
109a0 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
109b0 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
109c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64   **.    ** Added
109d0 20 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20   2014-05-26: If 
109e0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57  the table is a W
109f0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
10a00 6c 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  le, then.    ** 
10a10 75 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  use an ephemeral
10a20 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
10a30 66 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65  f a RowSet to re
10a40 63 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79  cord the primary
10a50 0a 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20  .    ** keys of 
10a60 74 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65  the rows we have
10a70 20 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20   already seen.. 
10a80 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
10a90 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
10aa0 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
10ab0 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
10ac0 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
10ad0 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
10ae0 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
10af0 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
10b00 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
10b10 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
10b20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
10b30 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
10b40 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
10b50 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
10b60 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
10b70 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
10b80 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
10b90 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
10ba0 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
10bb0 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
10bc0 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
10bd0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
10be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
10bf0 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
10c00 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
10c10 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
10c20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
10c40 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
10c50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
10c60 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
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 20 2f 2a 20 52 65 67 69           /* Regi
10c90 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
10ca0 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
10cb0 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
10cc0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10cd0 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
10ce0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
10cf0 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
10d00 20 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 2f 2a 20 41 64             /* Ad
10d20 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
10d30 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
10d40 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
10d50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10d60 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
10d70 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
10d80 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
10d90 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
10dc0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
10dd0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
10df0 67 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45  gs for sub-WHERE
10e00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45   clause */.    E
10e10 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
10e20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10e30 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
10e40 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
10e50 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
10e60 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
10e70 3e 70 54 61 62 3b 0a 0a 20 20 20 20 70 54 65 72  >pTab;..    pTer
10e80 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
10e90 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
10ea0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
10eb0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
10ec0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10ed0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
10ee0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
10ef0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
10f00 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
10f10 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
10f20 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
10f30 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
10f40 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
10f50 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
10f60 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
10f70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
10f80 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
10f90 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
10fa0 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
10fb0 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
10fc0 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
10fd0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
10fe0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
10ff0 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
11000 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
11010 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
11020 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
11030 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
11040 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
11050 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
11060 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
11070 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
110a0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
110b0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
110c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
110d0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
110e0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
110f0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
11100 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
11110 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
11120 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
11130 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
11140 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
11150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
11170 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
11180 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
11190 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
111a0 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
111b0 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
111c0 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
111d0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
111e0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
111f0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
11200 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
11210 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
11220 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
11230 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
11240 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
11250 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
11260 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
11270 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
11280 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
11290 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
112a0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
112b0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
112c0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
112d0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
112e0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
112f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
11300 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
11310 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
11320 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
11330 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
11340 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
11350 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
11360 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
11370 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
11380 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72  mpty rowset.  Or
11390 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  , create an ephe
113a0 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20  meral index.    
113b0 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f  ** capable of ho
113c0 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65  lding primary ke
113d0 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ys in the case o
113e0 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
113f0 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  D..    **.    **
11400 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
11410 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
11420 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
11430 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
11440 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
11450 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
11460 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
11470 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
11480 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
11490 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
114a0 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
114b0 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
114c0 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
114d0 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
114e0 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
114f0 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
11500 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
11510 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
11520 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
11530 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
11540 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
11550 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
11560 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
11570 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
11580 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
11590 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
115a0 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
115b0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
115c0 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
115d0 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
115e0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
115f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
11600 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
11610 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
11620 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
11630 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
11640 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
11650 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
11660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11670 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
11680 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
11690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
116a0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
116b0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
116c0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
116d0 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
116e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
116f0 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
11700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11710 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11720 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b  , regRowset, pPk
11730 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
11740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
11750 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
11760 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20  se, pPk);.      
11770 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  }.      regRowid
11780 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11790 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  m;.    }.    iRe
117a0 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
117b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
117c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
117d0 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
117e0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
117f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
11800 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
11810 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
11820 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
11830 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
11840 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
11850 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
11860 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
11870 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
11880 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
11890 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
118a0 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
118b0 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
118c0 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
118d0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
118e0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
118f0 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
11900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
11910 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
11920 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
11930 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
11940 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
11950 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
11960 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
11970 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
11980 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
11990 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
119a0 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
119b0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
119c0 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
119d0 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
119e0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
119f0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
11a00 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
11a10 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
11a20 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
11a30 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
11a40 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
11a50 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
11a60 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
11a70 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
11a80 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
11a90 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
11aa0 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
11ab0 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
11ac0 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
11ad0 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
11ae0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
11af0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
11b00 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
11b10 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
11b20 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
11b30 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
11b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
11b50 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
11b60 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
11b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
11b80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
11b90 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
11ba0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
11bb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11bc0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
11bd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
11be0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
11bf0 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
11c00 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
11c10 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
11c20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
11c30 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
11c40 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
11c50 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 29 21  AL|TERM_CODED))!
11c60 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11c70 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
11c80 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
11c90 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
11ca0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11cb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
11cc0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
11cd0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
11ce0 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45  FO );.        pE
11cf0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
11d00 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
11d10 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
11d20 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
11d30 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78  prAnd(db, pAndEx
11d40 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
11d50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
11d60 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
11d70 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
11d80 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
11d90 2c 20 54 4b 5f 41 4e 44 7c 54 4b 46 4c 47 5f 44  , TK_AND|TKFLG_D
11da0 4f 4e 54 46 4f 4c 44 2c 20 30 2c 20 70 41 6e 64  ONTFOLD, 0, pAnd
11db0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
11dc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
11dd0 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
11de0 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
11df0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
11e00 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
11e10 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
11e20 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
11e30 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
11e40 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
11e50 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
11e60 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
11e70 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
11e80 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
11e90 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
11ea0 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
11eb0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
11ec0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
11ed0 55 53 45 20 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  USE | (pWInfo->w
11ee0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
11ef0 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29 3b 0a 20  E_SEEK_TABLE);. 
11f00 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
11f10 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
11f20 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
11f30 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
11f40 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
11f50 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
11f60 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
11f70 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e  ur || (pOrTerm->
11f80 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
11f90 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
11fa0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
11fb0 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
11fc0 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
11fd0 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
11fe0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
11ff0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
12000 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20  Term->pExpr; /* 
12010 43 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73  Current OR claus
12020 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  e term */.      
12030 20 20 69 6e 74 20 6a 6d 70 31 20 3d 20 30 3b 20    int jmp1 = 0; 
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
12060 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a  jump operation *
12070 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  /.        if( pA
12080 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
12090 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
120a0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
120b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
120c0 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
120d0 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
120e0 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
120f0 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
12100 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
12110 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
12120 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
12130 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
12140 2a 2f 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  */.        WHERE
12150 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
12160 53 75 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63  Subplan for OR-c
12170 6c 61 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  lause:\n"));.   
12180 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
12190 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
121a0 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
121b0 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
121c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
121f0 67 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  gs, iCovCur);.  
12200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
12210 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
12220 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
12230 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
12240 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
12250 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
12260 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75    WhereLoop *pSu
12270 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  bLoop;.         
12280 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
12290 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
122a0 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
122c0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
122d0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
122e0 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
122f0 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
12300 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73    );.          s
12310 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63  qlite3WhereAddSc
12320 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f 72 54  anStatus(v, pOrT
12330 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
12340 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c 61 69  a[0], addrExplai
12350 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  n);..          /
12360 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73 75  * This is the su
12370 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 62  b-WHERE clause b
12380 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70  ody.  First skip
12390 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20 20   over.          
123a0 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  ** duplicate row
123b0 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62  s from prior sub
123c0 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20  -WHERE clauses, 
123d0 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20  and record the. 
123e0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
123f0 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  d (or PRIMARY KE
12400 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  Y) for the curre
12410 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74  nt row so that t
12420 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
12430 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65    ** row will be
12440 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73   skipped in subs
12450 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45  equent sub-WHERE
12460 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
12470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12480 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
12490 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
124a0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
124b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
124c0 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
124d0 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
124e0 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
124f0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
12500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61            if( Ha
12510 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
12530 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12540 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
12550 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  e, pTab, -1, iCu
12560 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b  r, regRowid, 0);
12570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
12580 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp1 = sqlite3Vdb
12590 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
125a0 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
125b0 52 6f 77 73 65 74 2c 20 30 2c 0a 20 20 20 20 20  Rowset, 0,.     
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 20 20 20 20 72 2c 69 53 65 74 29 3b 0a 20        r,iSet);. 
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
12600 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12610 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
12620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
12630 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
12640 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
12650 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
12660 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b 20          int nPk 
12670 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
12690 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20  t iPk;..        
126a0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
126b0 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72  e PK into an arr
126c0 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
126d0 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ters. */.       
126e0 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74         r = sqlit
126f0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
12700 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20  Parse, nPk);.   
12710 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
12720 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69  Pk=0; iPk<nPk; i
12730 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pk++){.         
12740 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12750 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
12760 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  iPk];.          
12770 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12780 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
12790 52 65 67 28 70 50 61 72 73 65 2c 20 70 54 61 62  Reg(pParse, pTab
127a0 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b  , iCol, iCur, r+
127b0 69 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPk);.          
127c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
127d0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
127e0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
127f0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
12800 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f   this key. If so
12810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12820 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61  ** the row has a
12830 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c  lready been incl
12840 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75  uded in the resu
12850 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20  lt set and.     
12860 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20           ** can 
12870 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a  be ignored (by j
12880 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20  umping past the 
12890 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74  Gosub below). Ot
128a0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20  herwise,.       
128b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
128c0 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68   the key into th
128d0 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64  e temp table and
128e0 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72   proceed with pr
128f0 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20  ocessing.       
12900 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f         ** the ro
12910 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w..             
12920 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
12930 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66    ** Use some of
12940 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69   the same optimi
12950 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f  zations as OP_Ro
12960 77 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65  wSetTest: If iSe
12970 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
12980 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75  ** is zero, assu
12990 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  me that the key 
129a0 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  cannot already b
129b0 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20  e present in.   
129c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
129d0 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e  e temp table. An
129e0 64 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c  d if iSet is -1,
129f0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
12a00 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20  re is no .      
12a10 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
12a20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65  to insert the ke
12a30 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  y into the temp 
12a40 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c  table, as it wil
12a50 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20  l never .       
12a60 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73         ** be tes
12a70 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20  ted for.  */ .  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12a90 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  iSet ){.        
12aa0 20 20 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73          jmp1 = s
12ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12ac0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
12ad0 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72   regRowset, 0, r
12ae0 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
12af0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12b00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e         if( iSet>
12b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12b50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
12b60 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b  keRecord, r, nPk
12b70 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
12ba0 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
12bb0 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65  t, regRowset, re
12bc0 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 2c 20               r, 
12bf0 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
12c00 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29        if( iSet )
12c10 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
12c20 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
12c30 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c60 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72 72   Release the arr
12c70 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73  ay of temp regis
12c80 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ters */.        
12c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
12ca0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
12cb0 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  arse, r, nPk);. 
12cc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12cd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
12ce0 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68      /* Invoke th
12cf0 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
12d00 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
12d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
12d20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d30 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
12d40 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
12d50 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
12d60 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69  * Jump here (ski
12d70 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c  pping the main l
12d80 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74  oop body subrout
12d90 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20 20  ine) if the.    
12da0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
12db0 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69   sub-WHERE row i
12dc0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 72  s a duplicate fr
12dd0 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45  om prior sub-WHE
12de0 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  REs. */.        
12df0 20 20 69 66 28 20 6a 6d 70 31 20 29 20 73 71 6c    if( jmp1 ) sql
12e00 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12e10 28 76 2c 20 6a 6d 70 31 29 3b 0a 0a 20 20 20 20  (v, jmp1);..    
12e20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
12e30 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
12e40 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
12e50 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
12e60 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
12e70 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
12e80 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
12e90 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
12ea0 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
12eb0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
12ec0 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
12ed0 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
12ee0 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
12ef0 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
12f00 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
12f10 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
12f20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
12f30 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
12f40 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
12f50 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
12f60 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
12f70 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
12f80 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
12f90 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
12fa0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
12fb0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
12fc0 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
12fd0 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
12fe0 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
12ff0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
13000 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
13010 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
13020 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
13030 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
13040 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
13050 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
13060 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
13070 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
13080 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
13090 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
130a0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
130b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
130c0 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
130d0 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
130e0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
130f0 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
13100 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
13110 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
13120 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
13130 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
13140 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
13150 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
13160 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
13170 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
13180 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
13190 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
131a0 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
131b0 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
131c0 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
131d0 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
131e0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
131f0 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
13200 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
13210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
13220 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
13230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13240 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
13250 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
13260 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
13270 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
13280 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13290 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
132a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
132b0 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
132c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
132d0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
132e0 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
132f0 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
13300 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
13310 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
13320 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
13330 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
13340 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75  ndex(pSubLoop->u
13350 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a  .btree.pIndex)).
13360 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
13370 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13380 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d   pSubWInfo->a[0]
13390 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75  .iIdxCur==iCovCu
133a0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
133b0 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70   pCov = pSubLoop
133c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
133d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
133e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
133f0 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cov = 0;.       
13400 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
13410 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
13420 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
13430 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
13440 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
13450 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
13460 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
13470 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
13480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13490 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
134a0 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b  .pCovidx = pCov;
134b0 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20  .    if( pCov ) 
134c0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
134d0 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69  = iCovCur;.    i
134e0 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
134f0 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
13500 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
13510 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
13520 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  e(db, pAndExpr);
13530 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13540 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
13550 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
13560 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13570 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
13580 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
13590 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
135a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
135b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
135c0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
135d0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
135e0 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
135f0 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
13600 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
13610 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
13620 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
13630 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
13640 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
13650 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
13660 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
13670 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
13680 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
13690 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
136a0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
136b0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
136c0 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
136d0 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
136e0 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
136f0 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
13700 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
13710 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
13720 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
13730 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
13740 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
13750 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
13760 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
13770 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
13780 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
13790 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62   ){.      /* Tab
137a0 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63  les marked isRec
137b0 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79  ursive have only
137c0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68   a single row th
137d0 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  at is stored in.
137e0 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64        ** a pseud
137f0 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65  o-cursor.  No ne
13800 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20  ed to Rewind or 
13810 4e 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72  Next such cursor
13820 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76  s. */.      pLev
13830 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
13840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13850 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e     codeCursorHin
13860 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e  t(pTabItem, pWIn
13870 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 30 29 3b 0a  fo, pLevel, 0);.
13880 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
13890 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
138a0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
138b0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
138c0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
138d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
138e0 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
138f0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 48 61 6c  ], iCur, addrHal
13900 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
13910 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
13920 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ==0);.      Vdbe
13930 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
13940 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c  ev!=0);.      pL
13950 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
13960 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
13970 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
13980 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
139a0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70 4c  _SCANSTATUS.  pL
139b0 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69 74 20  evel->addrVisit 
139c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
139d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65 6e  rentAddr(v);.#en
139e0 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  dif..  /* Insert
139f0 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
13a00 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
13a10 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
13a20 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
13a30 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
13a40 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
13a50 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
13a60 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20  * This loop may 
13a70 72 75 6e 20 62 65 74 77 65 65 6e 20 6f 6e 65 20  run between one 
13a80 61 6e 64 20 74 68 72 65 65 20 74 69 6d 65 73 2c  and three times,
13a90 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
13aa0 65 0a 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  e.  ** constrain
13ab0 74 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ts to be generat
13ac0 65 64 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  ed. The value of
13ad0 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
13ae0 69 4c 6f 6f 70 0a 20 20 2a 2a 20 64 65 74 65 72  iLoop.  ** deter
13af0 6d 69 6e 65 73 20 74 68 65 20 63 6f 6e 73 74 72  mines the constr
13b00 61 69 6e 74 73 20 63 6f 64 65 64 20 62 79 20 65  aints coded by e
13b10 61 63 68 20 69 74 65 72 61 74 69 6f 6e 2c 20 61  ach iteration, a
13b20 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
13b30 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 31 3a 20 43    ** iLoop==1: C
13b40 6f 64 65 20 6f 6e 6c 79 20 65 78 70 72 65 73 73  ode only express
13b50 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 65 6e  ions that are en
13b60 74 69 72 65 6c 79 20 63 6f 76 65 72 65 64 20 62  tirely covered b
13b70 79 20 70 49 64 78 2e 0a 20 20 2a 2a 20 69 4c 6f  y pIdx..  ** iLo
13b80 6f 70 3d 3d 32 3a 20 43 6f 64 65 20 72 65 6d 61  op==2: Code rema
13b90 69 6e 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ining expression
13ba0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
13bb0 6e 74 61 69 6e 20 63 6f 72 72 65 6c 61 74 65 64  ntain correlated
13bc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
13bd0 73 75 62 2d 71 75 65 72 69 65 73 2e 20 20 0a 20  sub-queries.  . 
13be0 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 33 3a 20 43 6f   ** iLoop==3: Co
13bf0 64 65 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  de all remaining
13c00 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
13c10 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 66 66 6f 72  **.  ** An effor
13c20 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 6b 69  t is made to ski
13c30 70 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 74  p unnecessary it
13c40 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
13c50 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 4c 6f  loop..  */.  iLo
13c60 6f 70 20 3d 20 28 70 49 64 78 20 3f 20 31 20 3a  op = (pIdx ? 1 :
13c70 20 32 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69   2);.  do{.    i
13c80 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b 20 20 20  nt iNext = 0;   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ca0 4e 65 78 74 20 76 61 6c 75 65 20 66 6f 72 20 69  Next value for i
13cb0 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 66 6f 72 28  Loop */.    for(
13cc0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
13cd0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
13ce0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
13cf0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
13d00 20 20 20 20 20 20 69 6e 74 20 73 6b 69 70 4c 69        int skipLi
13d10 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  keAddr = 0;.    
13d20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13d30 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
13d40 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
13d50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
13d60 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
13d70 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
13d80 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
13d90 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
13da0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
13db0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13dc0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
13dd0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
13de0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
13df0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
13e00 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
13e10 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
13e20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
13e30 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
13e40 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
13e50 4c 41 55 53 45 29 21 3d 30 20 29 3b 0a 20 20 20  LAUSE)!=0 );.   
13e60 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
13e70 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
13e80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
13e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ea0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
13eb0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
13ec0 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
13ed0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
13ee0 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61  tJoin && !ExprHa
13ef0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
13f00 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
13f10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
13f30 20 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3d 3d       if( iLoop==
13f40 31 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  1 && !sqlite3Exp
13f50 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
13f60 70 45 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  pE, pLevel->iTab
13f70 43 75 72 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  Cur, pIdx) ){.  
13f80 20 20 20 20 20 20 69 4e 65 78 74 20 3d 20 32 3b        iNext = 2;
13f90 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
13fa0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
13fb0 20 69 66 28 20 69 4c 6f 6f 70 3c 33 20 26 26 20   if( iLoop<3 && 
13fc0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
13fd0 26 20 54 45 52 4d 5f 56 41 52 53 45 4c 45 43 54  & TERM_VARSELECT
13fe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13ff0 20 69 4e 65 78 74 3d 3d 30 20 29 20 69 4e 65 78   iNext==0 ) iNex
14000 74 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 63  t = 3;.        c
14010 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
14020 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
14030 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14040 4d 5f 4c 49 4b 45 43 4f 4e 44 20 29 7b 0a 20 20  M_LIKECOND ){.  
14050 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14060 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 66 6c  TERM_LIKECOND fl
14070 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
14080 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
14090 61 6e 67 65 20 73 65 61 72 63 68 0a 20 20 20 20  ange search.    
140a0 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
140b0 69 65 6e 74 20 74 6f 20 67 75 61 72 61 6e 74 65  ient to guarante
140c0 65 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20  e that the LIKE 
140d0 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
140e0 2c 20 73 6f 20 77 65 0a 20 20 20 20 20 20 20 20  , so we.        
140f0 2a 2a 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20  ** can skip the 
14100 63 61 6c 6c 20 74 6f 20 74 68 65 20 6c 69 6b 65  call to the like
14110 28 41 2c 42 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (A,B) function. 
14120 20 42 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 77   But this only w
14130 6f 72 6b 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  orks.        ** 
14140 66 6f 72 20 73 74 72 69 6e 67 73 2e 20 20 53 6f  for strings.  So
14150 20 64 6f 20 6e 6f 74 20 73 6b 69 70 20 74 68 65   do not skip the
14160 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 66 75 6e   call to the fun
14170 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61 73  ction on the pas
14180 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
14190 74 20 63 6f 6d 70 61 72 65 73 20 42 4c 4f 42 73  t compares BLOBs
141a0 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
141b0 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
141c0 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20  ATCH_BLOBS.     
141d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c     continue;.#el
141e0 73 65 0a 20 20 20 20 20 20 20 20 75 33 32 20 78  se.        u32 x
141f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65   = pLevel->iLike
14200 52 65 70 43 6e 74 72 3b 0a 20 20 20 20 20 20 20  RepCntr;.       
14210 20 61 73 73 65 72 74 28 20 78 3e 30 20 29 3b 0a   assert( x>0 );.
14220 20 20 20 20 20 20 20 20 73 6b 69 70 4c 69 6b 65          skipLike
14230 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
14240 62 65 41 64 64 4f 70 31 28 76 2c 20 28 78 26 31  beAddOp1(v, (x&1
14250 29 3f 4f 50 5f 49 66 4e 6f 74 3a 4f 50 5f 49 66  )?OP_IfNot:OP_If
14260 2c 20 28 69 6e 74 29 28 78 3e 3e 31 29 29 3b 0a  , (int)(x>>1));.
14270 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
14280 72 61 67 65 28 76 29 3b 0a 23 65 6e 64 69 66 0a  rage(v);.#endif.
14290 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 57        }.#ifdef W
142a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
142b0 44 20 2f 2a 20 30 78 66 66 66 66 20 2a 2f 0a 20  D /* 0xffff */. 
142c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
142d0 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
142e0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
142f0 6d 6d 65 6e 74 28 28 76 2c 20 22 57 68 65 72 65  mment((v, "Where
14300 54 65 72 6d 5b 25 64 5d 20 28 25 70 29 20 70 72  Term[%d] (%p) pr
14310 69 6f 72 69 74 79 3d 25 64 22 2c 0a 20 20 20 20  iority=%d",.    
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2d       pWC->nTerm-
14340 6a 2c 20 70 54 65 72 6d 2c 20 69 4c 6f 6f 70 29  j, pTerm, iLoop)
14350 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
14360 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  f.      sqlite3E
14370 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14380 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
14390 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
143a0 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  LL);.      if( s
143b0 6b 69 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71  kipLikeAddr ) sq
143c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
143d0 65 28 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64  e(v, skipLikeAdd
143e0 72 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  r);.      pTerm-
143f0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
14400 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
14410 20 20 69 4c 6f 6f 70 20 3d 20 69 4e 65 78 74 3b    iLoop = iNext;
14420 0a 20 20 7d 77 68 69 6c 65 28 20 69 4c 6f 6f 70  .  }while( iLoop
14430 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  >0 );..  /* Inse
14440 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
14450 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
14460 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
14470 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
14480 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
14490 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
144a0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
144b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
144c0 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
144d0 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
144e0 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
144f0 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
14500 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
14510 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
14520 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
14530 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
14540 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
14550 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
14560 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
14570 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
14580 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
14590 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
145a0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
145b0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
145c0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
145d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 73  .    Expr *pE, s
145e0 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54  EAlt;.    WhereT
145f0 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69  erm *pAlt;.    i
14600 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
14610 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
14620 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
14630 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14640 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
14650 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
14660 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
14670 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
14680 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14690 57 4f 5f 45 51 55 49 56 29 3d 3d 30 20 29 20 63  WO_EQUIV)==0 ) c
146a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
146b0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
146c0 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
146d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nue;.    if( pLe
146e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
146f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
14700 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
14710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
14720 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14730 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
14740 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
14750 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
14760 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ht & pLevel->not
14770 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20  Ready)!=0 );.   
14780 20 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 57   pAlt = sqlite3W
14790 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
147a0 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75  , iCur, pTerm->u
147b0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74  .leftColumn, not
147c0 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20  Ready,.         
147d0 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51             WO_EQ
147e0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30 29  |WO_IN|WO_IS, 0)
147f0 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d  ;.    if( pAlt==
14800 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14810 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c    if( pAlt->wtFl
14820 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45  ags & (TERM_CODE
14830 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
14840 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
14850 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
14860 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74  O_EQ );.    test
14870 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
14880 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
14890 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
148a0 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
148b0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64   WO_IN );.    Vd
148c0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
148d0 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73  (v, "begin trans
148e0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
148f0 22 29 29 3b 0a 20 20 20 20 73 45 41 6c 74 20 3d  "));.    sEAlt =
14900 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
14910 20 20 20 73 45 41 6c 74 2e 70 4c 65 66 74 20 3d     sEAlt.pLeft =
14920 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
14930 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
14940 73 65 28 70 50 61 72 73 65 2c 20 26 73 45 41 6c  se(pParse, &sEAl
14950 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  t, addrCont, SQL
14960 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
14970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
14980 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
14990 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
149a0 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
149b0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
149c0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
149d0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
149e0 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
149f0 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
14a00 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
14a10 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
14a20 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
14a30 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
14a40 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
14a50 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
14a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14a80 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
14a90 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
14aa0 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
14ab0 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
14ac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14ad0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
14ae0 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
14af0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
14b00 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
14b10 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
14b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
14b30 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14b40 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
14b50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14b60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14b70 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
14b80 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
14b90 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
14ba0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
14bb0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
14bc0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
14bd0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
14be0 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
14bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
14c00 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
14c10 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
14c20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
14c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
14c40 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
14c50 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
14c60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14c70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
14c80 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
14c90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
14ca0 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
14cb0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
14cc0 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
14cd0 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65  ..  return pLeve
14ce0 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a     l->notReady;.}.