/ Hex Artifact Content
Login

Artifact 728c7f70731430ccdac807a79969873e1af6968bf1c4745dff3f9dd35f636cc8:


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 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0770: 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
0780: 2c 20 35 29 3b 0a 0a 20 20 69 66 28 20 6e 54 65  , 5);..  if( nTe
0790: 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33 5f 73  rm>1 ) sqlite3_s
07a0: 74 72 5f 61 70 70 65 6e 64 28 70 53 74 72 2c 20  tr_append(pStr, 
07b0: 22 28 22 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  "(", 1);.  for(i
07c0: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
07d0: 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 73  ){.    if( i ) s
07e0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
07f0: 64 28 70 53 74 72 2c 20 22 2c 22 2c 20 31 29 3b  d(pStr, ",", 1);
0800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
0810: 5f 61 70 70 65 6e 64 61 6c 6c 28 70 53 74 72 2c  _appendall(pStr,
0820: 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c   explainIndexCol
0830: 75 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 69 54  umnName(pIdx, iT
0840: 65 72 6d 2b 69 29 29 3b 0a 20 20 7d 0a 20 20 69  erm+i));.  }.  i
0850: 66 28 20 6e 54 65 72 6d 3e 31 20 29 20 73 71 6c  f( nTerm>1 ) sql
0860: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
0870: 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a 0a  pStr, ")", 1);..
0880: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
0890: 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
08a0: 31 29 3b 0a 0a 20 20 69 66 28 20 6e 54 65 72 6d  1);..  if( nTerm
08b0: 3e 31 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72  >1 ) sqlite3_str
08c0: 5f 61 70 70 65 6e 64 28 70 53 74 72 2c 20 22 28  _append(pStr, "(
08d0: 22 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 1);.  for(i=0
08e0: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
08f0: 0a 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c  .    if( i ) sql
0900: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
0910: 70 53 74 72 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  pStr, ",", 1);. 
0920: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
0930: 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
0940: 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   1);.  }.  if( n
0950: 54 65 72 6d 3e 31 20 29 20 73 71 6c 69 74 65 33  Term>1 ) sqlite3
0960: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 53 74 72  _str_append(pStr
0970: 2c 20 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , ")", 1);.}../*
0980: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
0990: 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
09a0: 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
09b0: 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
09c0: 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
09d0: 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74  ion appends text
09e0: 20 74 6f 20 70 53 74 72 20 74 68 61 74 20 64 65   to pStr that de
09f0: 73 63 72 69 62 65 73 20 74 68 65 20 73 75 62 73  scribes the subs
0a00: 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72  et of table.** r
0a10: 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
0a20: 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
0a30: 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51  he form of an SQ
0a40: 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  L expression..**
0a50: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
0a60: 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a   if the query:.*
0a70: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
0a80: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
0a90: 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a  1 AND b>2;.**.**
0aa0: 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72   is run and ther
0ab0: 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
0ac0: 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68   (a, b), then th
0ad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
0ae0: 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20  rns a.** string 
0af0: 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  similar to:.**.*
0b00: 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f  *   "a=? AND b>?
0b10: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ".*/.static void
0b20: 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
0b30: 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74  ge(StrAccum *pSt
0b40: 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  r, WhereLoop *pL
0b50: 6f 6f 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oop){.  Index *p
0b60: 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
0b70: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
0b80: 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   u16 nEq = pLoop
0b90: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
0ba0: 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f   u16 nSkip = pLo
0bb0: 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74  op->nSkip;.  int
0bc0: 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 6e 45   i, j;..  if( nE
0bd0: 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
0be0: 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42  wsFlags&(WHERE_B
0bf0: 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
0c00: 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20  OP_LIMIT))==0 ) 
0c10: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
0c20: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 53 74  3_str_append(pSt
0c30: 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  r, " (", 2);.  f
0c40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
0c50: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
0c60: 68 61 72 20 2a 7a 20 3d 20 65 78 70 6c 61 69 6e  har *z = explain
0c70: 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65 28  IndexColumnName(
0c80: 70 49 6e 64 65 78 2c 20 69 29 3b 0a 20 20 20 20  pIndex, i);.    
0c90: 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 5f  if( i ) sqlite3_
0ca0: 73 74 72 5f 61 70 70 65 6e 64 28 70 53 74 72 2c  str_append(pStr,
0cb0: 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
0cc0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
0cd0: 70 65 6e 64 66 28 70 53 74 72 2c 20 69 3e 3d 6e  pendf(pStr, i>=n
0ce0: 53 6b 69 70 20 3f 20 22 25 73 3d 3f 22 20 3a 20  Skip ? "%s=?" : 
0cf0: 22 41 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20  "ANY(%s)", z);. 
0d00: 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
0d10: 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
0d20: 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
0d30: 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  T ){.    explain
0d40: 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c  AppendTerm(pStr,
0d50: 20 70 49 6e 64 65 78 2c 20 70 4c 6f 6f 70 2d 3e   pIndex, pLoop->
0d60: 75 2e 62 74 72 65 65 2e 6e 42 74 6d 2c 20 6a 2c  u.btree.nBtm, j,
0d70: 20 69 2c 20 22 3e 22 29 3b 0a 20 20 20 20 69 20   i, ">");.    i 
0d80: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
0d90: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
0da0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
0db0: 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
0dc0: 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 70 49 6e  ndTerm(pStr, pIn
0dd0: 64 65 78 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dex, pLoop->u.bt
0de0: 72 65 65 2e 6e 54 6f 70 2c 20 6a 2c 20 69 2c 20  ree.nTop, j, i, 
0df0: 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
0e00: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70  te3_str_append(p
0e10: 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a 7d 0a  Str, ")", 1);.}.
0e20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
0e30: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
0e40: 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
0e50: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
0e60: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
0e70: 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20 6f 72  N.** command, or
0e80: 20 69 66 20 65 69 74 68 65 72 20 53 51 4c 49 54   if either SQLIT
0e90: 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c 49 54  E_DEBUG or SQLIT
0ea0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
0eb0: 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a 2a 20  ANSTATUS was.** 
0ec0: 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  defined at compi
0ed0: 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74 20 69  le-time. If it i
0ee0: 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c 20 61  s not a no-op, a
0ef0: 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
0f00: 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20 69 73  in opcode .** is
0f10: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
0f20: 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
0f30: 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
0f40: 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c 65 76  strategy in pLev
0f50: 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  el..**.** If an 
0f60: 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
0f70: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
0f80: 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72 65 73  e VM, its addres
0f90: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
0fa0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
0fb0: 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 73  no OP_Explain is
0fc0: 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69 73 20   coded, zero is 
0fd0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
0fe0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
0ff0: 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
1000: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1020: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
1030: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1040: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
1050: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
1060: 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
1070: 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
1080: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10a0: 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
10b0: 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
10c0: 6f 72 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  or */.  u16 wctr
10d0: 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
10e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
10f0: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1100: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
1110: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  /.){.  int ret =
1120: 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   0;.#if !defined
1130: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
1140: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1150: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
1160: 41 4e 53 54 41 54 55 53 29 0a 20 20 69 66 28 20  ANSTATUS).  if( 
1170: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1180: 65 76 65 6c 28 70 50 61 72 73 65 29 2d 3e 65 78  evel(pParse)->ex
1190: 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69  plain==2 ).#endi
11a0: 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  f.  {.    struct
11b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
11c0: 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
11d0: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
11e0: 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
11f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1200: 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
1210: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
1220: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1230: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1240: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1250: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  andle */.    int
1260: 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
1270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1280: 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
1290: 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
12a0: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f   */.    WhereLoo
12b0: 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
12c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
12d0: 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f  trolling WhereLo
12e0: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  op object */.   
12f0: 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20   u32 flags;     
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65 73  * Flags that des
1320: 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20  cribe this loop 
1330: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
1340: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1350: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
1360: 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
1370: 74 20 2a 2f 0a 20 20 20 20 53 74 72 41 63 63 75  t */.    StrAccu
1380: 6d 20 73 74 72 3b 20 20 20 20 20 20 20 20 20 20  m str;          
1390: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 6f 75         /* EQP ou
13a0: 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  tput string */. 
13b0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
13c0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
13d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 70 61 63   /* Initial spac
13e0: 65 20 66 6f 72 20 45 51 50 20 6f 75 74 70 75 74  e for EQP output
13f0: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20   string */..    
1400: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
1410: 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67  pWLoop;.    flag
1420: 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
1430: 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  gs;.    if( (fla
1440: 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
1450: 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
1460: 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  s&WHERE_OR_SUBCL
1470: 41 55 53 45 29 20 29 20 72 65 74 75 72 6e 20 30  AUSE) ) return 0
1480: 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20  ;..    isSearch 
1490: 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f  = (flags&(WHERE_
14a0: 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
14b0: 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20  TOP_LIMIT))!=0. 
14c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
14d0: 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54  flags&WHERE_VIRT
14e0: 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20  UALTABLE)==0 && 
14f0: 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
1500: 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20  nEq>0)).        
1510: 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
1520: 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
1530: 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
1540: 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20  RBY_MAX));..    
1550: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
1560: 6e 69 74 28 26 73 74 72 2c 20 64 62 2c 20 7a 42  nit(&str, db, zB
1570: 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  uf, sizeof(zBuf)
1580: 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
1590: 47 54 48 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  GTH);.    sqlite
15a0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
15b0: 26 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f  &str, isSearch ?
15c0: 20 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41   "SEARCH" : "SCA
15d0: 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
15e0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
15f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1600: 5f 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  _appendf(&str, "
1610: 20 53 55 42 51 55 45 52 59 20 30 78 25 70 22 2c   SUBQUERY 0x%p",
1620: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
1630: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1640: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
1650: 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20 54  ppendf(&str, " T
1660: 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d  ABLE %s", pItem-
1670: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
1680: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
1690: 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 73  Alias ){.      s
16a0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
16b0: 64 66 28 26 73 74 72 2c 20 22 20 41 53 20 25 73  df(&str, " AS %s
16c0: 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
16d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16e0: 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
16f0: 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
1700: 41 4c 54 41 42 4c 45 29 29 3d 3d 30 20 29 7b 0a  ALTABLE))==0 ){.
1710: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1720: 20 2a 7a 46 6d 74 20 3d 20 30 3b 0a 20 20 20 20   *zFmt = 0;.    
1730: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
1740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1750: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1760: 64 65 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  dex!=0 );.      
1770: 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
1780: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
1790: 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c      assert( !(fl
17a0: 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f 49  ags&WHERE_AUTO_I
17b0: 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73 26  NDEX) || (flags&
17c0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
17d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61  );.      if( !Ha
17e0: 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54  sRowid(pItem->pT
17f0: 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72 79  ab) && IsPrimary
1800: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
1810: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
1820: 53 65 61 72 63 68 20 29 7b 0a 20 20 20 20 20 20  Search ){.      
1830: 20 20 20 20 7a 46 6d 74 20 3d 20 22 50 52 49 4d      zFmt = "PRIM
1840: 41 52 59 20 4b 45 59 22 3b 0a 20 20 20 20 20 20  ARY KEY";.      
1850: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1860: 69 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52  if( flags & WHER
1870: 45 5f 50 41 52 54 49 41 4c 49 44 58 20 29 7b 0a  E_PARTIALIDX ){.
1880: 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22          zFmt = "
1890: 41 55 54 4f 4d 41 54 49 43 20 50 41 52 54 49 41  AUTOMATIC PARTIA
18a0: 4c 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  L COVERING INDEX
18b0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
18c0: 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45  f( flags & WHERE
18d0: 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a 20  _AUTO_INDEX ){. 
18e0: 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 41         zFmt = "A
18f0: 55 54 4f 4d 41 54 49 43 20 43 4f 56 45 52 49 4e  UTOMATIC COVERIN
1900: 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20  G INDEX";.      
1910: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1920: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1930: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
1940: 20 3d 20 22 43 4f 56 45 52 49 4e 47 20 49 4e 44   = "COVERING IND
1950: 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  EX %s";.      }e
1960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  lse{.        zFm
1970: 74 20 3d 20 22 49 4e 44 45 58 20 25 73 22 3b 0a  t = "INDEX %s";.
1980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1990: 28 20 7a 46 6d 74 20 29 7b 0a 20 20 20 20 20 20  ( zFmt ){.      
19a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
19b0: 70 65 6e 64 28 26 73 74 72 2c 20 22 20 55 53 49  pend(&str, " USI
19c0: 4e 47 20 22 2c 20 37 29 3b 0a 20 20 20 20 20 20  NG ", 7);.      
19d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
19e0: 70 65 6e 64 66 28 26 73 74 72 2c 20 7a 46 6d 74  pendf(&str, zFmt
19f0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
1a00: 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 49          explainI
1a10: 6e 64 65 78 52 61 6e 67 65 28 26 73 74 72 2c 20  ndexRange(&str, 
1a20: 70 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a  pLoop);.      }.
1a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1a40: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1a50: 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26  )!=0 && (flags &
1a60: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
1a70: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  T)!=0 ){.      c
1a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 67  onst char *zRang
1a90: 65 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66  eOp;.      if( f
1aa0: 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55  lags&(WHERE_COLU
1ab0: 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1ac0: 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  MN_IN) ){.      
1ad0: 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3d 22    zRangeOp = "="
1ae0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1af0: 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42  ( (flags&WHERE_B
1b00: 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52  OTH_LIMIT)==WHER
1b10: 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a  E_BOTH_LIMIT ){.
1b20: 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70          zRangeOp
1b30: 20 3d 20 22 3e 3f 20 41 4e 44 20 72 6f 77 69 64   = ">? AND rowid
1b40: 3c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  <";.      }else 
1b50: 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1b60: 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1b70: 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20       zRangeOp = 
1b80: 22 3e 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ">";.      }else
1b90: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ba0: 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  ( flags&WHERE_TO
1bb0: 50 5f 4c 49 4d 49 54 29 3b 0a 20 20 20 20 20 20  P_LIMIT);.      
1bc0: 20 20 7a 52 61 6e 67 65 4f 70 20 3d 20 22 3c 22    zRangeOp = "<"
1bd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1be0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
1bf0: 6e 64 66 28 26 73 74 72 2c 20 0a 20 20 20 20 20  ndf(&str, .     
1c00: 20 20 20 20 20 22 20 55 53 49 4e 47 20 49 4e 54       " USING INT
1c10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1c20: 20 28 72 6f 77 69 64 25 73 3f 29 22 2c 7a 52 61   (rowid%s?)",zRa
1c30: 6e 67 65 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 69  ngeOp);.    }.#i
1c40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c50: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1c60: 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61     else if( (fla
1c70: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1c80: 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1c90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1ca0: 5f 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  _appendf(&str, "
1cb0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1cc0: 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20  NDEX %d:%s",.   
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ce0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1cf0: 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
1d00: 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1d10: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1d20: 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45  SQLITE_EXPLAIN_E
1d30: 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20  STIMATED_ROWS.  
1d40: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
1d50: 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73  t>=10 ){.      s
1d60: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
1d70: 64 66 28 26 73 74 72 2c 20 22 20 28 7e 25 6c 6c  df(&str, " (~%ll
1d80: 75 20 72 6f 77 73 29 22 2c 0a 20 20 20 20 20 20  u rows)",.      
1d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1da0: 67 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d  gEstToInt(pLoop-
1db0: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c  >nOut));.    }el
1dc0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1dd0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 73 74  3_str_append(&st
1de0: 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c 20  r, " (~1 row)", 
1df0: 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  9);.    }.#endif
1e00: 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
1e10: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
1e20: 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65 74  h(&str);.    ret
1e30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1e40: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
1e50: 69 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  in, sqlite3VdbeC
1e60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2c 0a 20  urrentAddr(v),. 
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
1e90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
1ea0: 30 2c 20 7a 4d 73 67 2c 50 34 5f 44 59 4e 41 4d  0, zMsg,P4_DYNAM
1eb0: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
1ec0: 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  n ret;.}.#endif 
1ed0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1ee0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1ef0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f00: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1f10: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1f20: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1f30: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f40: 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1f50: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1f60: 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1f70: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1f80: 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
1f90: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
1fa0: 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
1fb0: 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
1fc0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1fd0: 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
1fe0: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
1ff0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
2000: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
2010: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
2020: 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
2030: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
2040: 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
2050: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
2060: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
2070: 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
2080: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2090: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
20a0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
20d0: 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
20e0: 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
20f0: 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
2100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
2110: 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
2120: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
2130: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
2140: 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
2150: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
2160: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
2170: 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
2180: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
21b0: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
21c0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
21d0: 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
21e0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
21f0: 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
2200: 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
2210: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2220: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2230: 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
2240: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
2250: 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
2260: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2270: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
2280: 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
2290: 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
22a0: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
22b0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
22c0: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
22d0: 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
22e0: 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
22f0: 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
2300: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
2310: 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69  Obj.  );.}.#endi
2320: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  f.../*.** Disabl
2330: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
2340: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
2350: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
2360: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
2370: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
2380: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2390: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
23a0: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
23b0: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
23c0: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
23d0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
23e0: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
23f0: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
2400: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
2410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
2420: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2430: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
2440: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
2450: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
2460: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
2470: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2480: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
2490: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
24a0: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
24b0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
24c0: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
24d0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
24e0: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
24f0: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2500: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
2510: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
2520: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
2530: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
2540: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
2550: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
2560: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
2570: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
2580: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
2590: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
25a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
25b0: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
25c0: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
25d0: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
25e0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
25f0: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2600: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
2610: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
2620: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
2630: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
2640: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
2650: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
2660: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
2670: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
2680: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
2690: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
26a0: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
26b0: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
26c0: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
26d0: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
26e0: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
26f0: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
2700: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
2710: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
2720: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
2730: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
2740: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
2750: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
2760: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
2770: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
2780: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  3..**.** If all 
2790: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  the children of 
27a0: 61 20 74 65 72 6d 20 61 72 65 20 64 69 73 61 62  a term are disab
27b0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 61 74 20 74  led, then that t
27c0: 65 72 6d 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  erm is also.** a
27d0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 69 73  utomatically dis
27e0: 61 62 6c 65 64 2e 20 20 49 6e 20 74 68 69 73 20  abled.  In this 
27f0: 77 61 79 2c 20 74 65 72 6d 73 20 67 65 74 20 64  way, terms get d
2800: 69 73 61 62 6c 65 64 20 69 66 20 64 65 72 69 76  isabled if deriv
2810: 65 64 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ed.** virtual te
2820: 72 6d 73 20 61 72 65 20 74 65 73 74 65 64 20 66  rms are tested f
2830: 69 72 73 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  irst.  For examp
2840: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  le:.**.**      x
2850: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 41 4e 44   GLOB 'abc*' AND
2860: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
2870: 27 61 63 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f  'acd'.**      \_
2880: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
2890: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  \______/     \__
28a0: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
28b0: 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  parent          
28c0: 63 68 69 6c 64 31 20 20 20 20 20 20 20 63 68 69  child1       chi
28d0: 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ld2.**.** Only t
28e0: 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20 77  he parent term w
28f0: 61 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  as in the origin
2900: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
2910: 20 20 54 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20    The child1.** 
2920: 61 6e 64 20 63 68 69 6c 64 32 20 74 65 72 6d 73  and child2 terms
2930: 20 77 65 72 65 20 61 64 64 65 64 20 62 79 20 74   were added by t
2940: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
2950: 74 69 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f  tion.  If both o
2960: 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c  f.** the virtual
2970: 20 63 68 69 6c 64 20 74 65 72 6d 73 20 61 72 65   child terms are
2980: 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 65 73   valid, then tes
2990: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 65  ting of the pare
29a0: 6e 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b  nt can be .** sk
29b0: 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  ipped..**.** Usu
29c0: 61 6c 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  ally the parent 
29d0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 61  term is marked a
29e0: 73 20 54 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42  s TERM_CODED.  B
29f0: 75 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ut if the parent
2a00: 0a 2a 2a 20 74 65 72 6d 20 77 61 73 20 6f 72 69  .** term was ori
2a10: 67 69 6e 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b  ginally TERM_LIK
2a20: 45 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65  E, then the pare
2a30: 6e 74 20 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b  nt gets TERM_LIK
2a40: 45 43 4f 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a  ECOND instead..*
2a50: 2a 20 54 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43  * The TERM_LIKEC
2a60: 4f 4e 44 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69  OND marking indi
2a70: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
2a80: 65 72 6d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  erm should be co
2a90: 64 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20  ded inside.** a 
2aa0: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 75 63 68  conditional such
2ab0: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 65 76   that is only ev
2ac0: 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
2ad0: 65 63 6f 6e 64 20 70 61 73 73 20 6f 66 20 61 0a  econd pass of a.
2ae0: 2a 2a 20 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61  ** LIKE-optimiza
2af0: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20  tion loop, when 
2b00: 73 63 61 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69  scanning BLOBs i
2b10: 6e 73 74 65 61 64 20 6f 66 20 73 74 72 69 6e 67  nstead of string
2b20: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2b30: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
2b40: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2b50: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
2b60: 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  rm){.  int nLoop
2b70: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2b80: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 77 68  pTerm!=0 );.  wh
2b90: 69 6c 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ile( (pTerm->wtF
2ba0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
2bb0: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
2bc0: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2bd0: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
2be0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
2bf0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2c00: 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c  n)).      && (pL
2c10: 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26  evel->notReady &
2c20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
2c30: 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  l)==0.  ){.    i
2c40: 66 28 20 6e 4c 6f 6f 70 20 26 26 20 28 70 54 65  f( nLoop && (pTe
2c50: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2c60: 52 4d 5f 4c 49 4b 45 29 21 3d 30 20 29 7b 0a 20  RM_LIKE)!=0 ){. 
2c70: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2c80: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45  ags |= TERM_LIKE
2c90: 43 4f 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  COND;.    }else{
2ca0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
2cb0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2cc0: 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  DED;.    }.    i
2cd0: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
2ce0: 74 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  t<0 ) break;.   
2cf0: 20 70 54 65 72 6d 20 3d 20 26 70 54 65 72 6d 2d   pTerm = &pTerm-
2d00: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
2d10: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 61 73 73  Parent];.    ass
2d20: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
2d30: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
2d40: 6c 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 54  ld--;.    if( pT
2d50: 65 72 6d 2d 3e 6e 43 68 69 6c 64 21 3d 30 20 29  erm->nChild!=0 )
2d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f   break;.    nLoo
2d70: 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p++;.  }.}../*.*
2d80: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66  * Code an OP_Aff
2d90: 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20  inity opcode to 
2da0: 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e  apply the column
2db0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
2dc0: 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20   zAff.** to the 
2dd0: 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
2de0: 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a  ting at base. .*
2df0: 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d  *.** As an optim
2e00: 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f  ization, SQLITE_
2e10: 41 46 46 5f 42 4c 4f 42 20 65 6e 74 72 69 65 73  AFF_BLOB entries
2e20: 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f   (which are no-o
2e30: 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65  ps) at the.** be
2e40: 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
2e50: 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f  of zAff are igno
2e60: 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74  red.  If all ent
2e70: 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65  ries in zAff are
2e80: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  .** SQLITE_AFF_B
2e90: 4c 4f 42 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64  LOB, then no cod
2ea0: 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64  e gets generated
2eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2ec0: 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f  tine makes its o
2ed0: 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20  wn copy of zAff 
2ee0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  so that the call
2ef0: 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f  er is free.** to
2f00: 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74   modify zAff aft
2f10: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2f20: 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
2f30: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
2f40: 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
2f50: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
2f60: 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  e, int n, char *
2f70: 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76  zAff){.  Vdbe *v
2f80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2f90: 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
2fa0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2fb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2fc0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
2fd0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
2fe0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20  ert( v!=0 );..  
2ff0: 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61  /* Adjust base a
3000: 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65  nd n to skip ove
3010: 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  r SQLITE_AFF_BLO
3020: 42 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65  B entries at the
3030: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
3040: 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61  and end of the a
3050: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
3060: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e    */.  while( n>
3070: 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51  0 && zAff[0]==SQ
3080: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b  LITE_AFF_BLOB ){
3090: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61  .    n--;.    ba
30a0: 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b  se++;.    zAff++
30b0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  ;.  }.  while( n
30c0: 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d  >1 && zAff[n-1]=
30d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
30e0: 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d   ){.    n--;.  }
30f0: 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
3100: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
3110: 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  de if there is a
3120: 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20  nything left to 
3130: 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30  do. */.  if( n>0
3140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3150: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
3160: 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20  Affinity, base, 
3170: 6e 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a  n, 0, zAff, n);.
3180: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3190: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
31a0: 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
31b0: 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   n);.  }.}../*.*
31c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 52 69  * Expression pRi
31d0: 67 68 74 2c 20 77 68 69 63 68 20 69 73 20 74 68  ght, which is th
31e0: 65 20 52 48 53 20 6f 66 20 61 20 63 6f 6d 70 61  e RHS of a compa
31f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2c  rison operation,
3200: 20 69 73 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   is .** either a
3210: 20 76 65 63 74 6f 72 20 6f 66 20 6e 20 65 6c 65   vector of n ele
3220: 6d 65 6e 74 73 20 6f 72 2c 20 69 66 20 6e 3d 3d  ments or, if n==
3230: 31 2c 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  1, a scalar expr
3240: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 42 65 66 6f 72  ession..** Befor
3250: 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
3260: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 66 66 69   operation, affi
3270: 6e 69 74 79 20 7a 41 66 66 20 69 73 20 74 6f 20  nity zAff is to 
3280: 62 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f  be applied.** to
3290: 20 74 68 65 20 70 52 69 67 68 74 20 76 61 6c 75   the pRight valu
32a0: 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  es. This functio
32b0: 6e 20 6d 6f 64 69 66 69 65 73 20 63 68 61 72 61  n modifies chara
32c0: 63 74 65 72 73 20 77 69 74 68 69 6e 20 74 68 65  cters within the
32d0: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72  .** affinity str
32e0: 69 6e 67 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  ing to SQLITE_AF
32f0: 46 5f 42 4c 4f 42 20 69 66 20 65 69 74 68 65 72  F_BLOB if either
3300: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
3310: 63 6f 6d 70 61 72 69 73 6f 6e 20 77 69 6c 6c 20  comparison will 
3320: 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
3330: 68 20 6e 6f 20 61 66 66 69 6e 69 74 79 2c 20 6f  h no affinity, o
3340: 72 0a 2a 2a 20 20 20 2a 20 74 68 65 20 61 66 66  r.**   * the aff
3350: 69 6e 69 74 79 20 63 68 61 6e 67 65 20 69 6e 20  inity change in 
3360: 7a 41 66 66 20 69 73 20 67 75 61 72 61 6e 74 65  zAff is guarante
3370: 65 64 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65  ed not to change
3380: 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
3390: 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
33a0: 65 52 61 6e 67 65 41 66 66 69 6e 69 74 79 53 74  eRangeAffinitySt
33b0: 72 28 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  r(.  Expr *pRigh
33c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
33d0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 63       /* RHS of c
33e0: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 69  omparison */.  i
33f0: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 65 63 74  * Number of vect
3420: 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 63  or elements in c
3430: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
3440: 68 61 72 20 2a 7a 41 66 66 20 20 20 20 20 20 20  har *zAff       
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3460: 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
3470: 67 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 29  g to modify */.)
3480: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
3490: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
34a0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
34b0: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
34c0: 64 53 75 62 65 78 70 72 28 70 52 69 67 68 74 2c  dSubexpr(pRight,
34d0: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   i);.    if( sql
34e0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
34f0: 69 74 79 28 70 2c 20 7a 41 66 66 5b 69 5d 29 3d  ity(p, zAff[i])=
3500: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
3510: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
3520: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
3530: 69 74 79 43 68 61 6e 67 65 28 70 2c 20 7a 41 66  ityChange(p, zAf
3540: 66 5b 69 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20  f[i]).    ){.   
3550: 20 20 20 7a 41 66 66 5b 69 5d 20 3d 20 53 51 4c     zAff[i] = SQL
3560: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
3570: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
3580: 2a 20 70 58 20 69 73 20 61 6e 20 65 78 70 72 65  * pX is an expre
3590: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
35a0: 6d 3a 20 20 28 76 65 63 74 6f 72 29 20 49 4e 20  m:  (vector) IN 
35b0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
35c0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
35d0: 69 74 20 69 73 20 61 20 76 65 63 74 6f 72 20 49  it is a vector I
35e0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
35f0: 61 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 20  a SELECT clause 
3600: 6f 6e 20 74 68 65 0a 2a 2a 20 4c 48 53 2e 20 20  on the.** LHS.  
3610: 42 75 74 20 6e 6f 74 20 61 6c 6c 20 74 65 72 6d  But not all term
3620: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  s in the vector 
3630: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 61 6e  are indexable an
3640: 64 20 74 68 65 20 74 65 72 6d 73 20 6d 69 67 68  d the terms migh
3650: 74 0a 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74  t.** not be in t
3660: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
3670: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 2e 0a 2a   for indexing..*
3680: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3690: 65 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f  e makes a copy o
36a0: 66 20 74 68 65 20 69 6e 70 75 74 20 70 58 20 65  f the input pX e
36b0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68  xpression and th
36c0: 65 6e 20 61 64 6a 75 73 74 73 0a 2a 2a 20 74 68  en adjusts.** th
36d0: 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
36e0: 4c 48 53 20 77 69 74 68 20 63 6f 72 72 65 73 70  LHS with corresp
36f0: 6f 6e 64 69 6e 67 20 63 68 61 6e 67 65 73 20 74  onding changes t
3700: 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 6f 20  o the SELECT so 
3710: 74 68 61 74 0a 2a 2a 20 74 68 65 20 76 65 63 74  that.** the vect
3720: 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  or contains only
3730: 20 69 6e 64 65 78 20 74 65 72 6d 73 20 61 6e 64   index terms and
3740: 20 74 68 6f 73 65 20 74 65 72 6d 73 20 61 72 65   those terms are
3750: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 0a   in the correct.
3760: 2a 2a 20 6f 72 64 65 72 2e 20 20 54 68 65 20 6d  ** order.  The m
3770: 6f 64 69 66 69 65 64 20 49 4e 20 65 78 70 72 65  odified IN expre
3780: 73 73 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ssion is returne
3790: 64 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  d.  The caller i
37a0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
37b0: 20 66 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68   for deleting th
37c0: 65 20 72 65 74 75 72 6e 65 64 20 65 78 70 72 65  e returned expre
37d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  ssion..**.** Exa
37e0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  mple:.**.**    C
37f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3800: 2c 62 2c 63 2c 64 2c 65 2c 66 29 3b 0a 2a 2a 20  ,b,c,d,e,f);.** 
3810: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
3820: 74 31 78 31 20 4f 4e 20 74 31 28 65 2c 63 29 3b  t1x1 ON t1(e,c);
3830: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
3840: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 61  FROM t1 WHERE (a
3850: 2c 62 2c 63 2c 64 2c 65 29 20 49 4e 20 28 53 45  ,b,c,d,e) IN (SE
3860: 4c 45 43 54 20 76 2c 77 2c 78 2c 79 2c 7a 20 46  LECT v,w,x,y,z F
3870: 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 20  ROM t2).**      
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
38a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
38b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
38c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 54 68 65 20 70 58 20 65 78 70        The pX exp
38f0: 72 65 73 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 53 69  ression.**.** Si
3900: 6e 63 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  nce only columns
3910: 20 65 20 61 6e 64 20 63 20 63 61 6e 20 62 65 20   e and c can be 
3920: 75 73 65 64 20 77 69 74 68 20 74 68 65 20 69 6e  used with the in
3930: 64 65 78 2c 20 69 6e 20 74 68 61 74 20 6f 72 64  dex, in that ord
3940: 65 72 2c 0a 2a 2a 20 74 68 65 20 6d 6f 64 69 66  er,.** the modif
3950: 69 65 64 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ied IN expressio
3960: 6e 20 74 68 61 74 20 69 73 20 72 65 74 75 72 6e  n that is return
3970: 65 64 20 77 69 6c 6c 20 62 65 3a 0a 2a 2a 0a 2a  ed will be:.**.*
3980: 2a 20 20 20 20 20 20 20 20 28 65 2c 63 29 20 49  *        (e,c) I
3990: 4e 20 28 53 45 4c 45 43 54 20 7a 2c 78 20 46 52  N (SELECT z,x FR
39a0: 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65  OM t2).**.** The
39b0: 20 72 65 64 75 63 65 64 20 70 58 20 69 73 20 64   reduced pX is d
39c0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
39d0: 65 20 6f 72 69 67 69 6e 61 6c 20 28 6f 62 76 69  e original (obvi
39e0: 6f 75 73 6c 79 29 20 61 6e 64 20 74 68 75 73 20  ously) and thus 
39f0: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 75 73 65 64 20  is.** only used 
3a00: 66 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 74 6f  for indexing, to
3a10: 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
3a20: 61 6e 63 65 2e 20 20 54 68 65 20 6f 72 69 67 69  ance.  The origi
3a30: 6e 61 6c 20 75 6e 61 6c 74 65 72 65 64 0a 2a 2a  nal unaltered.**
3a40: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   IN expression m
3a50: 75 73 74 20 61 6c 73 6f 20 62 65 20 72 75 6e 20  ust also be run 
3a60: 6f 6e 20 65 61 63 68 20 6f 75 74 70 75 74 20 72  on each output r
3a70: 6f 77 20 66 6f 72 20 63 6f 72 72 65 63 74 6e 65  ow for correctne
3a80: 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ss..*/.static Ex
3a90: 70 72 20 2a 72 65 6d 6f 76 65 55 6e 69 6e 64 65  pr *removeUninde
3aa0: 78 61 62 6c 65 49 6e 43 6c 61 75 73 65 54 65 72  xableInClauseTer
3ab0: 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
3ac0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
3ad0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
3ae0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  xt */.  int iEq,
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b00: 20 4c 6f 6f 6b 20 61 74 20 6c 6f 6f 70 20 74 65   Look at loop te
3b10: 72 6d 73 20 73 74 61 72 74 69 6e 67 20 68 65 72  rms starting her
3b20: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
3b30: 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 2f 2a 20   *pLoop,     /* 
3b40: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  The current loop
3b50: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 20 20   */.  Expr *pX  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3b70: 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
3b80: 20 74 6f 20 62 65 20 72 65 64 75 63 65 64 20 2a   to be reduced *
3b90: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
3ba0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
3bb0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
3bc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
3bd0: 62 2c 20 70 58 2c 20 30 29 3b 0a 20 20 69 66 28  b, pX, 0);.  if(
3be0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3bf0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  d==0 ){.    Expr
3c00: 4c 69 73 74 20 2a 70 4f 72 69 67 52 68 73 20 3d  List *pOrigRhs =
3c10: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
3c20: 2d 3e 70 45 4c 69 73 74 3b 20 20 2f 2a 20 4f 72  ->pEList;  /* Or
3c30: 69 67 69 6e 61 6c 20 75 6e 6d 6f 64 69 66 69 65  iginal unmodifie
3c40: 64 20 52 48 53 20 2a 2f 0a 20 20 20 20 45 78 70  d RHS */.    Exp
3c50: 72 4c 69 73 74 20 2a 70 4f 72 69 67 4c 68 73 20  rList *pOrigLhs 
3c60: 3d 20 70 4e 65 77 2d 3e 70 4c 65 66 74 2d 3e 78  = pNew->pLeft->x
3c70: 2e 70 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4f  .pList;     /* O
3c80: 72 69 67 69 6e 61 6c 20 75 6e 6d 6f 64 69 66 69  riginal unmodifi
3c90: 65 64 20 4c 48 53 20 2a 2f 0a 20 20 20 20 45 78  ed LHS */.    Ex
3ca0: 70 72 4c 69 73 74 20 2a 70 52 68 73 20 3d 20 30  prList *pRhs = 0
3cb0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77  ;         /* New
3cc0: 20 52 48 53 20 61 66 74 65 72 20 6d 6f 64 69 66   RHS after modif
3cd0: 69 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  ications */.    
3ce0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 68 73 20 3d  ExprList *pLhs =
3cf0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
3d00: 65 77 20 4c 48 53 20 61 66 74 65 72 20 6d 6f 64  ew LHS after mod
3d10: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  s */.    int i; 
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3d40: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 53 65 6c 65  nter */.    Sele
3d50: 63 74 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 20  ct *pSelect;    
3d60: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3d70: 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54  er to the SELECT
3d80: 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 0a   on the RHS */..
3d90: 20 20 20 20 66 6f 72 28 69 3d 69 45 71 3b 20 69      for(i=iEq; i
3da0: 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 20  <pLoop->nLTerm; 
3db0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
3dc0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
3dd0: 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20  ->pExpr==pX ){. 
3de0: 20 20 20 20 20 20 20 69 6e 74 20 69 46 69 65 6c         int iFiel
3df0: 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
3e00: 6d 5b 69 5d 2d 3e 69 46 69 65 6c 64 20 2d 20 31  m[i]->iField - 1
3e10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3e20: 28 20 70 4f 72 69 67 52 68 73 2d 3e 61 5b 69 46  ( pOrigRhs->a[iF
3e30: 69 65 6c 64 5d 2e 70 45 78 70 72 21 3d 30 20 29  ield].pExpr!=0 )
3e40: 3b 0a 20 20 20 20 20 20 20 20 70 52 68 73 20 3d  ;.        pRhs =
3e50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3e60: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
3e70: 52 68 73 2c 20 70 4f 72 69 67 52 68 73 2d 3e 61  Rhs, pOrigRhs->a
3e80: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 29 3b  [iField].pExpr);
3e90: 0a 20 20 20 20 20 20 20 20 70 4f 72 69 67 52 68  .        pOrigRh
3ea0: 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  s->a[iField].pEx
3eb0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
3ec0: 61 73 73 65 72 74 28 20 70 4f 72 69 67 4c 68 73  assert( pOrigLhs
3ed0: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3ee0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
3ef0: 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78  pLhs = sqlite3Ex
3f00: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
3f10: 72 73 65 2c 20 70 4c 68 73 2c 20 70 4f 72 69 67  rse, pLhs, pOrig
3f20: 4c 68 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  Lhs->a[iField].p
3f30: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
3f40: 4f 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69 65 6c  OrigLhs->a[iFiel
3f50: 64 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  d].pExpr = 0;.  
3f60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3f80: 65 6c 65 74 65 28 64 62 2c 20 70 4f 72 69 67 52  elete(db, pOrigR
3f90: 68 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  hs);.    sqlite3
3fa0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
3fb0: 62 2c 20 70 4f 72 69 67 4c 68 73 29 3b 0a 20 20  b, pOrigLhs);.  
3fc0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 2d 3e 78    pNew->pLeft->x
3fd0: 2e 70 4c 69 73 74 20 3d 20 70 4c 68 73 3b 0a 20  .pList = pLhs;. 
3fe0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
3ff0: 63 74 2d 3e 70 45 4c 69 73 74 20 3d 20 70 52 68  ct->pEList = pRh
4000: 73 3b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 20  s;.    if( pLhs 
4010: 26 26 20 70 4c 68 73 2d 3e 6e 45 78 70 72 3d 3d  && pLhs->nExpr==
4020: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61  1 ){.      /* Ta
4030: 6b 65 20 63 61 72 65 20 68 65 72 65 20 6e 6f 74  ke care here not
4040: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 54   to generate a T
4050: 4b 5f 56 45 43 54 4f 52 20 63 6f 6e 74 61 69 6e  K_VECTOR contain
4060: 69 6e 67 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20  ing only a.     
4070: 20 2a 2a 20 73 69 6e 67 6c 65 20 76 61 6c 75 65   ** single value
4080: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 72 73  . Since the pars
4090: 65 72 20 6e 65 76 65 72 20 63 72 65 61 74 65 73  er never creates
40a0: 20 73 75 63 68 20 61 20 76 65 63 74 6f 72 2c 20   such a vector, 
40b0: 73 6f 6d 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  some.      ** of
40c0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
40d0: 20 64 6f 20 6e 6f 74 20 68 61 6e 64 6c 65 20 74   do not handle t
40e0: 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
40f0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 4c      Expr *p = pL
4100: 68 73 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  hs->a[0].pExpr;.
4110: 20 20 20 20 20 20 70 4c 68 73 2d 3e 61 5b 30 5d        pLhs->a[0]
4120: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
4130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4140: 65 74 65 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c  ete(db, pNew->pL
4150: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  eft);.      pNew
4160: 2d 3e 70 4c 65 66 74 20 3d 20 70 3b 0a 20 20 20  ->pLeft = p;.   
4170: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
4180: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
4190: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
41a0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
41b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53       /* If the S
41c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
41d0: 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20  has an ORDER BY 
41e0: 63 6c 61 75 73 65 2c 20 7a 65 72 6f 20 74 68 65  clause, zero the
41f0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
4200: 72 42 79 43 6f 6c 20 76 61 72 69 61 62 6c 65 73  rByCol variables
4210: 2e 20 54 68 65 73 65 20 61 72 65 20 73 65 74 20  . These are set 
4220: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  to non-zero when
4230: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 4f 52   an .      ** OR
4240: 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 61 63  DER BY term exac
4250: 74 6c 79 20 6d 61 74 63 68 65 73 20 6f 6e 65 20  tly matches one 
4260: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  of the terms of 
4270: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  the .      ** re
4280: 73 75 6c 74 2d 73 65 74 2e 20 53 69 6e 63 65 20  sult-set. Since 
4290: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f  the result-set o
42a0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
42b0: 74 65 6d 65 6e 74 20 6d 61 79 0a 20 20 20 20 20  tement may.     
42c0: 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   ** have been mo
42d0: 64 69 66 69 65 64 20 6f 72 20 72 65 6f 72 64 65  dified or reorde
42e0: 72 65 64 2c 20 74 68 65 73 65 20 76 61 72 69 61  red, these varia
42f0: 62 6c 65 73 20 61 72 65 20 6e 6f 20 6c 6f 6e 67  bles are no long
4300: 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  er .      ** set
4310: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 6e   correctly.  Sin
4320: 63 65 20 73 65 74 74 69 6e 67 20 74 68 65 6d 20  ce setting them 
4330: 69 73 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d  is just an optim
4340: 69 7a 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20  ization, .      
4350: 2a 2a 20 69 74 27 73 20 65 61 73 69 65 73 74 20  ** it's easiest 
4360: 6a 75 73 74 20 74 6f 20 7a 65 72 6f 20 74 68 65  just to zero the
4370: 6d 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20  m here.  */.    
4380: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4390: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
43a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
43b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
43c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
43d0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
43e0: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
43f0: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
4400: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
4410: 20 30 0a 20 20 20 20 70 72 69 6e 74 66 28 22 46   0.    printf("F
4420: 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 63 68 61  or indexing, cha
4430: 6e 67 65 20 74 68 65 20 49 4e 20 65 78 70 72 3a  nge the IN expr:
4440: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
4450: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
4460: 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 70 72 69   pX, 0);.    pri
4470: 6e 74 66 28 22 49 6e 74 6f 3a 5c 6e 22 29 3b 0a  ntf("Into:\n");.
4480: 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
4490: 69 65 77 45 78 70 72 28 30 2c 20 70 4e 65 77 2c  iewExpr(0, pNew,
44a0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
44b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
44c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
44d0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
44e0: 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
44f0: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
4500: 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
4510: 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
4520: 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
4530: 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
4540: 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
4550: 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
4560: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
4570: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
4580: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
4590: 69 73 20 6c 65 66 74 20 69 6e 20 61 20 72 65 67  is left in a reg
45a0: 69 73 74 65 72 2c 20 74 68 65 20 69 6e 64 65 78  ister, the index
45b0: 0a 2a 2a 20 6f 66 20 77 68 69 63 68 20 69 73 20  .** of which is 
45c0: 72 65 74 75 72 6e 65 64 2e 20 20 41 6e 20 61 74  returned.  An at
45d0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 73 74  tempt is made st
45e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
45f0: 6e 20 69 54 61 72 67 65 74 20 62 75 74 0a 2a 2a  n iTarget but.**
4600: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 67 75   this is only gu
4610: 61 72 61 6e 74 65 65 64 20 66 6f 72 20 54 4b 5f  aranteed for TK_
4620: 49 53 4e 55 4c 4c 20 61 6e 64 20 54 4b 5f 49 4e  ISNULL and TK_IN
4630: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49   constraints.  I
4640: 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72 61  f the.** constra
4650: 69 6e 74 20 69 73 20 61 20 54 4b 5f 45 51 20 6f  int is a TK_EQ o
4660: 72 20 54 4b 5f 49 53 2c 20 74 68 65 6e 20 74 68  r TK_IS, then th
4670: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
4680: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
4690: 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  .** some other r
46a0: 65 67 69 73 74 65 72 20 61 6e 64 20 69 74 20 69  egister and it i
46b0: 73 20 74 68 65 20 63 61 6c 6c 65 72 27 73 20 72  s the caller's r
46c0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
46d0: 20 63 6f 6d 70 65 6e 73 61 74 65 2e 0a 2a 2a 0a   compensate..**.
46e0: 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
46f0: 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
4700: 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
4710: 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
4720: 74 65 64 20 69 6e 0a 2a 2a 20 73 74 72 61 69 67  ted in.** straig
4730: 68 74 2d 6c 69 6e 65 20 63 6f 64 65 2e 20 20 46  ht-line code.  F
4740: 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
4750: 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
4760: 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
4770: 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
4780: 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
4790: 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
47a0: 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
47b0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
47c0: 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
47d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
47e0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
47f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
4800: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
4810: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
4820: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4830: 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
4840: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
4850: 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
4860: 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
4870: 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
4880: 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
4890: 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
48a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
48b0: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
48c0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
48d0: 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
48f0: 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
4900: 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
4910: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
4920: 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
4930: 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
4940: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
4950: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
4960: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
4970: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
4980: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4990: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
49a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
49b0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
49c0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
49d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  /..  assert( pLe
49e0: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 61 4c 54  vel->pWLoop->aLT
49f0: 65 72 6d 5b 69 45 71 5d 3d 3d 70 54 65 72 6d 20  erm[iEq]==pTerm 
4a00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  );.  assert( iTa
4a10: 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
4a20: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pX->op==TK_EQ ||
4a30: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29   pX->op==TK_IS )
4a40: 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
4a50: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
4a60: 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
4a70: 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
4a80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
4a90: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
4aa0: 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
4ab0: 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
4ac0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ad0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
4ae0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4af0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
4b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
4b10: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
4b20: 5f 4e 4f 4f 50 3b 0a 20 20 20 20 69 6e 74 20 69  _NOOP;.    int i
4b30: 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
4b40: 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
4b50: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
4b60: 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
4b70: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  op;.    int i;. 
4b80: 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 30 3b 0a     int nEq = 0;.
4b90: 20 20 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d      int *aiMap =
4ba0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c   0;..    if( (pL
4bb0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
4bc0: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
4bd0: 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
4be0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
4bf0: 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
4c00: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
4c10: 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
4c20: 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
4c30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4c40: 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
4c50: 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
4c60: 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
4c70: 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
4c80: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
4c90: 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
4ca0: 20 3d 20 69 54 61 72 67 65 74 3b 0a 0a 20 20 20   = iTarget;..   
4cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 45 71 3b   for(i=0; i<iEq;
4cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4cd0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69   pLoop->aLTerm[i
4ce0: 5d 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ] && pLoop->aLTe
4cf0: 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58  rm[i]->pExpr==pX
4d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
4d10: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
4d20: 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
4d30: 72 65 74 75 72 6e 20 69 54 61 72 67 65 74 3b 0a  return iTarget;.
4d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4d50: 20 20 66 6f 72 28 69 3d 69 45 71 3b 69 3c 70 4c    for(i=iEq;i<pL
4d60: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b  oop->nLTerm; i++
4d70: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4d80: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69   pLoop->aLTerm[i
4d90: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  ]!=0 );.      if
4da0: 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  ( pLoop->aLTerm[
4db0: 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 20  i]->pExpr==pX ) 
4dc0: 6e 45 71 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  nEq++;.    }..  
4dd0: 20 20 69 66 28 20 28 70 58 2d 3e 66 6c 61 67 73    if( (pX->flags
4de0: 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
4df0: 3d 3d 30 20 7c 7c 20 70 58 2d 3e 78 2e 70 53 65  ==0 || pX->x.pSe
4e00: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
4e10: 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
4e20: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
4e30: 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
4e40: 65 2c 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f  e, pX, IN_INDEX_
4e50: 4c 4f 4f 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LOOP, 0, 0);.   
4e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
4e70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4e80: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 70 58  se->db;.      pX
4e90: 20 3d 20 72 65 6d 6f 76 65 55 6e 69 6e 64 65 78   = removeUnindex
4ea0: 61 62 6c 65 49 6e 43 6c 61 75 73 65 54 65 72 6d  ableInClauseTerm
4eb0: 73 28 70 50 61 72 73 65 2c 20 69 45 71 2c 20 70  s(pParse, iEq, p
4ec0: 4c 6f 6f 70 2c 20 70 58 29 3b 0a 0a 20 20 20 20  Loop, pX);..    
4ed0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
4ee0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
4ef0: 20 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a     aiMap = (int*
4f00: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
4f10: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
4f20: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 45 71   sizeof(int)*nEq
4f30: 29 3b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  );.        eType
4f40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
4f50: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
4f60: 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
4f70: 20 30 2c 20 61 69 4d 61 70 29 3b 0a 20 20 20 20   0, aiMap);.    
4f80: 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72      pTerm->pExpr
4f90: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 58 2d 3e 69  ->iTable = pX->i
4fa0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Table;.      }. 
4fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4fc0: 44 65 6c 65 74 65 28 64 62 2c 20 70 58 29 3b 0a  Delete(db, pX);.
4fd0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
4fe0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a  ->pExpr;.    }..
4ff0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
5000: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
5010: 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  SC ){.      test
5020: 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
5030: 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
5040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62  ;.    }.    iTab
5050: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
5060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5070: 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
5080: 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
5090: 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
50a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
50b0: 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56  (v, bRev);.    V
50c0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
50d0: 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73   !bRev);.    ass
50e0: 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
50f0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
5100: 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 0a 20 20  TI_OR)==0 );..  
5110: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
5120: 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c   |= WHERE_IN_ABL
5130: 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  E;.    if( pLeve
5140: 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
5150: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
5160: 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
5170: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
5180: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 20  );.    }..    i 
5190: 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
51a0: 49 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  In;.    pLevel->
51b0: 75 2e 69 6e 2e 6e 49 6e 20 2b 3d 20 6e 45 71 3b  u.in.nIn += nEq;
51c0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
51d0: 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
51e0: 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
51f0: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
5200: 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
5210: 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
5240: 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
5250: 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
5260: 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
5270: 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
5280: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
5290: 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
52a0: 20 20 69 6e 74 20 69 4d 61 70 20 3d 20 30 3b 20    int iMap = 0; 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
52c0: 20 49 6e 64 65 78 20 69 6e 20 61 69 4d 61 70 5b   Index in aiMap[
52d0: 5d 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 20 2b  ] */.      pIn +
52e0: 3d 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = i;.      for(i
52f0: 3d 69 45 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c  =iEq;i<pLoop->nL
5300: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
5310: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
5320: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
5330: 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
5340: 20 69 6e 74 20 69 4f 75 74 20 3d 20 69 52 65 67   int iOut = iReg
5350: 20 2b 20 69 20 2d 20 69 45 71 3b 0a 20 20 20 20   + i - iEq;.    
5360: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
5370: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
5380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
5390: 65 73 74 63 61 73 65 28 20 6e 45 71 3e 31 20 29  estcase( nEq>1 )
53a0: 3b 20 20 2f 2a 20 48 61 70 70 65 6e 73 20 77 69  ;  /* Happens wi
53b0: 74 68 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65  th a UNIQUE inde
53c0: 78 20 6f 6e 20 52 4f 57 49 44 20 2a 2f 0a 20 20  x on ROWID */.  
53d0: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61            pIn->a
53e0: 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
53f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5400: 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
5410: 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iOut);.         
5420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5430: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61      int iCol = a
5440: 69 4d 61 70 20 3f 20 61 69 4d 61 70 5b 69 4d 61  iMap ? aiMap[iMa
5450: 70 2b 2b 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  p++] : 0;.      
5460: 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
5470: 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
5480: 62 65 41 64 64 4f 70 33 28 76 2c 4f 50 5f 43 6f  beAddOp3(v,OP_Co
5490: 6c 75 6d 6e 2c 69 54 61 62 2c 20 69 43 6f 6c 2c  lumn,iTab, iCol,
54a0: 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20   iOut);.        
54b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
54c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
54d0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 4f  v, OP_IsNull, iO
54e0: 75 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ut); VdbeCoverag
54f0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
5500: 69 66 28 20 69 3d 3d 69 45 71 20 29 7b 0a 20 20  if( i==iEq ){.  
5510: 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
5520: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
5530: 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e          pIn->eEn
5540: 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
5550: 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a   OP_PrevIfOpen :
5560: 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a   OP_NextIfOpen;.
5570: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
5590: 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 4f  ->eEndLoopOp = O
55a0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
55b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 49    }.          pI
55c0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n++;.        }. 
55d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
55e0: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
55f0: 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
5600: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
5610: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
5620: 2c 20 61 69 4d 61 70 29 3b 0a 23 65 6e 64 69 66  , aiMap);.#endif
5630: 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
5640: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
5650: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
5660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5670: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5680: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
5690: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
56a0: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
56b0: 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a  index scan..**.*
56c0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
56d0: 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
56e0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
56f0: 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
5700: 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
5710: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5720: 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
5730: 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
5740: 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
5750: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
5760: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
5770: 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
5780: 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
5790: 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
57a0: 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
57b0: 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
57c0: 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
57d0: 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
57e0: 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
57f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5800: 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
5810: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
5820: 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
5830: 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
5840: 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
5850: 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
5860: 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
5870: 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
5880: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
5890: 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
58a0: 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
58b0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
58c0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
58d0: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
58e0: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
58f0: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
5900: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
5910: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
5920: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5930: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
5940: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
5950: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
5960: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
5970: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
5980: 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
5990: 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
59a0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
59b0: 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72 61  e nExtraReg para
59c0: 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e  meter is 0 or 1.
59d0: 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c    It is 0 if all
59e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
59f0: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65  nstraints.** are
5a00: 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72   == or IN and ar
5a10: 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 65  e covered by the
5a20: 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67   nEq.  nExtraReg
5a30: 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20 69   is 1 if there i
5a40: 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69  s.** an inequali
5a50: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73  ty constraint (s
5a60: 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35  uch as the "c>=5
5a70: 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68   AND c<10" in th
5a80: 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a  e example) that.
5a90: 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
5aa0: 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20  the nEq quality 
5ab0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
5ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5ad0: 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67  allocates a rang
5ae0: 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52  e of nEq+nExtraR
5af0: 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  eg memory cells 
5b00: 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
5b10: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5b20: 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c  first memory cel
5b30: 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e  l in that range.
5b40: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
5b50: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
5b60: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
5b70: 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20  at memory range 
5b80: 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f  to store keys fo
5b90: 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74  r.** start and t
5ba0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
5bb0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
5bc0: 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  p..** key value 
5bd0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
5be0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
5bf0: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
5c00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
5c10: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
5c20: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
5c30: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
5c40: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
5c50: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
5c60: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
5c70: 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
5c80: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
5c90: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
5ca0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
5cb0: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
5cc0: 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
5cd0: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
5ce0: 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
5cf0: 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
5d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
5d10: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
5d20: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
5d30: 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
5d40: 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
5d50: 20 42 4c 4f 42 20 6f 72 20 4e 4f 4e 45 20 61 66   BLOB or NONE af
5d60: 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
5d70: 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
5d80: 42 4c 4f 42 2e 20 54 68 69 73 20 69 73 20 74 6f  BLOB. This is to
5d90: 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
5da0: 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
5db0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
5dc0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
5dd0: 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
5de0: 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
5df0: 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
5e00: 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
5e10: 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
5e20: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
5e30: 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
5e40: 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
5e50: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
5e60: 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
5e70: 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
5e80: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
5e90: 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
5ea0: 68 61 73 20 42 4c 4f 42 2f 4e 4f 4e 45 20 61 66  has BLOB/NONE af
5eb0: 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
5ec0: 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
5ed0: 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
5ee0: 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
5ef0: 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
5f00: 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
5f10: 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
5f20: 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
5f30: 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
5f40: 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
5f50: 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
5f60: 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
5f70: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
5f80: 46 46 5f 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61 74  FF_BLOB..*/.stat
5f90: 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
5fa0: 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
5fb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5fc0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5fd0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
5fe0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
5ff0: 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
6000: 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
6010: 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
6020: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6040: 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
6050: 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
6060: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
6070: 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
6080: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
6090: 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
60a0: 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
60b0: 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
60c0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
60d0: 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
60e0: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
60f0: 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20   u16 nEq;       
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6110: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
6120: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
6130: 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
6140: 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20    u16 nSkip;    
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66  /* Number of lef
6170: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74  t-most columns t
6180: 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65  o skip */.  Vdbe
6190: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
61a0: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
61b0: 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
61c0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
61d0: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61f0: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
6200: 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
6210: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
6220: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
6230: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
6240: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
6250: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
6260: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
6270: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
6280: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
6290: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
62c0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62e0: 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
62f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6320: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
6330: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
6340: 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20   *zAff;         
6350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
6360: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20  inity string to 
6370: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
6380: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
6390: 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
63a0: 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
63b0: 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
63c0: 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
63d0: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65  ->pWLoop;.  asse
63e0: 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
63f0: 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
6400: 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
6410: 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75    nEq = pLoop->u
6420: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53  .btree.nEq;.  nS
6430: 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b  kip = pLoop->nSk
6440: 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  ip;.  pIdx = pLo
6450: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
6460: 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
6470: 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
6480: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
6490: 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
64a0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
64b0: 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
64c0: 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
64d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
64e0: 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
64f0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
6500: 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
6510: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6520: 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
6530: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
6540: 50 61 72 73 65 2d 3e 64 62 2c 73 71 6c 69 74 65  Parse->db,sqlite
6550: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
6560: 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 49 64  r(pParse->db,pId
6570: 78 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  x));.  assert( z
6580: 41 66 66 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Aff!=0 || pParse
6590: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
65a0: 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 6b  ed );..  if( nSk
65b0: 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
65c0: 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
65d0: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
65e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
65f0: 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
6600: 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
6610: 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
6620: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
6630: 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
6640: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
6650: 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  !=0);.    VdbeCo
6660: 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
6670: 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
6680: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
6690: 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
66a0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
66b0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
66c0: 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
66e0: 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
66f0: 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47  _SeekLT:OP_SeekG
6700: 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T),.            
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
6730: 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
6740: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
6750: 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
6760: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
6770: 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
6780: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6790: 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
67a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
67b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
67c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
67d0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
67e0: 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
67f0: 65 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65 73 74  e+j);.      test
6800: 63 61 73 65 28 20 70 49 64 78 2d 3e 61 69 43 6f  case( pIdx->aiCo
6810: 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52  lumn[j]==XN_EXPR
6820: 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
6830: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6840: 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75  explainIndexColu
6850: 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a 29 29  mnName(pIdx, j))
6860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20  );.    }.  }    
6870: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
6880: 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
6890: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
68a0: 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20  assert( zAff==0 
68b0: 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  || (int)strlen(z
68c0: 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  Aff)>=nEq );.  f
68d0: 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45  or(j=nSkip; j<nE
68e0: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
68f0: 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
6900: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
6910: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
6920: 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
6930: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
6940: 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65  testcase is true
6950: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
6960: 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
6970: 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
6980: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
6990: 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
69a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
69b0: 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
69c0: 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
69d0: 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
69e0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
69f0: 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
6a00: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
6a10: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
6a20: 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  UAL );.    r1 = 
6a30: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
6a40: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
6a50: 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
6a60: 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
6a70: 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
6a80: 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
6a90: 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
6aa0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6ab0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ac0: 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
6ad0: 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
6ae0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
6b10: 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
6b20: 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
6b30: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
6b40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
6b50: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _IN ){.      if(
6b60: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 66   pTerm->pExpr->f
6b70: 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
6b80: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
6b90: 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79 20 65 76  * No affinity ev
6ba0: 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 28  er needs to be (
6bb0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 29 20 61 70  or should be) ap
6bc0: 70 6c 69 65 64 20 74 6f 20 61 20 76 61 6c 75 65  plied to a value
6bd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  .        ** from
6be0: 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 22   the RHS of an "
6bf0: 3f 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  ? IN (SELECT ...
6c00: 29 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  )" expression. T
6c10: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
6c20: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
6c30: 78 28 29 20 72 6f 75 74 69 6e 65 20 68 61 73 20  x() routine has 
6c40: 61 6c 72 65 61 64 79 20 65 6e 73 75 72 65 64 20  already ensured 
6c50: 74 68 61 74 20 74 68 65 20 0a 20 20 20 20 20 20  that the .      
6c60: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66    ** affinity of
6c70: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
6c80: 68 61 73 20 62 65 65 6e 20 61 70 70 6c 69 65 64  has been applied
6c90: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 2e 20 20   to the value.  
6ca0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
6cb0: 41 66 66 20 29 20 7a 41 66 66 5b 6a 5d 20 3d 20  Aff ) zAff[j] = 
6cc0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
6cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6ce0: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
6cf0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
6d00: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
6d10: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
6d20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
6d30: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
6d40: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
6d50: 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d 30 20 26   & TERM_IS)==0 &
6d60: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
6d70: 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29  BeNull(pRight) )
6d80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6da0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
6db0: 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
6dc0: 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  rBrk);.        V
6dd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6df0: 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
6e00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
6e10: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
6e20: 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
6e30: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
6e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
6e50: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
6e60: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
6e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6e80: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
6e90: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
6ea0: 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
6eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
6ec0: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
6ed0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
6ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6ef0: 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
6f00: 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
6f10: 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
6f20: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
6f30: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
6f40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f 73  /*.** If the mos
6f50: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
6f60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
6f70: 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67 65  a constant range
6f80: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 28   constraint.** (
6f90: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
6fa0: 29 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  ) that originate
6fb0: 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  d from the LIKE 
6fc0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
6fd0: 65 6e 20 0a 2a 2a 20 73 65 74 20 50 33 20 61 6e  en .** set P3 an
6fe0: 64 20 50 35 20 6f 6e 20 74 68 65 20 4f 50 5f 53  d P5 on the OP_S
6ff0: 74 72 69 6e 67 20 6f 70 63 6f 64 65 20 73 6f 20  tring opcode so 
7000: 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
7010: 77 69 6c 6c 20 62 65 20 63 61 73 74 0a 2a 2a 20  will be cast.** 
7020: 74 6f 20 61 20 42 4c 4f 42 20 61 74 20 61 70 70  to a BLOB at app
7030: 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73 2e 0a  ropriate times..
7040: 2a 2a 0a 2a 2a 20 54 68 65 20 4c 49 4b 45 20 6f  **.** The LIKE o
7050: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 79 73  ptimization trys
7060: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 78 20   to evaluate "x 
7070: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 61 73 20  LIKE 'abc%'" as 
7080: 61 20 72 61 6e 67 65 0a 2a 2a 20 65 78 70 72 65  a range.** expre
7090: 73 73 69 6f 6e 3a 20 22 78 3e 3d 27 41 42 43 27  ssion: "x>='ABC'
70a0: 20 41 4e 44 20 78 3c 27 61 62 64 27 22 2e 20 20   AND x<'abd'".  
70b0: 42 75 74 20 74 68 69 73 20 72 65 71 75 69 72 65  But this require
70c0: 73 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65  s that the range
70d0: 0a 2a 2a 20 73 63 61 6e 20 6c 6f 6f 70 20 72 75  .** scan loop ru
70e0: 6e 20 74 77 69 63 65 2c 20 6f 6e 63 65 20 66 6f  n twice, once fo
70f0: 72 20 73 74 72 69 6e 67 73 20 61 6e 64 20 61 20  r strings and a 
7100: 73 65 63 6f 6e 64 20 74 69 6d 65 20 66 6f 72 20  second time for 
7110: 42 4c 4f 42 73 2e 0a 2a 2a 20 54 68 65 20 4f 50  BLOBs..** The OP
7120: 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20  _String opcodes 
7130: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  on the second pa
7140: 73 73 20 63 6f 6e 76 65 72 74 20 74 68 65 20 75  ss convert the u
7150: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 0a 2a  pper and lower.*
7160: 2a 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 63  * bound string c
7170: 6f 6e 73 74 61 6e 74 73 20 74 6f 20 62 6c 6f 62  onstants to blob
7180: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
7190: 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
71a0: 73 61 72 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20  sary changes.** 
71b0: 74 6f 20 74 68 65 20 4f 50 5f 53 74 72 69 6e 67  to the OP_String
71c0: 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 74 68 61   opcodes for tha
71d0: 74 20 74 6f 20 68 61 70 70 65 6e 2e 0a 2a 2a 0a  t to happen..**.
71e0: 2a 2a 20 45 78 63 65 70 74 2c 20 6f 66 20 63 6f  ** Except, of co
71f0: 75 72 73 65 2c 20 69 66 20 53 51 4c 49 54 45 5f  urse, if SQLITE_
7200: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
7210: 48 5f 42 4c 4f 42 53 20 69 73 20 64 65 66 69 6e  H_BLOBS is defin
7220: 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 6c 79  ed, then.** only
7230: 20 74 68 65 20 6f 6e 65 20 70 61 73 73 20 74 68   the one pass th
7240: 72 6f 75 67 68 20 74 68 65 20 73 74 72 69 6e 67  rough the string
7250: 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
7260: 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ed, so this rout
7270: 69 6e 65 0a 2a 2a 20 62 65 63 6f 6d 65 73 20 61  ine.** becomes a
7280: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
7290: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b 65  c void whereLike
72a0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
72b0: 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65 20  ngFixup(.  Vdbe 
72c0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
72d0: 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20 73     /* prepared s
72e0: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
72f0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
7300: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
7310: 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  vel,     /* The 
7320: 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69  loop that contai
7330: 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ns the LIKE oper
7340: 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54  ator */.  WhereT
7350: 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20  erm *pTerm      
7360: 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20 6f    /* The upper o
7370: 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a 75  r lower bound ju
7380: 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  st coded */.){. 
7390: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
73a0: 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
73b0: 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  PT ){.    VdbeOp
73c0: 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65 72   *pOp;.    asser
73d0: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t( pLevel->iLike
73e0: 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20  RepCntr>0 );.   
73f0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
7400: 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a  beGetOp(v, -1);.
7410: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 21      assert( pOp!
7420: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
7430: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
7440: 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20 20  P_String8 .     
7450: 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
7460: 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  >pWC->pWInfo->pP
7470: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7480: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4f  Failed );.    pO
7490: 70 2d 3e 70 33 20 3d 20 28 69 6e 74 29 28 70 4c  p->p3 = (int)(pL
74a0: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
74b0: 74 72 3e 3e 31 29 3b 20 20 2f 2a 20 52 65 67 69  tr>>1);  /* Regi
74c0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 75  ster holding cou
74d0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4f 70 2d  nter */.    pOp-
74e0: 3e 70 35 20 3d 20 28 75 38 29 28 70 4c 65 76 65  >p5 = (u8)(pLeve
74f0: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 26  l->iLikeRepCntr&
7500: 31 29 3b 20 20 20 20 2f 2a 20 41 53 43 20 6f 72  1);    /* ASC or
7510: 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 7d 0a 23   DESC */.  }.}.#
7520: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 68  else.# define wh
7530: 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74  ereLikeOptimizat
7540: 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 41  ionStringFixup(A
7550: 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 23 69  ,B,C).#endif..#i
7560: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7570: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7580: 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
7590: 6e 20 69 73 20 70 61 73 73 65 64 20 66 72 6f 6d  n is passed from
75a0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
75b0: 29 20 64 6f 77 6e 20 74 6f 20 69 6e 64 69 76 69  ) down to indivi
75c0: 64 75 61 6c 20 6e 6f 64 65 73 20 6f 66 0a 2a 2a  dual nodes of.**
75d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
75e0: 74 72 65 65 20 28 62 79 20 73 71 6c 69 74 65 33  tree (by sqlite3
75f0: 57 61 6c 6b 45 78 70 72 28 29 29 20 75 73 69 6e  WalkExpr()) usin
7600: 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  g an instance of
7610: 20 74 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75   this.** structu
7620: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43 43  re..*/.struct CC
7630: 75 72 48 69 6e 74 20 7b 0a 20 20 69 6e 74 20 69  urHint {.  int i
7640: 54 61 62 43 75 72 3b 20 20 20 20 2f 2a 20 43 75  TabCur;    /* Cu
7650: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d 61 69  rsor for the mai
7660: 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  n table */.  int
7670: 20 69 49 64 78 43 75 72 3b 20 20 20 20 2f 2a 20   iIdxCur;    /* 
7680: 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  Cursor for the i
7690: 6e 64 65 78 2c 20 69 66 20 70 49 64 78 21 3d 30  ndex, if pIdx!=0
76a0: 2e 20 20 55 6e 75 73 65 64 20 6f 74 68 65 72 77  .  Unused otherw
76b0: 69 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ise */.  Index *
76c0: 70 49 64 78 3b 20 20 20 20 2f 2a 20 54 68 65 20  pIdx;    /* The 
76d0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
76e0: 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a  cess the table *
76f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
7700: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7710: 6c 65 64 20 66 6f 72 20 65 76 65 72 79 20 6e 6f  led for every no
7720: 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  de of an express
7730: 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 63 61  ion that is a ca
7740: 6e 64 69 64 61 74 65 0a 2a 2a 20 66 6f 72 20 61  ndidate.** for a
7750: 20 63 75 72 73 6f 72 20 68 69 6e 74 20 6f 6e 20   cursor hint on 
7760: 61 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e  an index cursor.
7770: 20 20 46 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20    For TK_COLUMN 
7780: 6e 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72  nodes that refer
7790: 65 6e 63 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ence.** the tabl
77a0: 65 20 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43  e CCurHint.iTabC
77b0: 75 72 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  ur, verify that 
77c0: 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
77d0: 63 61 6e 20 62 65 0a 2a 2a 20 61 63 63 65 73 73  can be.** access
77e0: 65 64 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ed through the i
77f0: 6e 64 65 78 2e 20 20 49 66 20 69 74 20 63 61 6e  ndex.  If it can
7800: 6e 6f 74 2c 20 74 68 65 6e 20 73 65 74 20 70 57  not, then set pW
7810: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
7820: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
7830: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 43   codeCursorHintC
7840: 68 65 63 6b 45 78 70 72 28 57 61 6c 6b 65 72 20  heckExpr(Walker 
7850: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
7860: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
7870: 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69 6e 74   CCurHint *pHint
7880: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43   = pWalker->u.pC
7890: 43 75 72 48 69 6e 74 3b 0a 20 20 61 73 73 65 72  CurHint;.  asser
78a0: 74 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21 3d  t( pHint->pIdx!=
78b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
78c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
78d0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
78e0: 62 6c 65 3d 3d 70 48 69 6e 74 2d 3e 69 54 61 62  ble==pHint->iTab
78f0: 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65  Cur.   && sqlite
7900: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
7910: 48 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70  Hint->pIdx, pExp
7920: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
7930: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
7940: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  eCode = 1;.  }. 
7950: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
7960: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
7970: 65 73 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e  est whether or n
7980: 6f 74 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ot expression pE
7990: 78 70 72 2c 20 77 68 69 63 68 20 77 61 73 20 70  xpr, which was p
79a0: 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63  art of a WHERE c
79b0: 6c 61 75 73 65 2c 0a 2a 2a 20 73 68 6f 75 6c 64  lause,.** should
79c0: 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   be included in 
79d0: 74 68 65 20 63 75 72 73 6f 72 2d 68 69 6e 74 20  the cursor-hint 
79e0: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
79f0: 20 69 73 20 6f 6e 20 74 68 65 20 72 68 73 0a 2a   is on the rhs.*
7a00: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  * of a LEFT JOIN
7a10: 2e 20 53 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  . Set Walker.eCo
7a20: 64 65 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 62  de to non-zero b
7a30: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
7a40: 69 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  if the .** expre
7a50: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 73 75 69  ssion is not sui
7a60: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  table..**.** An 
7a70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
7a80: 73 75 69 74 61 62 6c 65 20 69 66 20 69 74 20 6d  suitable if it m
7a90: 69 67 68 74 20 65 76 61 6c 75 61 74 65 20 74 6f  ight evaluate to
7aa0: 20 6e 6f 6e 20 4e 55 4c 4c 20 65 76 65 6e 20 69   non NULL even i
7ab0: 66 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  f.** a TK_COLUMN
7ac0: 20 6e 6f 64 65 20 74 68 61 74 20 64 6f 65 73 20   node that does 
7ad0: 61 66 66 65 63 74 20 74 68 65 20 76 61 6c 75 65  affect the value
7ae0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
7af0: 6f 6e 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  on is set.** to 
7b00: 4e 55 4c 4c 2e 20 46 6f 72 20 65 78 61 6d 70 6c  NULL. For exampl
7b10: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 6f 6c 20 49  e:.**.**   col I
7b20: 53 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f 6c 20  S NULL.**   col 
7b30: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2a 20 20  IS NOT NULL.**  
7b40: 20 63 6f 61 6c 65 73 63 65 28 63 6f 6c 2c 20 31   coalesce(col, 1
7b50: 29 0a 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e  ).**   CASE WHEN
7b60: 20 63 6f 6c 20 54 48 45 4e 20 30 20 45 4c 53 45   col THEN 0 ELSE
7b70: 20 31 20 45 4e 44 0a 2a 2f 0a 73 74 61 74 69 63   1 END.*/.static
7b80: 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72 48   int codeCursorH
7b90: 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e 28  intIsOrFunction(
7ba0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
7bb0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
7bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
7bd0: 54 4b 5f 49 53 20 0a 20 20 20 7c 7c 20 70 45 78  TK_IS .   || pEx
7be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pr->op==TK_ISNUL
7bf0: 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  L || pExpr->op==
7c00: 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 7c 7c 20  TK_ISNOT .   || 
7c10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
7c20: 54 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72 2d 3e  TNULL || pExpr->
7c30: 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 0a 20 20 29  op==TK_CASE .  )
7c40: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
7c50: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Code = 1;.  }els
7c60: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
7c70: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
7c80: 20 20 20 20 69 6e 74 20 64 31 3b 0a 20 20 20 20      int d1;.    
7c90: 63 68 61 72 20 64 32 5b 34 5d 3b 0a 20 20 20 20  char d2[4];.    
7ca0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 49 73  if( 0==sqlite3Is
7cb0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 70 57 61  LikeFunction(pWa
7cc0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
7cd0: 2c 20 70 45 78 70 72 2c 20 26 64 31 2c 20 64 32  , pExpr, &d1, d2
7ce0: 29 20 29 7b 0a 20 20 20 20 20 20 70 57 61 6c 6b  ) ){.      pWalk
7cf0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
7d00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
7d10: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
7d20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
7d30: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
7d40: 65 64 20 6f 6e 20 65 76 65 72 79 20 6e 6f 64 65  ed on every node
7d50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7d60: 6e 20 74 72 65 65 20 75 73 65 64 20 61 73 20 61  n tree used as a
7d70: 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  n.** argument to
7d80: 20 74 68 65 20 4f 50 5f 43 75 72 73 6f 72 48 69   the OP_CursorHi
7d90: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  nt instruction. 
7da0: 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 61  If the node is a
7db0: 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 74 68   TK_COLUMN.** th
7dc0: 61 74 20 61 63 63 65 73 73 65 73 20 61 6e 79 20  at accesses any 
7dd0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
7de0: 20 74 68 65 20 6f 6e 65 20 69 64 65 6e 74 69 66   the one identif
7df0: 69 65 64 20 62 79 0a 2a 2a 20 43 43 75 72 48 69  ied by.** CCurHi
7e00: 6e 74 2e 69 54 61 62 43 75 72 2c 20 74 68 65 6e  nt.iTabCur, then
7e10: 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
7e20: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 61 6c  g:.**.**   1) al
7e30: 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
7e40: 72 20 61 6e 64 20 63 6f 64 65 20 61 6e 20 4f 50  r and code an OP
7e50: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
7e60: 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a 2a 2a 20  ion to read .** 
7e70: 20 20 20 20 20 74 68 65 20 73 70 65 63 69 66 69       the specifi
7e80: 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 74  ed column into t
7e90: 68 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 2c  he new register,
7ea0: 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20   and.**.**   2) 
7eb0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 65 78  transform the ex
7ec0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
7ed0: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6e   a TK_REGISTER n
7ee0: 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20 0a  ode that reads .
7ef0: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
7f00: 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61 74 65 64   newly populated
7f10: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
7f20: 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 6e 6f   Also, if the no
7f30: 64 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d  de is a TK_COLUM
7f40: 4e 20 74 68 61 74 20 64 6f 65 73 20 61 63 63 65  N that does acce
7f50: 73 73 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  ss the table ide
7f60: 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 43 43  nified.** by pCC
7f70: 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20  urHint.iTabCur, 
7f80: 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20  and an index is 
7f90: 62 65 69 6e 67 20 75 73 65 64 20 28 77 68 69 63  being used (whic
7fa0: 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 6b 6e 6f  h we will.** kno
7fb0: 77 20 62 65 63 61 75 73 65 20 43 43 75 72 48 69  w because CCurHi
7fc0: 6e 74 2e 70 49 64 78 21 3d 30 29 20 74 68 65 6e  nt.pIdx!=0) then
7fd0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 54   transform the T
7fe0: 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f 0a 2a 2a  K_COLUMN into.**
7ff0: 20 61 6e 20 61 63 63 65 73 73 20 6f 66 20 74 68   an access of th
8000: 65 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  e index rather t
8010: 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  han the original
8020: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
8030: 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72  c int codeCursor
8040: 48 69 6e 74 46 69 78 45 78 70 72 28 57 61 6c 6b  HintFixExpr(Walk
8050: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
8060: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
8070: 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e 74 69 6e   rc = WRC_Contin
8080: 75 65 3b 0a 20 20 73 74 72 75 63 74 20 43 43 75  ue;.  struct CCu
8090: 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70  rHint *pHint = p
80a0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48  Walker->u.pCCurH
80b0: 69 6e 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  int;.  if( pExpr
80c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
80d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
80e0: 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69 6e 74 2d  ->iTable!=pHint-
80f0: 3e 69 54 61 62 43 75 72 20 29 7b 0a 20 20 20 20  >iTabCur ){.    
8100: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 61 6c    Vdbe *v = pWal
8110: 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  ker->pParse->pVd
8120: 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  be;.      int re
8130: 67 20 3d 20 2b 2b 70 57 61 6c 6b 65 72 2d 3e 70  g = ++pWalker->p
8140: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f  Parse->nMem;   /
8150: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 63  * Register for c
8160: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olumn value */. 
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8180: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
8190: 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  able(.          
81a0: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
81b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
81c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72  Expr->iColumn, r
81d0: 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  eg.      );.    
81e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
81f0: 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
8200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
8210: 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20   reg;.    }else 
8220: 69 66 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21  if( pHint->pIdx!
8230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
8240: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 48 69 6e  r->iTable = pHin
8250: 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  t->iIdxCur;.    
8260: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8270: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
8280: 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70  OfIndex(pHint->p
8290: 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
82a0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  umn);.      asse
82b0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
82c0: 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  mn>=0 );.    }. 
82d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
82e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
82f0: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  CTION ){.    /* 
8300: 41 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  An aggregate fun
8310: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 57 48 45  ction in the WHE
8320: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  RE clause of a q
8330: 75 65 72 79 20 6d 65 61 6e 73 20 74 68 69 73 20  uery means this 
8340: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 61  must.    ** be a
8350: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
8360: 71 75 65 72 79 2c 20 61 6e 64 20 65 78 70 72 65  query, and expre
8370: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
8380: 6e 20 61 67 67 72 65 67 61 74 65 20 66 72 6f 6d  n aggregate from
8390: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 65  .    ** the pare
83a0: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44 6f 20 6e  nt context. Do n
83b0: 6f 74 20 77 61 6c 6b 20 74 68 65 20 66 75 6e 63  ot walk the func
83c0: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
83d0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
83e0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a   **.    ** todo:
83f0: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 6f   It should be po
8400: 73 73 69 62 6c 65 20 74 6f 20 72 65 70 6c 61 63  ssible to replac
8410: 65 20 74 68 69 73 20 6e 6f 64 65 20 77 69 74 68  e this node with
8420: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20   a TK_REGISTER. 
8430: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8440: 2c 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  , as the result 
8450: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
8460: 6e 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  n must be stored
8470: 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a 20 72 65   in a .    ** re
8480: 67 69 73 74 65 72 20 61 74 20 74 68 69 73 20 70  gister at this p
8490: 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d 65 20 68  oint. The same h
84a0: 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41 47 47 5f  olds for TK_AGG_
84b0: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f  COLUMN nodes. */
84c0: 0a 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72  .    rc = WRC_Pr
84d0: 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
84e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
84f0: 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43 75 72 73  nsert an OP_Curs
8500: 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69  orHint instructi
8510: 6f 6e 20 69 66 20 69 74 20 69 73 20 61 70 70 72  on if it is appr
8520: 6f 70 72 69 61 74 65 20 74 6f 20 64 6f 20 73 6f  opriate to do so
8530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8540: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
8550: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
8560: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
8570: 2c 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ,  /* FROM claus
8580: 65 20 69 74 65 6d 20 2a 2f 0a 20 20 57 68 65 72  e item */.  Wher
8590: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
85a0: 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 63    /* The where c
85b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
85c0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
85d0: 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 74   /* Which loop t
85e0: 6f 20 70 72 6f 76 69 64 65 20 68 69 6e 74 73 20  o provide hints 
85f0: 66 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  for */.  WhereTe
8600: 72 6d 20 2a 70 45 6e 64 52 61 6e 67 65 20 20 2f  rm *pEndRange  /
8610: 2a 20 48 69 6e 74 20 74 68 69 73 20 65 6e 64 2d  * Hint this end-
8620: 6f 66 2d 73 63 61 6e 20 62 6f 75 6e 64 61 72 79  of-scan boundary
8630: 20 74 65 72 6d 20 69 66 20 6e 6f 74 20 4e 55 4c   term if not NUL
8640: 4c 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  L */.){.  Parse 
8650: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
8660: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
8670: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8680: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
8690: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
86a0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
86b0: 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   0;.  WhereLoop 
86c0: 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d  *pLoop = pLevel-
86d0: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69  >pWLoop;.  int i
86e0: 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
86f0: 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
8700: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
8710: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
8720: 74 20 43 43 75 72 48 69 6e 74 20 73 48 69 6e 74  t CCurHint sHint
8730: 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  ;.  Walker sWalk
8740: 65 72 3b 0a 0a 20 20 69 66 28 20 4f 70 74 69 6d  er;..  if( Optim
8750: 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
8760: 64 62 2c 20 53 51 4c 49 54 45 5f 43 75 72 73 6f  db, SQLITE_Curso
8770: 72 48 69 6e 74 73 29 20 29 20 72 65 74 75 72 6e  rHints) ) return
8780: 3b 0a 20 20 69 43 75 72 20 3d 20 70 4c 65 76 65  ;.  iCur = pLeve
8790: 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 61 73  l->iTabCur;.  as
87a0: 73 65 72 74 28 20 69 43 75 72 3d 3d 70 57 49 6e  sert( iCur==pWIn
87b0: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
87c0: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
87d0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 48 69 6e  Cursor );.  sHin
87e0: 74 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  t.iTabCur = iCur
87f0: 3b 0a 20 20 73 48 69 6e 74 2e 69 49 64 78 43 75  ;.  sHint.iIdxCu
8800: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
8810: 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e 70 49 64  Cur;.  sHint.pId
8820: 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
8830: 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 6d 65 6d  ee.pIndex;.  mem
8840: 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
8850: 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29   sizeof(sWalker)
8860: 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  );.  sWalker.pPa
8870: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
8880: 73 57 61 6c 6b 65 72 2e 75 2e 70 43 43 75 72 48  sWalker.u.pCCurH
8890: 69 6e 74 20 3d 20 26 73 48 69 6e 74 3b 0a 20 20  int = &sHint;.  
88a0: 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
88b0: 57 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  WC;.  for(i=0; i
88c0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
88d0: 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  ){.    pTerm = &
88e0: 70 57 43 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69  pWC->a[i];.    i
88f0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
8900: 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
8910: 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
8920: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8930: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ( pTerm->prereqA
8940: 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
8950: 52 65 61 64 79 20 29 20 63 6f 6e 74 69 6e 75 65  Ready ) continue
8960: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 74 65  ;..    /* Any te
8970: 72 6d 73 20 73 70 65 63 69 66 69 65 64 20 61 73  rms specified as
8980: 20 70 61 72 74 20 6f 66 20 74 68 65 20 4f 4e 28   part of the ON(
8990: 2e 2e 2e 29 20 63 6c 61 75 73 65 20 66 6f 72 20  ...) clause for 
89a0: 61 6e 79 20 4c 45 46 54 20 0a 20 20 20 20 2a 2a  any LEFT .    **
89b0: 20 4a 4f 49 4e 20 66 6f 72 20 77 68 69 63 68 20   JOIN for which 
89c0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
89d0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 72 68 73  e is not the rhs
89e0: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20   are omitted.   
89f0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75 72   ** from the cur
8a00: 73 6f 72 2d 68 69 6e 74 2e 20 0a 20 20 20 20 2a  sor-hint. .    *
8a10: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
8a20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 68   table is the rh
8a30: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
8a40: 2c 20 22 49 53 22 20 6f 72 20 22 49 53 20 4e 55  , "IS" or "IS NU
8a50: 4c 4c 22 20 74 65 72 6d 73 20 0a 20 20 20 20 2a  LL" terms .    *
8a60: 2a 20 74 68 61 74 20 77 65 72 65 20 73 70 65 63  * that were spec
8a70: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
8a80: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8a90: 65 20 6d 75 73 74 20 62 65 20 65 78 63 6c 75 64  e must be exclud
8aa0: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ed..    ** This 
8ab0: 69 73 20 74 6f 20 61 64 64 72 65 73 73 20 74 68  is to address th
8ac0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
8ad0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
8ae0: 45 43 54 20 2e 2e 2e 20 74 31 20 4c 45 46 54 20  ECT ... t1 LEFT 
8af0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 74 31 2e 61  JOIN t2 ON (t1.a
8b00: 3d 74 32 2e 62 29 20 57 48 45 52 45 20 74 32 2e  =t2.b) WHERE t2.
8b10: 63 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a  c IS NULL;.    *
8b20: 2a 0a 20 20 20 20 2a 2a 20 53 61 79 20 74 68 65  *.    ** Say the
8b30: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72  re is a single r
8b40: 6f 77 20 69 6e 20 74 32 20 74 68 61 74 20 6d 61  ow in t2 that ma
8b50: 74 63 68 65 73 20 28 74 31 2e 61 3d 74 32 2e 62  tches (t1.a=t2.b
8b60: 29 2c 20 62 75 74 20 69 74 73 0a 20 20 20 20 2a  ), but its.    *
8b70: 2a 20 74 32 2e 63 20 76 61 6c 75 65 73 20 69 73  * t2.c values is
8b80: 20 6e 6f 74 20 4e 55 4c 4c 2e 20 49 66 20 74 68   not NULL. If th
8b90: 65 20 28 74 32 2e 63 20 49 53 20 4e 55 4c 4c 29  e (t2.c IS NULL)
8ba0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 0a   constraint is .
8bb0: 20 20 20 20 2a 2a 20 70 75 73 68 65 64 20 64 6f      ** pushed do
8bc0: 77 6e 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  wn to the cursor
8bd0: 2c 20 74 68 69 73 20 72 6f 77 20 69 73 20 66 69  , this row is fi
8be0: 6c 74 65 72 65 64 20 6f 75 74 2c 20 63 61 75 73  ltered out, caus
8bf0: 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ing.    ** SQLit
8c00: 65 20 74 6f 20 73 79 6e 74 68 65 73 69 7a 65 20  e to synthesize 
8c10: 61 20 72 6f 77 20 6f 66 20 4e 55 4c 4c 20 76 61  a row of NULL va
8c20: 6c 75 65 73 2e 20 57 68 69 63 68 20 64 6f 65 73  lues. Which does
8c30: 20 6d 61 74 63 68 20 74 68 65 0a 20 20 20 20 2a   match the.    *
8c40: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  * WHERE clause, 
8c50: 61 6e 64 20 73 6f 20 74 68 65 20 71 75 65 72 79  and so the query
8c60: 20 72 65 74 75 72 6e 73 20 61 20 72 6f 77 2e 20   returns a row. 
8c70: 57 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  Which is incorre
8c80: 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
8c90: 2a 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  * For the same r
8ca0: 65 61 73 6f 6e 2c 20 57 48 45 52 45 20 74 65 72  eason, WHERE ter
8cb0: 6d 73 20 73 75 63 68 20 61 73 3a 0a 20 20 20 20  ms such as:.    
8cc0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 57 48 45 52  **.    **   WHER
8cd0: 45 20 31 20 3d 20 28 74 32 2e 63 20 49 53 20 4e  E 1 = (t2.c IS N
8ce0: 55 4c 4c 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ULL).    **.    
8cf0: 2a 2a 20 61 72 65 20 61 6c 73 6f 20 65 78 63 6c  ** are also excl
8d00: 75 64 65 64 2e 20 53 65 65 20 63 6f 64 65 43 75  uded. See codeCu
8d10: 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e 63  rsorHintIsOrFunc
8d20: 74 69 6f 6e 28 29 20 66 6f 72 20 64 65 74 61 69  tion() for detai
8d30: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
8d40: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
8d50: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
8d60: 46 54 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  FT ){.      Expr
8d70: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
8d80: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
8d90: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8da0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
8db0: 6d 4a 6f 69 6e 29 20 0a 20 20 20 20 20 20 20 7c  mJoin) .       |
8dc0: 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
8dd0: 6f 69 6e 54 61 62 6c 65 21 3d 70 54 61 62 49 74  oinTable!=pTabIt
8de0: 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20 20  em->iCursor.    
8df0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 57 61    ){.        sWa
8e00: 6c 6b 65 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  lker.eCode = 0;.
8e10: 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65 72 2e          sWalker.
8e20: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
8e30: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73  codeCursorHintIs
8e40: 4f 72 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20  OrFunction;.    
8e50: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
8e60: 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 54  xpr(&sWalker, pT
8e70: 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
8e80: 20 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72       if( sWalker
8e90: 2e 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75  .eCode ) continu
8ea0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
8eb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
8ec0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8ed0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
8ee0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
8ef0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
8f00: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 69    /* All terms i
8f10: 6e 20 70 57 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  n pWLoop->aLTerm
8f20: 5b 5d 20 65 78 63 65 70 74 20 70 45 6e 64 52 61  [] except pEndRa
8f30: 6e 67 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  nge are used to 
8f40: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
8f50: 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  * the cursor.  T
8f60: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e  hese terms are n
8f70: 6f 74 20 6e 65 65 64 65 64 20 61 73 20 68 69 6e  ot needed as hin
8f80: 74 73 20 66 6f 72 20 61 20 70 75 72 65 20 72 61  ts for a pure ra
8f90: 6e 67 65 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20  nge.    ** scan 
8fa0: 28 74 68 61 74 20 68 61 73 20 6e 6f 20 3d 3d 20  (that has no == 
8fb0: 74 65 72 6d 73 29 20 73 6f 20 6f 6d 69 74 20 74  terms) so omit t
8fc0: 68 65 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  hem. */.    if( 
8fd0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
8fe0: 45 71 3d 3d 30 20 26 26 20 70 54 65 72 6d 21 3d  Eq==0 && pTerm!=
8ff0: 70 45 6e 64 52 61 6e 67 65 20 29 7b 0a 20 20 20  pEndRange ){.   
9000: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
9010: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
9020: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21  Loop->aLTerm[j]!
9030: 3d 70 54 65 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20  =pTerm; j++){}. 
9040: 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
9050: 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69  ->nLTerm ) conti
9060: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
9070: 2f 2a 20 4e 6f 20 73 75 62 71 75 65 72 69 65 73  /* No subqueries
9080: 20 6f 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   or non-determin
9090: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  istic functions 
90a0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69  allowed */.    i
90b0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
90c0: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 70  ntainsSubquery(p
90d0: 54 65 72 6d 2d 3e 70 45 78 70 72 29 20 29 20 63  Term->pExpr) ) c
90e0: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
90f0: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
9100: 61 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  an, make sure re
9110: 66 65 72 65 6e 63 65 64 20 63 6f 6c 75 6d 6e 73  ferenced columns
9120: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 69 6e   are actually in
9130: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
9140: 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 48  x. */.    if( sH
9150: 69 6e 74 2e 70 49 64 78 21 3d 30 20 29 7b 0a 20  int.pIdx!=0 ){. 
9160: 20 20 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f       sWalker.eCo
9170: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 57  de = 0;.      sW
9180: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
9190: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
91a0: 48 69 6e 74 43 68 65 63 6b 45 78 70 72 3b 0a 20  HintCheckExpr;. 
91b0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
91c0: 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
91d0: 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
91e0: 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e      if( sWalker.
91f0: 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  eCode ) continue
9200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9210: 49 66 20 77 65 20 73 75 72 76 69 76 65 20 61 6c  If we survive al
9220: 6c 20 70 72 69 6f 72 20 74 65 73 74 73 2c 20 74  l prior tests, t
9230: 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 74  hat means this t
9240: 65 72 6d 20 69 73 20 77 6f 72 74 68 20 68 69 6e  erm is worth hin
9250: 74 69 6e 67 20 2a 2f 0a 20 20 20 20 70 45 78 70  ting */.    pExp
9260: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
9270: 6e 64 28 64 62 2c 20 70 45 78 70 72 2c 20 73 71  nd(db, pExpr, sq
9280: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9290: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
92a0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  ));.  }.  if( pE
92b0: 78 70 72 21 3d 30 20 29 7b 0a 20 20 20 20 73 57  xpr!=0 ){.    sW
92c0: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
92d0: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
92e0: 48 69 6e 74 46 69 78 45 78 70 72 3b 0a 20 20 20  HintFixExpr;.   
92f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
9300: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  (&sWalker, pExpr
9310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9320: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
9330: 75 72 73 6f 72 48 69 6e 74 2c 20 0a 20 20 20 20  ursorHint, .    
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 28 73 48 69 6e 74 2e 70 49 64 78 20 3f 20    (sHint.pIdx ? 
9360: 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20 3a 20  sHint.iIdxCur : 
9370: 73 48 69 6e 74 2e 69 54 61 62 43 75 72 29 2c 20  sHint.iTabCur), 
9380: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
9390: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
93a0: 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2c 20  st char*)pExpr, 
93b0: 50 34 5f 45 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a  P4_EXPR);.  }.}.
93c0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63  #else.# define c
93d0: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 41 2c  odeCursorHint(A,
93e0: 42 2c 43 2c 44 29 20 20 2f 2a 20 4e 6f 2d 6f 70  B,C,D)  /* No-op
93f0: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
9400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9410: 4f 52 5f 48 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a  OR_HINTS */../*.
9420: 2a 2a 20 43 75 72 73 6f 72 20 69 43 75 72 20 69  ** Cursor iCur i
9430: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
9440: 6b 65 79 20 62 2d 74 72 65 65 20 28 61 20 74 61  key b-tree (a ta
9450: 62 6c 65 29 2e 20 52 65 67 69 73 74 65 72 20 69  ble). Register i
9460: 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 0a 2a  Rowid contains.*
9470: 2a 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 20  * a rowid value 
9480: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 63  just read from c
9490: 75 72 73 6f 72 20 69 49 64 78 43 75 72 2c 20 6f  ursor iIdxCur, o
94a0: 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 70 49 64  pen on index pId
94b0: 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
94c0: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ion generates co
94d0: 64 65 20 74 6f 20 64 6f 20 61 20 64 65 66 65 72  de to do a defer
94e0: 72 65 64 20 73 65 65 6b 20 6f 66 20 63 75 72 73  red seek of curs
94f0: 6f 72 20 69 43 75 72 20 74 6f 20 74 68 65 20 0a  or iCur to the .
9500: 2a 2a 20 72 6f 77 69 64 20 73 74 6f 72 65 64 20  ** rowid stored 
9510: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 6f 77  in register iRow
9520: 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  id..**.** Normal
9530: 6c 79 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74  ly, this is just
9540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 50 5f 44 65 66  :.**.**   OP_Def
9550: 65 72 72 65 64 53 65 65 6b 20 24 69 43 75 72 20  erredSeek $iCur 
9560: 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f  $iRowid.**.** Ho
9570: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 63  wever, if the sc
9580: 61 6e 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  an currently bei
9590: 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20 62 72  ng coded is a br
95a0: 61 6e 63 68 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f  anch of an OR-lo
95b0: 6f 70 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 74  op and.** the st
95c0: 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
95d0: 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73  y being coded is
95e0: 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20   a SELECT, then 
95f0: 50 33 20 6f 66 20 4f 50 5f 44 65 66 65 72 72 65  P3 of OP_Deferre
9600: 64 53 65 65 6b 0a 2a 2a 20 69 73 20 73 65 74 20  dSeek.** is set 
9610: 74 6f 20 69 49 64 78 43 75 72 20 61 6e 64 20 50  to iIdxCur and P
9620: 34 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  4 is set to poin
9630: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
9640: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 63 6f 6e   integers.** con
9650: 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e 74 72  taining one entr
9660: 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  y for each colum
9670: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  n of the table c
9680: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
9690: 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46 6f 72 20 65  en .** on. For e
96a0: 61 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ach table column
96b0: 2c 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , if the column 
96c0: 69 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  is the i'th colu
96d0: 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  mn of the .** in
96e0: 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  dex, then the co
96f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72 72 61  rresponding arra
9700: 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74  y entry is set t
9710: 6f 20 28 69 2b 31 29 2e 20 49 66 20 74 68 65 20  o (i+1). If the 
9720: 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f 65 73 20 6e  column.** does n
9730: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
9740: 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2c 20 74   index at all, t
9750: 68 65 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  he array entry i
9760: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
9770: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
9780: 65 66 65 72 72 65 64 53 65 65 6b 28 0a 20 20 57  eferredSeek(.  W
9790: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
97b0: 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 63  * Where clause c
97c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
97d0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
97f0: 6e 64 65 78 20 73 63 61 6e 20 69 73 20 75 73 69  ndex scan is usi
9800: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ng */.  int iCur
9810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9820: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9830: 72 20 66 6f 72 20 49 50 4b 20 62 2d 74 72 65 65  r for IPK b-tree
9840: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
9850: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
9860: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
9870: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 50 61  ursor */.){.  Pa
9880: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
9890: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 2f 2a  Info->pParse; /*
98a0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
98b0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
98c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
98d0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 67      /* Vdbe to g
98e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 69 74  enerate code wit
98f0: 68 69 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hin */..  assert
9900: 28 20 69 49 64 78 43 75 72 3e 30 20 29 3b 0a 20  ( iIdxCur>0 );. 
9910: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
9920: 69 43 6f 6c 75 6d 6e 5b 70 49 64 78 2d 3e 6e 43  iColumn[pIdx->nC
9930: 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31 20 29 3b 0a  olumn-1]==-1 );.
9940: 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65    .  sqlite3Vdbe
9950: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 66  AddOp3(v, OP_Def
9960: 65 72 72 65 64 53 65 65 6b 2c 20 69 49 64 78 43  erredSeek, iIdxC
9970: 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a 20 20  ur, 0, iCur);.  
9980: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
9990: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
99a0: 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a 20 20  OR_SUBCLAUSE).  
99b0: 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   && DbMaskAllZer
99c0: 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  o(sqlite3ParseTo
99d0: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 2d 3e  plevel(pParse)->
99e0: 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29 7b 0a  writeMask).  ){.
99f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
9a00: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
9a10: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 69  x->pTable;.    i
9a20: 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a 29 73  nt *ai = (int*)s
9a30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9a40: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
9a50: 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54 61 62  izeof(int)*(pTab
9a60: 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  ->nCol+1));.    
9a70: 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20 20 20  if( ai ){.      
9a80: 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 43  ai[0] = pTab->nC
9a90: 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ol;.      for(i=
9aa0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
9ab0: 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn-1; i++){.    
9ac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9ad0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 70 54  ->aiColumn[i]<pT
9ae0: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
9af0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9b00: 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 20 61  Column[i]>=0 ) a
9b10: 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  i[pIdx->aiColumn
9b20: 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a 20 20  [i]+1] = i+1;.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9b40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
9b50: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 61 69  v, -1, (char*)ai
9b60: 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
9b70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9b80: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9b90: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
9ba0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
9bb0: 6e 74 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  nt is a vector, 
9bc0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
9bd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 66 69   to write the fi
9be0: 72 73 74 20 6e 52 65 67 20 65 6c 65 6d 65 6e 74  rst nReg element
9bf0: 73 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  s of the vector 
9c00: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 0a 2a 2a  into an array.**
9c10: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
9c20: 61 72 74 69 6e 67 20 77 69 74 68 20 69 52 65 67  arting with iReg
9c30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9c40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
9c50: 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20   a vector, then 
9c60: 6e 52 65 67 20 6d 75 73 74 20 62 65 20 70 61 73  nReg must be pas
9c70: 73 65 64 20 31 2e 20 49 6e 0a 2a 2a 20 74 68 69  sed 1. In.** thi
9c80: 73 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65  s case, generate
9c90: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
9ca0: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
9cb0: 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 0a 2a   and leave the.*
9cc0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  * result in regi
9cd0: 73 74 65 72 20 69 52 65 67 2e 0a 2a 2f 0a 73 74  ster iReg..*/.st
9ce0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 78  atic void codeEx
9cf0: 70 72 4f 72 56 65 63 74 6f 72 28 50 61 72 73 65  prOrVector(Parse
9d00: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
9d10: 70 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  p, int iReg, int
9d20: 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
9d30: 28 20 6e 52 65 67 3e 30 20 29 3b 0a 20 20 69 66  ( nReg>0 );.  if
9d40: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 45 78  ( p && sqlite3Ex
9d50: 70 72 49 73 56 65 63 74 6f 72 28 70 29 20 29 7b  prIsVector(p) ){
9d60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d70: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9d80: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
9d90: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
9da0: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
9db0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9dc0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 6c  ;.      int iSel
9dd0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ect = sqlite3Cod
9de0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
9df0: 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, p, 0, 0);.   
9e00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9e10: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
9e20: 20 69 53 65 6c 65 63 74 2c 20 69 52 65 67 2c 20   iSelect, iReg, 
9e30: 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  nReg-1);.    }el
9e40: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
9e50: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9e60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9e70: 73 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b  st = p->x.pList;
9e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
9e90: 52 65 67 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  Reg<=pList->nExp
9ea0: 72 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r );.      for(i
9eb0: 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29  =0; i<nReg; i++)
9ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9ed0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9ee0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
9ef0: 78 70 72 2c 20 69 52 65 67 2b 69 29 3b 0a 20 20  xpr, iReg+i);.  
9f00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9f10: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
9f20: 20 6e 52 65 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nReg==1 );.    
9f30: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9f40: 70 50 61 72 73 65 2c 20 70 2c 20 69 52 65 67 29  pParse, p, iReg)
9f50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 69  ;.  }.}../* An i
9f60: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 49  nstance of the I
9f70: 64 78 45 78 70 72 54 72 61 6e 73 20 6f 62 6a 65  dxExprTrans obje
9f80: 63 74 20 63 61 72 72 69 65 73 20 69 6e 66 6f 72  ct carries infor
9f90: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
9fa0: 2a 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 61  * mapping from a
9fb0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  n expression on 
9fc0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
9fd0: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  to a column in a
9fe0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 64 6f 77 6e 20  n index.** down 
9ff0: 74 68 72 6f 75 67 68 20 74 68 65 20 57 61 6c 6b  through the Walk
a000: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
a010: 74 72 75 63 74 20 49 64 78 45 78 70 72 54 72 61  truct IdxExprTra
a020: 6e 73 20 7b 0a 20 20 45 78 70 72 20 2a 70 49 64  ns {.  Expr *pId
a030: 78 45 78 70 72 3b 20 20 20 20 2f 2a 20 54 68 65  xExpr;    /* The
a040: 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
a050: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  n */.  int iTabC
a060: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
a070: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63   cursor of the c
a080: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
a090: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  le */.  int iIdx
a0a0: 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
a0b0: 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
a0c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
a0d0: 69 49 64 78 43 6f 6c 3b 20 20 20 20 20 20 20 2f  iIdxCol;       /
a0e0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  * The column for
a0f0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 20   the index */.} 
a100: 49 64 78 45 78 70 72 54 72 61 6e 73 3b 0a 0a 2f  IdxExprTrans;../
a110: 2a 20 54 68 65 20 77 61 6c 6b 65 72 20 6e 6f 64  * The walker nod
a120: 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  e callback used 
a130: 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74  to transform mat
a140: 63 68 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ching expression
a150: 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 66 65  s into.** a refe
a160: 72 65 6e 63 65 20 74 6f 20 61 6e 20 69 6e 64 65  rence to an inde
a170: 78 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6e 20  x column for an 
a180: 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78 70 72  index on an expr
a190: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
a1a0: 20 70 45 78 70 72 20 6d 61 74 63 68 65 73 2c 20   pExpr matches, 
a1b0: 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 69  then transform i
a1c0: 74 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e  t into a referen
a1d0: 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
a1e0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 63  column.** that c
a1f0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
a200: 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  e of pExpr..*/.s
a210: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
a220: 6e 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64  ndexExprTransNod
a230: 65 28 57 61 6c 6b 65 72 20 2a 70 2c 20 45 78 70  e(Walker *p, Exp
a240: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 49 64 78  r *pExpr){.  Idx
a250: 45 78 70 72 54 72 61 6e 73 20 2a 70 58 20 3d 20  ExprTrans *pX = 
a260: 70 2d 3e 75 2e 70 49 64 78 54 72 61 6e 73 3b 0a  p->u.pIdxTrans;.
a270: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
a280: 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
a290: 72 2c 20 70 58 2d 3e 70 49 64 78 45 78 70 72 2c  r, pX->pIdxExpr,
a2a0: 20 70 58 2d 3e 69 54 61 62 43 75 72 29 3d 3d 30   pX->iTabCur)==0
a2b0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   ){.    pExpr->o
a2c0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
a2d0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
a2e0: 20 3d 20 70 58 2d 3e 69 49 64 78 43 75 72 3b 0a   = pX->iIdxCur;.
a2f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
a300: 6d 6e 20 3d 20 70 58 2d 3e 69 49 64 78 43 6f 6c  mn = pX->iIdxCol
a310: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
a320: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
a330: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
a340: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
a350: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
a360: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20   }.}../*.** For 
a370: 61 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20 65 78  an indexes on ex
a380: 70 72 65 73 73 69 6f 6e 20 58 2c 20 6c 6f 63 61  pression X, loca
a390: 74 65 20 65 76 65 72 79 20 69 6e 73 74 61 6e 63  te every instanc
a3a0: 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  e of expression 
a3b0: 58 0a 2a 2a 20 69 6e 20 70 45 78 70 72 20 61 6e  X.** in pExpr an
a3c0: 64 20 63 68 61 6e 67 65 20 74 68 61 74 20 73 75  d change that su
a3d0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f  bexpression into
a3e0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
a3f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
a400: 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ** column of the
a410: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
a420: 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 64 65  c void whereInde
a430: 78 45 78 70 72 54 72 61 6e 73 28 0a 20 20 49 6e  xExprTrans(.  In
a440: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
a450: 2f 2a 20 54 68 65 20 49 6e 64 65 78 20 2a 2f 0a  /* The Index */.
a460: 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
a470: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
a480: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
a490: 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  is being indexed
a4a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
a4b0: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
a4c0: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
a4d0: 74 73 65 6c 66 20 2a 2f 0a 20 20 57 68 65 72 65  tself */.  Where
a4e0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 2f 2a 20  Info *pWInfo /* 
a4f0: 54 72 61 6e 73 66 6f 72 6d 20 65 78 70 72 65 73  Transform expres
a500: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 57 48  sions in this WH
a510: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
a520: 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 3b 20  .  int iIdxCol; 
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a540: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
a550: 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
a560: 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45   ExprList *aColE
a570: 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr;        /* E
a580: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
a590: 61 72 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  are indexed */. 
a5a0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 49 64 78   Walker w;.  Idx
a5b0: 45 78 70 72 54 72 61 6e 73 20 78 3b 0a 20 20 61  ExprTrans x;.  a
a5c0: 43 6f 6c 45 78 70 72 20 3d 20 70 49 64 78 2d 3e  ColExpr = pIdx->
a5d0: 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 66 28 20  aColExpr;.  if( 
a5e0: 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 72 65  aColExpr==0 ) re
a5f0: 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 20 61 6e  turn;  /* Not an
a600: 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
a610: 73 69 6f 6e 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  sions */.  memse
a620: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
a630: 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
a640: 6c 6c 62 61 63 6b 20 3d 20 77 68 65 72 65 49 6e  llback = whereIn
a650: 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64 65  dexExprTransNode
a660: 3b 0a 20 20 77 2e 75 2e 70 49 64 78 54 72 61 6e  ;.  w.u.pIdxTran
a670: 73 20 3d 20 26 78 3b 0a 20 20 78 2e 69 54 61 62  s = &x;.  x.iTab
a680: 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b 0a 20  Cur = iTabCur;. 
a690: 20 78 2e 69 49 64 78 43 75 72 20 3d 20 69 49 64   x.iIdxCur = iId
a6a0: 78 43 75 72 3b 0a 20 20 66 6f 72 28 69 49 64 78  xCur;.  for(iIdx
a6b0: 43 6f 6c 3d 30 3b 20 69 49 64 78 43 6f 6c 3c 61  Col=0; iIdxCol<a
a6c0: 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3b 20  ColExpr->nExpr; 
a6d0: 69 49 64 78 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  iIdxCol++){.    
a6e0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a6f0: 6d 6e 5b 69 49 64 78 43 6f 6c 5d 21 3d 58 4e 5f  mn[iIdxCol]!=XN_
a700: 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
a710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 43 6f  .    assert( aCo
a720: 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
a730: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
a740: 20 20 78 2e 69 49 64 78 43 6f 6c 20 3d 20 69 49    x.iIdxCol = iI
a750: 64 78 43 6f 6c 3b 0a 20 20 20 20 78 2e 70 49 64  dxCol;.    x.pId
a760: 78 45 78 70 72 20 3d 20 61 43 6f 6c 45 78 70 72  xExpr = aColExpr
a770: 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
a780: 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  pr;.    sqlite3W
a790: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 57 49 6e  alkExpr(&w, pWIn
a7a0: 66 6f 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  fo->pWhere);.   
a7b0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a7c0: 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d  List(&w, pWInfo-
a7d0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
a7e0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
a7f0: 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e  ist(&w, pWInfo->
a800: 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 7d  pResultSet);.  }
a810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a820: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
a830: 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
a840: 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
a850: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
a860: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
a870: 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
a880: 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61 73  WInfo..*/.Bitmas
a890: 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  k sqlite3WhereCo
a8a0: 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
a8b0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
a8c0: 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
a8d0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
a8e0: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
a8f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
a900: 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
a910: 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
a920: 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
a930: 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
a940: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a950: 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
a960: 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
a970: 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
a980: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
a990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a9a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
a9b0: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
a9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
a9d0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
a9e0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
a9f0: 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
aa00: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
aa10: 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
aa20: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
aa30: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
aa40: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
aa50: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
aa60: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
aa70: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
aa80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aa90: 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
aaa0: 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
aab0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
aac0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
aad0: 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
aae0: 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
aaf0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
ab00: 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
ab10: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
ab20: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
ab30: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
ab40: 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
ab50: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
ab60: 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
ab70: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
ab80: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
ab90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
aba0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
abb0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
abc0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
abd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
abe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
abf0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac10: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ac20: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
ac30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ac50: 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
ac60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ac70: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
ac80: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
ac90: 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
aca0: 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
acb0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
acc0: 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
ace0: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
acf0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
ad00: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 48  p */.  int addrH
ad10: 61 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  alt;            
ad20: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 42 72         /* addrBr
ad30: 6b 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 6d  k for the outerm
ad40: 6f 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ost loop */.  in
ad50: 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad70: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
ad80: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
ad90: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
ada0: 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
adb0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
adc0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
add0: 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
ade0: 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
adf0: 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
ae00: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
ae10: 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
ae20: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
ae30: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
ae40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
ae50: 2a 20 49 6e 64 65 78 20 75 73 65 64 20 62 79 20  * Index used by 
ae60: 6c 6f 6f 70 20 28 69 66 20 61 6e 79 29 20 2a 2f  loop (if any) */
ae70: 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae90: 49 74 65 72 61 74 69 6f 6e 20 6f 66 20 63 6f 6e  Iteration of con
aea0: 73 74 72 61 69 6e 74 20 67 65 6e 65 72 61 74 6f  straint generato
aeb0: 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 70 50 61  r loop */..  pPa
aec0: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
aed0: 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
aee0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
aef0: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
af00: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
af10: 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
af20: 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
af30: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
af40: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
af50: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
af60: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
af70: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
af80: 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
af90: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
afa0: 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
afb0: 6e 6f 74 52 65 61 64 79 20 26 20 7e 73 71 6c 69  notReady & ~sqli
afc0: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
afd0: 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
afe0: 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76  t, iCur);.  bRev
aff0: 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
b000: 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
b010: 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
b020: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
b030: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
b040: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
b050: 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
b060: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
b070: 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 3b 0a  _SUBCLAUSE)==0;.
b080: 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
b090: 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
b0a0: 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
b0b0: 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
b0c0: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
b0d0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
b0e0: 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
b0f0: 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
b100: 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
b110: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
b120: 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
b130: 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
b140: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
b150: 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
b160: 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
b170: 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
b180: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
b190: 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
b1a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
b1b0: 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
b1c0: 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
b1d0: 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
b1e0: 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
b1f0: 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
b200: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
b210: 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
b220: 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
b230: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
b240: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
b250: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
b260: 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
b270: 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
b280: 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
b290: 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
b2a0: 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
b2b0: 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
b2c0: 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
b2d0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
b2e0: 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
b2f0: 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
b300: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b310: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
b320: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
b330: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
b340: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
b350: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
b360: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
b370: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
b380: 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
b390: 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
b3a0: 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
b3b0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
b3c0: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
b3d0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e  .  assert( (pWIn
b3e0: 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
b3f0: 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
b400: 55 53 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 70  USE).       || p
b410: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 7c  Level->iFrom>0 |
b420: 7c 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 66  | (pTabItem[0].f
b430: 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
b440: 4c 45 46 54 29 3d 3d 30 0a 20 20 29 3b 0a 20 20  LEFT)==0.  );.  
b450: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
b460: 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
b470: 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
b480: 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
b490: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
b4a0: 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
b4b0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
b4c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b4d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b4e0: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
b4f0: 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
b500: 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
b510: 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
b520: 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
b530: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 73    /* Compute a s
b540: 61 66 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a  afe address to j
b550: 75 6d 70 20 74 6f 20 69 66 20 77 65 20 64 69 73  ump to if we dis
b560: 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 74  cover that the t
b570: 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68  able for.  ** th
b580: 69 73 20 6c 6f 6f 70 20 69 73 20 65 6d 70 74 79  is loop is empty
b590: 20 61 6e 64 20 63 61 6e 20 6e 65 76 65 72 20 63   and can never c
b5a0: 6f 6e 74 72 69 62 75 74 65 20 63 6f 6e 74 65 6e  ontribute conten
b5b0: 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 69 4c  t. */.  for(j=iL
b5c0: 65 76 65 6c 3b 20 6a 3e 30 20 26 26 20 70 57 49  evel; j>0 && pWI
b5d0: 6e 66 6f 2d 3e 61 5b 6a 5d 2e 69 4c 65 66 74 4a  nfo->a[j].iLeftJ
b5e0: 6f 69 6e 3d 3d 30 3b 20 6a 2d 2d 29 7b 7d 0a 20  oin==0; j--){}. 
b5f0: 20 61 64 64 72 48 61 6c 74 20 3d 20 70 57 49 6e   addrHalt = pWIn
b600: 66 6f 2d 3e 61 5b 6a 5d 2e 61 64 64 72 42 72 6b  fo->a[j].addrBrk
b610: 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
b620: 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
b630: 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
b640: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
b650: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
b660: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
b670: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
b680: 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
b690: 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65  d = pTabItem->re
b6a0: 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c  gReturn;.    sql
b6b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b6c0: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
b6d0: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
b6e0: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
b6f0: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 70 4c 65  illSub);.    pLe
b700: 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74  vel->p2 =  sqlit
b710: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b720: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
b730: 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ld, addrBrk);.  
b740: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b750: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
b760: 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
b770: 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61   of \"%s\"", pTa
b780: 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
b790: 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  me));.    pLevel
b7a0: 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  ->op = OP_Goto;.
b7b0: 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
b7c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
b7d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
b7e0: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
b7f0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
b800: 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
b810: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65   /* Case 1:  The
b820: 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
b830: 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
b840: 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
b850: 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
b860: 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
b870: 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
b880: 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
b890: 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
b8a0: 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
b8b0: 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f     int addrNotFo
b8c0: 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  und;.    int nCo
b8d0: 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70  nstraint = pLoop
b8e0: 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 6e  ->nLTerm;.    in
b8f0: 74 20 69 49 6e 3b 20 20 20 20 2f 2a 20 43 6f 75  t iIn;    /* Cou
b900: 6e 74 65 72 20 66 6f 72 20 49 4e 20 63 6f 6e 73  nter for IN cons
b910: 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20  traints */..    
b920: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b930: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
b940: 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
b950: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
b960: 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
b970: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
b980: 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
b990: 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
b9a0: 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
b9b0: 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
b9c0: 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
b9d0: 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
b9e0: 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
b9f0: 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
ba00: 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d  f( NEVER(pTerm==
ba10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
ba20: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
ba30: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
ba40: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  N ){.        cod
ba50: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
ba60: 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
ba70: 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54  vel, j, bRev, iT
ba80: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
ba90: 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
baa0: 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
bab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bac0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
bad0: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
bae0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
baf0: 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74    codeExprOrVect
bb00: 6f 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  or(pParse, pRigh
bb10: 74 2c 20 69 54 61 72 67 65 74 2c 20 31 29 3b 0a  t, iTarget, 1);.
bb20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb40: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
bb50: 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
bb60: 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
bb70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bb80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bb90: 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
bba0: 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
bbb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
bbc0: 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
bbd0: 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
bbe0: 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
bc10: 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
bc30: 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
bc40: 65 65 20 3f 20 50 34 5f 44 59 4e 41 4d 49 43 20  ee ? P4_DYNAMIC 
bc50: 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
bc60: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
bc70: 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
bc80: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
bc90: 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  0;.    pLevel->p
bca0: 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
bcb0: 65 76 65 6c 2d 3e 6f 70 20 3d 20 70 57 49 6e 66  evel->op = pWInf
bcc0: 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3f 20 4f 50  o->eOnePass ? OP
bcd0: 5f 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e 65 78 74  _Noop : OP_VNext
bce0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
bcf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
bd00: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
bd10: 20 20 69 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    iIn = pLevel->
bd20: 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20 66 6f  u.in.nIn;.    fo
bd30: 72 28 6a 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  r(j=nConstraint-
bd40: 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
bd50: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
bd60: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
bd70: 20 20 20 20 20 69 66 28 20 6a 3c 31 36 20 26 26       if( j<16 &&
bd80: 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e   (pLoop->u.vtab.
bd90: 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29  omitMask>>j)&1 )
bda0: 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
bdb0: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
bdc0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
bdd0: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
bde0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
bdf0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  !=0 ){.        E
be00: 78 70 72 20 2a 70 43 6f 6d 70 61 72 65 3b 20 20  xpr *pCompare;  
be10: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
be20: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
be30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
be40: 68 74 3b 20 20 20 20 2f 2a 20 52 48 53 20 6f 66  ht;    /* RHS of
be50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
be60: 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  */.        VdbeO
be70: 70 20 2a 70 4f 70 3b 20 20 20 20 20 2f 2a 20 4f  p *pOp;     /* O
be80: 70 63 6f 64 65 20 74 6f 20 61 63 63 65 73 73 20  pcode to access 
be90: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
bea0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a   IN constraint *
beb0: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  /..        /* Re
bec0: 6c 6f 61 64 20 74 68 65 20 63 6f 6e 73 74 72 61  load the constra
bed0: 69 6e 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  int value into r
bee0: 65 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e 20 20 54  eg[iReg+j+2].  T
bef0: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20  he same value.  
bf00: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 6c 6f 61        ** was loa
bf10: 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73 61 6d  ded into the sam
bf20: 65 20 72 65 67 69 73 74 65 72 20 70 72 69 6f 72  e register prior
bf30: 20 74 6f 20 74 68 65 20 4f 50 5f 56 46 69 6c 74   to the OP_VFilt
bf40: 65 72 2c 20 62 75 74 0a 20 20 20 20 20 20 20 20  er, but.        
bf50: 2a 2a 20 74 68 65 20 78 46 69 6c 74 65 72 20 69  ** the xFilter i
bf60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69  mplementation mi
bf70: 67 68 74 20 68 61 76 65 20 63 68 61 6e 67 65 64  ght have changed
bf80: 20 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 72   the datatype or
bf90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f  .        ** enco
bfa0: 64 69 6e 67 20 6f 66 20 74 68 65 20 76 61 6c 75  ding of the valu
bfb0: 65 20 69 6e 20 74 68 65 20 72 65 67 69 73 74 65  e in the registe
bfc0: 72 2c 20 73 6f 20 69 74 20 2a 6d 75 73 74 2a 20  r, so it *must* 
bfd0: 62 65 20 72 65 6c 6f 61 64 65 64 2e 20 2a 2f 0a  be reloaded. */.
bfe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bff0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
c000: 4c 6f 6f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  Loop!=0 || db->m
c010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c020: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
c030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c040: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
c050: 28 20 69 49 6e 3e 30 20 29 3b 0a 20 20 20 20 20  ( iIn>0 );.     
c060: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
c070: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
c080: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
c090: 6f 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64 64 72 49  oop[--iIn].addrI
c0a0: 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nTop);.         
c0b0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
c0c0: 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
c0d0: 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
c0e0: 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  OP_Rowid );.    
c0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
c100: 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 43 6f  p->opcode!=OP_Co
c110: 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d  lumn || pOp->p3=
c120: 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20  =iReg+j+2 );.   
c130: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c140: 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  Op->opcode!=OP_R
c150: 6f 77 69 64 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d  owid || pOp->p2=
c160: 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20  =iReg+j+2 );.   
c170: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c180: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
c190: 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  _Rowid );.      
c1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c1b0: 64 64 4f 70 33 28 76 2c 20 70 4f 70 2d 3e 6f 70  ddOp3(v, pOp->op
c1c0: 63 6f 64 65 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  code, pOp->p1, p
c1d0: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29  Op->p2, pOp->p3)
c1e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
c1f0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
c200: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c210: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  continue to the 
c220: 6e 65 78 74 20 72 6f 77 20 69 66 20 0a 20 20 20  next row if .   
c230: 20 20 20 20 20 2a 2a 20 74 68 65 20 49 4e 20 63       ** the IN c
c240: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
c250: 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20   satisfied */.  
c260: 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 20 3d        pCompare =
c270: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c280: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 30 2c 20  arse, TK_EQ, 0, 
c290: 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
c2a0: 72 74 28 20 70 43 6f 6d 70 61 72 65 21 3d 30 20  rt( pCompare!=0 
c2b0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c2c0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
c2d0: 66 28 20 70 43 6f 6d 70 61 72 65 20 29 7b 0a 20  f( pCompare ){. 
c2e0: 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72           pCompar
c2f0: 65 2d 3e 70 4c 65 66 74 20 3d 20 70 54 65 72 6d  e->pLeft = pTerm
c300: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
c310: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61            pCompa
c320: 72 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  re->pRight = pRi
c330: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
c340: 72 28 64 62 2c 20 54 4b 5f 52 45 47 49 53 54 45  r(db, TK_REGISTE
c350: 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  R, 0);.         
c360: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
c370: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
c380: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  t->iTable = iReg
c390: 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20  +j+2;.          
c3a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
c3b0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
c3c0: 6d 70 61 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 61  mpare, pLevel->a
c3d0: 64 64 72 43 6f 6e 74 2c 20 30 29 3b 0a 20 20 20  ddrCont, 0);.   
c3e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3f0: 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70 4c 65     pCompare->pLe
c400: 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ft = 0;.        
c410: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c420: 65 74 65 28 64 62 2c 20 70 43 6f 6d 70 61 72 65  ete(db, pCompare
c430: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c440: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
c450: 2a 20 54 68 65 73 65 20 72 65 67 69 73 74 65 72  * These register
c460: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 65  s need to be pre
c470: 73 65 72 76 65 64 20 69 6e 20 63 61 73 65 20 74  served in case t
c480: 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
c490: 65 72 61 74 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  erator.    ** lo
c4a0: 6f 70 2e 20 20 53 6f 20 77 65 20 63 6f 75 6c 64  op.  So we could
c4b0: 20 64 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   deallocate the 
c4c0: 72 65 67 69 73 74 65 72 73 20 68 65 72 65 20 28  registers here (
c4d0: 61 6e 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  and potentially.
c4e0: 20 20 20 20 2a 2a 20 72 65 75 73 65 20 74 68 65      ** reuse the
c4f0: 6d 20 6c 61 74 65 72 29 20 69 66 20 28 70 4c 6f  m later) if (pLo
c500: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
c510: 45 52 45 5f 49 4e 5f 41 42 4c 45 29 3d 3d 30 2e  ERE_IN_ABLE)==0.
c520: 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 0a 20    But it seems. 
c530: 20 20 20 2a 2a 20 73 69 6d 70 6c 65 72 20 61 6e     ** simpler an
c540: 64 20 73 61 66 65 72 20 74 6f 20 73 69 6d 70 6c  d safer to simpl
c550: 79 20 6e 6f 74 20 72 65 75 73 65 20 74 68 65 20  y not reuse the 
c560: 72 65 67 69 73 74 65 72 73 2e 0a 20 20 20 20 2a  registers..    *
c570: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69  *.    **    sqli
c580: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
c590: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
c5a0: 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
c5b0: 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ;.    */.    sql
c5c0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
c5d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
c5e0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
c5f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c600: 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
c610: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
c620: 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
c630: 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
c640: 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
c650: 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
c660: 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
c670: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
c680: 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
c690: 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
c6a0: 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
c6b0: 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
c6c0: 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
c6d0: 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
c6e0: 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
c6f0: 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
c700: 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
c710: 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
c720: 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
c730: 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
c740: 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
c750: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c760: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
c770: 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
c780: 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
c790: 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
c7a0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
c7b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c7c0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
c7d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
c7e0: 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
c7f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
c800: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c810: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
c820: 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
c830: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c840: 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
c850: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
c860: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
c870: 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
c880: 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
c890: 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67     if( iRowidReg
c8a0: 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20  !=iReleaseReg ) 
c8b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
c8c0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
c8d0: 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
c8e0: 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
c8f0: 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
c900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c910: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
c920: 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
c930: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
c940: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
c960: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
c970: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
c980: 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
c990: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c9a0: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
c9b0: 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
c9c0: 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
c9d0: 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
c9e0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
c9f0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
ca00: 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
ca10: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
ca20: 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
ca30: 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
ca40: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
ca50: 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
ca60: 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
ca70: 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
ca80: 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
ca90: 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
caa0: 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
cab0: 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
cac0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
cad0: 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
cae0: 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
caf0: 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
cb00: 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
cb10: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
cb20: 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
cb30: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
cb40: 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
cb50: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
cb60: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
cb70: 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
cb80: 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
cb90: 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
cba0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
cbb0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
cbc0: 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
cbd0: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
cbe0: 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
cbf0: 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
cc00: 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
cc10: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
cc20: 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
cc30: 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
cc40: 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
cc50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 43  .    }.    codeC
cc60: 75 72 73 6f 72 48 69 6e 74 28 70 54 61 62 49 74  ursorHint(pTabIt
cc70: 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76  em, pWInfo, pLev
cc80: 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 69  el, pEnd);.    i
cc90: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
cca0: 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
ccb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ccc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
ccd0: 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
cce0: 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
ccf0: 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
cd00: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
cd10: 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
cd20: 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
cd30: 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ry */.      int 
cd40: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
cd50: 20 20 2f 2a 20 43 75 72 73 6f 72 20 73 65 65 6b    /* Cursor seek
cd60: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
cd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
cd80: 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
cd90: 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
cda0: 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
cdb0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
cdc0: 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
cdd0: 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
cde0: 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
cdf0: 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
ce00: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
ce10: 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
ce20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
ce30: 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54  GT */  OP_SeekGT
ce40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
ce50: 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
ce60: 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLE,.           
ce70: 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
ce80: 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20  SeekLT,.        
ce90: 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
cea0: 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20  OP_SeekGE.      
ceb0: 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
cec0: 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
ced0: 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
cee0: 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
cef0: 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
cf00: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
cf10: 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
cf20: 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
cf30: 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
cf40: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
cf50: 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
cf60: 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
cf70: 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
cf80: 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72    assert( (pStar
cf90: 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
cfa0: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
cfb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
cfc0: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
cfd0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
cfe0: 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
cff0: 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
d000: 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
d010: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
d020: 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
d030: 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
d040: 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
d050: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
d060: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d070: 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69  IsVector(pX->pRi
d080: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
d090: 72 31 20 3d 20 72 54 65 6d 70 20 3d 20 73 71 6c  r1 = rTemp = sql
d0a0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d0b0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d0c0: 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72  codeExprOrVector
d0d0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
d0e0: 67 68 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  ght, r1, 1);.   
d0f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d100: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  X->op==TK_GT );.
d110: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
d120: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  ( pX->op==TK_GE 
d130: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
d140: 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
d150: 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LT );.        te
d160: 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
d170: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 20  TK_LE );.       
d180: 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70 5b 28 28   op = aMoveOp[((
d190: 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54 20 2d  pX->op - TK_GT -
d1a0: 20 31 29 20 26 20 30 78 33 29 20 7c 20 30 78 31   1) & 0x3) | 0x1
d1b0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
d1c0: 74 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 47 54  t( pX->op!=TK_GT
d1d0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47   || op==OP_SeekG
d1e0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  E );.        ass
d1f0: 65 72 74 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f  ert( pX->op!=TK_
d200: 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65  GE || op==OP_See
d210: 6b 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 61  kGE );.        a
d220: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 21 3d 54  ssert( pX->op!=T
d230: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53  K_LT || op==OP_S
d240: 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 20  eekLE );.       
d250: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 21   assert( pX->op!
d260: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
d270: 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20  _SeekLE );.     
d280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d290: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
d2a0: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
d2b0: 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54   pX->pRight, &rT
d2c0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64 69  emp);.        di
d2d0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
d2e0: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
d2f0: 20 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70 5b     op = aMoveOp[
d300: 28 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54 29  (pX->op - TK_GT)
d310: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
d320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d330: 70 33 28 76 2c 20 6f 70 2c 20 69 43 75 72 2c 20  p3(v, op, iCur, 
d340: 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
d350: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d360: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
d370: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
d380: 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
d390: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
d3a0: 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
d3b0: 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
d3c0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
d3d0: 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
d3e0: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
d3f0: 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
d400: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
d410: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
d420: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
d430: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
d440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
d450: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
d460: 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
d470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
d480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d490: 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
d4a0: 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
d4b0: 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29 3b 0a  Cur, addrHalt);.
d4c0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
d4d0: 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
d4e0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d4f0: 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d  rageIf(v, bRev!=
d500: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
d510: 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
d520: 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
d530: 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
d540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d550: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
d560: 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74  ssert( (pEnd->wt
d570: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
d580: 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  LL)==0 );.      
d590: 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
d5a0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
d5b0: 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76   ); /* Transitiv
d5c0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
d5d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d5e0: 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26   pEnd->wtFlags &
d5f0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
d600: 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c  .      memEndVal
d610: 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ue = ++pParse->n
d620: 4d 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  Mem;.      codeE
d630: 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72  xprOrVector(pPar
d640: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
d650: 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 31 29 3b  memEndValue, 1);
d660: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
d670: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
d680: 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20 0a 20  r(pX->pRight) . 
d690: 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e 6f 70        && (pX->op
d6a0: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
d6b0: 70 3d 3d 54 4b 5f 47 54 29 20 0a 20 20 20 20 20  p==TK_GT) .     
d6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
d6d0: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
d6e0: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
d6f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d700: 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
d710: 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
d720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d730: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
d740: 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69 67  sVector(pX->pRig
d750: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ht) ){.        d
d760: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
d770: 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20 20  l, pEnd);.      
d780: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  }.    }.    star
d790: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
d7a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d7b0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
d7c0: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
d7d0: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
d7e0: 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
d7f0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
d800: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
d810: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
d820: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
d830: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
d840: 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
d850: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d860: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
d870: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d880: 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
d890: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
d8a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d8b0: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
d8c0: 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
d8d0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
d8e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
d8f0: 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
d900: 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
d910: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
d920: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
d930: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
d940: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
d950: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
d960: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
d970: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
d980: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
d990: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
d9a0: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
d9b0: 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
d9c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d9d0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
d9e0: 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
d9f0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
da00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
da10: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
da20: 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
da30: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
da40: 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
da50: 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
da60: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
da70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
da80: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
da90: 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
daa0: 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
dab0: 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
dac0: 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
dad0: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
dae0: 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
daf0: 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
db00: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
db10: 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
db20: 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
db30: 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
db40: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
db50: 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
db60: 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
db70: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
db80: 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
db90: 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
dba0: 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
dbb0: 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
dbc0: 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
dbd0: 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
dbe0: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
dbf0: 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
dc00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
dc10: 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
dc20: 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
dc30: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
dc40: 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
dc50: 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
dc60: 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
dc70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
dc80: 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
dc90: 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
dca0: 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
dcb0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
dcc0: 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
dcd0: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
dce0: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
dcf0: 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
dd00: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
dd10: 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
dd20: 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
dd30: 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
dd40: 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
dd50: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
dd60: 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
dd70: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
dd80: 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
dd90: 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
dda0: 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
ddb0: 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
ddc0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
ddd0: 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
dde0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
ddf0: 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
de00: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
de10: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
de20: 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
de30: 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
de40: 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
de50: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
de60: 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
de70: 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
de80: 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
de90: 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
dea0: 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
deb0: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
dec0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
ded0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
dee0: 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
def0: 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
df00: 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
df10: 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
df20: 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
df30: 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
df40: 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
df50: 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
df60: 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
df70: 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
df80: 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
df90: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
dfa0: 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
dfb0: 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
dfc0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
dfd0: 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
dfe0: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
dff0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
e000: 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
e010: 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
e020: 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
e030: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
e040: 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
e050: 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
e060: 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
e070: 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
e080: 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
e090: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
e0a0: 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
e0b0: 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
e0c0: 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
e0d0: 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
e0e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
e0f0: 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
e100: 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
e110: 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
e120: 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
e130: 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
e140: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
e150: 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
e160: 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
e170: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
e180: 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
e190: 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
e1a0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
e1b0: 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
e1c0: 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
e1d0: 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
e1e0: 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
e1f0: 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
e200: 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
e210: 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
e220: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
e230: 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
e240: 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
e250: 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
e260: 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
e270: 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
e280: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
e290: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
e2a0: 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
e2b0: 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
e2c0: 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
e2d0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
e2e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e2f0: 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
e300: 2a 2f 0a 20 20 20 20 75 31 36 20 6e 42 74 6d 20  */.    u16 nBtm 
e310: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
e320: 2e 6e 42 74 6d 3b 20 20 20 2f 2a 20 4c 65 6e 67  .nBtm;   /* Leng
e330: 74 68 20 6f 66 20 42 54 4d 20 76 65 63 74 6f 72  th of BTM vector
e340: 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 54 6f 70   */.    u16 nTop
e350: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
e360: 65 2e 6e 54 6f 70 3b 20 20 20 2f 2a 20 4c 65 6e  e.nTop;   /* Len
e370: 67 74 68 20 6f 66 20 54 4f 50 20 76 65 63 74 6f  gth of TOP vecto
e380: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  r */.    int reg
e390: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
e3a0: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
e3b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
e3c0: 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
e3d0: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
e3e0: 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
e3f0: 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
e400: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
e410: 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
e420: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
e430: 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
e440: 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
e450: 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
e460: 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
e470: 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
e480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e490: 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
e4a0: 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
e4b0: 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
e4c0: 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e4e0: 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
e4f0: 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
e500: 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
e510: 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
e520: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
e530: 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
e540: 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
e550: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
e560: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e570: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
e580: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
e590: 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
e5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e5b0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
e5c0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
e5d0: 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
e5e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
e5f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
e600: 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
e610: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
e620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e630: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
e640: 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
e650: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
e660: 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
e670: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
e680: 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
e690: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
e6a0: 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 20    char *zEndAff 
e6b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
e6c0: 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
e6d0: 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
e6e0: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
e6f0: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
e700: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
e710: 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
e720: 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
e730: 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
e740: 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
e750: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
e760: 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
e770: 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
e780: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
e790: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
e7a0: 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
e7b0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
e7c0: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
e7d0: 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a  Loop->nSkip );..
e7e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
e7f0: 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
e800: 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
e810: 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
e820: 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
e830: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
e840: 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
e850: 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
e860: 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
e870: 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
e880: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
e890: 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
e8a0: 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
e8b0: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
e8c0: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
e8d0: 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
e8e0: 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
e8f0: 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
e900: 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
e910: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
e920: 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
e930: 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
e940: 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
e950: 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
e960: 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
e970: 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
e980: 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
e990: 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
e9a0: 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
e9b0: 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
e9c0: 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
e9d0: 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
e9e0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
e9f0: 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
ea00: 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
ea10: 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
ea20: 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
ea30: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
ea40: 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
ea50: 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
ea60: 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
ea70: 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
ea80: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
ea90: 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
eaa0: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e  assert( pLoop->n
eab0: 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
eac0: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
ead0: 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
eae0: 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
eaf0: 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
eb00: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
eb10: 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
eb20: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
eb30: 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
eb40: 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
eb50: 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
eb60: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
eb70: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
eb80: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
eb90: 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
eba0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
ebb0: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
ebc0: 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52 65 67   = MAX(nExtraReg
ebd0: 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
ebe0: 2e 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  .nBtm);.      /*
ebf0: 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69   Like optimizati
ec00: 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
ec10: 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75  ints always occu
ec20: 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20  r in pairs */.  
ec30: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52 61      assert( (pRa
ec40: 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
ec50: 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
ec60: 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  )==0 || .       
ec70: 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77         (pLoop->w
ec80: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
ec90: 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a  OP_LIMIT)!=0 );.
eca0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
ecb0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
ecc0: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
ecd0: 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
ece0: 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
ecf0: 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
ed00: 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28 6e 45  xtraReg = MAX(nE
ed10: 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70 2d 3e  xtraReg, pLoop->
ed20: 75 2e 62 74 72 65 65 2e 6e 54 6f 70 29 3b 0a 23  u.btree.nTop);.#
ed30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
ed40: 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
ed50: 42 4c 4f 42 53 0a 20 20 20 20 20 20 69 66 28 20  BLOBS.      if( 
ed60: 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
ed70: 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
ed80: 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  PT)!=0 ){.      
ed90: 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65    assert( pRange
eda0: 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20 20 20  Start!=0 );     
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f 6e 73  /* LIKE opt cons
edd0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
ede0: 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
edf0: 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
ee00: 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
ee10: 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69 6e 20  ;   /* occur in 
ee20: 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  pairs */.       
ee30: 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
ee40: 70 43 6e 74 72 20 3d 20 28 75 33 32 29 2b 2b 70  pCntr = (u32)++p
ee50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ee60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ee80: 65 67 65 72 2c 20 31 2c 20 28 69 6e 74 29 70 4c  eger, 1, (int)pL
ee90: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
eea0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  tr);.        Vdb
eeb0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
eec0: 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 22  KE loop counter"
eed0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  ));.        pLev
eee0: 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20  el->addrLikeRep 
eef0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ef00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
ef10: 20 20 20 20 20 2f 2a 20 69 4c 69 6b 65 52 65 70       /* iLikeRep
ef20: 43 6e 74 72 20 61 63 74 75 61 6c 6c 79 20 73 74  Cntr actually st
ef30: 6f 72 65 73 20 32 78 20 74 68 65 20 63 6f 75 6e  ores 2x the coun
ef40: 74 65 72 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ter register num
ef50: 62 65 72 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ber.  The.      
ef60: 20 20 2a 2a 20 62 6f 74 74 6f 6d 20 62 69 74 20    ** bottom bit 
ef70: 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65  indicates whethe
ef80: 72 20 74 68 65 20 73 65 61 72 63 68 20 6f 72 64  r the search ord
ef90: 65 72 20 69 73 20 41 53 43 20 6f 72 20 44 45 53  er is ASC or DES
efa0: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65  C. */.        te
efb0: 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
efc0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
efd0: 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
efe0: 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
eff0: 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20 20 20  SO_DESC );.     
f000: 20 20 20 61 73 73 65 72 74 28 20 28 62 52 65 76     assert( (bRev
f010: 20 26 20 7e 31 29 3d 3d 30 20 29 3b 0a 20 20 20   & ~1)==0 );.   
f020: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69       pLevel->iLi
f030: 6b 65 52 65 70 43 6e 74 72 20 3c 3c 3d 31 3b 0a  keRepCntr <<=1;.
f040: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
f050: 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 7c 3d 20  iLikeRepCntr |= 
f060: 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e 61 53  bRev ^ (pIdx->aS
f070: 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
f080: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29 3b 0a  QLITE_SO_DESC);.
f090: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f0a0: 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53       if( pRangeS
f0b0: 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tart==0 ){.     
f0c0: 20 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43     j = pIdx->aiC
f0d0: 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
f0e0: 20 20 20 20 69 66 28 20 28 6a 3e 3d 30 20 26 26      if( (j>=0 &&
f0f0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
f100: 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
f110: 30 29 20 7c 7c 20 6a 3d 3d 58 4e 5f 45 58 50 52  0) || j==XN_EXPR
f120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53   ){.          bS
f130: 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
f140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f150: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f160: 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d  ert( pRangeEnd==
f170: 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d  0 || (pRangeEnd-
f180: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
f190: 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20  VNULL)==0 );..  
f1a0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
f1b0: 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
f1c0: 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
f1d0: 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
f1e0: 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
f1f0: 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
f200: 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
f210: 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
f220: 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
f230: 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
f240: 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
f250: 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
f260: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
f270: 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  nEq<pIdx->nKeyCo
f280: 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  l && bRev==(pIdx
f290: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
f2a0: 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
f2b0: 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
f2c0: 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   && pIdx->nKeyCo
f2d0: 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  l==nEq).    ){. 
f2e0: 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
f2f0: 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
f300: 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
f310: 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62        SWAP(u8, b
f320: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53  SeekPastNull, bS
f330: 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  topAtNull);.    
f340: 20 20 53 57 41 50 28 75 38 2c 20 6e 42 74 6d 2c    SWAP(u8, nBtm,
f350: 20 6e 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 0a 20   nTop);.    }.. 
f360: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
f370: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
f380: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
f390: 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
f3a0: 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
f3b0: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
f3c0: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
f3d0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
f3e0: 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
f3f0: 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
f400: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
f410: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70 54  odeCursorHint(pT
f420: 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20  abItem, pWInfo, 
f430: 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
f440: 64 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20  d);.    regBase 
f450: 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
f460: 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c  yTerms(pParse,pL
f470: 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61  evel,bRev,nExtra
f480: 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b  Reg,&zStartAff);
f490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74  .    assert( zSt
f4a0: 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c  artAff==0 || sql
f4b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
f4c0: 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a  artAff)>=nEq );.
f4d0: 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
f4e0: 66 20 26 26 20 6e 54 6f 70 20 29 7b 0a 20 20 20  f && nTop ){.   
f4f0: 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
f500: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f510: 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d   &zStartAff[nEq]
f520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
f530: 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
f540: 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 74 65 73  ddrNxt;..    tes
f550: 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
f560: 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
f570: 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
f580: 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
f590: 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
f5a0: 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
f5b0: 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
f5c0: 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
f5d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f5e0: 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
f5f0: 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
f600: 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
f610: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f620: 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61  RangeEnd && (pRa
f630: 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
f640: 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b  r & WO_GE)!=0 );
f650: 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
f660: 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
f670: 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
f680: 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
f690: 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
f6a0: 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
f6b0: 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
f6c0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
f6d0: 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
f6e0: 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
f6f0: 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
f700: 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
f710: 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
f720: 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
f730: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
f740: 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
f750: 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
f760: 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
f770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
f780: 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
f790: 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
f7a0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78 70 72  ;.      codeExpr
f7b0: 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  OrVector(pParse,
f7c0: 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
f7d0: 2b 6e 45 71 2c 20 6e 42 74 6d 29 3b 0a 20 20 20  +nEq, nBtm);.   
f7e0: 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74 69     whereLikeOpti
f7f0: 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46 69  mizationStringFi
f800: 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20 70  xup(v, pLevel, p
f810: 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
f820: 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74     if( (pRangeSt
f830: 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
f840: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
f850: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
f860: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
f870: 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
f880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
f8a0: 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
f8b0: 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
f8c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
f8d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
f8e0: 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
f8f0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70 64  f ){.        upd
f900: 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69 74 79  ateRangeAffinity
f910: 53 74 72 28 70 52 69 67 68 74 2c 20 6e 42 74 6d  Str(pRight, nBtm
f920: 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  , &zStartAff[nEq
f930: 5d 29 3b 0a 20 20 20 20 20 20 7d 20 20 0a 20 20  ]);.      }  .  
f940: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
f950: 2b 3d 20 6e 42 74 6d 3b 0a 20 20 20 20 20 20 74  += nBtm;.      t
f960: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
f970: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
f980: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
f990: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f9a0: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 52  3ExprIsVector(pR
f9b0: 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ight)==0 ){.    
f9c0: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
f9d0: 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
f9e0: 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  art);.      }els
f9f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  e{.        start
fa00: 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Eq = 1;.      }.
fa10: 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e        bSeekPastN
fa20: 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ull = 0;.    }el
fa30: 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74  se if( bSeekPast
fa40: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
fa50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fa60: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
fa70: 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
fa80: 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
fa90: 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
faa0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
fab0: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
fac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
fad0: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
fae0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
faf0: 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65  Constraint - bSe
fb00: 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61  ekPastNull, zSta
fb10: 72 74 41 66 66 29 3b 0a 20 20 20 20 69 66 28 20  rtAff);.    if( 
fb20: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3e 30 20 26  pLoop->nSkip>0 &
fb30: 26 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 70  & nConstraint==p
fb40: 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20  Loop->nSkip ){. 
fb50: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6b 69 70       /* The skip
fb60: 2d 73 63 61 6e 20 6c 6f 67 69 63 20 69 6e 73 69  -scan logic insi
fb70: 64 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  de the call to c
fb80: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 43 6f  odeAllEqualityCo
fb90: 6e 73 74 72 61 69 6e 74 73 28 29 0a 20 20 20 20  nstraints().    
fba0: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 61    ** above has a
fbb0: 6c 72 65 61 64 79 20 6c 65 66 74 20 74 68 65 20  lready left the 
fbc0: 63 75 72 73 6f 72 20 73 69 74 74 69 6e 67 20 6f  cursor sitting o
fbd0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  n the correct ro
fbe0: 77 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 6e  w,.      ** so n
fbf0: 6f 20 66 75 72 74 68 65 72 20 73 65 65 6b 69 6e  o further seekin
fc00: 67 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  g is needed */. 
fc10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc20: 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
fc30: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
fc40: 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
fc50: 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
fc60: 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
fc70: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
fc80: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
fc90: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
fca0: 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
fcb0: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
fcc0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
fcd0: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
fce0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
fcf0: 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74  ==OP_Rewind);  t
fd00: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
fd10: 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 20 20  Rewind );.      
fd20: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
fd30: 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
fd40: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
fd50: 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
fd60: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
fd70: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
fd80: 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  T);  testcase( o
fd90: 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a  p==OP_SeekGT );.
fda0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
fdb0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
fdc0: 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73  eekGE);  testcas
fdd0: 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45  e( op==OP_SeekGE
fde0: 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
fdf0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
fe00: 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73  OP_SeekLE);  tes
fe10: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
fe20: 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 56 64  ekLE );.      Vd
fe30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
fe40: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20  op==OP_SeekLT); 
fe50: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
fe60: 50 5f 53 65 65 6b 4c 54 20 29 3b 0a 20 20 20 20  P_SeekLT );.    
fe70: 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  }..    /* Load t
fe80: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
fe90: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
fea0: 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
feb0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fec0: 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
fed0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
fee0: 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
fef0: 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
ff00: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ff10: 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
ff20: 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
ff30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ff40: 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
ff50: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
ff60: 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f  Eq, 1);.      co
ff70: 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70  deExprOrVector(p
ff80: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
ff90: 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f 70  egBase+nEq, nTop
ffa0: 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69  );.      whereLi
ffb0: 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
ffc0: 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65  ringFixup(v, pLe
ffd0: 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
ffe0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
fff0: 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
10000 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
10010 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
10020 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
10030 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
10040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10060 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
10070 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
10080 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
10090 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
100a0 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66        if( zEndAf
100b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70 64  f ){.        upd
100c0 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69 74 79  ateRangeAffinity
100d0 53 74 72 28 70 52 69 67 68 74 2c 20 6e 54 6f 70  Str(pRight, nTop
100e0 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20  , zEndAff);.    
100f0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
10100 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
10110 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f 70 2c  gBase+nEq, nTop,
10120 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20   zEndAff);.     
10130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10140 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10150 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10160 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
10170 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d    nConstraint +=
10180 20 6e 54 6f 70 3b 0a 20 20 20 20 20 20 74 65 73   nTop;.      tes
10190 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
101a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
101b0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 0a 20 20 20  _VIRTUAL );..   
101c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
101d0 70 72 49 73 56 65 63 74 6f 72 28 70 52 69 67 68  prIsVector(pRigh
101e0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
101f0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
10200 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
10210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10220 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 31 3b        endEq = 1;
10230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10240 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75  se if( bStopAtNu
10250 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
10260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10270 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
10280 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
10290 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
102a0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
102b0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
102c0 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30  .      endEq = 0
102d0 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
102e0 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  int++;.    }.   
102f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10300 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
10310 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10320 28 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a  (db, zEndAff);..
10330 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
10340 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
10350 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
10360 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10370 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
10380 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
10390 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
103a0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
103b0 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
103c0 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e    if( nConstrain
103d0 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  t ){.      op = 
103e0 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20  aEndOp[bRev*2 + 
103f0 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71  endEq];.      sq
10400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
10410 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
10420 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
10430 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
10440 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10450 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20  e( op==OP_IdxGT 
10460 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
10470 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
10480 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
10490 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
104a0 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GE );  VdbeCover
104b0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
104c0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74  IdxGE );.      t
104d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
104e0 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxLT );  VdbeCo
104f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
10500 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
10510 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10520 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62  OP_IdxLE );  Vdb
10530 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
10540 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20  p==OP_IdxLE );. 
10550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65     }..    /* See
10560 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
10570 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
10580 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54  */.    if( omitT
10590 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
105a0 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65 72   pIdx is a cover
105b0 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e  ing index.  No n
105c0 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  eed to access th
105d0 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f  e main table. */
105e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48  .    }else if( H
105f0 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
10600 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69  able) ){.      i
10610 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
10620 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
10630 45 45 4b 5f 54 41 42 4c 45 29 20 7c 7c 20 28 0a  EEK_TABLE) || (.
10640 20 20 20 20 20 20 20 20 20 20 28 70 57 49 6e 66            (pWInf
10650 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
10660 57 48 45 52 45 5f 53 45 45 4b 5f 55 4e 49 51 5f  WHERE_SEEK_UNIQ_
10670 54 41 42 4c 45 29 20 0a 20 20 20 20 20 20 20 26  TABLE) .       &
10680 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
10690 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
106a0 47 4c 45 29 0a 20 20 20 20 20 20 29 29 7b 0a 20  GLE).      )){. 
106b0 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67         iRowidReg
106c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
106d0 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
106e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
106f0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
10700 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
10710 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10720 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
10730 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
10740 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
10750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10760 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
10770 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 30  tExists, iCur, 0
10780 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
10790 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
107a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
107b0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
107c0 44 65 66 65 72 72 65 64 53 65 65 6b 28 70 57 49  DeferredSeek(pWI
107d0 6e 66 6f 2c 20 70 49 64 78 2c 20 69 43 75 72 2c  nfo, pIdx, iCur,
107e0 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20   iIdxCur);.     
107f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
10800 20 69 43 75 72 21 3d 69 49 64 78 43 75 72 20 29   iCur!=iIdxCur )
10810 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
10820 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
10830 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
10840 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->pTable);.     
10850 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c   iRowidReg = sql
10860 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
10870 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b  (pParse, pPk->nK
10880 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f  eyCol);.      fo
10890 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
108a0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
108b0 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33       k = sqlite3
108c0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
108d0 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
108e0 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  n[j]);.        s
108f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10900 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
10910 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69  IdxCur, k, iRowi
10920 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  dReg+j);.      }
10930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10940 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
10950 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72  P_NotFound, iCur
10960 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20  , addrCont,.    
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67         iRowidReg
10990 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
109a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
109b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
109c0 49 66 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  If pIdx is an in
109d0 64 65 78 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dex on one or mo
109e0 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  re expressions, 
109f0 74 68 65 6e 20 6c 6f 6f 6b 20 74 68 72 6f 75 67  then look throug
10a00 68 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  h.    ** all the
10a10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
10a20 70 57 49 6e 66 6f 20 61 6e 64 20 74 72 79 20 74  pWInfo and try t
10a30 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74 63  o transform matc
10a40 68 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  hing expressions
10a50 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 72 65 66  .    ** into ref
10a60 65 72 65 6e 63 65 20 74 6f 20 69 6e 64 65 78 20  erence to index 
10a70 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2a 0a  columns..    **.
10a80 20 20 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f      ** Do not do
10a90 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 52 48   this for the RH
10aa0 53 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  S of a LEFT JOIN
10ab0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
10ac0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 65 78  e the .    ** ex
10ad0 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 62 65 20  pression may be 
10ae0 65 76 61 6c 75 61 74 65 64 20 61 66 74 65 72 20  evaluated after 
10af0 4f 50 5f 4e 75 6c 6c 52 6f 77 20 68 61 73 20 62  OP_NullRow has b
10b00 65 65 6e 20 65 78 65 63 75 74 65 64 20 6f 6e 0a  een executed on.
10b10 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
10b20 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10b30 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
10b40 74 6f 20 64 6f 20 74 68 65 20 66 75 6c 6c 20 65  to do the full e
10b50 76 61 6c 75 61 74 69 6f 6e 2c 0a 20 20 20 20 2a  valuation,.    *
10b60 2a 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  * as the result 
10b70 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
10b80 6e 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e 55 4c  n may not be NUL
10b90 4c 2c 20 65 76 65 6e 20 69 66 20 61 6c 6c 20 74  L, even if all t
10ba0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  able.    ** colu
10bb0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  mn values are.  
10bc0 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69  https://www.sqli
10bd0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
10be0 37 66 61 38 30 34 39 36 38 35 62 35 30 62 35 61  7fa8049685b50b5a
10bf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10c00 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10c10 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 68  n==0 ){.      wh
10c20 65 72 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e  ereIndexExprTran
10c30 73 28 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49  s(pIdx, iCur, iI
10c40 64 78 43 75 72 2c 20 70 57 49 6e 66 6f 29 3b 0a  dxCur, pWInfo);.
10c50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
10c60 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
10c70 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
10c80 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
10c90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
10ca0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10cb0 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
10cc0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
10cd0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
10ce0 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
10cf0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
10d00 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
10d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
10d20 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
10d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
10d40 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
10d50 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33  ;.    pLevel->p3
10d60 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
10d70 67 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  gs&WHERE_UNQ_WAN
10d80 54 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20  TED)!=0 ? 1:0;. 
10d90 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
10da0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
10db0 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
10dc0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
10dd0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
10de0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
10df0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
10e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
10e10 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
10e20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6d 69     }.    if( omi
10e30 74 54 61 62 6c 65 20 29 20 70 49 64 78 20 3d 20  tTable ) pIdx = 
10e40 30 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  0;.  }else..#ifn
10e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10e60 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
10e70 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
10e80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
10e90 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
10ea0 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
10eb0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
10ec0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
10ed0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
10ee0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
10ef0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
10f00 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
10f10 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
10f20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
10f30 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
10f40 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
10f50 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
10f60 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
10f70 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
10f80 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
10f90 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
10fa0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
10fb0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
10fc0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
10fd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
10fe0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
10ff0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
11000 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
11010 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
11020 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
11030 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
11040 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
11050 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
11060 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
11070 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
11080 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
11090 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
110a0 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
110b0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
110c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
110d0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
110e0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
110f0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
11100 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
11110 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
11120 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
11130 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
11140 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
11150 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
11160 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
11170 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
11180 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
11190 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
111a0 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
111b0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
111c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
111d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
111e0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
111f0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
11200 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11210 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
11220 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
11230 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
11240 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
11250 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
11260 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
11270 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
11280 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
11290 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
112a0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
112b0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
112c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
112d0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
112e0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
112f0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
11300 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
11310 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
11320 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
11340 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
11350 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
11360 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
11370 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
11380 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
11390 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
113a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
113b0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
113d0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
113e0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
113f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
11400 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
11410 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
11420 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
11430 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
11440 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
11450 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
11460 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20  **.    ** Added 
11470 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74  2014-05-26: If t
11480 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49  he table is a WI
11490 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
114a0 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75  e, then.    ** u
114b0 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  se an ephemeral 
114c0 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
114d0 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63   a RowSet to rec
114e0 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a  ord the primary.
114f0 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74      ** keys of t
11500 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20  he rows we have 
11510 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20  already seen..  
11520 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
11530 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
11540 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
11550 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
11560 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
11570 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
11580 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
11590 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
115a0 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
115b0 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
115c0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
115d0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
115e0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
115f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
11600 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
11610 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
11620 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
11630 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
11640 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
11650 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
11660 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
11670 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11690 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
116a0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
116b0 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
116c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
116e0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
116f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
11700 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11730 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
11740 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
11750 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
11760 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11770 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
11780 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
11790 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
117c0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
117d0 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
117e0 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
117f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11800 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
11810 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
11820 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
11830 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11850 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11860 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
11870 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
11880 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
11890 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20  s for sub-WHERE 
118a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78  clause */.    Ex
118b0 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30  pr *pAndExpr = 0
118c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
118d0 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28   /* An ".. AND (
118e0 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
118f0 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
11900 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
11910 70 54 61 62 3b 0a 0a 20 20 20 20 70 54 65 72 6d  pTab;..    pTerm
11920 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
11930 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
11940 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
11950 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
11960 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
11970 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
11980 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
11990 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
119a0 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
119b0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
119c0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65  nfo->wc;.    pLe
119d0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74  vel->op = OP_Ret
119e0 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  urn;.    pLevel-
119f0 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b  >p1 = regReturn;
11a00 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
11a10 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e  a new SrcList in
11a20 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69   pOrTab containi
11a30 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
11a40 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a  ng scanned.    *
11a50 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  * by this loop i
11a60 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20  n the a[0] slot 
11a70 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79  and all notReady
11a80 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e   tables in a[1..
11a90 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  ] slots..    ** 
11aa0 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  This becomes the
11ab0 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20   SrcList in the 
11ac0 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74  recursive call t
11ad0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
11ae0 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gin()..    */.  
11af0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
11b00 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  evel>1 ){.      
11b10 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20  int nNotReady;  
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b30 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
11b40 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
11b50 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
11b60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72  SrcList_item *or
11b70 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72  igSrc;     /* Or
11b80 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74  iginal list of t
11b90 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  ables */.      n
11ba0 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66  NotReady = pWInf
11bb0 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76  o->nLevel - iLev
11bc0 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f  el - 1;.      pO
11bd0 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74  rTab = sqlite3St
11be0 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a  ackAllocRaw(db,.
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
11c10 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
11c20 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
11c30 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
11c40 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
11c50 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
11c60 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
11c70 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29  b->nAlloc = (u8)
11c80 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
11c90 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
11ca0 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
11cb0 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
11cc0 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
11cd0 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
11ce0 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
11cf0 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
11d00 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
11d10 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
11d20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
11d30 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
11d40 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
11d50 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
11d60 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
11d70 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
11d80 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
11d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
11da0 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
11db0 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
11dc0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
11dd0 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
11de0 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
11df0 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
11e00 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
11e10 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
11e20 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c  pty rowset.  Or,
11e30 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
11e40 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a  eral index.    *
11e50 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c  * capable of hol
11e60 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  ding primary key
11e70 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  s in the case of
11e80 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
11e90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11ea0 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
11eb0 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
11ec0 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
11ed0 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
11ee0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
11ef0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
11f00 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
11f10 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
11f20 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
11f30 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
11f40 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
11f50 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
11f60 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
11f70 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
11f80 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
11f90 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
11fa0 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
11fb0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
11fc0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
11fd0 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
11fe0 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
11ff0 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
12000 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
12010 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
12020 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
12030 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
12040 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
12050 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
12060 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
12070 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
12080 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
12090 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
120a0 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
120b0 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  K)==0 ){.      i
120c0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
120d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  ) ){.        reg
120e0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
120f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
12100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12110 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
12120 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20  , regRowset);.  
12130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12140 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
12150 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
12160 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
12170 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
12180 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
121a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
121b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
121c0 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d   regRowset, pPk-
121d0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
121e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
121f0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
12200 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d  e, pPk);.      }
12210 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
12220 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
12240 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
12250 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12260 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
12270 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
12280 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
12290 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
122a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
122b0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
122c0 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
122d0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
122e0 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
122f0 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
12300 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
12310 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
12320 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
12330 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
12340 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
12350 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
12360 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
12370 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
12380 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
12390 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
123a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
123b0 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
123c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
123d0 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
123e0 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
123f0 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
12400 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
12410 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
12420 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
12430 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
12440 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
12450 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
12460 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
12470 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
12480 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
12490 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
124a0 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
124b0 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
124c0 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
124d0 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
124e0 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
124f0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
12500 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
12510 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
12520 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
12530 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
12540 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
12550 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
12560 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
12570 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
12580 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
12590 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
125a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
125b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
125c0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
125d0 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
125e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57  .        if( &pW
125f0 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70  C->a[iTerm] == p
12600 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
12610 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12620 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
12630 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
12640 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
12650 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43     testcase( pWC
12660 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
12670 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
12680 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
12690 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
126a0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
126b0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
126c0 29 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))!=0 ) continue
126d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
126e0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70  WC->a[iTerm].eOp
126f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29  erator & WO_ALL)
12700 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12710 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
12720 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
12730 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
12740 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  RINFO );.       
12750 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
12760 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
12770 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
12780 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
12790 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
127a0 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
127b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
127c0 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
127d0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
127e0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
127f0 72 73 65 2c 20 54 4b 5f 41 4e 44 7c 54 4b 46 4c  rse, TK_AND|TKFL
12800 47 5f 44 4f 4e 54 46 4f 4c 44 2c 20 30 2c 20 70  G_DONTFOLD, 0, p
12810 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 20 20  AndExpr);.      
12820 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
12830 52 75 6e 20 61 20 73 65 70 61 72 61 74 65 20 57  Run a separate W
12840 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
12850 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
12860 20 4f 52 20 63 6c 61 75 73 65 2e 20 20 41 66 74   OR clause.  Aft
12870 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e  er.    ** elimin
12880 61 74 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  ating duplicates
12890 20 66 72 6f 6d 20 6f 74 68 65 72 20 57 48 45 52   from other WHER
128a0 45 20 63 6c 61 75 73 65 73 2c 20 74 68 65 20 61  E clauses, the a
128b0 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20  ction for each. 
128c0 20 20 20 2a 2a 20 73 75 62 2d 57 48 45 52 45 20     ** sub-WHERE 
128d0 63 6c 61 75 73 65 20 69 73 20 74 6f 20 74 6f 20  clause is to to 
128e0 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20  invoke the main 
128f0 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73  loop body as a s
12900 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a  ubroutine..    *
12910 2f 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  /.    wctrlFlags
12920 20 3d 20 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   =  WHERE_OR_SUB
12930 43 4c 41 55 53 45 20 7c 20 28 70 57 49 6e 66 6f  CLAUSE | (pWInfo
12940 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
12950 48 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29  HERE_SEEK_TABLE)
12960 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  ;.    ExplainQue
12970 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
12980 31 2c 20 22 4d 55 4c 54 49 2d 49 4e 44 45 58 20  1, "MULTI-INDEX 
12990 4f 52 22 29 29 3b 0a 20 20 20 20 66 6f 72 28 69  OR"));.    for(i
129a0 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
129b0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
129c0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
129d0 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
129e0 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
129f0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
12a00 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70  rsor==iCur || (p
12a10 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
12a20 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
12a30 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
12a40 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
12a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
12a60 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
12a70 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
12a80 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
12a90 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
12aa0 78 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  xpr; /* Current 
12ab0 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  OR clause term *
12ac0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d  /.        int jm
12ad0 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
12ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12af0 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65  ress of jump ope
12b00 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
12b10 20 20 61 73 73 65 72 74 28 20 28 70 54 61 62 49    assert( (pTabI
12b20 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  tem[0].fg.jointy
12b30 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30  pe & JT_LEFT)==0
12b40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
12b50 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
12b60 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72  y(pOrExpr, EP_Fr
12b70 6f 6d 4a 6f 69 6e 29 20 0a 20 20 20 20 20 20 20  omJoin) .       
12b80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
12b90 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
12ba0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
12bb0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
12bc0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
12bd0 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
12be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12bf0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
12c00 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
12c10 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
12c20 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
12c30 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
12c40 66 66 66 66 2c 20 28 22 53 75 62 70 6c 61 6e 20  ffff, ("Subplan 
12c50 66 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e  for OR-clause:\n
12c60 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  "));.        pSu
12c70 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
12c80 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
12c90 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
12ca0 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 77 63 74 72 6c 46 6c 61 67 73 2c 20 69 43 6f 76  wctrlFlags, iCov
12ce0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
12cf0 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
12d00 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
12d10 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12d20 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
12d30 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
12d40 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
12d50 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
12d60 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
12d70 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74  rExplain = sqlit
12d80 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e  e3WhereExplainOn
12d90 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
12da0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
12db0 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
12dc0 3e 61 5b 30 5d 2c 20 30 0a 20 20 20 20 20 20 20  >a[0], 0.       
12dd0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
12de0 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53  sqlite3WhereAddS
12df0 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 4f 72  canStatus(v, pOr
12e00 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
12e10 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c 61  >a[0], addrExpla
12e20 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  in);..          
12e30 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73  /* This is the s
12e40 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
12e50 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69  body.  First ski
12e60 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20  p over.         
12e70 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f   ** duplicate ro
12e80 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75  ws from prior su
12e90 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  b-WHERE clauses,
12ea0 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a   and record the.
12eb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
12ec0 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  id (or PRIMARY K
12ed0 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72  EY) for the curr
12ee0 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20  ent row so that 
12ef0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
12f00 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62     ** row will b
12f10 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62  e skipped in sub
12f20 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52  sequent sub-WHER
12f30 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  E clauses..     
12f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12f50 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
12f60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
12f70 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
12f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12f90 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
12fa0 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
12fb0 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
12fc0 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
12fd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48             if( H
12fe0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
12ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13000 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13010 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
13020 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43  se, pTab, -1, iC
13030 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29  ur, regRowid, 0)
13040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13050 6a 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp1 = sqlite3Vd
13060 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
13070 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65  P_RowSetTest, re
13080 67 52 6f 77 73 65 74 2c 20 30 2c 0a 20 20 20 20  gRowset, 0,.    
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 20 20 72 2c 69 53 65 74 29 3b 0a         r,iSet);.
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
130d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
130e0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
130f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13100 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
13110 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
13120 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
13130 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b           int nPk
13140 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
13150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13160 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20  nt iPk;..       
13170 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
13180 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72  he PK into an ar
13190 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
131a0 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  sters. */.      
131b0 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
131c0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
131d0 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20  pParse, nPk);.  
131e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
131f0 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20  iPk=0; iPk<nPk; 
13200 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPk++){.        
13210 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
13220 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
13230 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  [iPk];.         
13240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13250 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
13260 6f 52 65 67 28 70 50 61 72 73 65 2c 20 70 54 61  oReg(pParse, pTa
13270 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72  b, iCol, iCur, r
13280 2b 69 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  +iPk);.         
13290 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
132a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
132b0 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  f the temp table
132c0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
132d0 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73  s this key. If s
132e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
132f0 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20   ** the row has 
13300 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
13310 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73  luded in the res
13320 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20  ult set and.    
13330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e            ** can
13340 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20   be ignored (by 
13350 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65  jumping past the
13360 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f   Gosub below). O
13370 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
13380 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
13390 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74  t the key into t
133a0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e  he temp table an
133b0 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70  d proceed with p
133c0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
133d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
133e0 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow..            
133f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
13400 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f     ** Use some o
13410 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d  f the same optim
13420 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52  izations as OP_R
13430 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20 69 53  owSetTest: If iS
13440 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
13450 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73   ** is zero, ass
13460 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65 79  ume that the key
13470 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20   cannot already 
13480 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  be present in.  
13490 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
134a0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41  he temp table. A
134b0 6e 64 20 69 66 20 69 53 65 74 20 69 73 20 2d 31  nd if iSet is -1
134c0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
134d0 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20  ere is no .     
134e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
134f0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b   to insert the k
13500 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ey into the temp
13510 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69   table, as it wi
13520 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20  ll never .      
13530 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65          ** be te
13540 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20  sted for.  */ . 
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
13560 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20   iSet ){.       
13570 20 20 20 20 20 20 20 20 20 6a 6d 70 31 20 3d 20           jmp1 = 
13580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13590 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
135a0 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20  , regRowset, 0, 
135b0 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
135c0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
135d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
135e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
135f0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
13600 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
13610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13620 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
13630 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50  akeRecord, r, nP
13640 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
13670 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
13680 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72  rt, regRowset, r
13690 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  egRowid,.       
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 2c                r,
136c0 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
136d0 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20         if( iSet 
136e0 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
136f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
13700 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
13720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
13730 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72  * Release the ar
13740 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
13750 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  sters */.       
13760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
13770 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
13780 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a  Parse, r, nPk);.
13790 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
137a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
137b0 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74       /* Invoke t
137c0 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64  he main loop bod
137d0 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e  y as a subroutin
137e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  e */.          s
137f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13800 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
13810 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
13820 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
13830 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b  /* Jump here (sk
13840 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ipping the main 
13850 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75  loop body subrou
13860 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20  tine) if the.   
13870 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
13880 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20  t sub-WHERE row 
13890 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66  is a duplicate f
138a0 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
138b0 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  EREs. */.       
138c0 20 20 20 69 66 28 20 6a 6d 70 31 20 29 20 73 71     if( jmp1 ) sq
138d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
138e0 65 28 76 2c 20 6a 6d 70 31 29 3b 0a 0a 20 20 20  e(v, jmp1);..   
138f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
13900 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
13910 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e  dTerms flag mean
13920 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74  s that this OR t
13930 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
13940 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f   contained one o
13950 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20  r more AND term 
13960 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20  from a notReady 
13970 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20  table.  The.    
13980 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66        ** terms f
13990 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79  rom the notReady
139a0 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74   table could not
139b0 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77   be tested and w
139c0 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ill.          **
139d0 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74   need to be test
139e0 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  ed later..      
139f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13a00 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e   if( pSubWInfo->
13a10 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
13a20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
13a30 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  1;..          /*
13a40 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f   If all of the O
13a50 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
13a60 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20  s are optimized 
13a70 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
13a80 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65           ** inde
13a90 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  x, and the index
13aa0 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
13ab0 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72   the same cursor
13ac0 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
13ad0 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c    ** by each cal
13ae0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
13af0 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79  eBegin() made by
13b00 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d   this loop, it m
13b10 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ay.          ** 
13b20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
13b30 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73  se that index as
13b40 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13b50 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  x..          **.
13b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
13b70 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
13b80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
13b90 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69  above resulted i
13ba0 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20  n a scan that.  
13bb0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20          ** uses 
13bc0 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  an index, and th
13bd0 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65  is is either the
13be0 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63   first OR-connec
13bf0 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20  ted term.       
13c00 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
13c10 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  or the index is 
13c20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74  the same as that
13c30 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65   used by all pre
13c40 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
13c50 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43  ** terms, set pC
13c60 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64  ov to the candid
13c70 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
13c80 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ex. Otherwise, s
13c90 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  et .          **
13ca0 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f   pCov to NULL to
13cb0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e   indicate that n
13cc0 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  o candidate cove
13cd0 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20  ring index will 
13ce0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
13cf0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20   available..    
13d00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13d10 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53     pSubLoop = pS
13d20 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57  ubWInfo->a[0].pW
13d30 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
13d40 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f  assert( (pSubLoo
13d50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
13d60 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
13d70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
13d80 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73  f( (pSubLoop->ws
13d90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
13da0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
13db0 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c       && (ii==0 |
13dc0 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  | pSubLoop->u.bt
13dd0 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76  ree.pIndex==pCov
13de0 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
13df0 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  (HasRowid(pTab) 
13e00 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  || !IsPrimaryKey
13e10 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e  Index(pSubLoop->
13e20 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29  u.btree.pIndex))
13e30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
13e40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13e50 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  ( pSubWInfo->a[0
13e60 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43  ].iIdxCur==iCovC
13e70 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ur );.          
13e80 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f    pCov = pSubLoo
13e90 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
13ea0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  x;.          }el
13eb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
13ec0 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
13ed0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
13ee0 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
13ef0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
13f00 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
13f10 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
13f20 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
13f30 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
13f40 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
13f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f60 20 20 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51    }.    ExplainQ
13f70 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
13f80 73 65 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  se);.    pLevel-
13f90 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
13fa0 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
13fb0 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
13fc0 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
13fd0 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
13fe0 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
13ff0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
14000 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14010 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
14020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14030 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
14040 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
14050 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
14060 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
14070 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
14080 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
14090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
140a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
140b0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
140c0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
140d0 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
140e0 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
140f0 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
14100 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
14110 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14120 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
14130 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
14140 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
14150 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
14160 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
14170 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
14180 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
14190 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
141a0 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
141b0 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
141c0 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
141d0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
141e0 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
141f0 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
14200 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
14210 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
14220 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
14230 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
14240 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
14250 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
14260 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  ;.    if( pTabIt
14270 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
14280 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ve ){.      /* T
14290 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52  ables marked isR
142a0 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e  ecursive have on
142b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ly a single row 
142c0 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
142d0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65  n.      ** a pse
142e0 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20  udo-cursor.  No 
142f0 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f  need to Rewind o
14300 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72 73  r Next such curs
14310 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ors. */.      pL
14320 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
14330 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  op;.    }else{. 
14340 20 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48       codeCursorH
14350 69 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57  int(pTabItem, pW
14360 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 30 29  Info, pLevel, 0)
14370 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
14380 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
14390 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
143a0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
143b0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
143c0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
143d0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
143e0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 48  ev], iCur, addrH
143f0 61 6c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  alt);.      Vdbe
14400 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
14410 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
14420 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
14430 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20  bRev!=0);.      
14440 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
14450 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
14460 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
14470 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14480 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14490 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
144a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69  pLevel->addrVisi
144b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
144c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23  urrentAddr(v);.#
144d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65  endif..  /* Inse
144e0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
144f0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
14500 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
14510 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
14520 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
14530 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
14540 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  f tables..  **. 
14550 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 61   ** This loop ma
14560 79 20 72 75 6e 20 62 65 74 77 65 65 6e 20 6f 6e  y run between on
14570 65 20 61 6e 64 20 74 68 72 65 65 20 74 69 6d 65  e and three time
14580 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  s, depending on 
14590 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 73 74 72 61  the.  ** constra
145a0 69 6e 74 73 20 74 6f 20 62 65 20 67 65 6e 65 72  ints to be gener
145b0 61 74 65 64 2e 20 54 68 65 20 76 61 6c 75 65 20  ated. The value 
145c0 6f 66 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  of stack variabl
145d0 65 20 69 4c 6f 6f 70 0a 20 20 2a 2a 20 64 65 74  e iLoop.  ** det
145e0 65 72 6d 69 6e 65 73 20 74 68 65 20 63 6f 6e 73  ermines the cons
145f0 74 72 61 69 6e 74 73 20 63 6f 64 65 64 20 62 79  traints coded by
14600 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 2c   each iteration,
14610 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
14620 2a 0a 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 31 3a  *.  ** iLoop==1:
14630 20 43 6f 64 65 20 6f 6e 6c 79 20 65 78 70 72 65   Code only expre
14640 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
14650 65 6e 74 69 72 65 6c 79 20 63 6f 76 65 72 65 64  entirely covered
14660 20 62 79 20 70 49 64 78 2e 0a 20 20 2a 2a 20 69   by pIdx..  ** i
14670 4c 6f 6f 70 3d 3d 32 3a 20 43 6f 64 65 20 72 65  Loop==2: Code re
14680 6d 61 69 6e 69 6e 67 20 65 78 70 72 65 73 73 69  maining expressi
14690 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ons that do not 
146a0 63 6f 6e 74 61 69 6e 20 63 6f 72 72 65 6c 61 74  contain correlat
146b0 65 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  ed.  **         
146c0 20 20 73 75 62 2d 71 75 65 72 69 65 73 2e 20 20    sub-queries.  
146d0 0a 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 33 3a 20  .  ** iLoop==3: 
146e0 43 6f 64 65 20 61 6c 6c 20 72 65 6d 61 69 6e 69  Code all remaini
146f0 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  ng expressions..
14700 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 66 66    **.  ** An eff
14710 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73  ort is made to s
14720 6b 69 70 20 75 6e 6e 65 63 65 73 73 61 72 79 20  kip unnecessary 
14730 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
14740 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69  e loop..  */.  i
14750 4c 6f 6f 70 20 3d 20 28 70 49 64 78 20 3f 20 31  Loop = (pIdx ? 1
14760 20 3a 20 32 29 3b 0a 20 20 64 6f 7b 0a 20 20 20   : 2);.  do{.   
14770 20 69 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b 20   int iNext = 0; 
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14790 2a 20 4e 65 78 74 20 76 61 6c 75 65 20 66 6f 72  * Next value for
147a0 20 69 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 66 6f   iLoop */.    fo
147b0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
147c0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
147d0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
147e0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
147f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6b 69 70  ;.      int skip
14800 4c 69 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  LikeAddr = 0;.  
14810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
14820 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
14830 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
14840 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14850 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
14860 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
14870 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
14880 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
14890 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
148a0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
148b0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
148c0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
148d0 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
148e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
148f0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
14900 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
14910 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
14920 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
14930 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
14940 42 43 4c 41 55 53 45 29 21 3d 30 20 29 3b 0a 20  BCLAUSE)!=0 );. 
14950 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75         pWInfo->u
14960 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
14970 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
14980 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
14990 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
149a0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
149b0 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
149c0 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d    if( (pTabItem-
149d0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 4a 54 5f  >fg.jointype&JT_
149e0 4c 45 46 54 29 20 26 26 20 21 45 78 70 72 48 61  LEFT) && !ExprHa
149f0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 45 50 5f  sProperty(pE,EP_
14a00 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
14a10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
14a30 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3d 3d 31      if( iLoop==1
14a40 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
14a50 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70  CoveredByIndex(p
14a60 45 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  E, pLevel->iTabC
14a70 75 72 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  ur, pIdx) ){.   
14a80 20 20 20 20 20 69 4e 65 78 74 20 3d 20 32 3b 0a       iNext = 2;.
14a90 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ab0 69 66 28 20 69 4c 6f 6f 70 3c 33 20 26 26 20 28  if( iLoop<3 && (
14ac0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
14ad0 20 54 45 52 4d 5f 56 41 52 53 45 4c 45 43 54 29   TERM_VARSELECT)
14ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14af0 69 4e 65 78 74 3d 3d 30 20 29 20 69 4e 65 78 74  iNext==0 ) iNext
14b00 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 3;.        co
14b10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
14b20 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
14b30 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14b40 4d 5f 4c 49 4b 45 43 4f 4e 44 29 21 3d 30 20 29  M_LIKECOND)!=0 )
14b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
14b60 74 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e  the TERM_LIKECON
14b70 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  D flag is set, t
14b80 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
14b90 68 65 20 72 61 6e 67 65 20 73 65 61 72 63 68 0a  he range search.
14ba0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 75          ** is su
14bb0 66 66 69 63 69 65 6e 74 20 74 6f 20 67 75 61 72  fficient to guar
14bc0 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 4c  antee that the L
14bd0 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20  IKE operator is 
14be0 74 72 75 65 2c 20 73 6f 20 77 65 0a 20 20 20 20  true, so we.    
14bf0 20 20 20 20 2a 2a 20 63 61 6e 20 73 6b 69 70 20      ** can skip 
14c00 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  the call to the 
14c10 6c 69 6b 65 28 41 2c 42 29 20 66 75 6e 63 74 69  like(A,B) functi
14c20 6f 6e 2e 20 20 42 75 74 20 74 68 69 73 20 6f 6e  on.  But this on
14c30 6c 79 20 77 6f 72 6b 73 0a 20 20 20 20 20 20 20  ly works.       
14c40 20 2a 2a 20 66 6f 72 20 73 74 72 69 6e 67 73 2e   ** for strings.
14c50 20 20 53 6f 20 64 6f 20 6e 6f 74 20 73 6b 69 70    So do not skip
14c60 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65   the call to the
14c70 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
14c80 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 2a 2a   pass.        **
14c90 20 74 68 61 74 20 63 6f 6d 70 61 72 65 73 20 42   that compares B
14ca0 4c 4f 42 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20  LOBs. */.#ifdef 
14cb0 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53  SQLITE_LIKE_DOES
14cc0 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20  NT_MATCH_BLOBS. 
14cd0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14ce0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 75  .#else.        u
14cf0 33 32 20 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  32 x = pLevel->i
14d00 4c 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20 20  LikeRepCntr;.   
14d10 20 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a       if( x>0 ){.
14d20 20 20 20 20 20 20 20 20 20 20 73 6b 69 70 4c 69            skipLi
14d30 6b 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  keAddr = sqlite3
14d40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 78  VdbeAddOp1(v, (x
14d50 26 31 29 3f 4f 50 5f 49 66 4e 6f 74 3a 4f 50 5f  &1)?OP_IfNot:OP_
14d60 49 66 2c 28 69 6e 74 29 28 78 3e 3e 31 29 29 3b  If,(int)(x>>1));
14d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
14d90 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  v);.#endif.     
14da0 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
14db0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
14dc0 30 78 66 66 66 66 20 2a 2f 0a 20 20 20 20 20 20  0xffff */.      
14dd0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
14de0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
14df0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14e00 28 28 76 2c 20 22 57 68 65 72 65 54 65 72 6d 5b  ((v, "WhereTerm[
14e10 25 64 5d 20 28 25 70 29 20 70 72 69 6f 72 69 74  %d] (%p) priorit
14e20 79 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  y=%d",.         
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 70 57 43 2d 3e 6e 54 65 72 6d 2d 6a 2c 20 70 54  pWC->nTerm-j, pT
14e50 65 72 6d 2c 20 69 4c 6f 6f 70 29 29 3b 0a 20 20  erm, iLoop));.  
14e60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
14e80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
14e90 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
14ea0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
14eb0 20 20 20 20 20 20 69 66 28 20 73 6b 69 70 4c 69        if( skipLi
14ec0 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  keAddr ) sqlite3
14ed0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14ee0 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20  skipLikeAddr);. 
14ef0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
14f00 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
14f10 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 6f  D;.    }.    iLo
14f20 6f 70 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 77  op = iNext;.  }w
14f30 68 69 6c 65 28 20 69 4c 6f 6f 70 3e 30 20 29 3b  hile( iLoop>0 );
14f40 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
14f50 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69  de to test for i
14f60 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e  mplied constrain
14f70 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e  ts based on tran
14f80 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66  sitivity.  ** of
14f90 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74   the "==" operat
14fa0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  or..  **.  ** Ex
14fb0 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48  ample: If the WH
14fc0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
14fd0 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  ins "t1.a=t2.b" 
14fe0 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20  and "t2.b=123". 
14ff0 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63   ** and we are c
15000 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f  oding the t1 loo
15010 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f  p and the t2 loo
15020 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f  p has not yet co
15030 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ded,.  ** then w
15040 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
15050 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e   "t1.a=t2.b" con
15060 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20  straint, but we 
15070 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68  can code.  ** th
15080 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d  e implied "t1.a=
15090 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e  123" constraint.
150a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
150b0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
150c0 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
150d0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
150e0 45 78 70 72 20 2a 70 45 2c 20 73 45 41 6c 74 3b  Expr *pE, sEAlt;
150f0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
15100 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54  pAlt;.    if( pT
15110 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
15120 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
15130 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
15140 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
15150 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15160 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d   (WO_EQ|WO_IS))=
15170 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
15180 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
15190 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
151a0 55 49 56 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  UIV)==0 ) contin
151b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
151c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
151d0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
151e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
151f0 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74  iLeftJoin ) cont
15200 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70  inue;.    pE = p
15210 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
15220 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15230 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
15240 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20  _FromJoin) );.  
15250 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
15260 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
15270 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
15280 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
15290 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
152a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
152b0 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  r, pTerm->u.left
152c0 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79  Column, notReady
152d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152e0 20 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49        WO_EQ|WO_I
152f0 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20  N|WO_IS, 0);.   
15300 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63   if( pAlt==0 ) c
15310 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15320 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26   pAlt->wtFlags &
15330 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20   (TERM_CODED) ) 
15340 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15350 28 20 28 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  ( (pAlt->eOperat
15360 6f 72 20 26 20 57 4f 5f 49 4e 29 20 0a 20 20 20  or & WO_IN) .   
15370 20 20 26 26 20 28 70 41 6c 74 2d 3e 70 45 78 70    && (pAlt->pExp
15380 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
15390 73 53 65 6c 65 63 74 29 0a 20 20 20 20 20 26 26  sSelect).     &&
153a0 20 28 70 41 6c 74 2d 3e 70 45 78 70 72 2d 3e 78   (pAlt->pExpr->x
153b0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
153c0 2d 3e 6e 45 78 70 72 3e 31 29 0a 20 20 20 20 29  ->nExpr>1).    )
153d0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
153e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
153f0 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
15400 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
15410 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
15420 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
15430 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
15440 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
15450 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
15460 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  );.    VdbeModul
15470 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
15480 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63  gin transitive c
15490 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20  onstraint"));.  
154a0 20 20 73 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d    sEAlt = *pAlt-
154b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 73 45 41 6c  >pExpr;.    sEAl
154c0 74 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  t.pLeft = pE->pL
154d0 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eft;.    sqlite3
154e0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
154f0 73 65 2c 20 26 73 45 41 6c 74 2c 20 61 64 64 72  se, &sEAlt, addr
15500 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
15510 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20  PIFNULL);.  }.. 
15520 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
15530 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
15540 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
15550 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
15560 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
15570 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
15580 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
15590 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
155a0 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
155b0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
155c0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
155d0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
155e0 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
155f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15620 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
15630 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
15640 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
15650 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
15660 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
15670 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15680 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
15690 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
156a0 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
156b0 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
156c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
156d0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
156e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
156f0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  TUAL );.      te
15700 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
15710 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
15720 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28  DED );.      if(
15730 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
15740 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
15750 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
15760 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
15770 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
15780 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
15790 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
157a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
157b0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
157c0 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
157d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
157e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
157f0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
15800 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15810 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15820 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
15830 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
15840 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
15850 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
15860 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
15870 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15880 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  urn pLevel->notR
15890 65 61 64 79 3b 0a 7d 0a                          eady;.}.