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

Artifact 3317f2b083a66d3e65a03edf316ade4ccb0a99c9956273282ebb579b95d4ba96:


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 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
5560: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt;.            
5570: 69 66 28 20 69 45 71 3e 30 20 26 26 20 28 70 4c  if( iEq>0 && (pL
5580: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
5590: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
55a0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
55b0: 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 42 61 73         pIn->iBas
55c0: 65 20 3d 20 69 52 65 67 20 2d 20 69 3b 0a 20 20  e = iReg - i;.  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
55e0: 3e 6e 50 72 65 66 69 78 20 3d 20 69 3b 0a 20 20  >nPrefix = i;.  
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
5600: 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
5610: 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 3b  ERE_IN_EARLYOUT;
5620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
5630: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5640: 20 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78 20 3d    pIn->nPrefix =
5650: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
5660: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
5670: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
5680: 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
5690: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
56a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
56b0: 70 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  pIn++;.        }
56c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
56d0: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
56e0: 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
56f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5700: 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
5710: 64 62 2c 20 61 69 4d 61 70 29 3b 0a 23 65 6e 64  db, aiMap);.#end
5720: 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
5730: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
5740: 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
5750: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
5760: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
5770: 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
5780: 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
5790: 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
57a0: 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a  * index scan..**
57b0: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
57c0: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
57d0: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
57e0: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
57f0: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
5800: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5810: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
5820: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
5830: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
5840: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
5850: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
5860: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
5870: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
5880: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
5890: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
58a0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
58b0: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
58c0: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
58d0: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
58e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
58f0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
5900: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
5910: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
5920: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
5930: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
5940: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
5950: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
5960: 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
5970: 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
5980: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
5990: 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
59a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
59b0: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
59c0: 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
59d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
59e0: 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
59f0: 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
5a00: 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
5a10: 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
5a20: 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
5a30: 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
5a40: 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
5a50: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
5a60: 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
5a70: 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
5a80: 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
5a90: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
5aa0: 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61  The nExtraReg pa
5ab0: 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20  rameter is 0 or 
5ac0: 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61  1.  It is 0 if a
5ad0: 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ll WHERE clause 
5ae0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61  constraints.** a
5af0: 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20  re == or IN and 
5b00: 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
5b10: 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52  he nEq.  nExtraR
5b20: 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65  eg is 1 if there
5b30: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61   is.** an inequa
5b40: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
5b50: 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e  (such as the "c>
5b60: 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20  =5 AND c<10" in 
5b70: 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61  the example) tha
5b80: 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65  t.** occurs afte
5b90: 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74  r the nEq qualit
5ba0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
5bb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5bc0: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61  e allocates a ra
5bd0: 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72  nge of nEq+nExtr
5be0: 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  aReg memory cell
5bf0: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  s and returns.**
5c00: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5c10: 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63  e first memory c
5c20: 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67  ell in that rang
5c30: 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  e. The code that
5c40: 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
5c50: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
5c60: 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67  that memory rang
5c70: 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20  e to store keys 
5c80: 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64  for.** start and
5c90: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
5ca0: 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  ditions of the l
5cb0: 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  oop..** key valu
5cc0: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
5cd0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
5ce0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
5cf0: 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
5d00: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
5d10: 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
5d20: 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
5d30: 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
5d40: 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
5d50: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
5d60: 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
5d70: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
5d80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
5d90: 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
5da0: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
5db0: 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
5dc0: 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
5dd0: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
5de0: 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
5df0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
5e00: 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
5e10: 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
5e20: 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
5e30: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
5e40: 73 65 20 42 4c 4f 42 20 6f 72 20 4e 4f 4e 45 20  se BLOB or NONE 
5e50: 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
5e60: 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
5e70: 46 5f 42 4c 4f 42 2e 20 54 68 69 73 20 69 73 20  F_BLOB. This is 
5e80: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
5e90: 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
5ea0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
5eb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5ec0: 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
5ed0: 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
5ee0: 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
5ef0: 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
5f00: 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
5f10: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
5f20: 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
5f30: 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
5f40: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
5f50: 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
5f60: 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
5f70: 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
5f80: 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
5f90: 29 20 68 61 73 20 42 4c 4f 42 2f 4e 4f 4e 45 20  ) has BLOB/NONE 
5fa0: 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
5fb0: 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
5fc0: 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
5fd0: 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
5fe0: 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
5ff0: 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
6000: 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
6010: 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
6020: 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
6030: 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
6040: 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
6050: 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
6060: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
6070: 5f 41 46 46 5f 42 4c 4f 42 2e 0a 2a 2f 0a 73 74  _AFF_BLOB..*/.st
6080: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
6090: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
60a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
60b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
60c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
60d0: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
60e0: 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
60f0: 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
6100: 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
6110: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ing */.  int bRe
6120: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
6130: 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
6140: 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
6150: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
6160: 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
6170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
6180: 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
6190: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
61a0: 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
61b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
61c0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
61d0: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
61e0: 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20  .  u16 nEq;     
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
6210: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
6220: 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
6230: 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20  /.  u16 nSkip;  
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
6260: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
6270: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64   to skip */.  Vd
6280: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6290: 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
62a0: 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
62b0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
62c0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
62e0: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
62f0: 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
6300: 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  p */.  WhereTerm
6310: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
6320: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
6330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
6340: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
6350: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
6360: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
6370: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
6380: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
63a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
63b0: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
63e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
63f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6400: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6410: 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
6420: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
6430: 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
6440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6450: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
6460: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
6470: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
6480: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
6490: 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
64a0: 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
64b0: 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  /.  pLoop = pLev
64c0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73  el->pWLoop;.  as
64d0: 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
64e0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
64f0: 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
6500: 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ;.  nEq = pLoop-
6510: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
6520: 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  nSkip = pLoop->n
6530: 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70  Skip;.  pIdx = p
6540: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
6550: 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ndex;.  assert( 
6560: 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pIdx!=0 );..  /*
6570: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
6580: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
6590: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
65a0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
65b0: 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73  m..  */.  regBas
65c0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
65d0: 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70   + 1;.  nReg = p
65e0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
65f0: 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20  q + nExtraReg;. 
6600: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6610: 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d   nReg;..  zAff =
6620: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6630: 28 70 50 61 72 73 65 2d 3e 64 62 2c 73 71 6c 69  (pParse->db,sqli
6640: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
6650: 53 74 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 70  Str(pParse->db,p
6660: 49 64 78 29 29 3b 0a 20 20 61 73 73 65 72 74 28  Idx));.  assert(
6670: 20 7a 41 66 66 21 3d 30 20 7c 7c 20 70 50 61 72   zAff!=0 || pPar
6680: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
6690: 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 6e  iled );..  if( n
66a0: 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  Skip ){.    int 
66b0: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
66c0: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73  ->iIdxCur;.    s
66d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
66e0: 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73  (v, (bRev?OP_Las
66f0: 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49  t:OP_Rewind), iI
6700: 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65  dxCur);.    Vdbe
6710: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
6720: 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev==0);.    Vdbe
6730: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
6740: 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev!=0);.    Vdbe
6750: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
6760: 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  in skip-scan on 
6770: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
6780: 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69  ));.    j = sqli
6790: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
67a0: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70   OP_Goto);.    p
67b0: 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
67c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
67d0: 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f  Op4Int(v, (bRev?
67e0: 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65  OP_SeekLT:OP_See
67f0: 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20  kGT),.          
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65    iIdxCur, 0, re
6820: 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20  gBase, nSkip);. 
6830: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
6840: 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
6850: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
6860: 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
6870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
6880: 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20  mpHere(v, j);.  
6890: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b    for(j=0; j<nSk
68a0: 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ip; j++){.      
68b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68c0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
68d0: 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42  iIdxCur, j, regB
68e0: 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65  ase+j);.      te
68f0: 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 61 69  stcase( pIdx->ai
6900: 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58  Column[j]==XN_EX
6910: 50 52 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  PR );.      Vdbe
6920: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
6930: 2c 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f  , explainIndexCo
6940: 6c 75 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a  lumnName(pIdx, j
6950: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  )));.    }.  }  
6960: 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74    ..  /* Evaluat
6970: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
6980: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
6990: 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d    assert( zAff==
69a0: 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e  0 || (int)strlen
69b0: 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  (zAff)>=nEq );. 
69c0: 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c   for(j=nSkip; j<
69d0: 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
69e0: 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d  nt r1;.    pTerm
69f0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
6a00: 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [j];.    assert(
6a10: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
6a20: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
6a30: 67 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72  g testcase is tr
6a40: 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
6a50: 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
6a60: 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
6a70: 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
6a80: 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
6a90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6aa0: 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
6ab0: 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
6ac0: 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
6ad0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
6ae0: 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
6af0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
6b00: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
6b10: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20  RTUAL );.    r1 
6b20: 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
6b30: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
6b40: 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
6b50: 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  v, regBase+j);. 
6b60: 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
6b70: 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
6b80: 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
6b90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6ba0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6bb0: 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
6bc0: 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
6bd0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6be0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c00: 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
6c10: 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
6c20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65     }.    if( pTe
6c30: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
6c40: 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 69  WO_IN ){.      i
6c50: 66 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  f( pTerm->pExpr-
6c60: 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
6c70: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
6c80: 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79 20   /* No affinity 
6c90: 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
6ca0: 20 28 6f 72 20 73 68 6f 75 6c 64 20 62 65 29 20   (or should be) 
6cb0: 61 70 70 6c 69 65 64 20 74 6f 20 61 20 76 61 6c  applied to a val
6cc0: 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  ue.        ** fr
6cd0: 6f 6d 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  om the RHS of an
6ce0: 20 22 3f 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "? IN (SELECT .
6cf0: 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 2e  ..)" expression.
6d00: 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
6d10: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
6d20: 64 65 78 28 29 20 72 6f 75 74 69 6e 65 20 68 61  dex() routine ha
6d30: 73 20 61 6c 72 65 61 64 79 20 65 6e 73 75 72 65  s already ensure
6d40: 64 20 74 68 61 74 20 74 68 65 20 0a 20 20 20 20  d that the .    
6d50: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 20      ** affinity 
6d60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
6d70: 6e 20 68 61 73 20 62 65 65 6e 20 61 70 70 6c 69  n has been appli
6d80: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 2e  ed to the value.
6d90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
6da0: 20 7a 41 66 66 20 29 20 7a 41 66 66 5b 6a 5d 20   zAff ) zAff[j] 
6db0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
6dc0: 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  B;.      }.    }
6dd0: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
6de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
6df0: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
6e00: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
6e10: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
6e20: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
6e30: 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
6e40: 67 73 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d 30  gs & TERM_IS)==0
6e50: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
6e60: 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29  anBeNull(pRight)
6e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6e80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6e90: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
6ea0: 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61  ase+j, pLevel->a
6eb0: 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20  ddrBrk);.       
6ec0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6ed0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6ee0: 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20  if( zAff ){.    
6ef0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
6f00: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
6f10: 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d  Right, zAff[j])=
6f20: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
6f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
6f40: 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
6f50: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
6f60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
6f70: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
6f80: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
6f90: 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
6fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
6fb0: 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
6fc0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
6fd0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6fe0: 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20  .  }.  *pzAff = 
6ff0: 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  zAff;.  return r
7000: 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64  egBase;.}..#ifnd
7010: 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44  ef SQLITE_LIKE_D
7020: 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42  OESNT_MATCH_BLOB
7030: 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  S./*.** If the m
7040: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
7050: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ed instruction i
7060: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e  s a constant ran
7070: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ge constraint.**
7080: 20 28 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72   (a string liter
7090: 61 6c 29 20 74 68 61 74 20 6f 72 69 67 69 6e 61  al) that origina
70a0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ted from the LIK
70b0: 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  E optimization, 
70c0: 74 68 65 6e 20 0a 2a 2a 20 73 65 74 20 50 33 20  then .** set P3 
70d0: 61 6e 64 20 50 35 20 6f 6e 20 74 68 65 20 4f 50  and P5 on the OP
70e0: 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 20 73  _String opcode s
70f0: 6f 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e  o that the strin
7100: 67 20 77 69 6c 6c 20 62 65 20 63 61 73 74 0a 2a  g will be cast.*
7110: 2a 20 74 6f 20 61 20 42 4c 4f 42 20 61 74 20 61  * to a BLOB at a
7120: 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73  ppropriate times
7130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4c 49 4b 45  ..**.** The LIKE
7140: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72   optimization tr
7150: 79 73 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ys to evaluate "
7160: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 61  x LIKE 'abc%'" a
7170: 73 20 61 20 72 61 6e 67 65 0a 2a 2a 20 65 78 70  s a range.** exp
7180: 72 65 73 73 69 6f 6e 3a 20 22 78 3e 3d 27 41 42  ression: "x>='AB
7190: 43 27 20 41 4e 44 20 78 3c 27 61 62 64 27 22 2e  C' AND x<'abd'".
71a0: 20 20 42 75 74 20 74 68 69 73 20 72 65 71 75 69    But this requi
71b0: 72 65 73 20 74 68 61 74 20 74 68 65 20 72 61 6e  res that the ran
71c0: 67 65 0a 2a 2a 20 73 63 61 6e 20 6c 6f 6f 70 20  ge.** scan loop 
71d0: 72 75 6e 20 74 77 69 63 65 2c 20 6f 6e 63 65 20  run twice, once 
71e0: 66 6f 72 20 73 74 72 69 6e 67 73 20 61 6e 64 20  for strings and 
71f0: 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 66 6f  a second time fo
7200: 72 20 42 4c 4f 42 73 2e 0a 2a 2a 20 54 68 65 20  r BLOBs..** The 
7210: 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65  OP_String opcode
7220: 73 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  s on the second 
7230: 70 61 73 73 20 63 6f 6e 76 65 72 74 20 74 68 65  pass convert the
7240: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
7250: 0a 2a 2a 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  .** bound string
7260: 20 63 6f 6e 73 74 61 6e 74 73 20 74 6f 20 62 6c   constants to bl
7270: 6f 62 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  obs.  This routi
7280: 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
7290: 65 73 73 61 72 79 20 63 68 61 6e 67 65 73 0a 2a  essary changes.*
72a0: 2a 20 74 6f 20 74 68 65 20 4f 50 5f 53 74 72 69  * to the OP_Stri
72b0: 6e 67 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 74  ng opcodes for t
72c0: 68 61 74 20 74 6f 20 68 61 70 70 65 6e 2e 0a 2a  hat to happen..*
72d0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 6f 66 20  *.** Except, of 
72e0: 63 6f 75 72 73 65 2c 20 69 66 20 53 51 4c 49 54  course, if SQLIT
72f0: 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41  E_LIKE_DOESNT_MA
7300: 54 43 48 5f 42 4c 4f 42 53 20 69 73 20 64 65 66  TCH_BLOBS is def
7310: 69 6e 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e  ined, then.** on
7320: 6c 79 20 74 68 65 20 6f 6e 65 20 70 61 73 73 20  ly the one pass 
7330: 74 68 72 6f 75 67 68 20 74 68 65 20 73 74 72 69  through the stri
7340: 6e 67 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ng space is requ
7350: 69 72 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  ired, so this ro
7360: 75 74 69 6e 65 0a 2a 2a 20 62 65 63 6f 6d 65 73  utine.** becomes
7370: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
7380: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69  tic void whereLi
7390: 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
73a0: 72 69 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62  ringFixup(.  Vdb
73b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
73c0: 20 20 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64       /* prepared
73d0: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
73e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
73f0: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
7400: 4c 65 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68  Level,     /* Th
7410: 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74  e loop that cont
7420: 61 69 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70  ains the LIKE op
7430: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72  erator */.  Wher
7440: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20  eTerm *pTerm    
7450: 20 20 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72      /* The upper
7460: 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
7470: 6a 75 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b  just coded */.){
7480: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74  .  if( pTerm->wt
7490: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
74a0: 45 4f 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65  EOPT ){.    Vdbe
74b0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73  Op *pOp;.    ass
74c0: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69  ert( pLevel->iLi
74d0: 6b 65 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20  keRepCntr>0 );. 
74e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
74f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29  VdbeGetOp(v, -1)
7500: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
7510: 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
7520: 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
7530: 3d 4f 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20  =OP_String8 .   
7540: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72           || pTer
7550: 6d 2d 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e  m->pWC->pWInfo->
7560: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7570: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7580: 70 4f 70 2d 3e 70 33 20 3d 20 28 69 6e 74 29 28  pOp->p3 = (int)(
7590: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
75a0: 43 6e 74 72 3e 3e 31 29 3b 20 20 2f 2a 20 52 65  Cntr>>1);  /* Re
75b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
75c0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4f  ounter */.    pO
75d0: 70 2d 3e 70 35 20 3d 20 28 75 38 29 28 70 4c 65  p->p5 = (u8)(pLe
75e0: 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
75f0: 72 26 31 29 3b 20 20 20 20 2f 2a 20 41 53 43 20  r&1);    /* ASC 
7600: 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 7d  or DESC */.  }.}
7610: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
7620: 77 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a  whereLikeOptimiz
7630: 61 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70  ationStringFixup
7640: 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
7650: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7660: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
7670: 53 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  S./*.** Informat
7680: 69 6f 6e 20 69 73 20 70 61 73 73 65 64 20 66 72  ion is passed fr
7690: 6f 6d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e  om codeCursorHin
76a0: 74 28 29 20 64 6f 77 6e 20 74 6f 20 69 6e 64 69  t() down to indi
76b0: 76 69 64 75 61 6c 20 6e 6f 64 65 73 20 6f 66 0a  vidual nodes of.
76c0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
76d0: 6e 20 74 72 65 65 20 28 62 79 20 73 71 6c 69 74  n tree (by sqlit
76e0: 65 33 57 61 6c 6b 45 78 70 72 28 29 29 20 75 73  e3WalkExpr()) us
76f0: 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ing an instance 
7700: 6f 66 20 74 68 69 73 0a 2a 2a 20 73 74 72 75 63  of this.** struc
7710: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
7720: 43 43 75 72 48 69 6e 74 20 7b 0a 20 20 69 6e 74  CCurHint {.  int
7730: 20 69 54 61 62 43 75 72 3b 20 20 20 20 2f 2a 20   iTabCur;    /* 
7740: 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d  Cursor for the m
7750: 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ain table */.  i
7760: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 2f  nt iIdxCur;    /
7770: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65  * Cursor for the
7780: 20 69 6e 64 65 78 2c 20 69 66 20 70 49 64 78 21   index, if pIdx!
7790: 3d 30 2e 20 20 55 6e 75 73 65 64 20 6f 74 68 65  =0.  Unused othe
77a0: 72 77 69 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  rwise */.  Index
77b0: 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20 54 68   *pIdx;    /* Th
77c0: 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  e index used to 
77d0: 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
77e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
77f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
7800: 61 6c 6c 65 64 20 66 6f 72 20 65 76 65 72 79 20  alled for every 
7810: 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65  node of an expre
7820: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20  ssion that is a 
7830: 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 66 6f 72  candidate.** for
7840: 20 61 20 63 75 72 73 6f 72 20 68 69 6e 74 20 6f   a cursor hint o
7850: 6e 20 61 6e 20 69 6e 64 65 78 20 63 75 72 73 6f  n an index curso
7860: 72 2e 20 20 46 6f 72 20 54 4b 5f 43 4f 4c 55 4d  r.  For TK_COLUM
7870: 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 72 65 66  N nodes that ref
7880: 65 72 65 6e 63 65 0a 2a 2a 20 74 68 65 20 74 61  erence.** the ta
7890: 62 6c 65 20 43 43 75 72 48 69 6e 74 2e 69 54 61  ble CCurHint.iTa
78a0: 62 43 75 72 2c 20 76 65 72 69 66 79 20 74 68 61  bCur, verify tha
78b0: 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
78c0: 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 61 63 63 65  n can be.** acce
78d0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 68 65  ssed through the
78e0: 20 69 6e 64 65 78 2e 20 20 49 66 20 69 74 20 63   index.  If it c
78f0: 61 6e 6e 6f 74 2c 20 74 68 65 6e 20 73 65 74 20  annot, then set 
7900: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
7910: 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 1..*/.static i
7920: 6e 74 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e  nt codeCursorHin
7930: 74 43 68 65 63 6b 45 78 70 72 28 57 61 6c 6b 65  tCheckExpr(Walke
7940: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
7950: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75   *pExpr){.  stru
7960: 63 74 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69  ct CCurHint *pHi
7970: 6e 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  nt = pWalker->u.
7980: 70 43 43 75 72 48 69 6e 74 3b 0a 20 20 61 73 73  pCCurHint;.  ass
7990: 65 72 74 28 20 70 48 69 6e 74 2d 3e 70 49 64 78  ert( pHint->pIdx
79a0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
79b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
79c0: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
79d0: 54 61 62 6c 65 3d 3d 70 48 69 6e 74 2d 3e 69 54  Table==pHint->iT
79e0: 61 62 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  abCur.   && sqli
79f0: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
7a00: 28 70 48 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45  (pHint->pIdx, pE
7a10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
7a20: 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
7a30: 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d  ->eCode = 1;.  }
7a40: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
7a50: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
7a60: 20 54 65 73 74 20 77 68 65 74 68 65 72 20 6f 72   Test whether or
7a70: 20 6e 6f 74 20 65 78 70 72 65 73 73 69 6f 6e 20   not expression 
7a80: 70 45 78 70 72 2c 20 77 68 69 63 68 20 77 61 73  pExpr, which was
7a90: 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45   part of a WHERE
7aa0: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 73 68 6f 75   clause,.** shou
7ab0: 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  ld be included i
7ac0: 6e 20 74 68 65 20 63 75 72 73 6f 72 2d 68 69 6e  n the cursor-hin
7ad0: 74 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68  t for a table th
7ae0: 61 74 20 69 73 20 6f 6e 20 74 68 65 20 72 68 73  at is on the rhs
7af0: 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  .** of a LEFT JO
7b00: 49 4e 2e 20 53 65 74 20 57 61 6c 6b 65 72 2e 65  IN. Set Walker.e
7b10: 43 6f 64 65 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f  Code to non-zero
7b20: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
7b30: 67 20 69 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  g if the .** exp
7b40: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 73  ression is not s
7b50: 75 69 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  uitable..**.** A
7b60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
7b70: 75 6e 73 75 69 74 61 62 6c 65 20 69 66 20 69 74  unsuitable if it
7b80: 20 6d 69 67 68 74 20 65 76 61 6c 75 61 74 65 20   might evaluate 
7b90: 74 6f 20 6e 6f 6e 20 4e 55 4c 4c 20 65 76 65 6e  to non NULL even
7ba0: 20 69 66 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55   if.** a TK_COLU
7bb0: 4d 4e 20 6e 6f 64 65 20 74 68 61 74 20 64 6f 65  MN node that doe
7bc0: 73 20 61 66 66 65 63 74 20 74 68 65 20 76 61 6c  s affect the val
7bd0: 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ue of the expres
7be0: 73 69 6f 6e 20 69 73 20 73 65 74 0a 2a 2a 20 74  sion is set.** t
7bf0: 6f 20 4e 55 4c 4c 2e 20 46 6f 72 20 65 78 61 6d  o NULL. For exam
7c00: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 6f 6c  ple:.**.**   col
7c10: 20 49 53 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f   IS NULL.**   co
7c20: 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2a  l IS NOT NULL.**
7c30: 20 20 20 63 6f 61 6c 65 73 63 65 28 63 6f 6c 2c     coalesce(col,
7c40: 20 31 29 0a 2a 2a 20 20 20 43 41 53 45 20 57 48   1).**   CASE WH
7c50: 45 4e 20 63 6f 6c 20 54 48 45 4e 20 30 20 45 4c  EN col THEN 0 EL
7c60: 53 45 20 31 20 45 4e 44 0a 2a 2f 0a 73 74 61 74  SE 1 END.*/.stat
7c70: 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f  ic int codeCurso
7c80: 72 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f  rHintIsOrFunctio
7c90: 6e 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  n(Walker *pWalke
7ca0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
7cb0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
7cc0: 3d 3d 54 4b 5f 49 53 20 0a 20 20 20 7c 7c 20 70  ==TK_IS .   || p
7cd0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
7ce0: 55 4c 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  ULL || pExpr->op
7cf0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 7c  ==TK_ISNOT .   |
7d00: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
7d10: 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72  NOTNULL || pExpr
7d20: 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 0a 20  ->op==TK_CASE . 
7d30: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
7d40: 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65  >eCode = 1;.  }e
7d50: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
7d60: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
7d70: 7b 0a 20 20 20 20 69 6e 74 20 64 31 3b 0a 20 20  {.    int d1;.  
7d80: 20 20 63 68 61 72 20 64 32 5b 34 5d 3b 0a 20 20    char d2[4];.  
7d90: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
7da0: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 70  IsLikeFunction(p
7db0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
7dc0: 64 62 2c 20 70 45 78 70 72 2c 20 26 64 31 2c 20  db, pExpr, &d1, 
7dd0: 64 32 29 20 29 7b 0a 20 20 20 20 20 20 70 57 61  d2) ){.      pWa
7de0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
7df0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7e00: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
7e10: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e;.}.../*.** Thi
7e20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7e30: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 6e 6f  lled on every no
7e40: 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  de of an express
7e50: 69 6f 6e 20 74 72 65 65 20 75 73 65 64 20 61 73  ion tree used as
7e60: 20 61 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20   an.** argument 
7e70: 74 6f 20 74 68 65 20 4f 50 5f 43 75 72 73 6f 72  to the OP_Cursor
7e80: 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Hint instruction
7e90: 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73  . If the node is
7ea0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20   a TK_COLUMN.** 
7eb0: 74 68 61 74 20 61 63 63 65 73 73 65 73 20 61 6e  that accesses an
7ec0: 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  y table other th
7ed0: 61 6e 20 74 68 65 20 6f 6e 65 20 69 64 65 6e 74  an the one ident
7ee0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 43 43 75 72  ified by.** CCur
7ef0: 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20 74 68  Hint.iTabCur, th
7f00: 65 6e 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en do the follow
7f10: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ing:.**.**   1) 
7f20: 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
7f30: 74 65 72 20 61 6e 64 20 63 6f 64 65 20 61 6e 20  ter and code an 
7f40: 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75  OP_Column instru
7f50: 63 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a 2a  ction to read .*
7f60: 2a 20 20 20 20 20 20 74 68 65 20 73 70 65 63 69  *      the speci
7f70: 66 69 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  fied column into
7f80: 20 74 68 65 20 6e 65 77 20 72 65 67 69 73 74 65   the new registe
7f90: 72 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32  r, and.**.**   2
7fa0: 29 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  ) transform the 
7fb0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
7fc0: 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
7fd0: 20 6e 6f 64 65 20 74 68 61 74 20 72 65 61 64 73   node that reads
7fe0: 20 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74   .**      from t
7ff0: 68 65 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61 74  he newly populat
8000: 65 64 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  ed register..**.
8010: 2a 2a 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  ** Also, if the 
8020: 6e 6f 64 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c  node is a TK_COL
8030: 55 4d 4e 20 74 68 61 74 20 64 6f 65 73 20 61 63  UMN that does ac
8040: 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 69  cess the table i
8050: 64 65 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  denified.** by p
8060: 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72  CCurHint.iTabCur
8070: 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69  , and an index i
8080: 73 20 62 65 69 6e 67 20 75 73 65 64 20 28 77 68  s being used (wh
8090: 69 63 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 6b  ich we will.** k
80a0: 6e 6f 77 20 62 65 63 61 75 73 65 20 43 43 75 72  now because CCur
80b0: 48 69 6e 74 2e 70 49 64 78 21 3d 30 29 20 74 68  Hint.pIdx!=0) th
80c0: 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  en transform the
80d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f 0a   TK_COLUMN into.
80e0: 2a 2a 20 61 6e 20 61 63 63 65 73 73 20 6f 66 20  ** an access of 
80f0: 74 68 65 20 69 6e 64 65 78 20 72 61 74 68 65 72  the index rather
8100: 20 74 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e   than the origin
8110: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
8120: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73  tic int codeCurs
8130: 6f 72 48 69 6e 74 46 69 78 45 78 70 72 28 57 61  orHintFixExpr(Wa
8140: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
8150: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
8160: 6e 74 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e 74  nt rc = WRC_Cont
8170: 69 6e 75 65 3b 0a 20 20 73 74 72 75 63 74 20 43  inue;.  struct C
8180: 43 75 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d  CurHint *pHint =
8190: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75   pWalker->u.pCCu
81a0: 72 48 69 6e 74 3b 0a 20 20 69 66 28 20 70 45 78  rHint;.  if( pEx
81b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
81c0: 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  N ){.    if( pEx
81d0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69 6e  pr->iTable!=pHin
81e0: 74 2d 3e 69 54 61 62 43 75 72 20 29 7b 0a 20 20  t->iTabCur ){.  
81f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57      Vdbe *v = pW
8200: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 70  alker->pParse->p
8210: 56 64 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Vdbe;.      int 
8220: 72 65 67 20 3d 20 2b 2b 70 57 61 6c 6b 65 72 2d  reg = ++pWalker-
8230: 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  >pParse->nMem;  
8240: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
8250: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 2a 2f   column value */
8260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8270: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
8280: 66 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  fTable(.        
8290: 20 20 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62    v, pExpr->pTab
82a0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
82b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
82c0: 20 72 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20   reg.      );.  
82d0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
82e0: 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
82f0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
8300: 20 3d 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c 73   = reg;.    }els
8310: 65 20 69 66 28 20 70 48 69 6e 74 2d 3e 70 49 64  e if( pHint->pId
8320: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  x!=0 ){.      pE
8330: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 48  xpr->iTable = pH
8340: 69 6e 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  int->iIdxCur;.  
8350: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
8360: 6d 6e 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  mn = sqlite3Colu
8370: 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d  mnOfIndex(pHint-
8380: 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
8390: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 73  olumn);.      as
83a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
83b0: 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  lumn>=0 );.    }
83c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78  .  }else if( pEx
83d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
83e0: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 2f  UNCTION ){.    /
83f0: 2a 20 41 6e 20 61 67 67 72 65 67 61 74 65 20 66  * An aggregate f
8400: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 57  unction in the W
8410: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61  HERE clause of a
8420: 20 71 75 65 72 79 20 6d 65 61 6e 73 20 74 68 69   query means thi
8430: 73 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  s must.    ** be
8440: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
8450: 62 2d 71 75 65 72 79 2c 20 61 6e 64 20 65 78 70  b-query, and exp
8460: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
8470: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 72   an aggregate fr
8480: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  om.    ** the pa
8490: 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44 6f  rent context. Do
84a0: 20 6e 6f 74 20 77 61 6c 6b 20 74 68 65 20 66 75   not walk the fu
84b0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
84c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
84d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f 64     **.    ** tod
84e0: 6f 3a 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  o: It should be 
84f0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 70 6c  possible to repl
8500: 61 63 65 20 74 68 69 73 20 6e 6f 64 65 20 77 69  ace this node wi
8510: 74 68 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  th a TK_REGISTER
8520: 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69  .    ** expressi
8530: 6f 6e 2c 20 61 73 20 74 68 65 20 72 65 73 75 6c  on, as the resul
8540: 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
8550: 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 6f 72  ion must be stor
8560: 65 64 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a 20  ed in a .    ** 
8570: 72 65 67 69 73 74 65 72 20 61 74 20 74 68 69 73  register at this
8580: 20 70 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d 65   point. The same
8590: 20 68 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41 47   holds for TK_AG
85a0: 47 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20  G_COLUMN nodes. 
85b0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 57 52 43 5f  */.    rc = WRC_
85c0: 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
85d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
85e0: 20 49 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43 75   Insert an OP_Cu
85f0: 72 73 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63  rsorHint instruc
8600: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 61 70  tion if it is ap
8610: 70 72 6f 70 72 69 61 74 65 20 74 6f 20 64 6f 20  propriate to do 
8620: 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  so..*/.static vo
8630: 69 64 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e  id codeCursorHin
8640: 74 28 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t(.  struct SrcL
8650: 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
8660: 65 6d 2c 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em,  /* FROM cla
8670: 75 73 65 20 69 74 65 6d 20 2a 2f 0a 20 20 57 68  use item */.  Wh
8680: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
8690: 20 20 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65      /* The where
86a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
86b0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
86c0: 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70     /* Which loop
86d0: 20 74 6f 20 70 72 6f 76 69 64 65 20 68 69 6e 74   to provide hint
86e0: 73 20 66 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65  s for */.  Where
86f0: 54 65 72 6d 20 2a 70 45 6e 64 52 61 6e 67 65 20  Term *pEndRange 
8700: 20 2f 2a 20 48 69 6e 74 20 74 68 69 73 20 65 6e   /* Hint this en
8710: 64 2d 6f 66 2d 73 63 61 6e 20 62 6f 75 6e 64 61  d-of-scan bounda
8720: 72 79 20 74 65 72 6d 20 69 66 20 6e 6f 74 20 4e  ry term if not N
8730: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73  ULL */.){.  Pars
8740: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
8750: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  fo->pParse;.  sq
8760: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8770: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
8780: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8790: 65 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  e;.  Expr *pExpr
87a0: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f   = 0;.  WhereLoo
87b0: 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  p *pLoop = pLeve
87c0: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 6e 74  l->pWLoop;.  int
87d0: 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
87e0: 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
87f0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
8800: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
8810: 75 63 74 20 43 43 75 72 48 69 6e 74 20 73 48 69  uct CCurHint sHi
8820: 6e 74 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  nt;.  Walker sWa
8830: 6c 6b 65 72 3b 0a 0a 20 20 69 66 28 20 4f 70 74  lker;..  if( Opt
8840: 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
8850: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 43 75 72  d(db, SQLITE_Cur
8860: 73 6f 72 48 69 6e 74 73 29 20 29 20 72 65 74 75  sorHints) ) retu
8870: 72 6e 3b 0a 20 20 69 43 75 72 20 3d 20 70 4c 65  rn;.  iCur = pLe
8880: 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20  vel->iTabCur;.  
8890: 61 73 73 65 72 74 28 20 69 43 75 72 3d 3d 70 57  assert( iCur==pW
88a0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
88b0: 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
88c0: 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 48  .iCursor );.  sH
88d0: 69 6e 74 2e 69 54 61 62 43 75 72 20 3d 20 69 43  int.iTabCur = iC
88e0: 75 72 3b 0a 20 20 73 48 69 6e 74 2e 69 49 64 78  ur;.  sHint.iIdx
88f0: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
8900: 64 78 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e 70  dxCur;.  sHint.p
8910: 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
8920: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 6d  tree.pIndex;.  m
8930: 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
8940: 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
8950: 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
8960: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
8970: 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 43 43 75    sWalker.u.pCCu
8980: 72 48 69 6e 74 20 3d 20 26 73 48 69 6e 74 3b 0a  rHint = &sHint;.
8990: 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
89a0: 3e 73 57 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >sWC;.  for(i=0;
89b0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
89c0: 2b 2b 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d  ++){.    pTerm =
89d0: 20 26 70 57 43 2d 3e 61 5b 69 5d 3b 0a 20 20 20   &pWC->a[i];.   
89e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
89f0: 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
8a00: 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
8a10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8a20: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
8a30: 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
8a40: 6f 74 52 65 61 64 79 20 29 20 63 6f 6e 74 69 6e  otReady ) contin
8a50: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20  ue;..    /* Any 
8a60: 74 65 72 6d 73 20 73 70 65 63 69 66 69 65 64 20  terms specified 
8a70: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 4f  as part of the O
8a80: 4e 28 2e 2e 2e 29 20 63 6c 61 75 73 65 20 66 6f  N(...) clause fo
8a90: 72 20 61 6e 79 20 4c 45 46 54 20 0a 20 20 20 20  r any LEFT .    
8aa0: 2a 2a 20 4a 4f 49 4e 20 66 6f 72 20 77 68 69 63  ** JOIN for whic
8ab0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
8ac0: 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ble is not the r
8ad0: 68 73 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  hs are omitted. 
8ae0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
8af0: 75 72 73 6f 72 2d 68 69 6e 74 2e 20 0a 20 20 20  ursor-hint. .   
8b00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
8b10: 69 73 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  is table is the 
8b20: 72 68 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rhs of a LEFT JO
8b30: 49 4e 2c 20 22 49 53 22 20 6f 72 20 22 49 53 20  IN, "IS" or "IS 
8b40: 4e 55 4c 4c 22 20 74 65 72 6d 73 20 0a 20 20 20  NULL" terms .   
8b50: 20 2a 2a 20 74 68 61 74 20 77 65 72 65 20 73 70   ** that were sp
8b60: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
8b70: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
8b80: 75 73 65 20 6d 75 73 74 20 62 65 20 65 78 63 6c  use must be excl
8b90: 75 64 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 69  uded..    ** Thi
8ba0: 73 20 69 73 20 74 6f 20 61 64 64 72 65 73 73 20  s is to address 
8bb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
8bc0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
8bd0: 45 4c 45 43 54 20 2e 2e 2e 20 74 31 20 4c 45 46  ELECT ... t1 LEF
8be0: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 74 31  T JOIN t2 ON (t1
8bf0: 2e 61 3d 74 32 2e 62 29 20 57 48 45 52 45 20 74  .a=t2.b) WHERE t
8c00: 32 2e 63 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20  2.c IS NULL;.   
8c10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 61 79 20 74   **.    ** Say t
8c20: 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
8c30: 20 72 6f 77 20 69 6e 20 74 32 20 74 68 61 74 20   row in t2 that 
8c40: 6d 61 74 63 68 65 73 20 28 74 31 2e 61 3d 74 32  matches (t1.a=t2
8c50: 2e 62 29 2c 20 62 75 74 20 69 74 73 0a 20 20 20  .b), but its.   
8c60: 20 2a 2a 20 74 32 2e 63 20 76 61 6c 75 65 73 20   ** t2.c values 
8c70: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 49 66 20  is not NULL. If 
8c80: 74 68 65 20 28 74 32 2e 63 20 49 53 20 4e 55 4c  the (t2.c IS NUL
8c90: 4c 29 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  L) constraint is
8ca0: 20 0a 20 20 20 20 2a 2a 20 70 75 73 68 65 64 20   .    ** pushed 
8cb0: 64 6f 77 6e 20 74 6f 20 74 68 65 20 63 75 72 73  down to the curs
8cc0: 6f 72 2c 20 74 68 69 73 20 72 6f 77 20 69 73 20  or, this row is 
8cd0: 66 69 6c 74 65 72 65 64 20 6f 75 74 2c 20 63 61  filtered out, ca
8ce0: 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c  using.    ** SQL
8cf0: 69 74 65 20 74 6f 20 73 79 6e 74 68 65 73 69 7a  ite to synthesiz
8d00: 65 20 61 20 72 6f 77 20 6f 66 20 4e 55 4c 4c 20  e a row of NULL 
8d10: 76 61 6c 75 65 73 2e 20 57 68 69 63 68 20 64 6f  values. Which do
8d20: 65 73 20 6d 61 74 63 68 20 74 68 65 0a 20 20 20  es match the.   
8d30: 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
8d40: 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 71 75 65  , and so the que
8d50: 72 79 20 72 65 74 75 72 6e 73 20 61 20 72 6f 77  ry returns a row
8d60: 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63 6f 72  . Which is incor
8d70: 72 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rect..    **.   
8d80: 20 2a 2a 20 46 6f 72 20 74 68 65 20 73 61 6d 65   ** For the same
8d90: 20 72 65 61 73 6f 6e 2c 20 57 48 45 52 45 20 74   reason, WHERE t
8da0: 65 72 6d 73 20 73 75 63 68 20 61 73 3a 0a 20 20  erms such as:.  
8db0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 57 48    **.    **   WH
8dc0: 45 52 45 20 31 20 3d 20 28 74 32 2e 63 20 49 53  ERE 1 = (t2.c IS
8dd0: 20 4e 55 4c 4c 29 0a 20 20 20 20 2a 2a 0a 20 20   NULL).    **.  
8de0: 20 20 2a 2a 20 61 72 65 20 61 6c 73 6f 20 65 78    ** are also ex
8df0: 63 6c 75 64 65 64 2e 20 53 65 65 20 63 6f 64 65  cluded. See code
8e00: 43 75 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75  CursorHintIsOrFu
8e10: 6e 63 74 69 6f 6e 28 29 20 66 6f 72 20 64 65 74  nction() for det
8e20: 61 69 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ails..    */.   
8e30: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
8e40: 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
8e50: 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 45 78  LEFT ){.      Ex
8e60: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
8e70: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
8e80: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8e90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
8ea0: 72 6f 6d 4a 6f 69 6e 29 20 0a 20 20 20 20 20 20  romJoin) .      
8eb0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
8ec0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 54 61 62  tJoinTable!=pTab
8ed0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20  Item->iCursor.  
8ee0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
8ef0: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 3d 20 30  Walker.eCode = 0
8f00: 3b 0a 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65  ;.        sWalke
8f10: 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
8f20: 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  = codeCursorHint
8f30: 49 73 4f 72 46 75 6e 63 74 69 6f 6e 3b 0a 20 20  IsOrFunction;.  
8f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
8f50: 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20  kExpr(&sWalker, 
8f60: 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
8f70: 20 20 20 20 20 20 20 69 66 28 20 73 57 61 6c 6b         if( sWalk
8f80: 65 72 2e 65 43 6f 64 65 20 29 20 63 6f 6e 74 69  er.eCode ) conti
8f90: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
8fa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
8fb0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8fc0: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
8fd0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63  EP_FromJoin) ) c
8fe0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
8ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
9000: 20 69 6e 20 70 57 4c 6f 6f 70 2d 3e 61 4c 54 65   in pWLoop->aLTe
9010: 72 6d 5b 5d 20 65 78 63 65 70 74 20 70 45 6e 64  rm[] except pEnd
9020: 52 61 6e 67 65 20 61 72 65 20 75 73 65 64 20 74  Range are used t
9030: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20  o initialize.   
9040: 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20   ** the cursor. 
9050: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
9060: 20 6e 6f 74 20 6e 65 65 64 65 64 20 61 73 20 68   not needed as h
9070: 69 6e 74 73 20 66 6f 72 20 61 20 70 75 72 65 20  ints for a pure 
9080: 72 61 6e 67 65 0a 20 20 20 20 2a 2a 20 73 63 61  range.    ** sca
9090: 6e 20 28 74 68 61 74 20 68 61 73 20 6e 6f 20 3d  n (that has no =
90a0: 3d 20 74 65 72 6d 73 29 20 73 6f 20 6f 6d 69 74  = terms) so omit
90b0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 20 20 69 66   them. */.    if
90c0: 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
90d0: 2e 6e 45 71 3d 3d 30 20 26 26 20 70 54 65 72 6d  .nEq==0 && pTerm
90e0: 21 3d 70 45 6e 64 52 61 6e 67 65 20 29 7b 0a 20  !=pEndRange ){. 
90f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
9100: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
9110: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
9120: 5d 21 3d 70 54 65 72 6d 3b 20 6a 2b 2b 29 7b 7d  ]!=pTerm; j++){}
9130: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f  .      if( j<pLo
9140: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e  op->nLTerm ) con
9150: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
9160: 20 20 2f 2a 20 4e 6f 20 73 75 62 71 75 65 72 69    /* No subqueri
9170: 65 73 20 6f 72 20 6e 6f 6e 2d 64 65 74 65 72 6d  es or non-determ
9180: 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e  inistic function
9190: 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20  s allowed */.   
91a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
91b0: 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79  ContainsSubquery
91c0: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 20 29  (pTerm->pExpr) )
91d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
91e0: 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  /* For an index 
91f0: 73 63 61 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  scan, make sure 
9200: 72 65 66 65 72 65 6e 63 65 64 20 63 6f 6c 75 6d  referenced colum
9210: 6e 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ns are actually 
9220: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  in.    ** the in
9230: 64 65 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  dex. */.    if( 
9240: 73 48 69 6e 74 2e 70 49 64 78 21 3d 30 20 29 7b  sHint.pIdx!=0 ){
9250: 0a 20 20 20 20 20 20 73 57 61 6c 6b 65 72 2e 65  .      sWalker.e
9260: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
9270: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
9280: 6c 62 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73  lback = codeCurs
9290: 6f 72 48 69 6e 74 43 68 65 63 6b 45 78 70 72 3b  orHintCheckExpr;
92a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
92b0: 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
92c0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
92d0: 20 20 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65        if( sWalke
92e0: 72 2e 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e  r.eCode ) contin
92f0: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
9300: 2a 20 49 66 20 77 65 20 73 75 72 76 69 76 65 20  * If we survive 
9310: 61 6c 6c 20 70 72 69 6f 72 20 74 65 73 74 73 2c  all prior tests,
9320: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
9330: 20 74 65 72 6d 20 69 73 20 77 6f 72 74 68 20 68   term is worth h
9340: 69 6e 74 69 6e 67 20 2a 2f 0a 20 20 20 20 70 45  inting */.    pE
9350: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9360: 72 41 6e 64 28 64 62 2c 20 70 45 78 70 72 2c 20  rAnd(db, pExpr, 
9370: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9380: 62 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  b, pTerm->pExpr,
9390: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   0));.  }.  if( 
93a0: 70 45 78 70 72 21 3d 30 20 29 7b 0a 20 20 20 20  pExpr!=0 ){.    
93b0: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
93c0: 6c 62 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73  lback = codeCurs
93d0: 6f 72 48 69 6e 74 46 69 78 45 78 70 72 3b 0a 20  orHintFixExpr;. 
93e0: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
93f0: 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 78  pr(&sWalker, pEx
9400: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9410: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9420: 5f 43 75 72 73 6f 72 48 69 6e 74 2c 20 0a 20 20  _CursorHint, .  
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 20 28 73 48 69 6e 74 2e 70 49 64 78 20      (sHint.pIdx 
9450: 3f 20 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20  ? sHint.iIdxCur 
9460: 3a 20 73 48 69 6e 74 2e 69 54 61 62 43 75 72 29  : sHint.iTabCur)
9470: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
9490: 6f 6e 73 74 20 63 68 61 72 2a 29 70 45 78 70 72  onst char*)pExpr
94a0: 2c 20 50 34 5f 45 58 50 52 29 3b 0a 20 20 7d 0a  , P4_EXPR);.  }.
94b0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
94c0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
94d0: 41 2c 42 2c 43 2c 44 29 20 20 2f 2a 20 4e 6f 2d  A,B,C,D)  /* No-
94e0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  op */.#endif /* 
94f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
9500: 52 53 4f 52 5f 48 49 4e 54 53 20 2a 2f 0a 0a 2f  RSOR_HINTS */../
9510: 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 69 43 75 72  *.** Cursor iCur
9520: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
9530: 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 28 61 20  ntkey b-tree (a 
9540: 74 61 62 6c 65 29 2e 20 52 65 67 69 73 74 65 72  table). Register
9550: 20 69 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73   iRowid contains
9560: 0a 2a 2a 20 61 20 72 6f 77 69 64 20 76 61 6c 75  .** a rowid valu
9570: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
9580: 20 63 75 72 73 6f 72 20 69 49 64 78 43 75 72 2c   cursor iIdxCur,
9590: 20 6f 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 70   open on index p
95a0: 49 64 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  Idx. This.** fun
95b0: 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20  ction generates 
95c0: 63 6f 64 65 20 74 6f 20 64 6f 20 61 20 64 65 66  code to do a def
95d0: 65 72 72 65 64 20 73 65 65 6b 20 6f 66 20 63 75  erred seek of cu
95e0: 72 73 6f 72 20 69 43 75 72 20 74 6f 20 74 68 65  rsor iCur to the
95f0: 20 0a 2a 2a 20 72 6f 77 69 64 20 73 74 6f 72 65   .** rowid store
9600: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  d in register iR
9610: 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  owid..**.** Norm
9620: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 6a 75  ally, this is ju
9630: 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 50 5f 44  st:.**.**   OP_D
9640: 65 66 65 72 72 65 64 53 65 65 6b 20 24 69 43 75  eferredSeek $iCu
9650: 72 20 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  r $iRowid.**.** 
9660: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
9670: 73 63 61 6e 20 63 75 72 72 65 6e 74 6c 79 20 62  scan currently b
9680: 65 69 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20  eing coded is a 
9690: 62 72 61 6e 63 68 20 6f 66 20 61 6e 20 4f 52 2d  branch of an OR-
96a0: 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20 74 68 65 20  loop and.** the 
96b0: 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
96c0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20  tly being coded 
96d0: 69 73 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65  is a SELECT, the
96e0: 6e 20 50 33 20 6f 66 20 4f 50 5f 44 65 66 65 72  n P3 of OP_Defer
96f0: 72 65 64 53 65 65 6b 0a 2a 2a 20 69 73 20 73 65  redSeek.** is se
9700: 74 20 74 6f 20 69 49 64 78 43 75 72 20 61 6e 64  t to iIdxCur and
9710: 20 50 34 20 69 73 20 73 65 74 20 74 6f 20 70 6f   P4 is set to po
9720: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
9730: 6f 66 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 63  of integers.** c
9740: 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e  ontaining one en
9750: 74 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  try for each col
9760: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
9770: 20 63 75 72 73 6f 72 20 69 43 75 72 20 69 73 20   cursor iCur is 
9780: 6f 70 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46 6f 72  open .** on. For
9790: 20 65 61 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   each table colu
97a0: 6d 6e 2c 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  mn, if the colum
97b0: 6e 20 69 73 20 74 68 65 20 69 27 74 68 20 63 6f  n is the i'th co
97c0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lumn of the .** 
97d0: 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20  index, then the 
97e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72  corresponding ar
97f0: 72 61 79 20 65 6e 74 72 79 20 69 73 20 73 65 74  ray entry is set
9800: 20 74 6f 20 28 69 2b 31 29 2e 20 49 66 20 74 68   to (i+1). If th
9810: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f 65 73  e column.** does
9820: 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74   not appear in t
9830: 68 65 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2c  he index at all,
9840: 20 74 68 65 20 61 72 72 61 79 20 65 6e 74 72 79   the array entry
9850: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
9860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
9870: 65 44 65 66 65 72 72 65 64 53 65 65 6b 28 0a 20  eDeferredSeek(. 
9880: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
9890: 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
98a0: 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65   /* Where clause
98b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
98c0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98e0: 20 49 6e 64 65 78 20 73 63 61 6e 20 69 73 20 75   Index scan is u
98f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sing */.  int iC
9900: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
9910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
9920: 73 6f 72 20 66 6f 72 20 49 50 4b 20 62 2d 74 72  sor for IPK b-tr
9930: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ee */.  int iIdx
9940: 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
9950: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9960: 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
9970: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
9980: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
9990: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
99a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
99b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
99c0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
99d0: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   generate code w
99e0: 69 74 68 69 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ithin */..  asse
99f0: 72 74 28 20 69 49 64 78 43 75 72 3e 30 20 29 3b  rt( iIdxCur>0 );
9a00: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
9a10: 3e 61 69 43 6f 6c 75 6d 6e 5b 70 49 64 78 2d 3e  >aiColumn[pIdx->
9a20: 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31 20 29  nColumn-1]==-1 )
9a30: 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64  ;.  .  sqlite3Vd
9a40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
9a50: 65 66 65 72 72 65 64 53 65 65 6b 2c 20 69 49 64  eferredSeek, iId
9a60: 78 43 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a  xCur, 0, iCur);.
9a70: 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
9a80: 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
9a90: 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a  E_OR_SUBCLAUSE).
9aa0: 20 20 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a     && DbMaskAllZ
9ab0: 65 72 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65  ero(sqlite3Parse
9ac0: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
9ad0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29  ->writeMask).  )
9ae0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9af0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9b00: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
9b10: 20 69 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a   int *ai = (int*
9b20: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
9b30: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
9b40: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54   sizeof(int)*(pT
9b50: 61 62 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20  ab->nCol+1));.  
9b60: 20 20 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20    if( ai ){.    
9b70: 20 20 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e    ai[0] = pTab->
9b80: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCol;.      for(
9b90: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
9ba0: 6c 75 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  lumn-1; i++){.  
9bb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9bc0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  dx->aiColumn[i]<
9bd0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
9be0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9bf0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29  aiColumn[i]>=0 )
9c00: 20 61 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75   ai[pIdx->aiColu
9c10: 6d 6e 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a  mn[i]+1] = i+1;.
9c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9c30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9c40: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
9c50: 61 69 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  ai, P4_INTARRAY)
9c60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9c70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9c80: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
9c90: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
9ca0: 6d 65 6e 74 20 69 73 20 61 20 76 65 63 74 6f 72  ment is a vector
9cb0: 2c 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  , generate.** co
9cc0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
9cd0: 66 69 72 73 74 20 6e 52 65 67 20 65 6c 65 6d 65  first nReg eleme
9ce0: 6e 74 73 20 6f 66 20 74 68 65 20 76 65 63 74 6f  nts of the vecto
9cf0: 72 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 0a  r into an array.
9d00: 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ** of registers 
9d10: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 52  starting with iR
9d20: 65 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  eg..**.** If the
9d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
9d40: 6f 74 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65  ot a vector, the
9d50: 6e 20 6e 52 65 67 20 6d 75 73 74 20 62 65 20 70  n nReg must be p
9d60: 61 73 73 65 64 20 31 2e 20 49 6e 0a 2a 2a 20 74  assed 1. In.** t
9d70: 68 69 73 20 63 61 73 65 2c 20 67 65 6e 65 72 61  his case, genera
9d80: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
9d90: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
9da0: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65  on and leave the
9db0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 72 65  .** result in re
9dc0: 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2f 0a  gister iReg..*/.
9dd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
9de0: 45 78 70 72 4f 72 56 65 63 74 6f 72 28 50 61 72  ExprOrVector(Par
9df0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
9e00: 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 2c 20 69   *p, int iReg, i
9e10: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
9e20: 72 74 28 20 6e 52 65 67 3e 30 20 29 3b 0a 20 20  rt( nReg>0 );.  
9e30: 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33  if( p && sqlite3
9e40: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 29 20  ExprIsVector(p) 
9e50: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9e60: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9e70: 20 20 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67      if( (p->flag
9e80: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
9e90: 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20  ) ){.      Vdbe 
9ea0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9eb0: 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  be;.      int iS
9ec0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 43  elect = sqlite3C
9ed0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
9ee0: 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20  rse, p, 0, 0);. 
9ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
9f10: 79 2c 20 69 53 65 6c 65 63 74 2c 20 69 52 65 67  y, iSelect, iReg
9f20: 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 7d  , nReg-1);.    }
9f30: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
9f40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9f50: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9f60: 4c 69 73 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73  List = p->x.pLis
9f70: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
9f80: 20 6e 52 65 67 3c 3d 70 4c 69 73 74 2d 3e 6e 45   nReg<=pList->nE
9f90: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  xpr );.      for
9fa0: 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b  (i=0; i<nReg; i+
9fb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
9fc0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9fd0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
9fe0: 70 45 78 70 72 2c 20 69 52 65 67 2b 69 29 3b 0a  pExpr, iReg+i);.
9ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a000: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
a010: 74 28 20 6e 52 65 67 3d 3d 31 20 29 3b 0a 20 20  t( nReg==1 );.  
a020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a030: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 69 52 65  e(pParse, p, iRe
a040: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e  g);.  }.}../* An
a050: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
a060: 20 49 64 78 45 78 70 72 54 72 61 6e 73 20 6f 62   IdxExprTrans ob
a070: 6a 65 63 74 20 63 61 72 72 69 65 73 20 69 6e 66  ject carries inf
a080: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
a090: 0a 2a 2a 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  .** mapping from
a0a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
a0b0: 6e 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  n table columns 
a0c0: 69 6e 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  into a column in
a0d0: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 64 6f 77   an index.** dow
a0e0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 57 61  n through the Wa
a0f0: 6c 6b 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  lker..*/.typedef
a100: 20 73 74 72 75 63 74 20 49 64 78 45 78 70 72 54   struct IdxExprT
a110: 72 61 6e 73 20 7b 0a 20 20 45 78 70 72 20 2a 70  rans {.  Expr *p
a120: 49 64 78 45 78 70 72 3b 20 20 20 20 2f 2a 20 54  IdxExpr;    /* T
a130: 68 65 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  he index express
a140: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ion */.  int iTa
a150: 62 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  bCur;       /* T
a160: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
a170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
a180: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  able */.  int iI
a190: 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  dxCur;       /* 
a1a0: 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  The cursor for t
a1b0: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
a1c0: 74 20 69 49 64 78 43 6f 6c 3b 20 20 20 20 20 20  t iIdxCol;      
a1d0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66   /* The column f
a1e0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
a1f0: 7d 20 49 64 78 45 78 70 72 54 72 61 6e 73 3b 0a  } IdxExprTrans;.
a200: 0a 2f 2a 20 54 68 65 20 77 61 6c 6b 65 72 20 6e  ./* The walker n
a210: 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  ode callback use
a220: 64 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d  d to transform m
a230: 61 74 63 68 69 6e 67 20 65 78 70 72 65 73 73 69  atching expressi
a240: 6f 6e 73 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65  ons into.** a re
a250: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 69 6e  ference to an in
a260: 64 65 78 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  dex column for a
a270: 6e 20 69 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78  n index on an ex
a280: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
a290: 49 66 20 70 45 78 70 72 20 6d 61 74 63 68 65 73  If pExpr matches
a2a0: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d  , then transform
a2b0: 20 69 74 20 69 6e 74 6f 20 61 20 72 65 66 65 72   it into a refer
a2c0: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
a2d0: 78 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74  x column.** that
a2e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
a2f0: 6c 75 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2f  lue of pExpr..*/
a300: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
a310: 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73 4e  eIndexExprTransN
a320: 6f 64 65 28 57 61 6c 6b 65 72 20 2a 70 2c 20 45  ode(Walker *p, E
a330: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 49  xpr *pExpr){.  I
a340: 64 78 45 78 70 72 54 72 61 6e 73 20 2a 70 58 20  dxExprTrans *pX 
a350: 3d 20 70 2d 3e 75 2e 70 49 64 78 54 72 61 6e 73  = p->u.pIdxTrans
a360: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
a370: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45  xprCompare(0, pE
a380: 78 70 72 2c 20 70 58 2d 3e 70 49 64 78 45 78 70  xpr, pX->pIdxExp
a390: 72 2c 20 70 58 2d 3e 69 54 61 62 43 75 72 29 3d  r, pX->iTabCur)=
a3a0: 3d 30 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  =0 ){.    pExpr-
a3b0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
a3c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
a3d0: 6c 65 20 3d 20 70 58 2d 3e 69 49 64 78 43 75 72  le = pX->iIdxCur
a3e0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
a3f0: 6c 75 6d 6e 20 3d 20 70 58 2d 3e 69 49 64 78 43  lumn = pX->iIdxC
a400: 6f 6c 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  ol;.    pExpr->p
a410: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Tab = 0;.    ret
a420: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
a430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
a440: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
a450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  .  }.}../*.** Fo
a460: 72 20 61 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20  r an indexes on 
a470: 65 78 70 72 65 73 73 69 6f 6e 20 58 2c 20 6c 6f  expression X, lo
a480: 63 61 74 65 20 65 76 65 72 79 20 69 6e 73 74 61  cate every insta
a490: 6e 63 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f  nce of expressio
a4a0: 6e 20 58 0a 2a 2a 20 69 6e 20 70 45 78 70 72 20  n X.** in pExpr 
a4b0: 61 6e 64 20 63 68 61 6e 67 65 20 74 68 61 74 20  and change that 
a4c0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  subexpression in
a4d0: 74 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  to a reference t
a4e0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
a4f0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  e.** column of t
a500: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  he index..*/.sta
a510: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
a520: 64 65 78 45 78 70 72 54 72 61 6e 73 28 0a 20 20  dexExprTrans(.  
a530: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
a540: 20 20 2f 2a 20 54 68 65 20 49 6e 64 65 78 20 2a    /* The Index *
a550: 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
a560: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
a570: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
a580: 74 20 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78  t is being index
a590: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ed */.  int iIdx
a5a0: 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
a5b0: 73 6f 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  sor of the index
a5c0: 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 57 68 65   itself */.  Whe
a5d0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 2f  reInfo *pWInfo /
a5e0: 2a 20 54 72 61 6e 73 66 6f 72 6d 20 65 78 70 72  * Transform expr
a5f0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
a600: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
a610: 29 7b 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c  ){.  int iIdxCol
a620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a630: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
a640: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
a650: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
a660: 6c 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lExpr;        /*
a670: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   Expressions tha
a680: 74 20 61 72 65 20 69 6e 64 65 78 65 64 20 2a 2f  t are indexed */
a690: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 49  .  Walker w;.  I
a6a0: 64 78 45 78 70 72 54 72 61 6e 73 20 78 3b 0a 20  dxExprTrans x;. 
a6b0: 20 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 64 78   aColExpr = pIdx
a6c0: 2d 3e 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 66  ->aColExpr;.  if
a6d0: 28 20 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20  ( aColExpr==0 ) 
a6e0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 20  return;  /* Not 
a6f0: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72  an index on expr
a700: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 6d 65 6d  essions */.  mem
a710: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
a720: 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
a730: 43 61 6c 6c 62 61 63 6b 20 3d 20 77 68 65 72 65  Callback = where
a740: 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f  IndexExprTransNo
a750: 64 65 3b 0a 20 20 77 2e 75 2e 70 49 64 78 54 72  de;.  w.u.pIdxTr
a760: 61 6e 73 20 3d 20 26 78 3b 0a 20 20 78 2e 69 54  ans = &x;.  x.iT
a770: 61 62 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b  abCur = iTabCur;
a780: 0a 20 20 78 2e 69 49 64 78 43 75 72 20 3d 20 69  .  x.iIdxCur = i
a790: 49 64 78 43 75 72 3b 0a 20 20 66 6f 72 28 69 49  IdxCur;.  for(iI
a7a0: 64 78 43 6f 6c 3d 30 3b 20 69 49 64 78 43 6f 6c  dxCol=0; iIdxCol
a7b0: 3c 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  <aColExpr->nExpr
a7c0: 3b 20 69 49 64 78 43 6f 6c 2b 2b 29 7b 0a 20 20  ; iIdxCol++){.  
a7d0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
a7e0: 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 21 3d 58  lumn[iIdxCol]!=X
a7f0: 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75  N_EXPR ) continu
a800: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  e;.    assert( a
a810: 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
a820: 6f 6c 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  ol].pExpr!=0 );.
a830: 20 20 20 20 78 2e 69 49 64 78 43 6f 6c 20 3d 20      x.iIdxCol = 
a840: 69 49 64 78 43 6f 6c 3b 0a 20 20 20 20 78 2e 70  iIdxCol;.    x.p
a850: 49 64 78 45 78 70 72 20 3d 20 61 43 6f 6c 45 78  IdxExpr = aColEx
a860: 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
a870: 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  Expr;.    sqlite
a880: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 57  3WalkExpr(&w, pW
a890: 49 6e 66 6f 2d 3e 70 57 68 65 72 65 29 3b 0a 20  Info->pWhere);. 
a8a0: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
a8b0: 70 72 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66  prList(&w, pWInf
a8c0: 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  o->pOrderBy);.  
a8d0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
a8e0: 72 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f  rList(&w, pWInfo
a8f0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  ->pResultSet);. 
a900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
a910: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
a920: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
a930: 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
a940: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a950: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
a960: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
a970: 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d   pWInfo..*/.Bitm
a980: 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65  ask sqlite3Where
a990: 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  CodeOneLoopStart
a9a0: 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
a9b0: 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
a9c0: 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
a9d0: 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
a9e0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a9f0: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
aa00: 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
aa10: 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
aa20: 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
aa30: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
aa40: 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
aa50: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
aa60: 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
aa70: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
aa80: 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
aa90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
aaa0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
aab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aac0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
aad0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
aae0: 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
aaf0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
ab00: 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
ab10: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
ab20: 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
ab30: 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
ab40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
ab50: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
ab60: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
ab70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ab80: 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
ab90: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
aba0: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
abb0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
abc0: 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
abd0: 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
abe0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
abf0: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54   *pLoop;    /* T
ac00: 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
ac10: 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ect being coded 
ac20: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
ac30: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
ac40: 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
ac50: 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
ac60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
ac70: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
ac90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
aca0: 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
acb0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
acc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
acd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
ace0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad00: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
ad10: 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
ad20: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
ad30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ad40: 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
ad50: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ad60: 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
ad70: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
ad80: 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
ad90: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
ada0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
adb0: 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
add0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
ade0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
adf0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
ae00: 72 48 61 6c 74 3b 20 20 20 20 20 20 20 20 20 20  rHalt;          
ae10: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
ae20: 42 72 6b 20 66 6f 72 20 74 68 65 20 6f 75 74 65  Brk for the oute
ae30: 72 6d 6f 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  rmost loop */.  
ae40: 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
ae70: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
ae80: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
ae90: 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
aea0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
aeb0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
aec0: 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
aed0: 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
aee0: 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
aef0: 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
af00: 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
af10: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
af20: 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  g */.  Index *pI
af30: 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
af40: 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 62   /* Index used b
af50: 79 20 6c 6f 6f 70 20 28 69 66 20 61 6e 79 29 20  y loop (if any) 
af60: 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af80: 2a 20 49 74 65 72 61 74 69 6f 6e 20 6f 66 20 63  * Iteration of c
af90: 6f 6e 73 74 72 61 69 6e 74 20 67 65 6e 65 72 61  onstraint genera
afa0: 74 6f 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 70  tor loop */..  p
afb0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
afc0: 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
afd0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
afe0: 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
aff0: 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  C;.  db = pParse
b000: 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  ->db;.  pLevel =
b010: 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
b020: 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  el];.  pLoop = p
b030: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
b040: 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
b050: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
b060: 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
b070: 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
b080: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
b090: 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
b0a0: 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 73 71  = notReady & ~sq
b0b0: 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
b0c0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
b0d0: 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
b0e0: 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
b0f0: 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
b100: 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
b110: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
b120: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
b130: 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
b140: 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
b150: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
b160: 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
b170: 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  ;.  VdbeModuleCo
b180: 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
b190: 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
b1a0: 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74  s",iLevel,pTabIt
b1b0: 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
b1c0: 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
b1d0: 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
b1e0: 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
b1f0: 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
b200: 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
b210: 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
b220: 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
b230: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
b240: 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
b250: 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
b260: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
b270: 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
b280: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
b290: 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
b2a0: 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
b2b0: 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
b2c0: 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
b2d0: 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
b2e0: 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
b2f0: 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
b300: 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
b310: 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
b320: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
b330: 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
b340: 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
b350: 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
b360: 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
b370: 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
b380: 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
b390: 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
b3a0: 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
b3b0: 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
b3c0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b3d0: 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
b3e0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
b3f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
b400: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
b410: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
b420: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
b430: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
b440: 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
b450: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
b460: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
b470: 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
b480: 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
b490: 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
b4a0: 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
b4b0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
b4c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 57  */.  assert( (pW
b4d0: 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
b4e0: 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
b4f0: 4c 41 55 53 45 29 0a 20 20 20 20 20 20 20 7c 7c  LAUSE).       ||
b500: 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
b510: 20 7c 7c 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   || (pTabItem[0]
b520: 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
b530: 54 5f 4c 45 46 54 29 3d 3d 30 0a 20 20 29 3b 0a  T_LEFT)==0.  );.
b540: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
b550: 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
b560: 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  em[0].fg.jointyp
b570: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
b580: 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
b590: 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
b5a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
b5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b5d0: 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
b5e0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
b5f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
b600: 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
b610: 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
b620: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
b630: 20 73 61 66 65 20 61 64 64 72 65 73 73 20 74 6f   safe address to
b640: 20 6a 75 6d 70 20 74 6f 20 69 66 20 77 65 20 64   jump to if we d
b650: 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
b660: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20   table for.  ** 
b670: 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 6d 70  this loop is emp
b680: 74 79 20 61 6e 64 20 63 61 6e 20 6e 65 76 65 72  ty and can never
b690: 20 63 6f 6e 74 72 69 62 75 74 65 20 63 6f 6e 74   contribute cont
b6a0: 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  ent. */.  for(j=
b6b0: 69 4c 65 76 65 6c 3b 20 6a 3e 30 20 26 26 20 70  iLevel; j>0 && p
b6c0: 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 69 4c 65 66  WInfo->a[j].iLef
b6d0: 74 4a 6f 69 6e 3d 3d 30 3b 20 6a 2d 2d 29 7b 7d  tJoin==0; j--){}
b6e0: 0a 20 20 61 64 64 72 48 61 6c 74 20 3d 20 70 57  .  addrHalt = pW
b6f0: 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 61 64 64 72 42  Info->a[j].addrB
b700: 72 6b 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  rk;..  /* Specia
b710: 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d  l case of a FROM
b720: 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79   clause subquery
b730: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
b740: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
b750: 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
b760: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
b770: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
b780: 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
b790: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
b7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b7b0: 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
b7c0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
b7d0: 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  0, pTabItem->add
b7e0: 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 70  rFillSub);.    p
b7f0: 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
b800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b810: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
b820: 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ield, addrBrk);.
b830: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b840: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
b850: 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
b860: 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70  ow of \"%s\"", p
b870: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
b880: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65 76  Name));.    pLev
b890: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f  el->op = OP_Goto
b8a0: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
b8b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b8c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
b8d0: 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (  (pLoop->wsFla
b8e0: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
b8f0: 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
b900: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54     /* Case 1:  T
b910: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
b920: 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
b930: 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
b940: 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
b950: 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
b960: 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
b970: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
b980: 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
b990: 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
b9a0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74  .    int addrNot
b9b0: 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e  Found;.    int n
b9c0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f  Constraint = pLo
b9d0: 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20 20  op->nLTerm;.    
b9e0: 69 6e 74 20 69 49 6e 3b 20 20 20 20 2f 2a 20 43  int iIn;    /* C
b9f0: 6f 75 6e 74 65 72 20 66 6f 72 20 49 4e 20 63 6f  ounter for IN co
ba00: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
ba10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
ba20: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
ba30: 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
ba40: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
ba50: 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
ba60: 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
ba70: 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
ba80: 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
ba90: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
baa0: 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
bab0: 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d     int iTarget =
bac0: 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20   iReg+j+2;.     
bad0: 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
bae0: 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
baf0: 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d   if( NEVER(pTerm
bb00: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
bb10: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
bb20: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
bb30: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
bb40: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
bb50: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
bb60: 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
bb70: 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
bb80: 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
bb90: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
bba0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bbb0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69         Expr *pRi
bbc0: 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
bbd0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
bbe0: 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65      codeExprOrVe
bbf0: 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52 69  ctor(pParse, pRi
bc00: 67 68 74 2c 20 69 54 61 72 67 65 74 2c 20 31 29  ght, iTarget, 1)
bc10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bc40: 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
bc50: 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
bc60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bc70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
bc80: 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
bc90: 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
bca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bcb0: 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
bcc0: 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
bcd0: 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
bd00: 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
bd20: 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
bd30: 46 72 65 65 20 3f 20 50 34 5f 44 59 4e 41 4d 49  Free ? P4_DYNAMI
bd40: 43 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  C : P4_STATIC);.
bd50: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
bd60: 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  (v);.    pLoop->
bd70: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
bd80: 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
bd90: 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
bda0: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 70 57 49  pLevel->op = pWI
bdb0: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3f 20  nfo->eOnePass ? 
bdc0: 4f 50 5f 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e 65  OP_Noop : OP_VNe
bdd0: 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
bde0: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
bdf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
be00: 20 20 20 20 69 49 6e 20 3d 20 70 4c 65 76 65 6c      iIn = pLevel
be10: 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20  ->u.in.nIn;.    
be20: 66 6f 72 28 6a 3d 6e 43 6f 6e 73 74 72 61 69 6e  for(j=nConstrain
be30: 74 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  t-1; j>=0; j--){
be40: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
be50: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
be60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 31 36 20  .      if( j<16 
be70: 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  && (pLoop->u.vta
be80: 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
be90: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
bea0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
beb0: 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
bec0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
bed0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
bee0: 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
bef0: 20 45 78 70 72 20 2a 70 43 6f 6d 70 61 72 65 3b   Expr *pCompare;
bf00: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
bf10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  son operator */.
bf20: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
bf30: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 48 53 20  ight;    /* RHS 
bf40: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
bf50: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62  n */.        Vdb
bf60: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 2f 2a  eOp *pOp;     /*
bf70: 20 4f 70 63 6f 64 65 20 74 6f 20 61 63 63 65 73   Opcode to acces
bf80: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
bf90: 68 65 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  he IN constraint
bfa0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
bfb0: 52 65 6c 6f 61 64 20 74 68 65 20 63 6f 6e 73 74  Reload the const
bfc0: 72 61 69 6e 74 20 76 61 6c 75 65 20 69 6e 74 6f  raint value into
bfd0: 20 72 65 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e 20   reg[iReg+j+2]. 
bfe0: 20 54 68 65 20 73 61 6d 65 20 76 61 6c 75 65 0a   The same value.
bff0: 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20 6c          ** was l
c000: 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73  oaded into the s
c010: 61 6d 65 20 72 65 67 69 73 74 65 72 20 70 72 69  ame register pri
c020: 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 56 46 69  or to the OP_VFi
c030: 6c 74 65 72 2c 20 62 75 74 0a 20 20 20 20 20 20  lter, but.      
c040: 20 20 2a 2a 20 74 68 65 20 78 46 69 6c 74 65 72    ** the xFilter
c050: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c060: 6d 69 67 68 74 20 68 61 76 65 20 63 68 61 6e 67  might have chang
c070: 65 64 20 74 68 65 20 64 61 74 61 74 79 70 65 20  ed the datatype 
c080: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  or.        ** en
c090: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 76 61  coding of the va
c0a0: 6c 75 65 20 69 6e 20 74 68 65 20 72 65 67 69 73  lue in the regis
c0b0: 74 65 72 2c 20 73 6f 20 69 74 20 2a 6d 75 73 74  ter, so it *must
c0c0: 2a 20 62 65 20 72 65 6c 6f 61 64 65 64 2e 20 2a  * be reloaded. *
c0d0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c0e0: 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  ( pLevel->u.in.a
c0f0: 49 6e 4c 6f 6f 70 21 3d 30 20 7c 7c 20 64 62 2d  InLoop!=0 || db-
c100: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
c120: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c130: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
c140: 72 74 28 20 69 49 6e 3e 30 20 29 3b 0a 20 20 20  rt( iIn>0 );.   
c150: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
c160: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
c170: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
c180: 6e 4c 6f 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64 64  nLoop[--iIn].add
c190: 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
c1a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
c1b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
c1c0: 6e 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  n || pOp->opcode
c1d0: 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20  ==OP_Rowid );.  
c1e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c1f0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
c200: 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 70  Column || pOp->p
c210: 33 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20  3==iReg+j+2 );. 
c220: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
c230: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
c240: 5f 52 6f 77 69 64 20 7c 7c 20 70 4f 70 2d 3e 70  _Rowid || pOp->p
c250: 32 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20  2==iReg+j+2 );. 
c260: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
c270: 65 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  e( pOp->opcode==
c280: 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  OP_Rowid );.    
c290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c2a0: 65 41 64 64 4f 70 33 28 76 2c 20 70 4f 70 2d 3e  eAddOp3(v, pOp->
c2b0: 6f 70 63 6f 64 65 2c 20 70 4f 70 2d 3e 70 31 2c  opcode, pOp->p1,
c2c0: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
c2d0: 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  3);.        }.. 
c2e0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
c2f0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
c300: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68  l continue to th
c310: 65 20 6e 65 78 74 20 72 6f 77 20 69 66 20 0a 20  e next row if . 
c320: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 49 4e         ** the IN
c330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
c340: 6f 74 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a  ot satisfied */.
c350: 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65          pCompare
c360: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c370: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 30  pParse, TK_EQ, 0
c380: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
c390: 73 65 72 74 28 20 70 43 6f 6d 70 61 72 65 21 3d  sert( pCompare!=
c3a0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
c3b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
c3c0: 20 69 66 28 20 70 43 6f 6d 70 61 72 65 20 29 7b   if( pCompare ){
c3d0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70  .          pComp
c3e0: 61 72 65 2d 3e 70 4c 65 66 74 20 3d 20 70 54 65  are->pLeft = pTe
c3f0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
c400: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d  ;.          pCom
c410: 70 61 72 65 2d 3e 70 52 69 67 68 74 20 3d 20 70  pare->pRight = p
c420: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
c430: 78 70 72 28 64 62 2c 20 54 4b 5f 52 45 47 49 53  xpr(db, TK_REGIS
c440: 54 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  TER, 0);.       
c450: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
c460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
c470: 67 68 74 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52  ght->iTable = iR
c480: 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 20 20  eg+j+2;.        
c490: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
c4a0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
c4b0: 43 6f 6d 70 61 72 65 2c 20 70 4c 65 76 65 6c 2d  Compare, pLevel-
c4c0: 3e 61 64 64 72 43 6f 6e 74 2c 20 30 29 3b 0a 20  >addrCont, 0);. 
c4d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c4e0: 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70       pCompare->p
c4f0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
c500: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
c510: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6d 70 61  elete(db, pCompa
c520: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
c530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c540: 20 2f 2a 20 54 68 65 73 65 20 72 65 67 69 73 74   /* These regist
c550: 65 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 70  ers need to be p
c560: 72 65 73 65 72 76 65 64 20 69 6e 20 63 61 73 65  reserved in case
c570: 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
c580: 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 2a 2a 20  operator.    ** 
c590: 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 6f 75  loop.  So we cou
c5a0: 6c 64 20 64 65 61 6c 6c 6f 63 61 74 65 20 74 68  ld deallocate th
c5b0: 65 20 72 65 67 69 73 74 65 72 73 20 68 65 72 65  e registers here
c5c0: 20 28 61 6e 64 20 70 6f 74 65 6e 74 69 61 6c 6c   (and potentiall
c5d0: 79 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 20 74  y.    ** reuse t
c5e0: 68 65 6d 20 6c 61 74 65 72 29 20 69 66 20 28 70  hem later) if (p
c5f0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c600: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 3d 3d  WHERE_IN_ABLE)==
c610: 30 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73  0.  But it seems
c620: 0a 20 20 20 20 2a 2a 20 73 69 6d 70 6c 65 72 20  .    ** simpler 
c630: 61 6e 64 20 73 61 66 65 72 20 74 6f 20 73 69 6d  and safer to sim
c640: 70 6c 79 20 6e 6f 74 20 72 65 75 73 65 20 74 68  ply not reuse th
c650: 65 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 20  e registers..   
c660: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 73 71   **.    **    sq
c670: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
c680: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
c690: 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
c6a0: 32 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  2);.    */.    s
c6b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
c6c0: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65  op(pParse);.  }e
c6d0: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
c6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
c6f0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
c700: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
c710: 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
c720: 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
c730: 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
c740: 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
c750: 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
c760: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
c770: 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
c780: 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
c790: 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
c7a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
c7b0: 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
c7c0: 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
c7d0: 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
c7e0: 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
c7f0: 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
c800: 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
c810: 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
c820: 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
c830: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
c840: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
c850: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
c860: 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
c870: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
c880: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
c890: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
c8a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
c8b0: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
c8c0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
c8d0: 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
c8e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c8f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
c900: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
c910: 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
c920: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
c930: 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20  ;.    iRowidReg 
c940: 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
c950: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
c960: 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65  , pLevel, 0, bRe
c970: 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  v, iReleaseReg);
c980: 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 52  .    if( iRowidR
c990: 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20  eg!=iReleaseReg 
c9a0: 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
c9b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
c9c0: 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
c9d0: 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
c9e0: 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
c9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca00: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
ca10: 69 64 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  id, iCur, addrNx
ca20: 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
ca30: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ca40: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  v);.    sqlite3E
ca50: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
ca60: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
ca70: 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
ca80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
ca90: 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
caa0: 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
cab0: 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
cac0: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
cad0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
cae0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
caf0: 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
cb00: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
cb10: 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
cb20: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
cb30: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
cb40: 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
cb50: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
cb60: 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
cb70: 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
cb80: 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
cb90: 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
cba0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
cbb0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
cbc0: 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
cbd0: 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
cbe0: 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
cbf0: 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
cc00: 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
cc10: 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
cc20: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
cc30: 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
cc40: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
cc50: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
cc60: 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
cc70: 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
cc80: 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
cc90: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
cca0: 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
ccb0: 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
ccc0: 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
ccd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
cce0: 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt!=0 || pEnd!=0
ccf0: 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76   );.    if( bRev
cd00: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
cd10: 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
cd20: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
cd30: 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
cd40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  m;.    }.    cod
cd50: 65 43 75 72 73 6f 72 48 69 6e 74 28 70 54 61 62  eCursorHint(pTab
cd60: 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c  Item, pWInfo, pL
cd70: 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
cd80: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
cd90: 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
cda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
cdb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
cdc0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
cdd0: 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
cde0: 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
cdf0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
ce00: 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
ce10: 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
ce20: 64 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  dary */.      in
ce30: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
ce40: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 73 65      /* Cursor se
ce50: 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ek operation */.
ce60: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
ce70: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
ce80: 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
ce90: 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
cea0: 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
ceb0: 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
cec0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
ced0: 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
cee0: 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
cef0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
cf00: 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
cf10: 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
cf20: 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
cf30: 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  GT,.           /
cf40: 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
cf50: 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  eekLE,.         
cf60: 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
cf70: 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20  P_SeekLT,.      
cf80: 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
cf90: 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20    OP_SeekGE.    
cfa0: 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
cfb0: 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
cfc0: 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
cfd0: 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
cfe0: 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
cff0: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
d000: 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
d010: 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
d020: 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
d030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d040: 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
d050: 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
d060: 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
d070: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74      assert( (pSt
d080: 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
d090: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
d0a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d0b0: 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
d0c0: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
d0d0: 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  );.      pX = pS
d0e0: 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
d0f0: 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
d100: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
d110: 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  se( pStart->left
d120: 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
d130: 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  /* transitive co
d140: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
d150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d160: 70 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70  prIsVector(pX->p
d170: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
d180: 20 20 72 31 20 3d 20 72 54 65 6d 70 20 3d 20 73    r1 = rTemp = s
d190: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
d1a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d1b0: 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74    codeExprOrVect
d1c0: 6f 72 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  or(pParse, pX->p
d1d0: 52 69 67 68 74 2c 20 72 31 2c 20 31 29 3b 0a 20  Right, r1, 1);. 
d1e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
d1f0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
d200: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
d210: 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  se( pX->op==TK_G
d220: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  E );.        tes
d230: 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
d240: 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  K_LT );.        
d250: 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
d260: 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
d270: 20 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f 70 5b     op = aMoveOp[
d280: 28 28 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47 54  ((pX->op - TK_GT
d290: 20 2d 20 31 29 20 26 20 30 78 33 29 20 7c 20 30   - 1) & 0x3) | 0
d2a0: 78 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  x1];.        ass
d2b0: 65 72 74 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f  ert( pX->op!=TK_
d2c0: 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65  GT || op==OP_See
d2d0: 6b 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 61  kGE );.        a
d2e0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 21 3d 54  ssert( pX->op!=T
d2f0: 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53  K_GE || op==OP_S
d300: 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 20 20 20  eekGE );.       
d310: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 21   assert( pX->op!
d320: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
d330: 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20  _SeekLE );.     
d340: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
d350: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
d360: 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20  OP_SeekLE );.   
d370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d380: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
d390: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
d3a0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
d3b0: 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  rTemp);.        
d3c0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
d3d0: 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
d3e0: 20 20 20 20 20 6f 70 20 3d 20 61 4d 6f 76 65 4f       op = aMoveO
d3f0: 70 5b 28 70 58 2d 3e 6f 70 20 2d 20 54 4b 5f 47  p[(pX->op - TK_G
d400: 54 29 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  T)];.      }.   
d410: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d420: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 43 75 72  dOp3(v, op, iCur
d430: 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
d440: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d450: 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
d460: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d470: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
d480: 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _GT);.      Vdbe
d490: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
d4a0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20  ->op==TK_LE);.  
d4b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d4c0: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
d4d0: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LT);.      Vdbe
d4e0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
d4f0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20  ->op==TK_GE);.  
d500: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d510: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
d520: 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
d530: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d540: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
d550: 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
d560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d580: 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
d590: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
d5a0: 20 69 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29   iCur, addrHalt)
d5b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d5c0: 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
d5d0: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
d5e0: 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
d5f0: 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
d600: 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
d610: 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
d620: 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
d630: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d640: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
d650: 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
d660: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d670: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
d680: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
d690: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
d6a0: 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
d6b0: 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
d6c0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
d6d0: 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
d6e0: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
d6f0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
d700: 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
d710: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64  >nMem;.      cod
d720: 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50  eExprOrVector(pP
d730: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
d740: 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 31  , memEndValue, 1
d750: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
d760: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
d770: 74 6f 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20  tor(pX->pRight) 
d780: 0a 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e  .       && (pX->
d790: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
d7a0: 3e 6f 70 3d 3d 54 4b 5f 47 54 29 20 0a 20 20 20  >op==TK_GT) .   
d7b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65     ){.        te
d7c0: 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
d7d0: 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
d7e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d7f0: 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
d800: 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
d810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d820: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
d830: 72 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52  rIsVector(pX->pR
d840: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
d850: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
d860: 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
d870: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74    }.    }.    st
d880: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
d890: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d8a0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
d8b0: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
d8c0: 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
d8d0: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
d8e0: 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
d8f0: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
d900: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
d910: 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
d920: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
d930: 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
d940: 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
d950: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
d960: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d970: 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
d980: 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
d990: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
d9a0: 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
d9b0: 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
d9c0: 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
d9d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d9e0: 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
d9f0: 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
da00: 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
da10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
da20: 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65  v, testOp==OP_Le
da30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
da40: 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
da50: 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
da60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
da70: 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65  v, testOp==OP_Ge
da80: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
da90: 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
daa0: 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
dab0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
dac0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
dad0: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
dae0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
daf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
db00: 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
db10: 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
db20: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
db30: 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
db40: 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
db50: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
db60: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
db70: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
db80: 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
db90: 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
dba0: 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
dbb0: 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
dbc0: 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
dbd0: 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
dbe0: 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
dbf0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
dc00: 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
dc10: 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
dc20: 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
dc30: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
dc40: 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
dc50: 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
dc60: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
dc70: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
dc80: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
dc90: 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
dca0: 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
dcb0: 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
dcc0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
dcd0: 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
dce0: 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
dcf0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
dd00: 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
dd10: 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
dd20: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
dd30: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
dd40: 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
dd50: 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
dd60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
dd70: 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
dd80: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
dd90: 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
dda0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
ddb0: 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
ddc0: 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
ddd0: 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
dde0: 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
ddf0: 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
de00: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
de10: 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
de20: 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
de30: 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
de40: 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
de50: 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
de60: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
de70: 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
de80: 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
de90: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
dea0: 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
deb0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
dec0: 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
ded0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
dee0: 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
def0: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
df00: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
df10: 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
df20: 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
df30: 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
df40: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
df50: 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
df60: 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
df70: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
df80: 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
df90: 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
dfa0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
dfb0: 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
dfc0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
dfd0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
dfe0: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
dff0: 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
e000: 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
e010: 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
e020: 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
e030: 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
e040: 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
e050: 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
e060: 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
e070: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
e080: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
e090: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
e0a0: 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
e0b0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
e0c0: 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
e0d0: 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
e0e0: 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
e0f0: 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
e100: 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
e110: 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
e120: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
e130: 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20  ekGT,           
e140: 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
e150: 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
e160: 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
e170: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
e180: 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LT,           /*
e190: 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
e1a0: 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
e1b0: 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
e1c0: 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45  .      OP_SeekGE
e1d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
e1e0: 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
e1f0: 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
e200: 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
e210: 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20       OP_SeekLE  
e220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
e230: 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
e240: 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
e250: 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
e260: 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
e270: 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
e280: 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64   = {.      OP_Id
e290: 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
e2a0: 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 0: (end_const
e2b0: 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
e2c0: 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
e2d0: 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20      OP_IdxGT,   
e2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
e2f0: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
e300: 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64  && !bRev &&  end
e310: 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
e320: 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20  IdxLE,          
e330: 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
e340: 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
e350: 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a  v && !endEq) */.
e360: 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20        OP_IdxLT, 
e370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
e380: 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
e390: 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65  s &&  bRev &&  e
e3a0: 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  ndEq) */.    };.
e3b0: 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
e3c0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
e3d0: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
e3e0: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
e3f0: 73 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 42 74  s */.    u16 nBt
e400: 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  m = pLoop->u.btr
e410: 65 65 2e 6e 42 74 6d 3b 20 20 20 2f 2a 20 4c 65  ee.nBtm;   /* Le
e420: 6e 67 74 68 20 6f 66 20 42 54 4d 20 76 65 63 74  ngth of BTM vect
e430: 6f 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 54  or */.    u16 nT
e440: 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  op = pLoop->u.bt
e450: 72 65 65 2e 6e 54 6f 70 3b 20 20 20 2f 2a 20 4c  ree.nTop;   /* L
e460: 65 6e 67 74 68 20 6f 66 20 54 4f 50 20 76 65 63  ength of TOP vec
e470: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tor */.    int r
e480: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
e490: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
e4a0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
e4b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
e4c0: 65 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  es */.    WhereT
e4d0: 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
e4e0: 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
e4f0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
e500: 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
e510: 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
e520: 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
e530: 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
e540: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
e550: 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
e560: 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e580: 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
e590: 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
e5a0: 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
e5b0: 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
e5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e5d0: 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
e5e0: 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
e5f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
e600: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
e610: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
e620: 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
e630: 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
e640: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
e650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e660: 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
e670: 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  t terms */.    i
e680: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
e690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e6a0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
e6b0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
e6c0: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
e6d0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
e6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
e6f0: 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
e700: 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
e710: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
e730: 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
e740: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
e750: 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
e760: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
e770: 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
e780: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
e790: 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66      char *zEndAf
e7a0: 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
e7b0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
e7c0: 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
e7d0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
e7e0: 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  u8 bSeekPastNull
e7f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
e800: 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73  True to seek pas
e810: 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20  t initial nulls 
e820: 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41  */.    u8 bStopA
e830: 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
e840: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69      /* Add condi
e850: 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74  tion to terminat
e860: 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20  e at NULLs */.. 
e870: 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
e880: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
e890: 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
e8a0: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
e8b0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e      assert( nEq>
e8c0: 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b  =pLoop->nSkip );
e8d0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
e8e0: 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
e8f0: 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
e900: 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
e910: 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
e920: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
e930: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
e940: 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
e950: 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
e960: 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
e970: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
e980: 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
e990: 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
e9a0: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
e9b0: 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
e9c0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
e9d0: 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
e9e0: 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
e9f0: 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
ea00: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
ea10: 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
ea20: 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
ea30: 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
ea40: 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
ea50: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
ea60: 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
ea70: 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
ea80: 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
ea90: 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
eaa0: 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
eab0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20  ->pOrderBy==0.  
eac0: 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
ead0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
eae0: 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  r==1.         ||
eaf0: 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
eb00: 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
eb10: 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20  BY_MIN)==0 );.  
eb20: 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
eb30: 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
eb40: 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
eb50: 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
eb60: 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26  nOBSat>0.     &&
eb70: 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
eb80: 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
eb90: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
eba0: 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20  >nSkip==0 );.   
ebb0: 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
ebc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
ebd0: 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
ebe0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
ebf0: 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
ec00: 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
ec10: 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
ec20: 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
ec30: 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
ec40: 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20  /.    j = nEq;. 
ec50: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
ec60: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
ec70: 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
ec80: 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70   pRangeStart = p
ec90: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
eca0: 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
ecb0: 65 67 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52  eg = MAX(nExtraR
ecc0: 65 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  eg, pLoop->u.btr
ecd0: 65 65 2e 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20  ee.nBtm);.      
ece0: 2f 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61  /* Like optimiza
ecf0: 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
ed00: 72 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63  raints always oc
ed10: 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a  cur in pairs */.
ed20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
ed30: 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
ed40: 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
ed50: 50 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  PT)==0 || .     
ed60: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d           (pLoop-
ed70: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
ed80: 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29  _TOP_LIMIT)!=0 )
ed90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
eda0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
edb0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
edc0: 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
edd0: 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
ede0: 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
edf0: 6e 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28  nExtraReg = MAX(
ee00: 6e 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70  nExtraReg, pLoop
ee10: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 29 3b  ->u.btree.nTop);
ee20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ee30: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
ee40: 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 69 66  H_BLOBS.      if
ee50: 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
ee60: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
ee70: 45 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOPT)!=0 ){.    
ee80: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
ee90: 67 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20  geStart!=0 );   
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f    /* LIKE opt co
eec0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
eed0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61       assert( pRa
eee0: 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
eef0: 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
ef00: 20 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69   );   /* occur i
ef10: 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20  n pairs */.     
ef20: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65     pLevel->iLike
ef30: 52 65 70 43 6e 74 72 20 3d 20 28 75 33 32 29 2b  RepCntr = (u32)+
ef40: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ef50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ef70: 6e 74 65 67 65 72 2c 20 31 2c 20 28 69 6e 74 29  nteger, 1, (int)
ef80: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
ef90: 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56  Cntr);.        V
efa0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
efb0: 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  LIKE loop counte
efc0: 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  r"));.        pL
efd0: 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
efe0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
eff0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f000: 20 20 20 20 20 20 20 2f 2a 20 69 4c 69 6b 65 52         /* iLikeR
f010: 65 70 43 6e 74 72 20 61 63 74 75 61 6c 6c 79 20  epCntr actually 
f020: 73 74 6f 72 65 73 20 32 78 20 74 68 65 20 63 6f  stores 2x the co
f030: 75 6e 74 65 72 20 72 65 67 69 73 74 65 72 20 6e  unter register n
f040: 75 6d 62 65 72 2e 20 20 54 68 65 0a 20 20 20 20  umber.  The.    
f050: 20 20 20 20 2a 2a 20 62 6f 74 74 6f 6d 20 62 69      ** bottom bi
f060: 74 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  t indicates whet
f070: 68 65 72 20 74 68 65 20 73 65 61 72 63 68 20 6f  her the search o
f080: 72 64 65 72 20 69 73 20 41 53 43 20 6f 72 20 44  rder is ASC or D
f090: 45 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ESC. */.        
f0a0: 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29  testcase( bRev )
f0b0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f0c0: 73 65 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  se( pIdx->aSortO
f0d0: 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
f0e0: 45 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20  E_SO_DESC );.   
f0f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 52       assert( (bR
f100: 65 76 20 26 20 7e 31 29 3d 3d 30 20 29 3b 0a 20  ev & ~1)==0 );. 
f110: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
f120: 4c 69 6b 65 52 65 70 43 6e 74 72 20 3c 3c 3d 31  LikeRepCntr <<=1
f130: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
f140: 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 7c  ->iLikeRepCntr |
f150: 3d 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e  = bRev ^ (pIdx->
f160: 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
f170: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29  =SQLITE_SO_DESC)
f180: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f190: 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
f1a0: 65 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20  eStart==0 ){.   
f1b0: 20 20 20 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61       j = pIdx->a
f1c0: 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
f1d0: 20 20 20 20 20 20 69 66 28 20 28 6a 3e 3d 30 20        if( (j>=0 
f1e0: 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  && pIdx->pTable-
f1f0: 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
f200: 3d 3d 30 29 20 7c 7c 20 6a 3d 3d 58 4e 5f 45 58  ==0) || j==XN_EX
f210: 50 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PR ){.          
f220: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20  bSeekPastNull = 
f230: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
f240: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
f250: 73 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64  ssert( pRangeEnd
f260: 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e  ==0 || (pRangeEn
f270: 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
f280: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a  M_VNULL)==0 );..
f290: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
f2a0: 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
f2b0: 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
f2c0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
f2d0: 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
f2e0: 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
f2f0: 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
f300: 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
f310: 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
f320: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
f330: 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
f340: 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
f350: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f360: 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79   (nEq<pIdx->nKey
f370: 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49  Col && bRev==(pI
f380: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
f390: 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
f3a0: 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
f3b0: 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79  ev && pIdx->nKey
f3c0: 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  Col==nEq).    ){
f3d0: 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
f3e0: 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
f3f0: 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
f400: 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c  ;.      SWAP(u8,
f410: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
f420: 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20  bStopAtNull);.  
f430: 20 20 20 20 53 57 41 50 28 75 38 2c 20 6e 42 74      SWAP(u8, nBt
f440: 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 7d 0a  m, nTop);.    }.
f450: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
f460: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
f470: 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
f480: 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
f490: 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64  or IN.    ** and
f4a0: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
f4b0: 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
f4c0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
f4d0: 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
f4e0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
f4f0: 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Base..    */.   
f500: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
f510: 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f  pTabItem, pWInfo
f520: 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  , pLevel, pRange
f530: 45 6e 64 29 3b 0a 20 20 20 20 72 65 67 42 61 73  End);.    regBas
f540: 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
f550: 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
f560: 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
f570: 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
f580: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
f590: 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73  StartAff==0 || s
f5a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f5b0: 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29  StartAff)>=nEq )
f5c0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74  ;.    if( zStart
f5d0: 41 66 66 20 26 26 20 6e 54 6f 70 20 29 7b 0a 20  Aff && nTop ){. 
f5e0: 20 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73       zEndAff = s
f5f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
f600: 62 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45  b, &zStartAff[nE
f610: 71 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  q]);.    }.    a
f620: 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
f630: 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 74  >addrNxt;..    t
f640: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
f650: 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
f660: 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
f670: 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
f680: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
f690: 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
f6a0: 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
f6b0: 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
f6c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f6d0: 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
f6e0: 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
f6f0: 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
f700: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f710: 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
f720: 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
f730: 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
f740: 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
f750: 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
f760: 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
f770: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
f780: 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
f790: 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
f7a0: 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
f7b0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
f7c0: 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
f7d0: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
f7e0: 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
f7f0: 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
f800: 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
f810: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
f820: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
f830: 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
f840: 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
f850: 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
f860: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
f870: 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
f880: 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
f890: 68 74 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78  ht;.      codeEx
f8a0: 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73  prOrVector(pPars
f8b0: 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
f8c0: 73 65 2b 6e 45 71 2c 20 6e 42 74 6d 29 3b 0a 20  se+nEq, nBtm);. 
f8d0: 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70       whereLikeOp
f8e0: 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67  timizationString
f8f0: 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c  Fixup(v, pLevel,
f900: 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
f910: 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
f920: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
f930: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
f940: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f950: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
f960: 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
f970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f980: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f990: 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
f9a0: 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
f9b0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
f9c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
f9d0: 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
f9e0: 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Aff ){.        u
f9f0: 70 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69  pdateRangeAffini
fa00: 74 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 42  tyStr(pRight, nB
fa10: 74 6d 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e  tm, &zStartAff[n
fa20: 45 71 5d 29 3b 0a 20 20 20 20 20 20 7d 20 20 0a  Eq]);.      }  .
fa30: 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
fa40: 74 20 2b 3d 20 6e 42 74 6d 3b 0a 20 20 20 20 20  t += nBtm;.     
fa50: 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
fa60: 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
fa70: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
fa80: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fa90: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
faa0: 70 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  pRight)==0 ){.  
fab0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
fac0: 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
fad0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65  Start);.      }e
fae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61  lse{.        sta
faf0: 72 74 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  rtEq = 1;.      
fb00: 7d 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61 73  }.      bSeekPas
fb10: 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
fb20: 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61  else if( bSeekPa
fb30: 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  stNull ){.      
fb40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb50: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
fb60: 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
fb70: 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
fb80: 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
fb90: 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
fba0: 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
fbb0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
fbc0: 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
fbd0: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
fbe0: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62   nConstraint - b
fbf0: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53  SeekPastNull, zS
fc00: 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 69 66  tartAff);.    if
fc10: 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3e 30  ( pLoop->nSkip>0
fc20: 20 26 26 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3d   && nConstraint=
fc30: 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b  =pLoop->nSkip ){
fc40: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6b  .      /* The sk
fc50: 69 70 2d 73 63 61 6e 20 6c 6f 67 69 63 20 69 6e  ip-scan logic in
fc60: 73 69 64 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  side the call to
fc70: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
fc80: 43 6f 6e 73 74 72 61 69 6e 74 73 28 29 0a 20 20  Constraints().  
fc90: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
fca0: 20 61 6c 72 65 61 64 79 20 6c 65 66 74 20 74 68   already left th
fcb0: 65 20 63 75 72 73 6f 72 20 73 69 74 74 69 6e 67  e cursor sitting
fcc0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   on the correct 
fcd0: 72 6f 77 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f  row,.      ** so
fce0: 20 6e 6f 20 66 75 72 74 68 65 72 20 73 65 65 6b   no further seek
fcf0: 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ing is needed */
fd00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fd10: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
fd20: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
fd30: 45 41 52 4c 59 4f 55 54 20 29 7b 0a 20 20 20 20  EARLYOUT ){.    
fd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp1(v, OP_Seek
fd60: 48 69 74 2c 20 69 49 64 78 43 75 72 29 3b 0a 20  Hit, iIdxCur);. 
fd70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 70 20       }.      op 
fd80: 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
fd90: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
fda0: 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
fdb0: 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 20 20   + bRev];.      
fdc0: 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
fdd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fde0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
fdf0: 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
fe00: 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
fe10: 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
fe20: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
fe30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
fe40: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
fe50: 50 5f 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74  P_Rewind);  test
fe60: 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77  case( op==OP_Rew
fe70: 69 6e 64 20 29 3b 0a 20 20 20 20 20 20 56 64 62  ind );.      Vdb
fe80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
fe90: 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20  p==OP_Last);    
fea0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
feb0: 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 56  _Last );.      V
fec0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
fed0: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b   op==OP_SeekGT);
fee0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
fef0: 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20  OP_SeekGT );.   
ff00: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
ff10: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
ff20: 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GE);  testcase( 
ff30: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
ff40: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
ff50: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
ff60: 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61  SeekLE);  testca
ff70: 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
ff80: 45 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  E );.      VdbeC
ff90: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
ffa0: 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65  =OP_SeekLT);  te
ffb0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
ffc0: 65 65 6b 4c 54 20 29 3b 0a 20 20 20 20 7d 0a 0a  eekLT );.    }..
ffd0: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
ffe0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e  value for the in
fff0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
10000 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  int at the end o
10010 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e  f the.    ** ran
10020 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ge (if any)..   
10030 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
10040 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
10050 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
10060 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
10070 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ht = pRangeEnd->
10080 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
10090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
100a0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
100b0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
100c0 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45   1);.      codeE
100d0 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72  xprOrVector(pPar
100e0 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
100f0 61 73 65 2b 6e 45 71 2c 20 6e 54 6f 70 29 3b 0a  ase+nEq, nTop);.
10100 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f        whereLikeO
10110 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e  ptimizationStrin
10120 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c  gFixup(v, pLevel
10130 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
10140 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
10150 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
10160 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  RM_VNULL)==0.   
10170 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
10180 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
10190 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ht).      ){.   
101a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
101c0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
101d0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
101e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
101f0 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
10200 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
10210 7b 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  {.        update
10220 52 61 6e 67 65 41 66 66 69 6e 69 74 79 53 74 72  RangeAffinityStr
10230 28 70 52 69 67 68 74 2c 20 6e 54 6f 70 2c 20 7a  (pRight, nTop, z
10240 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 20  EndAff);.       
10250 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
10260 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
10270 73 65 2b 6e 45 71 2c 20 6e 54 6f 70 2c 20 7a 45  se+nEq, nTop, zE
10280 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 65  ndAff);.      }e
10290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
102a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
102b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
102c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
102d0 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20 6e 54  Constraint += nT
102e0 6f 70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  op;.      testca
102f0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
10300 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
10310 52 54 55 41 4c 20 29 3b 0a 0a 20 20 20 20 20 20  RTUAL );..      
10320 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
10330 73 56 65 63 74 6f 72 28 70 52 69 67 68 74 29 3d  sVector(pRight)=
10340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
10350 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
10360 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
10370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10380 20 20 20 65 6e 64 45 71 20 3d 20 31 3b 0a 20 20     endEq = 1;.  
10390 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
103a0 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
103b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
103c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
103d0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
103e0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71  e+nEq);.      sq
103f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
10400 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
10410 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
10420 20 20 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20      endEq = 0;. 
10430 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
10440 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
10450 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10460 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
10470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10480 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20  , zEndAff);..   
10490 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
104a0 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
104b0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
104c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
104d0 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  ddr(v);..    /* 
104e0 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64  Check if the ind
104f0 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  ex cursor is pas
10500 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10510 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69   range. */.    i
10520 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  f( nConstraint )
10530 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e  {.      op = aEn
10540 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64  dOp[bRev*2 + end
10550 45 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Eq];.      sqlit
10560 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10570 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
10580 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
10590 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
105a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
105b0 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20  op==OP_IdxGT ); 
105c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
105d0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20  v, op==OP_IdxGT 
105e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
105f0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
10600 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
10610 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
10620 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
10630 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
10640 4c 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LT );  VdbeCover
10650 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
10660 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  IdxLT );.      t
10670 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
10680 49 64 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f  IdxLE );  VdbeCo
10690 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
106a0 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20  OP_IdxLE );.    
106b0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  }..    if( pLoop
106c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
106d0 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29 7b  E_IN_EARLYOUT ){
106e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
106f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
10700 65 65 6b 48 69 74 2c 20 69 49 64 78 43 75 72 2c  eekHit, iIdxCur,
10710 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
10720 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
10730 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
10740 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
10750 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20   omitTable ){.  
10760 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61      /* pIdx is a
10770 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
10780 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63    No need to acc
10790 65 73 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ess the main tab
107a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  le. */.    }else
107b0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 49   if( HasRowid(pI
107c0 64 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20  dx->pTable) ){. 
107d0 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
107e0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
107f0 48 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29  HERE_SEEK_TABLE)
10800 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 20 20   || (.          
10810 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
10820 61 67 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b  ags & WHERE_SEEK
10830 5f 55 4e 49 51 5f 54 41 42 4c 45 29 20 0a 20 20  _UNIQ_TABLE) .  
10840 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
10850 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
10860 53 53 5f 53 49 4e 47 4c 45 29 0a 20 20 20 20 20  SS_SINGLE).     
10870 20 29 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f   )){.        iRo
10880 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
10890 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
108a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
108b0 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
108c0 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
108d0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  idReg);.        
108e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
108f0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
10900 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
10910 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
10920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10930 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
10940 43 75 72 2c 20 30 2c 20 69 52 6f 77 69 64 52 65  Cur, 0, iRowidRe
10950 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
10960 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10980 20 20 63 6f 64 65 44 65 66 65 72 72 65 64 53 65    codeDeferredSe
10990 65 6b 28 70 57 49 6e 66 6f 2c 20 70 49 64 78 2c  ek(pWInfo, pIdx,
109a0 20 69 43 75 72 2c 20 69 49 64 78 43 75 72 29 3b   iCur, iIdxCur);
109b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
109c0 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49 64  se if( iCur!=iId
109d0 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49 6e  xCur ){.      In
109e0 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
109f0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
10a00 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
10a10 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
10a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10a30 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
10a40 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
10a50 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
10a60 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
10a70 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
10a80 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
10a90 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
10aa0 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
10ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ac0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
10ad0 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
10ae0 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20   iRowidReg+j);. 
10af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10b10 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
10b20 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74  , iCur, addrCont
10b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52 6f               iRo
10b50 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65  widReg, pPk->nKe
10b60 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
10b70 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  age(v);.    }.. 
10b80 20 20 20 2f 2a 20 49 66 20 70 49 64 78 20 69 73     /* If pIdx is
10b90 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 6f 6e 65   an index on one
10ba0 20 6f 72 20 6d 6f 72 65 20 65 78 70 72 65 73 73   or more express
10bb0 69 6f 6e 73 2c 20 74 68 65 6e 20 6c 6f 6f 6b 20  ions, then look 
10bc0 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 61  through.    ** a
10bd0 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
10be0 6e 73 20 69 6e 20 70 57 49 6e 66 6f 20 61 6e 64  ns in pWInfo and
10bf0 20 74 72 79 20 74 6f 20 74 72 61 6e 73 66 6f 72   try to transfor
10c00 6d 20 6d 61 74 63 68 69 6e 67 20 65 78 70 72 65  m matching expre
10c10 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 69 6e  ssions.    ** in
10c20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  to reference to 
10c30 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 2e 0a 20  index columns.. 
10c40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 44 6f 20     **.    ** Do 
10c50 6e 6f 74 20 64 6f 20 74 68 69 73 20 66 6f 72 20  not do this for 
10c60 74 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45 46  the RHS of a LEF
10c70 54 20 4a 4f 49 4e 2e 20 54 68 69 73 20 69 73 20  T JOIN. This is 
10c80 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 20  because the .   
10c90 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   ** expression m
10ca0 61 79 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  ay be evaluated 
10cb0 61 66 74 65 72 20 4f 50 5f 4e 75 6c 6c 52 6f 77  after OP_NullRow
10cc0 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
10cd0 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed on.    ** the
10ce0 20 63 75 72 73 6f 72 2e 20 49 6e 20 74 68 69 73   cursor. In this
10cf0 20 63 61 73 65 20 69 74 20 69 73 20 69 6d 70 6f   case it is impo
10d00 72 74 61 6e 74 20 74 6f 20 64 6f 20 74 68 65 20  rtant to do the 
10d10 66 75 6c 6c 20 65 76 61 6c 75 61 74 69 6f 6e 2c  full evaluation,
10d20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 72  .    ** as the r
10d30 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
10d40 72 65 73 73 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  ression may not 
10d50 62 65 20 4e 55 4c 4c 2c 20 65 76 65 6e 20 69 66  be NULL, even if
10d60 20 61 6c 6c 20 74 61 62 6c 65 0a 20 20 20 20 2a   all table.    *
10d70 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  * column values 
10d80 61 72 65 2e 20 20 68 74 74 70 73 3a 2f 2f 77 77  are.  https://ww
10d90 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
10da0 2f 69 6e 66 6f 2f 37 66 61 38 30 34 39 36 38 35  /info/7fa8049685
10db0 62 35 30 62 35 61 0a 20 20 20 20 2a 2f 0a 20 20  b50b5a.    */.  
10dc0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
10dd0 65 66 74 4a 6f 69 6e 3d 3d 30 20 29 7b 0a 20 20  eftJoin==0 ){.  
10de0 20 20 20 20 77 68 65 72 65 49 6e 64 65 78 45 78      whereIndexEx
10df0 70 72 54 72 61 6e 73 28 70 49 64 78 2c 20 69 43  prTrans(pIdx, iC
10e00 75 72 2c 20 69 49 64 78 43 75 72 2c 20 70 57 49  ur, iIdxCur, pWI
10e10 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nfo);.    }..   
10e20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
10e30 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
10e40 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
10e50 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 66   loop. */.    if
10e60 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
10e70 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20   & WHERE_ONEROW 
10e80 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
10e90 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
10ea0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
10eb0 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  v ){.      pLeve
10ec0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
10ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ee0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
10ef0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  P_Next;.    }.  
10f00 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
10f10 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  IdxCur;.    pLev
10f20 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d  el->p3 = (pLoop-
10f30 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55  >wsFlags&WHERE_U
10f40 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20  NQ_WANTED)!=0 ? 
10f50 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  1:0;.    if( (pL
10f60 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
10f70 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
10f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
10f90 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
10fa0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
10fb0 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
10fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
10fd0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
10fe0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 );.    }.    i
10ff0 66 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 20 70  f( omitTable ) p
11000 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
11010 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11020 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
11030 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
11040 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11050 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
11060 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
11070 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
11080 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
11090 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
110a0 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
110b0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
110c0 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
110d0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
110e0 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
110f0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
11100 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
11110 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
11120 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
11130 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
11140 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
11150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
11160 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
11170 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
11180 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
11190 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
111a0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
111b0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
111c0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
111d0 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
111e0 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
111f0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
11200 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
11210 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
11220 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
11240 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
11250 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
11260 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
11270 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
11280 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
11290 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
112a0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
112b0 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
112c0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
112d0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
112e0 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
112f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
11300 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
11310 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
11320 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
11330 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
11340 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
11350 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
11360 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
11370 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
11380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
11390 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
113a0 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
113b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
113c0 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
113d0 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
113e0 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
113f0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
11400 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
11410 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
11420 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
11430 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
11440 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
11450 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
11460 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
11470 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
11480 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
11490 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
114a0 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
114b0 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
114c0 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
114d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
114e0 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
114f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11500 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
11510 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
11520 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
11530 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
11540 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
11550 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
11560 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11570 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
11580 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
11590 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
115a0 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
115b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
115c0 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
115d0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
115e0 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
115f0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
11600 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
11610 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
11620 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  >.    **.    ** 
11630 41 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36  Added 2014-05-26
11640 3a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  : If the table i
11650 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
11660 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20  D table, then.  
11670 20 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65    ** use an ephe
11680 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
11690 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
116a0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
116b0 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
116c0 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
116d0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
116e0 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
116f0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
11700 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
11710 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
11720 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
11730 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
11740 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
11750 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
11760 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
11770 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
11780 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
11790 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
117a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
117b0 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
117c0 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
117d0 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
117e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
117f0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
11800 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
11810 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
11820 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
11830 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
11840 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
11850 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
11860 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
11870 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
11880 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
118a0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
118b0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
118c0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
118d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118f0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
11900 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
11910 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
11920 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11930 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
11940 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
11950 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
11960 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
11990 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
119a0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
119b0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
119c0 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
119d0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
119e0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
119f0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11a20 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
11a30 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20  wctrlFlags;     
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a50 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d  * Flags for sub-
11a60 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11a70 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
11a80 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
11a90 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
11aa0 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
11ab0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
11ac0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
11ad0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  Item->pTab;..   
11ae0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
11af0 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
11b00 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
11b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
11b20 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
11b30 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  & WO_OR );.    a
11b40 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
11b50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
11b60 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
11b70 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
11b80 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
11b90 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
11ba0 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
11bb0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
11bc0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
11bd0 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
11be0 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f  ist in pOrTab co
11bf0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
11c00 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
11c10 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
11c20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
11c30 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
11c40 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
11c50 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
11c60 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
11c70 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
11c80 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
11c90 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
11ca0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
11cb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
11cc0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
11cd0 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
11ce0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
11cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
11d00 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
11d10 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
11d20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
11d30 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
11d40 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
11d50 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
11d60 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
11d70 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
11d80 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
11d90 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
11da0 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
11db0 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  w(db,.          
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
11de0 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
11df0 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
11e00 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
11e10 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
11e20 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
11e30 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
11e40 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79  = (u8)(nNotReady
11e50 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
11e60 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
11e70 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
11e80 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
11e90 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
11ea0 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
11eb0 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
11ec0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
11ed0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
11ee0 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
11ef0 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
11f00 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
11f10 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
11f20 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
11f30 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
11f40 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
11f50 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
11f60 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
11f70 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
11f80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
11f90 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
11fa0 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
11fb0 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
11fc0 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
11fd0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
11fe0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
11ff0 2e 20 20 4f 72 2c 20 63 72 65 61 74 65 20 61 6e  .  Or, create an
12000 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
12010 0a 20 20 20 20 2a 2a 20 63 61 70 61 62 6c 65 20  .    ** capable 
12020 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61  of holding prima
12030 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20 63  ry keys in the c
12040 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54  ase of a WITHOUT
12050 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20   ROWID..    **. 
12060 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
12070 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
12080 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
12090 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
120a0 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
120b0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
120c0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
120d0 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
120e0 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
120f0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
12100 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
12110 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
12120 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
12130 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
12140 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
12150 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
12160 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
12170 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
12180 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
12190 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
121a0 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
121b0 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
121c0 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
121d0 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
121e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
121f0 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
12200 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
12210 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
12220 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
12230 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
12240 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
12250 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
12260 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
12270 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
12280 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
12290 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
122a0 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
122b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
122c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
122d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
122e0 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
122f0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
12300 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
12310 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
12320 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
12330 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 52  b);.        regR
12340 6f 77 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  owset = pParse->
12350 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
12360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12370 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
12380 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77 73 65 74  meral, regRowset
12390 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
123a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
123b0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
123c0 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20  (pParse, pPk);. 
123d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67       }.      reg
123e0 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
123f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
12400 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c    iRetInit = sql
12410 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12420 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
12430 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
12440 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67    /* If the orig
12450 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
12460 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f  e is z of the fo
12470 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f  rm:  (x1 OR x2 O
12480 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20  R ...) AND y.   
12490 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65   ** Then for eve
124a0 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c  ry term xN, eval
124b0 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65  uate as the sube
124c0 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e  xpression: xN AN
124d0 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  D z.    ** That 
124e0 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20  way, terms in y 
124f0 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65  that are factore
12500 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75  d into the disju
12510 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  nction will.    
12520 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  ** be picked up 
12530 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65  by the recursive
12540 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12550 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65  3WhereBegin() be
12560 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  low..    **.    
12570 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63  ** Actually, eac
12580 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
12590 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
125a0 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65  "xN AND w" where
125b0 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65   w is.    ** the
125c0 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74   "interesting" t
125d0 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d  erms of z - term
125e0 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f  s that did not o
125f0 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a  riginate in the.
12600 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49      ** ON or USI
12610 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  NG clause of a L
12620 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65  EFT JOIN, and te
12630 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61  rms that are usa
12640 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69  ble as .    ** i
12650 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
12660 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d     ** This optim
12670 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c  ization also onl
12680 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65  y applies if the
12690 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
126a0 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69  .) term.    ** i
126b0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
126c0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
126d0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
126e0 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b  .    ** See tick
126f0 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  et http://www.sq
12700 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
12710 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20  o/f2369304e4.   
12720 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d   */.    if( pWC-
12730 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20  >nTerm>1 ){.    
12740 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
12750 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
12760 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d  iTerm<pWC->nTerm
12770 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
12780 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
12790 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  = pWC->a[iTerm].
127a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
127b0 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( &pWC->a[iTerm
127c0 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e  ] == pTerm ) con
127d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
127e0 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
127f0 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
12800 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
12810 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12820 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
12830 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
12840 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20  CODED );.       
12850 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
12860 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
12870 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
12880 5f 43 4f 44 45 44 29 29 21 3d 30 20 29 20 63 6f  _CODED))!=0 ) co
12890 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
128a0 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
128b0 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
128c0 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
128d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
128e0 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
128f0 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
12900 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
12910 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
12920 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
12930 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
12940 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
12950 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
12960 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
12970 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
12980 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
12990 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
129a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
129b0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
129c0 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46 4f 4c 44  D|TKFLG_DONTFOLD
129d0 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  , 0, pAndExpr);.
129e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
129f0 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61     /* Run a sepa
12a00 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  rate WHERE claus
12a10 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
12a20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
12a30 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  .  After.    ** 
12a40 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c  eliminating dupl
12a50 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65  icates from othe
12a60 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  r WHERE clauses,
12a70 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20   the action for 
12a80 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d  each.    ** sub-
12a90 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
12aa0 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  to to invoke the
12ab0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
12ac0 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  as a subroutine.
12ad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72  .    */.    wctr
12ae0 6c 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f  lFlags =  WHERE_
12af0 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 7c 20 28  OR_SUBCLAUSE | (
12b00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
12b10 67 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b 5f  gs & WHERE_SEEK_
12b20 54 41 42 4c 45 29 3b 0a 20 20 20 20 45 78 70 6c  TABLE);.    Expl
12b30 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
12b40 61 72 73 65 2c 20 31 2c 20 22 4d 55 4c 54 49 2d  arse, 1, "MULTI-
12b50 49 4e 44 45 58 20 4f 52 22 29 29 3b 0a 20 20 20  INDEX OR"));.   
12b60 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
12b70 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
12b80 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
12b90 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
12ba0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
12bb0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
12bc0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
12bd0 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f   || (pOrTerm->eO
12be0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
12bf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
12c00 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
12c10 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
12c20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
12c30 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
12c40 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
12c50 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
12c60 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75  rm->pExpr; /* Cu
12c70 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20  rrent OR clause 
12c80 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  term */.        
12c90 69 6e 74 20 6a 6d 70 31 20 3d 20 30 3b 20 20 20  int jmp1 = 0;   
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75  /* Address of ju
12cc0 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  mp operation */.
12cd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12ce0 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e  (pTabItem[0].fg.
12cf0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
12d00 46 54 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  FT)==0 .        
12d10 20 20 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50       || ExprHasP
12d20 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
12d30 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 0a 20   EP_FromJoin) . 
12d40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
12d50 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
12d60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
12d70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
12d80 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
12d90 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
12da0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
12db0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
12dc0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
12dd0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
12de0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
12df0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
12e00 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75  ACE(0xffff, ("Su
12e10 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61  bplan for OR-cla
12e20 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  use:\n"));.     
12e30 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
12e40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12e50 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
12e60 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73        wctrlFlags
12ea0 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
12eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
12ec0 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
12ed0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
12ee0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
12ef0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
12f00 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
12f10 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
12f20 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  oop;.          i
12f30 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  nt addrExplain =
12f40 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
12f50 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
12f60 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
12f70 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
12f80 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 0a 20  WInfo->a[0], 0. 
12f90 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
12fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
12fb0 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
12fc0 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  v, pOrTab, &pSub
12fd0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64  WInfo->a[0], add
12fe0 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20  rExplain);..    
12ff0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
13000 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20 63   the sub-WHERE c
13010 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72  lause body.  Fir
13020 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20  st skip over.   
13030 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63         ** duplic
13040 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72  ate rows from pr
13050 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ior sub-WHERE cl
13060 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72  auses, and recor
13070 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
13080 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49  ** rowid (or PRI
13090 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68  MARY KEY) for th
130a0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f  e current row so
130b0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20   that the same. 
130c0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20           ** row 
130d0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
130e0 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73 75  in subsequent su
130f0 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  b-WHERE clauses.
13100 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
13110 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
13120 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
13130 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
13140 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
13150 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
13160 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
13170 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
13180 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
13190 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
131a0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
131b0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
131c0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
131d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
131e0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
131f0 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77  -1, iCur, regRow
13200 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
13210 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c        jmp1 = sql
13220 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
13230 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
13240 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30  st, regRowset, 0
13250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 72 2c 69               r,i
13280 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
13290 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
132a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
132b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
132c0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
132d0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
132e0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
132f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13300 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  nt nPk = pPk->nK
13310 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  eyCol;.         
13320 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20       int iPk;.. 
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13340 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f  Read the PK into
13350 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d   an array of tem
13360 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  p registers. */.
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
13380 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13390 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
133a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
133b0 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b    for(iPk=0; iPk
133c0 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20  <nPk; iPk++){.  
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
133e0 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69  t iCol = pPk->ai
133f0 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20  Column[iPk];.   
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13410 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
13420 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
13430 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69  e, pTab, iCol, i
13440 43 75 72 2c 20 72 2b 69 50 6b 29 3b 0a 20 20 20  Cur, r+iPk);.   
13450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
13460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13470 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70  heck if the temp
13480 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63   table already c
13490 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79  ontains this key
134a0 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20  . If so,.       
134b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f         ** the ro
134c0 77 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  w has already be
134d0 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  en included in t
134e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
134f0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
13500 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  ** can be ignore
13510 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61  d (by jumping pa
13520 73 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c  st the Gosub bel
13530 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ow). Otherwise,.
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
13550 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
13560 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
13570 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20  ble and proceed 
13580 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a  with processing.
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
135a0 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20   the row..      
135b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
135c0 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20           ** Use 
135d0 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65  some of the same
135e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
135f0 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  s OP_RowSetTest:
13600 20 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20   If iSet.       
13610 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72         ** is zer
13620 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  o, assume that t
13630 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c  he key cannot al
13640 72 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74  ready be present
13650 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
13660 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61    ** the temp ta
13670 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74  ble. And if iSet
13680 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74   is -1, assume t
13690 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
136a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
136b0 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74  * need to insert
136c0 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68   the key into th
136d0 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73  e temp table, as
136e0 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a   it will never .
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
13700 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20   be tested for. 
13710 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20   */ .           
13720 20 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20     if( iSet ){. 
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
13740 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp1 = sqlite3Vdb
13750 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
13760 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65  _Found, regRowse
13770 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  t, 0, r, nPk);. 
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
13790 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
137c0 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
137e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
137f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
13800 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69   r, nPk, regRowi
13810 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
13820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13830 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
13840 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52 6f 77  dxInsert, regRow
13850 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  set, regRowid,. 
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20      r, nPk);.   
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
138a0 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56   iSet ) sqlite3V
138b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
138c0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
138d0 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULT);.          
138e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
138f0 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
13900 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d  the array of tem
13910 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  p registers */. 
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13930 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13940 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ange(pParse, r, 
13950 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
13960 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13970 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
13980 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
13990 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
139a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
139b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
139c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
139d0 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
139e0 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
139f0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
13a00 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65  re (skipping the
13a10 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
13a20 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74  subroutine) if t
13a30 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
13a40 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52  current sub-WHER
13a50 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69  E row is a dupli
13a60 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20  cate from prior 
13a70 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20  sub-WHEREs. */. 
13a80 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
13a90 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  1 ) sqlite3VdbeJ
13aa0 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 31 29  umpHere(v, jmp1)
13ab0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
13ac0 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
13ad0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
13ae0 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
13af0 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
13b00 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
13b10 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
13b20 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
13b30 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
13b40 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
13b50 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
13b60 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
13b70 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
13b80 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
13b90 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
13ba0 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
13bb0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
13bc0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
13bd0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
13be0 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
13bf0 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
13c00 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
13c10 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
13c20 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
13c30 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
13c40 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
13c50 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
13c60 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
13c70 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
13c80 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
13c90 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
13ca0 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
13cb0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
13cc0 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
13cd0 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
13ce0 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
13cf0 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
13d00 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
13d10 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
13d20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
13d30 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
13d40 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
13d50 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
13d60 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
13d70 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
13d80 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
13d90 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
13da0 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
13db0 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
13dc0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
13dd0 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
13de0 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
13df0 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
13e00 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
13e10 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
13e20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
13e30 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
13e40 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
13e50 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
13e60 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
13e70 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
13e80 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
13e90 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
13ea0 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
13eb0 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
13ec0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13ed0 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
13ee0 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
13ef0 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
13f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
13f10 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
13f20 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
13f30 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
13f40 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
13f50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
13f60 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
13f70 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
13f80 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
13f90 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
13fa0 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
13fb0 20 20 20 26 26 20 28 48 61 73 52 6f 77 69 64 28     && (HasRowid(
13fc0 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
13fd0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75 62  aryKeyIndex(pSub
13fe0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
13ff0 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20 20 20  ndex)).         
14000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14010 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
14020 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
14030 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
14040 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
14050 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
14060 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
14070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14080 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
14090 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
140a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
140b0 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
140c0 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
140d0 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
140e0 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
140f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
14100 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
14110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14120 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 45 78    }.    }.    Ex
14130 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
14140 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  p(pParse);.    p
14150 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
14160 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
14170 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
14180 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
14190 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
141a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
141b0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
141c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
141d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
141e0 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
141f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
14200 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
14210 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
14220 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
14230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
14240 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
14250 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
14260 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14270 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
14280 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
14290 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
142a0 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
142b0 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  (db, pOrTab);.  
142c0 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
142d0 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
142e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
142f0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
14300 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14310 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
14320 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
14330 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
14340 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
14350 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
14360 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
14370 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
14380 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
14390 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
143a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
143b0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
143c0 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
143d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
143e0 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
143f0 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
14400 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
14410 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
14420 76 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  v==1 );.    if( 
14430 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 69 73 52  pTabItem->fg.isR
14440 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
14450 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b    /* Tables mark
14460 65 64 20 69 73 52 65 63 75 72 73 69 76 65 20 68  ed isRecursive h
14470 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ave only a singl
14480 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 73 74  e row that is st
14490 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ored in.      **
144a0 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72   a pseudo-cursor
144b0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65  .  No need to Re
144c0 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63  wind or Next suc
144d0 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20  h cursors. */.  
144e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
144f0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
14500 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 43  lse{.      codeC
14510 75 72 73 6f 72 48 69 6e 74 28 70 54 61 62 49 74  ursorHint(pTabIt
14520 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76  em, pWInfo, pLev
14530 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c  el, 0);.      pL
14540 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
14550 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c  [bRev];.      pL
14560 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
14570 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
14580 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
14590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
145a0 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
145b0 20 61 64 64 72 48 61 6c 74 29 3b 0a 20 20 20 20   addrHalt);.    
145c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
145d0 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
145e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
145f0 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
14600 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
14610 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
14620 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
14630 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  EP;.    }.  }..#
14640 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14650 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
14660 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64  TUS.  pLevel->ad
14670 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65  drVisit = sqlite
14680 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14690 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (v);.#endif..  /
146a0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
146b0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
146c0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
146d0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
146e0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
146f0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
14700 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
14710 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
14720 6f 6f 70 20 6d 61 79 20 72 75 6e 20 62 65 74 77  oop may run betw
14730 65 65 6e 20 6f 6e 65 20 61 6e 64 20 74 68 72 65  een one and thre
14740 65 20 74 69 6d 65 73 2c 20 64 65 70 65 6e 64 69  e times, dependi
14750 6e 67 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 63  ng on the.  ** c
14760 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
14770 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20   generated. The 
14780 76 61 6c 75 65 20 6f 66 20 73 74 61 63 6b 20 76  value of stack v
14790 61 72 69 61 62 6c 65 20 69 4c 6f 6f 70 0a 20 20  ariable iLoop.  
147a0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
147b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 63 6f  e constraints co
147c0 64 65 64 20 62 79 20 65 61 63 68 20 69 74 65 72  ded by each iter
147d0 61 74 69 6f 6e 2c 20 61 73 20 66 6f 6c 6c 6f 77  ation, as follow
147e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 4c 6f  s:.  **.  ** iLo
147f0 6f 70 3d 3d 31 3a 20 43 6f 64 65 20 6f 6e 6c 79  op==1: Code only
14800 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
14810 74 20 61 72 65 20 65 6e 74 69 72 65 6c 79 20 63  t are entirely c
14820 6f 76 65 72 65 64 20 62 79 20 70 49 64 78 2e 0a  overed by pIdx..
14830 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 32 3a 20 43    ** iLoop==2: C
14840 6f 64 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 78  ode remaining ex
14850 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 64  pressions that d
14860 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63 6f  o not contain co
14870 72 72 65 6c 61 74 65 64 0a 20 20 2a 2a 20 20 20  rrelated.  **   
14880 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
14890 69 65 73 2e 20 20 0a 20 20 2a 2a 20 69 4c 6f 6f  ies.  .  ** iLoo
148a0 70 3d 3d 33 3a 20 43 6f 64 65 20 61 6c 6c 20 72  p==3: Code all r
148b0 65 6d 61 69 6e 69 6e 67 20 65 78 70 72 65 73 73  emaining express
148c0 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
148d0 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
148e0 65 20 74 6f 20 73 6b 69 70 20 75 6e 6e 65 63 65  e to skip unnece
148f0 73 73 61 72 79 20 69 74 65 72 61 74 69 6f 6e 73  ssary iterations
14900 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
14910 2a 2f 0a 20 20 69 4c 6f 6f 70 20 3d 20 28 70 49  */.  iLoop = (pI
14920 64 78 20 3f 20 31 20 3a 20 32 29 3b 0a 20 20 64  dx ? 1 : 2);.  d
14930 6f 7b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  o{.    int iNext
14940 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14950 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 76 61 6c       /* Next val
14960 75 65 20 66 6f 72 20 69 4c 6f 6f 70 20 2a 2f 0a  ue for iLoop */.
14970 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
14980 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
14990 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
149a0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  erm++){.      Ex
149b0 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e  pr *pE;.      in
149c0 74 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d  t skipLikeAddr =
149d0 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   0;.      testca
149e0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
149f0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
14a00 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
14a10 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
14a20 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
14a30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
14a40 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
14a50 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
14a60 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
14a70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
14a80 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
14a90 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65   & pLevel->notRe
14aa0 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
14ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49     testcase( pWI
14ac0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
14ad0 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ms==0.          
14ae0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
14af0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
14b00 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
14b10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  0 );.        pWI
14b20 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
14b30 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ms = 1;.        
14b40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14b50 7d 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54 65  }.      pE = pTe
14b60 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
14b70 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
14b80 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
14b90 62 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bItem->fg.jointy
14ba0 70 65 26 4a 54 5f 4c 45 46 54 29 20 26 26 20 21  pe&JT_LEFT) && !
14bb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14bc0 70 45 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  pE,EP_FromJoin) 
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
14be0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
14bf0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 69 4c     .      if( iL
14c00 6f 6f 70 3d 3d 31 20 26 26 20 21 73 71 6c 69 74  oop==1 && !sqlit
14c10 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49  e3ExprCoveredByI
14c20 6e 64 65 78 28 70 45 2c 20 70 4c 65 76 65 6c 2d  ndex(pE, pLevel-
14c30 3e 69 54 61 62 43 75 72 2c 20 70 49 64 78 29 20  >iTabCur, pIdx) 
14c40 29 7b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ){.        iNext
14c50 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 2;.        co
14c60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
14c70 20 20 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c        if( iLoop<
14c80 33 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46  3 && (pTerm->wtF
14c90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 41 52 53  lags & TERM_VARS
14ca0 45 4c 45 43 54 29 20 29 7b 0a 20 20 20 20 20 20  ELECT) ){.      
14cb0 20 20 69 66 28 20 69 4e 65 78 74 3d 3d 30 20 29    if( iNext==0 )
14cc0 20 69 4e 65 78 74 20 3d 20 33 3b 0a 20 20 20 20   iNext = 3;.    
14cd0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14ce0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14cf0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
14d00 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44   & TERM_LIKECOND
14d10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14d20 2f 2a 20 49 66 20 74 68 65 20 54 45 52 4d 5f 4c  /* If the TERM_L
14d30 49 4b 45 43 4f 4e 44 20 66 6c 61 67 20 69 73 20  IKECOND flag is 
14d40 73 65 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  set, that means 
14d50 74 68 61 74 20 74 68 65 20 72 61 6e 67 65 20 73  that the range s
14d60 65 61 72 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  earch.        **
14d70 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
14d80 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
14d90 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
14da0 6f 72 20 69 73 20 74 72 75 65 2c 20 73 6f 20 77  or is true, so w
14db0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
14dc0 20 73 6b 69 70 20 74 68 65 20 63 61 6c 6c 20 74   skip the call t
14dd0 6f 20 74 68 65 20 6c 69 6b 65 28 41 2c 42 29 20  o the like(A,B) 
14de0 66 75 6e 63 74 69 6f 6e 2e 20 20 42 75 74 20 74  function.  But t
14df0 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 0a 20  his only works. 
14e00 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 73 74         ** for st
14e10 72 69 6e 67 73 2e 20 20 53 6f 20 64 6f 20 6e 6f  rings.  So do no
14e20 74 20 73 6b 69 70 20 74 68 65 20 63 61 6c 6c 20  t skip the call 
14e30 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
14e40 6f 6e 20 74 68 65 20 70 61 73 73 0a 20 20 20 20  on the pass.    
14e50 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6d 70      ** that comp
14e60 61 72 65 73 20 42 4c 4f 42 73 2e 20 2a 2f 0a 23  ares BLOBs. */.#
14e70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  ifdef SQLITE_LIK
14e80 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
14e90 4c 4f 42 53 0a 20 20 20 20 20 20 20 20 63 6f 6e  LOBS.        con
14ea0 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20  tinue;.#else.   
14eb0 20 20 20 20 20 75 33 32 20 78 20 3d 20 70 4c 65       u32 x = pLe
14ec0 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
14ed0 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  r;.        if( x
14ee0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
14ef0 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73  skipLikeAddr = s
14f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14f10 28 76 2c 20 28 78 26 31 29 3f 4f 50 5f 49 66 4e  (v, (x&1)?OP_IfN
14f20 6f 74 3a 4f 50 5f 49 66 2c 28 69 6e 74 29 28 78  ot:OP_If,(int)(x
14f30 3e 3e 31 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  >>1));.        }
14f40 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
14f50 65 72 61 67 65 28 76 29 3b 0a 23 65 6e 64 69 66  erage(v);.#endif
14f60 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
14f70 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
14f80 45 44 20 2f 2a 20 30 78 66 66 66 66 20 2a 2f 0a  ED /* 0xffff */.
14f90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14fa0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
14fb0 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
14fc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 57 68 65 72  omment((v, "Wher
14fd0 65 54 65 72 6d 5b 25 64 5d 20 28 25 70 29 20 70  eTerm[%d] (%p) p
14fe0 72 69 6f 72 69 74 79 3d 25 64 22 2c 0a 20 20 20  riority=%d",.   
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 20 70 57 43 2d 3e 6e 54 65 72 6d        pWC->nTerm
15010 2d 6a 2c 20 70 54 65 72 6d 2c 20 69 4c 6f 6f 70  -j, pTerm, iLoop
15020 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ));.      }.#end
15030 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
15040 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
15050 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
15060 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
15070 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
15080 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 29 20 73  skipLikeAddr ) s
15090 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
150a0 72 65 28 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64  re(v, skipLikeAd
150b0 64 72 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  dr);.      pTerm
150c0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
150d0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
150e0 20 20 20 69 4c 6f 6f 70 20 3d 20 69 4e 65 78 74     iLoop = iNext
150f0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 4c 6f 6f  ;.  }while( iLoo
15100 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  p>0 );..  /* Ins
15110 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
15120 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
15130 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
15140 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
15150 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
15160 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
15170 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
15180 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15190 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
151a0 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
151b0 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
151c0 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
151d0 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
151e0 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
151f0 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
15200 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
15210 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
15220 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
15230 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
15240 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
15250 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
15260 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
15270 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
15280 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
15290 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
152a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20  {.    Expr *pE, 
152b0 73 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  sEAlt;.    Where
152c0 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
152d0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
152e0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
152f0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
15300 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
15310 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
15320 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
15330 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _IS))==0 ) conti
15340 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
15350 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15360 20 57 4f 5f 45 51 55 49 56 29 3d 3d 30 20 29 20   WO_EQUIV)==0 ) 
15370 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15380 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
15390 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
153a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
153b0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
153c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
153d0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
153e0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
153f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15400 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
15410 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15420 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
15430 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  ght & pLevel->no
15440 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
15450 20 20 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33    pAlt = sqlite3
15460 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
15470 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
15480 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
15490 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
154a0 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45              WO_E
154b0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30  Q|WO_IN|WO_IS, 0
154c0 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d  );.    if( pAlt=
154d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
154e0 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46     if( pAlt->wtF
154f0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44  lags & (TERM_COD
15500 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
15510 20 20 20 20 69 66 28 20 28 70 41 6c 74 2d 3e 65      if( (pAlt->e
15520 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
15530 29 20 0a 20 20 20 20 20 26 26 20 28 70 41 6c 74  ) .     && (pAlt
15540 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ->pExpr->flags &
15550 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
15560 20 20 20 20 26 26 20 28 70 41 6c 74 2d 3e 70 45      && (pAlt->pE
15570 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
15580 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 29  pEList->nExpr>1)
15590 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
155a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
155b0 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
155c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
155d0 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
155e0 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
155f0 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
15600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
15610 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
15620 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62  WO_IN );.    Vdb
15630 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
15640 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69  v, "begin transi
15650 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22  tive constraint"
15660 29 29 3b 0a 20 20 20 20 73 45 41 6c 74 20 3d 20  ));.    sEAlt = 
15670 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20  *pAlt->pExpr;.  
15680 20 20 73 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20    sEAlt.pLeft = 
15690 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73  pE->pLeft;.    s
156a0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
156b0 65 28 70 50 61 72 73 65 2c 20 26 73 45 41 6c 74  e(pParse, &sEAlt
156c0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
156d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
156e0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
156f0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
15700 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
15710 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
15720 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
15730 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
15740 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
15750 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
15760 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
15770 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
15780 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15790 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
157a0 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
157b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
157c0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
157d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
157e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
157f0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15800 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
15810 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
15820 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
15830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
15840 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
15850 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
15860 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
15870 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
15880 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
15890 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
158a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
158b0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
158c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
158d0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
158e0 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
158f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
15900 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
15910 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
15920 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
15930 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
15940 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76  prereqAll & pLev
15950 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30  el->notReady)!=0
15960 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15970 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
15980 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
15990 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
159a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
159b0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
159c0 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
159d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
159e0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
159f0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
15a00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
15a10 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
15a20 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
15a30 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
15a40 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c  .  return pLevel
15a50 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a        ->notReady;.}.