/ Hex Artifact Content
Login

Artifact ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6:


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 25 75 22 2c 20 70   SUBQUERY %u", p
1620: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 73  Item->pSelect->s
1630: 65 6c 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  elId);.    }else
1640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1650: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 73 74 72  str_appendf(&str
1660: 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c 20 70  , " TABLE %s", p
1670: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1680: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
1690: 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
16a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
16b0: 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20  appendf(&str, " 
16c0: 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
16d0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
16e0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
16f0: 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
1700: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
1710: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
1720: 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b   char *zFmt = 0;
1730: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1740: 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
1750: 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1760: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20  e.pIndex!=0 );. 
1770: 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
1780: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1790: 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  x;.      assert(
17a0: 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41   !(flags&WHERE_A
17b0: 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66  UTO_INDEX) || (f
17c0: 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
17d0: 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66  NLY) );.      if
17e0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
17f0: 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50 72  m->pTab) && IsPr
1800: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
1810: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
1820: 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20  f( isSearch ){. 
1830: 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20           zFmt = 
1840: 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20  "PRIMARY KEY";. 
1850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1860: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1870: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
1880: 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
1890: 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 50  t = "AUTOMATIC P
18a0: 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47 20  ARTIAL COVERING 
18b0: 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d 65  INDEX";.      }e
18c0: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
18d0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
18e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
18f0: 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f   = "AUTOMATIC CO
1900: 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20  VERING INDEX";. 
1910: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
1920: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1930: 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
1940: 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e   zFmt = "COVERIN
1950: 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20  G INDEX %s";.   
1960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1970: 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20    zFmt = "INDEX 
1980: 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
1990: 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20     if( zFmt ){. 
19a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
19b0: 74 72 5f 61 70 70 65 6e 64 28 26 73 74 72 2c 20  tr_append(&str, 
19c0: 22 20 55 53 49 4e 47 20 22 2c 20 37 29 3b 0a 20  " USING ", 7);. 
19d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
19e0: 74 72 5f 61 70 70 65 6e 64 66 28 26 73 74 72 2c  tr_appendf(&str,
19f0: 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e 61   zFmt, pIdx->zNa
1a00: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  me);.        exp
1a10: 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 26  lainIndexRange(&
1a20: 73 74 72 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 20  str, pLoop);.   
1a30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1a40: 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
1a50: 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c  E_IPK)!=0 && (fl
1a60: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1a70: 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20  TRAINT)!=0 ){.  
1a80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a90: 7a 52 61 6e 67 65 4f 70 3b 0a 20 20 20 20 20 20  zRangeOp;.      
1aa0: 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1ab0: 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1ac0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1ad0: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1ae0: 3d 20 22 3d 22 3b 0a 20 20 20 20 20 20 7d 65 6c  = "=";.      }el
1af0: 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1b00: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1b10: 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1b20: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61  T ){.        zRa
1b30: 6e 67 65 4f 70 20 3d 20 22 3e 3f 20 41 4e 44 20  ngeOp = ">? AND 
1b40: 72 6f 77 69 64 3c 22 3b 0a 20 20 20 20 20 20 7d  rowid<";.      }
1b50: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57  else if( flags&W
1b60: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1b70: 7b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65  {.        zRange
1b80: 4f 70 20 3d 20 22 3e 22 3b 0a 20 20 20 20 20 20  Op = ">";.      
1b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1ba0: 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45  ssert( flags&WHE
1bb0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20  RE_TOP_LIMIT);. 
1bc0: 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70 20         zRangeOp 
1bd0: 3d 20 22 3c 22 3b 0a 20 20 20 20 20 20 7d 0a 20  = "<";.      }. 
1be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1bf0: 5f 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 0a  _appendf(&str, .
1c00: 20 20 20 20 20 20 20 20 20 20 22 20 55 53 49 4e            " USIN
1c10: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1c20: 59 20 4b 45 59 20 28 72 6f 77 69 64 25 73 3f 29  Y KEY (rowid%s?)
1c30: 22 2c 7a 52 61 6e 67 65 4f 70 29 3b 0a 20 20 20  ",zRangeOp);.   
1c40: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1c50: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1c60: 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
1c70: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c80: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1c90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ca0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 73  3_str_appendf(&s
1cb0: 74 72 2c 20 22 20 56 49 52 54 55 41 4c 20 54 41  tr, " VIRTUAL TA
1cc0: 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
1cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ce0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1cf0: 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d  b.idxNum, pLoop-
1d00: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
1d10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 50 4c  fdef SQLITE_EXPL
1d30: 41 49 4e 5f 45 53 54 49 4d 41 54 45 44 5f 52 4f  AIN_ESTIMATED_RO
1d40: 57 53 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  WS.    if( pLoop
1d50: 2d 3e 6e 4f 75 74 3e 3d 31 30 20 29 7b 0a 20 20  ->nOut>=10 ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
1d70: 61 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20  appendf(&str, " 
1d80: 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 0a 20  (~%llu rows)",. 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1da0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
1db0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20  Loop->nOut));.  
1dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1dd0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
1de0: 64 28 26 73 74 72 2c 20 22 20 28 7e 31 20 72 6f  d(&str, " (~1 ro
1df0: 77 29 22 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23  w)", 9);.    }.#
1e00: 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d  endif.    zMsg =
1e10: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1e20: 46 69 6e 69 73 68 28 26 73 74 72 29 3b 0a 20 20  Finish(&str);.  
1e30: 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1e40: 42 72 65 61 6b 70 6f 69 6e 74 28 22 22 2c 7a 4d  Breakpoint("",zM
1e50: 73 67 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  sg);.    ret = s
1e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e70: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
1e80: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1e90: 6e 74 41 64 64 72 28 76 29 2c 0a 20 20 20 20 20  ntAddr(v),.     
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
1ec0: 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 20 7a  ddrExplain, 0, z
1ed0: 4d 73 67 2c 50 34 5f 44 59 4e 41 4d 49 43 29 3b  Msg,P4_DYNAMIC);
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
1ef0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
1f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
1f10: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
1f20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
1f30: 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a 2a  _SCANSTATUS./*.*
1f40: 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
1f50: 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 65  VM passed as the
1f60: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f70: 77 69 74 68 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  with an.** sqlit
1f80: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
1f90: 75 73 28 29 20 65 6e 74 72 79 20 63 6f 72 72 65  us() entry corre
1fa0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1fb0: 73 63 61 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a  scan used to .**
1fc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 6c 65 76 65 6c   implement level
1fd0: 20 70 4c 76 6c 2e 20 41 72 67 75 6d 65 6e 74 20   pLvl. Argument 
1fe0: 70 53 72 63 6c 69 73 74 20 69 73 20 61 20 70 6f  pSrclist is a po
1ff0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 52 4f  inter to the FRO
2000: 4d 20 0a 2a 2a 20 63 6c 61 75 73 65 20 74 68 61  M .** clause tha
2010: 74 20 74 68 65 20 73 63 61 6e 20 72 65 61 64 73  t the scan reads
2020: 20 64 61 74 61 20 66 72 6f 6d 2e 0a 2a 2a 0a 2a   data from..**.*
2030: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 64  * If argument ad
2040: 64 72 45 78 70 6c 61 69 6e 20 69 73 20 6e 6f 74  drExplain is not
2050: 20 30 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74   0, it must be t
2060: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 6e  he address of an
2070: 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c 61 69 6e 20   .** OP_Explain 
2080: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
2090: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73   describes the s
20a0: 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 76 6f 69  ame loop..*/.voi
20b0: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64  d sqlite3WhereAd
20c0: 64 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56  dScanStatus(.  V
20d0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f0: 2a 20 56 64 62 65 20 74 6f 20 61 64 64 20 73 63  * Vdbe to add sc
2100: 61 6e 73 74 61 74 75 73 20 65 6e 74 72 79 20 74  anstatus entry t
2110: 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  o */.  SrcList *
2120: 70 53 72 63 6c 69 73 74 2c 20 20 20 20 20 20 20  pSrclist,       
2130: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
2140: 6c 61 75 73 65 20 70 4c 76 6c 20 72 65 61 64 73  lause pLvl reads
2150: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
2160: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  WhereLevel *pLvl
2170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2180: 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64 64 20  /* Level to add 
2190: 73 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74  scanstatus() ent
21a0: 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
21b0: 61 64 64 72 45 78 70 6c 61 69 6e 20 20 20 20 20  addrExplain     
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21d0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
21e0: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 29  lain (or 0) */.)
21f0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2200: 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68 65 72  zObj = 0;.  Wher
2210: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
2220: 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  Lvl->pWLoop;.  i
2230: 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2240: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2250: 41 4c 54 41 42 4c 45 29 3d 3d 30 20 20 26 26 20  ALTABLE)==0  && 
2260: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2270: 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
2280: 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e 75   zObj = pLoop->u
2290: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
22a0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
22b0: 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c 69     zObj = pSrcli
22c0: 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72 6f  st->a[pLvl->iFro
22d0: 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  m].zName;.  }.  
22e0: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
22f0: 74 61 74 75 73 28 0a 20 20 20 20 20 20 76 2c 20  tatus(.      v, 
2300: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 70 4c 76  addrExplain, pLv
2310: 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 76  l->addrBody, pLv
2320: 6c 2d 3e 61 64 64 72 56 69 73 69 74 2c 20 70 4c  l->addrVisit, pL
2330: 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62 6a 0a  oop->nOut, zObj.
2340: 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a    );.}.#endif...
2350: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
2360: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
2370: 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
2380: 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
2390: 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
23a0: 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
23b0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
23c0: 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
23d0: 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
23e0: 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
23f0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
2400: 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
2410: 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
2420: 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
2430: 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
2440: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
2450: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2460: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2470: 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
2480: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
2490: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
24a0: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
24b0: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
24c0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
24d0: 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
24e0: 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
24f0: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
2500: 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
2510: 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
2520: 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
2530: 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
2540: 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
2550: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
2560: 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
2570: 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
2580: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
2590: 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
25a0: 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
25b0: 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
25c0: 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
25d0: 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
25e0: 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
25f0: 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
2600: 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
2610: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
2620: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
2630: 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
2640: 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
2650: 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
2660: 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
2670: 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
2680: 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
2690: 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
26a0: 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
26b0: 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
26c0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
26d0: 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
26e0: 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
26f0: 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
2700: 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
2710: 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
2720: 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
2730: 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
2740: 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
2750: 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
2760: 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
2770: 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
2780: 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
2790: 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
27a0: 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
27b0: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65 20  *.** If all the 
27c0: 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74 65  children of a te
27d0: 72 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c  rm are disabled,
27e0: 20 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d 20   then that term 
27f0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d  is also.** autom
2800: 61 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65  atically disable
2810: 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  d.  In this way,
2820: 20 74 65 72 6d 73 20 67 65 74 20 64 69 73 61 62   terms get disab
2830: 6c 65 64 20 69 66 20 64 65 72 69 76 65 64 0a 2a  led if derived.*
2840: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  * virtual terms 
2850: 61 72 65 20 74 65 73 74 65 64 20 66 69 72 73 74  are tested first
2860: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2870: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c 4f  **.**      x GLO
2880: 42 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e 3d  B 'abc*' AND x>=
2890: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63 64  'abc' AND x<'acd
28a0: 27 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  '.**      \_____
28b0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
28c0: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f  ___/     \_____/
28d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72 65  .**         pare
28e0: 6e 74 20 20 20 20 20 20 20 20 20 20 63 68 69 6c  nt          chil
28f0: 64 31 20 20 20 20 20 20 20 63 68 69 6c 64 32 0a  d1       child2.
2900: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 70  **.** Only the p
2910: 61 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 69  arent term was i
2920: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  n the original W
2930: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2940: 65 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64 20  e child1.** and 
2950: 63 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65 72  child2 terms wer
2960: 65 20 61 64 64 65 64 20 62 79 20 74 68 65 20 4c  e added by the L
2970: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
2980: 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a 2a  .  If both of.**
2990: 20 74 68 65 20 76 69 72 74 75 61 6c 20 63 68 69   the virtual chi
29a0: 6c 64 20 74 65 72 6d 73 20 61 72 65 20 76 61 6c  ld terms are val
29b0: 69 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e 67  id, then testing
29c0: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
29d0: 61 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70 65  an be .** skippe
29e0: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  d..**.** Usually
29f0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d   the parent term
2a00: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54 45   is marked as TE
2a10: 52 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20 69  RM_CODED.  But i
2a20: 66 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  f the parent.** 
2a30: 74 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e 61  term was origina
2a40: 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20 74  lly TERM_LIKE, t
2a50: 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 67  hen the parent g
2a60: 65 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e  ets TERM_LIKECON
2a70: 44 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68  D instead..** Th
2a80: 65 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20  e TERM_LIKECOND 
2a90: 6d 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74 65  marking indicate
2aa0: 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20  s that the term 
2ab0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
2ac0: 69 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e 64  inside.** a cond
2ad0: 69 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68 61  itional such tha
2ae0: 74 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61  t is only evalua
2af0: 74 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  ted on the secon
2b00: 64 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20 4c  d pass of a.** L
2b10: 49 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE-optimization
2b20: 20 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61 6e   loop, when scan
2b30: 6e 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74 65  ning BLOBs inste
2b40: 61 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a  ad of strings..*
2b50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
2b60: 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
2b70: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
2b80: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
2b90: 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30  .  int nLoop = 0
2ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
2bb0: 6d 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  m!=0 );.  while(
2bc0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
2bd0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
2be0: 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
2bf0: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
2c00: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
2c10: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
2c20: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
2c30: 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
2c40: 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70 54 65  ->notReady & pTe
2c50: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d  rm->prereqAll)==
2c60: 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  0.  ){.    if( n
2c70: 4c 6f 6f 70 20 26 26 20 28 70 54 65 72 6d 2d 3e  Loop && (pTerm->
2c80: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
2c90: 49 4b 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IKE)!=0 ){.     
2ca0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2cb0: 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44  |= TERM_LIKECOND
2cc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cd0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
2ce0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
2cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d00: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3c 30 20  Term->iParent<0 
2d10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 54 65  ) break;.    pTe
2d20: 72 6d 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  rm = &pTerm->pWC
2d30: 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
2d40: 6e 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nt];.    assert(
2d50: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
2d60: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d   pTerm->nChild--
2d70: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2d80: 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72 65  >nChild!=0 ) bre
2d90: 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b  ak;.    nLoop++;
2da0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2db0: 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
2dc0: 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
2dd0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
2de0: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
2df0: 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
2e00: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
2e10: 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
2e20: 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
2e30: 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
2e40: 42 4c 4f 42 20 65 6e 74 72 69 65 73 20 28 77 68  BLOB entries (wh
2e50: 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
2e60: 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
2e70: 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
2e80: 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
2e90: 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
2ea0: 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
2eb0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
2ec0: 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
2ed0: 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
2ee0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ef0: 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
2f00: 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
2f10: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
2f20: 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
2f30: 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
2f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2f50: 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
2f60: 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
2f70: 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
2f80: 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
2f90: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
2fa0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2fb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2fc0: 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
2fd0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
2fe0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2ff0: 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
3000: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3010: 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
3020: 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
3030: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
3040: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 65 6e  LITE_AFF_BLOB en
3050: 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
3060: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
3070: 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
3080: 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
3090: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
30a0: 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
30b0: 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
30c0: 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
30d0: 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
30e0: 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
30f0: 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
3100: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
3110: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
3120: 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
3130: 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
3140: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
3150: 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
3160: 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
3170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3180: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
3190: 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 2c 20 30  nity, base, n, 0
31a0: 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 7d 0a  , zAff, n);.  }.
31b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
31c0: 69 6f 6e 20 70 52 69 67 68 74 2c 20 77 68 69 63  ion pRight, whic
31d0: 68 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  h is the RHS of 
31e0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
31f0: 72 61 74 69 6f 6e 2c 20 69 73 20 0a 2a 2a 20 65  ration, is .** e
3200: 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
3210: 66 20 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 72 2c  f n elements or,
3220: 20 69 66 20 6e 3d 3d 31 2c 20 61 20 73 63 61 6c   if n==1, a scal
3230: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ar expression..*
3240: 2a 20 42 65 66 6f 72 65 20 74 68 65 20 63 6f 6d  * Before the com
3250: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
3260: 6e 2c 20 61 66 66 69 6e 69 74 79 20 7a 41 66 66  n, affinity zAff
3270: 20 69 73 20 74 6f 20 62 65 20 61 70 70 6c 69 65   is to be applie
3280: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 52 69 67  d.** to the pRig
3290: 68 74 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  ht values. This 
32a0: 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65  function modifie
32b0: 73 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74  s characters wit
32c0: 68 69 6e 20 74 68 65 0a 2a 2a 20 61 66 66 69 6e  hin the.** affin
32d0: 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 53 51  ity string to SQ
32e0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 69 66  LITE_AFF_BLOB if
32f0: 20 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20   either:.**.**  
3300: 20 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f   * the compariso
3310: 6e 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72  n will be perfor
3320: 6d 65 64 20 77 69 74 68 20 6e 6f 20 61 66 66 69  med with no affi
3330: 6e 69 74 79 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  nity, or.**   * 
3340: 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 68 61  the affinity cha
3350: 6e 67 65 20 69 6e 20 7a 41 66 66 20 69 73 20 67  nge in zAff is g
3360: 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f  uaranteed not to
3370: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
3380: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3390: 64 20 75 70 64 61 74 65 52 61 6e 67 65 41 66 66  d updateRangeAff
33a0: 69 6e 69 74 79 53 74 72 28 0a 20 20 45 78 70 72  inityStr(.  Expr
33b0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33d0: 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  HS of comparison
33e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3410: 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e  of vector elemen
3420: 74 73 20 69 6e 20 63 6f 6d 70 61 72 69 73 6f 6e  ts in comparison
3430: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
3460: 79 20 73 74 72 69 6e 67 20 74 6f 20 6d 6f 64 69  y string to modi
3470: 66 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  fy */.){.  int i
3480: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
3490: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
34a0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
34b0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
34c0: 70 52 69 67 68 74 2c 20 69 29 3b 0a 20 20 20 20  pRight, i);.    
34d0: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
34e0: 72 65 41 66 66 69 6e 69 74 79 28 70 2c 20 7a 41  reAffinity(p, zA
34f0: 66 66 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[i])==SQLITE_A
3500: 46 46 5f 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20  FF_BLOB.     || 
3510: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
3520: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
3530: 28 70 2c 20 7a 41 66 66 5b 69 5d 29 0a 20 20 20  (p, zAff[i]).   
3540: 20 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69   ){.      zAff[i
3550: 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ] = SQLITE_AFF_B
3560: 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LOB;.    }.  }.}
3570: 0a 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 61  .../*.** pX is a
3580: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  n expression of 
3590: 74 68 65 20 66 6f 72 6d 3a 20 20 28 76 65 63 74  the form:  (vect
35a0: 6f 72 29 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  or) IN (SELECT .
35b0: 2e 2e 29 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  ..).** In other 
35c0: 77 6f 72 64 73 2c 20 69 74 20 69 73 20 61 20 76  words, it is a v
35d0: 65 63 74 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ector IN operato
35e0: 72 20 77 69 74 68 20 61 20 53 45 4c 45 43 54 20  r with a SELECT 
35f0: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 0a 2a 2a  clause on the.**
3600: 20 4c 48 53 2e 20 20 42 75 74 20 6e 6f 74 20 61   LHS.  But not a
3610: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ll terms in the 
3620: 76 65 63 74 6f 72 20 61 72 65 20 69 6e 64 65 78  vector are index
3630: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74 65 72  able and the ter
3640: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 6e 6f 74 20  ms might.** not 
3650: 62 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  be in the correc
3660: 74 20 6f 72 64 65 72 20 66 6f 72 20 69 6e 64 65  t order for inde
3670: 78 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  xing..**.** This
3680: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61   routine makes a
3690: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70   copy of the inp
36a0: 75 74 20 70 58 20 65 78 70 72 65 73 73 69 6f 6e  ut pX expression
36b0: 20 61 6e 64 20 74 68 65 6e 20 61 64 6a 75 73 74   and then adjust
36c0: 73 0a 2a 2a 20 74 68 65 20 76 65 63 74 6f 72 20  s.** the vector 
36d0: 6f 6e 20 74 68 65 20 4c 48 53 20 77 69 74 68 20  on the LHS with 
36e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  corresponding ch
36f0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 53 45 4c  anges to the SEL
3700: 45 43 54 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ECT so that.** t
3710: 68 65 20 76 65 63 74 6f 72 20 63 6f 6e 74 61 69  he vector contai
3720: 6e 73 20 6f 6e 6c 79 20 69 6e 64 65 78 20 74 65  ns only index te
3730: 72 6d 73 20 61 6e 64 20 74 68 6f 73 65 20 74 65  rms and those te
3740: 72 6d 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  rms are in the c
3750: 6f 72 72 65 63 74 0a 2a 2a 20 6f 72 64 65 72 2e  orrect.** order.
3760: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 49    The modified I
3770: 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  N expression is 
3780: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
3790: 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
37a0: 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 64 65 6c 65  ible.** for dele
37b0: 74 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 65  ting the returne
37c0: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  d expression..**
37d0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  .** Example:.**.
37e0: 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  **    CREATE TAB
37f0: 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  LE t1(a,b,c,d,e,
3800: 66 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  f);.**    CREATE
3810: 20 49 4e 44 45 58 20 74 31 78 31 20 4f 4e 20 74   INDEX t1x1 ON t
3820: 31 28 65 2c 63 29 3b 0a 2a 2a 20 20 20 20 53 45  1(e,c);.**    SE
3830: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
3840: 48 45 52 45 20 28 61 2c 62 2c 63 2c 64 2c 65 29  HERE (a,b,c,d,e)
3850: 20 49 4e 20 28 53 45 4c 45 43 54 20 76 2c 77 2c   IN (SELECT v,w,
3860: 78 2c 79 2c 7a 20 46 52 4f 4d 20 74 32 29 0a 2a  x,y,z FROM t2).*
3870: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3880: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
3890: 5f 5f 5f 5f 5f 5f 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 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
38c0: 20 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 54 68 65               The
38e0: 20 70 58 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   pX expression.*
38f0: 2a 0a 2a 2a 20 53 69 6e 63 65 20 6f 6e 6c 79 20  *.** Since only 
3900: 63 6f 6c 75 6d 6e 73 20 65 20 61 6e 64 20 63 20  columns e and c 
3910: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
3920: 20 74 68 65 20 69 6e 64 65 78 2c 20 69 6e 20 74   the index, in t
3930: 68 61 74 20 6f 72 64 65 72 2c 0a 2a 2a 20 74 68  hat order,.** th
3940: 65 20 6d 6f 64 69 66 69 65 64 20 49 4e 20 65 78  e modified IN ex
3950: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
3960: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
3970: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
3980: 28 65 2c 63 29 20 49 4e 20 28 53 45 4c 45 43 54  (e,c) IN (SELECT
3990: 20 7a 2c 78 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   z,x FROM t2).**
39a0: 0a 2a 2a 20 54 68 65 20 72 65 64 75 63 65 64 20  .** The reduced 
39b0: 70 58 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  pX is different 
39c0: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
39d0: 6c 20 28 6f 62 76 69 6f 75 73 6c 79 29 20 61 6e  l (obviously) an
39e0: 64 20 74 68 75 73 20 69 73 0a 2a 2a 20 6f 6e 6c  d thus is.** onl
39f0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  y used for index
3a00: 69 6e 67 2c 20 74 6f 20 69 6d 70 72 6f 76 65 20  ing, to improve 
3a10: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68  performance.  Th
3a20: 65 20 6f 72 69 67 69 6e 61 6c 20 75 6e 61 6c 74  e original unalt
3a30: 65 72 65 64 0a 2a 2a 20 49 4e 20 65 78 70 72 65  ered.** IN expre
3a40: 73 73 69 6f 6e 20 6d 75 73 74 20 61 6c 73 6f 20  ssion must also 
3a50: 62 65 20 72 75 6e 20 6f 6e 20 65 61 63 68 20 6f  be run on each o
3a60: 75 74 70 75 74 20 72 6f 77 20 66 6f 72 20 63 6f  utput row for co
3a70: 72 72 65 63 74 6e 65 73 73 2e 0a 2a 2f 0a 73 74  rrectness..*/.st
3a80: 61 74 69 63 20 45 78 70 72 20 2a 72 65 6d 6f 76  atic Expr *remov
3a90: 65 55 6e 69 6e 64 65 78 61 62 6c 65 49 6e 43 6c  eUnindexableInCl
3aa0: 61 75 73 65 54 65 72 6d 73 28 0a 20 20 50 61 72  auseTerms(.  Par
3ab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3ac0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
3ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
3ae0: 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
3af0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20       /* Look at 
3b00: 6c 6f 6f 70 20 74 65 72 6d 73 20 73 74 61 72 74  loop terms start
3b10: 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 57 68  ing here */.  Wh
3b20: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
3b30: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
3b40: 6e 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 45 78 70  nt loop */.  Exp
3b50: 72 20 2a 70 58 20 20 20 20 20 20 20 20 20 20 20  r *pX           
3b60: 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70     /* The IN exp
3b70: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 72 65  ression to be re
3b80: 64 75 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  duced */.){.  sq
3b90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3ba0: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
3bb0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
3bc0: 70 72 44 75 70 28 64 62 2c 20 70 58 2c 20 30 29  prDup(db, pX, 0)
3bd0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
3be0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
3bf0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
3c00: 69 67 52 68 73 20 3d 20 70 4e 65 77 2d 3e 78 2e  igRhs = pNew->x.
3c10: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
3c20: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e    /* Original un
3c30: 6d 6f 64 69 66 69 65 64 20 52 48 53 20 2a 2f 0a  modified RHS */.
3c40: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
3c50: 72 69 67 4c 68 73 20 3d 20 70 4e 65 77 2d 3e 70  rigLhs = pNew->p
3c60: 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Left->x.pList;  
3c70: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75     /* Original u
3c80: 6e 6d 6f 64 69 66 69 65 64 20 4c 48 53 20 2a 2f  nmodified LHS */
3c90: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
3ca0: 52 68 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Rhs = 0;        
3cb0: 20 2f 2a 20 4e 65 77 20 52 48 53 20 61 66 74 65   /* New RHS afte
3cc0: 72 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  r modifications 
3cd0: 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
3ce0: 2a 70 4c 68 73 20 3d 20 30 3b 20 20 20 20 20 20  *pLhs = 0;      
3cf0: 20 20 20 2f 2a 20 4e 65 77 20 4c 48 53 20 61 66     /* New LHS af
3d00: 74 65 72 20 6d 6f 64 73 20 2a 2f 0a 20 20 20 20  ter mods */.    
3d10: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3d30: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
3d40: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
3d50: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
3d60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
3d70: 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
3d80: 48 53 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 69  HS */..    for(i
3d90: 3d 69 45 71 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 6e  =iEq; i<pLoop->n
3da0: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
3db0: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
3dc0: 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
3dd0: 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  pX ){.        in
3de0: 74 20 69 46 69 65 6c 64 20 3d 20 70 4c 6f 6f 70  t iField = pLoop
3df0: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 69 46 69  ->aLTerm[i]->iFi
3e00: 65 6c 64 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  eld - 1;.       
3e10: 20 69 66 28 20 70 4f 72 69 67 52 68 73 2d 3e 61   if( pOrigRhs->a
3e20: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3d 3d  [iField].pExpr==
3e30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  0 ) continue; /*
3e40: 20 44 75 70 6c 69 63 61 74 65 20 50 4b 20 63 6f   Duplicate PK co
3e50: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
3e60: 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78  pRhs = sqlite3Ex
3e70: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
3e80: 72 73 65 2c 20 70 52 68 73 2c 20 70 4f 72 69 67  rse, pRhs, pOrig
3e90: 52 68 73 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  Rhs->a[iField].p
3ea0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
3eb0: 4f 72 69 67 52 68 73 2d 3e 61 5b 69 46 69 65 6c  OrigRhs->a[iFiel
3ec0: 64 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  d].pExpr = 0;.  
3ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
3ee0: 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69 65 6c 64  rigLhs->a[iField
3ef0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
3f00: 20 20 20 20 20 20 70 4c 68 73 20 3d 20 73 71 6c        pLhs = sql
3f10: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
3f20: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  nd(pParse, pLhs,
3f30: 20 70 4f 72 69 67 4c 68 73 2d 3e 61 5b 69 46 69   pOrigLhs->a[iFi
3f40: 65 6c 64 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  eld].pExpr);.   
3f50: 20 20 20 20 20 70 4f 72 69 67 4c 68 73 2d 3e 61       pOrigLhs->a
3f60: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 20 3d  [iField].pExpr =
3f70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3f80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
3f90: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3fa0: 70 4f 72 69 67 52 68 73 29 3b 0a 20 20 20 20 73  pOrigRhs);.    s
3fb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3fc0: 6c 65 74 65 28 64 62 2c 20 70 4f 72 69 67 4c 68  lete(db, pOrigLh
3fd0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c  s);.    pNew->pL
3fe0: 65 66 74 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  eft->x.pList = p
3ff0: 4c 68 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78  Lhs;.    pNew->x
4000: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
4010: 20 3d 20 70 52 68 73 3b 0a 20 20 20 20 69 66 28   = pRhs;.    if(
4020: 20 70 4c 68 73 20 26 26 20 70 4c 68 73 2d 3e 6e   pLhs && pLhs->n
4030: 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Expr==1 ){.     
4040: 20 2f 2a 20 54 61 6b 65 20 63 61 72 65 20 68 65   /* Take care he
4050: 72 65 20 6e 6f 74 20 74 6f 20 67 65 6e 65 72 61  re not to genera
4060: 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 63  te a TK_VECTOR c
4070: 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 6c 79 20 61  ontaining only a
4080: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
4090: 20 76 61 6c 75 65 2e 20 53 69 6e 63 65 20 74 68   value. Since th
40a0: 65 20 70 61 72 73 65 72 20 6e 65 76 65 72 20 63  e parser never c
40b0: 72 65 61 74 65 73 20 73 75 63 68 20 61 20 76 65  reates such a ve
40c0: 63 74 6f 72 2c 20 73 6f 6d 65 0a 20 20 20 20 20  ctor, some.     
40d0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 72 6f   ** of the subro
40e0: 75 74 69 6e 65 73 20 64 6f 20 6e 6f 74 20 68 61  utines do not ha
40f0: 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2e 20  ndle this case. 
4100: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
4110: 70 20 3d 20 70 4c 68 73 2d 3e 61 5b 30 5d 2e 70  p = pLhs->a[0].p
4120: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4c 68 73  Expr;.      pLhs
4130: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 30  ->a[0].pExpr = 0
4140: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
4150: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  xprDelete(db, pN
4160: 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
4170: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
4180: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65  p;.    }.    pSe
4190: 6c 65 63 74 20 3d 20 70 4e 65 77 2d 3e 78 2e 70  lect = pNew->x.p
41a0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
41b0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
41c0: 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  y ){.      /* If
41d0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
41e0: 65 6d 65 6e 74 20 68 61 73 20 61 6e 20 4f 52 44  ement has an ORD
41f0: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 7a 65  ER BY clause, ze
4200: 72 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ro the .      **
4210: 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 72   iOrderByCol var
4220: 69 61 62 6c 65 73 2e 20 54 68 65 73 65 20 61 72  iables. These ar
4230: 65 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  e set to non-zer
4240: 6f 20 77 68 65 6e 20 61 6e 20 0a 20 20 20 20 20  o when an .     
4250: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
4260: 6d 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  m exactly matche
4270: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72  s one of the ter
4280: 6d 73 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  ms of the .     
4290: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 2e 20   ** result-set. 
42a0: 53 69 6e 63 65 20 74 68 65 20 72 65 73 75 6c 74  Since the result
42b0: 2d 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45  -set of the SELE
42c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  CT statement may
42d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62  .      ** have b
42e0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 6f 72 20  een modified or 
42f0: 72 65 6f 72 64 65 72 65 64 2c 20 74 68 65 73 65  reordered, these
4300: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4310: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
4320: 2a 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ** set correctly
4330: 2e 20 20 53 69 6e 63 65 20 73 65 74 74 69 6e 67  .  Since setting
4340: 20 74 68 65 6d 20 69 73 20 6a 75 73 74 20 61 6e   them is just an
4350: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 0a   optimization, .
4360: 20 20 20 20 20 20 2a 2a 20 69 74 27 73 20 65 61        ** it's ea
4370: 73 69 65 73 74 20 6a 75 73 74 20 74 6f 20 7a 65  siest just to ze
4380: 72 6f 20 74 68 65 6d 20 68 65 72 65 2e 20 20 2a  ro them here.  *
4390: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
43a0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65   *pOrderBy = pSe
43b0: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  lect->pOrderBy;.
43c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
43d0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
43e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
43f0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
4400: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
4410: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4420: 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 70 72 69  }..#if 0.    pri
4430: 6e 74 66 28 22 46 6f 72 20 69 6e 64 65 78 69 6e  ntf("For indexin
4440: 67 2c 20 63 68 61 6e 67 65 20 74 68 65 20 49 4e  g, change the IN
4450: 20 65 78 70 72 3a 5c 6e 22 29 3b 0a 20 20 20 20   expr:\n");.    
4460: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
4470: 78 70 72 28 30 2c 20 70 58 2c 20 30 29 3b 0a 20  xpr(0, pX, 0);. 
4480: 20 20 20 70 72 69 6e 74 66 28 22 49 6e 74 6f 3a     printf("Into:
4490: 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
44a0: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
44b0: 20 70 4e 65 77 2c 20 30 29 3b 0a 23 65 6e 64 69   pNew, 0);.#endi
44c0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  f.  }.  return p
44d0: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  New;.}.../*.** G
44e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
44f0: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
4500: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
4510: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
4520: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
4530: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
4540: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
4550: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
4560: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
4570: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
4580: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
4590: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
45a0: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
45b0: 20 61 20 72 65 67 69 73 74 65 72 2c 20 74 68 65   a register, the
45c0: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69   index.** of whi
45d0: 63 68 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ch is returned. 
45e0: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
45f0: 61 64 65 20 73 74 6f 72 65 20 74 68 65 20 72 65  ade store the re
4600: 73 75 6c 74 20 69 6e 20 69 54 61 72 67 65 74 20  sult in iTarget 
4610: 62 75 74 0a 2a 2a 20 74 68 69 73 20 69 73 20 6f  but.** this is o
4620: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 66  nly guaranteed f
4630: 6f 72 20 54 4b 5f 49 53 4e 55 4c 4c 20 61 6e 64  or TK_ISNULL and
4640: 20 54 4b 5f 49 4e 20 63 6f 6e 73 74 72 61 69 6e   TK_IN constrain
4650: 74 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  ts.  If the.** c
4660: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 61 20 54  onstraint is a T
4670: 4b 5f 45 51 20 6f 72 20 54 4b 5f 49 53 2c 20 74  K_EQ or TK_IS, t
4680: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
4690: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6c  value might be l
46a0: 65 66 74 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 6f  eft in.** some o
46b0: 74 68 65 72 20 72 65 67 69 73 74 65 72 20 61 6e  ther register an
46c0: 64 20 69 74 20 69 73 20 74 68 65 20 63 61 6c 6c  d it is the call
46d0: 65 72 27 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  er's responsibil
46e0: 69 74 79 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74  ity to compensat
46f0: 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  e..**.** For a c
4700: 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
4710: 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
4720: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
4730: 65 76 61 6c 75 61 74 65 64 20 69 6e 0a 2a 2a 20  evaluated in.** 
4740: 73 74 72 61 69 67 68 74 2d 6c 69 6e 65 20 63 6f  straight-line co
4750: 64 65 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  de.  For constra
4760: 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
4770: 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
4780: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4790: 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
47a0: 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
47b0: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
47c0: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
47d0: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
47e0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
47f0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
4800: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4810: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
4820: 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
4830: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
4840: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
4850: 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
4860: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
4870: 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
4880: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
4890: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
48a0: 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20  */.  int iEq,   
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
48c0: 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  x of the equalit
48d0: 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
48e0: 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  is level */.  in
48f0: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
4900: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65    /* True for re
4910: 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f  verse-order IN o
4920: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
4930: 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
4940: 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
4950: 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
4960: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
4970: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
4980: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
4990: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
49a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
49b0: 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
49c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
49d0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
49e0: 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
49f0: 74 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  t( pLevel->pWLoo
4a00: 70 2d 3e 61 4c 54 65 72 6d 5b 69 45 71 5d 3d 3d  p->aLTerm[iEq]==
4a10: 70 54 65 72 6d 20 29 3b 0a 20 20 61 73 73 65 72  pTerm );.  asser
4a20: 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
4a30: 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
4a40: 5f 45 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _EQ || pX->op==T
4a50: 4b 5f 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67  K_IS ){.    iReg
4a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4a70: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
4a80: 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
4a90: 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
4aa0: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
4ab0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
4ac0: 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
4ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ae0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
4af0: 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
4b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4b10: 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
4b20: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 49 4e    int eType = IN
4b30: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 20  _INDEX_NOOP;.   
4b40: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
4b50: 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
4b60: 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  n;.    WhereLoop
4b70: 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c   *pLoop = pLevel
4b80: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ->pWLoop;.    in
4b90: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71  t i;.    int nEq
4ba0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
4bb0: 69 4d 61 70 20 3d 20 30 3b 0a 0a 20 20 20 20 69  iMap = 0;..    i
4bc0: 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
4bd0: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
4be0: 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20  ALTABLE)==0.    
4bf0: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
4c00: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20  ree.pIndex!=0.  
4c10: 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
4c20: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53  btree.pIndex->aS
4c30: 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
4c40: 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
4c50: 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
4c60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
4c70: 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
4c80: 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
4c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
4ca0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
4cb0: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
4cc0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
4cd0: 69 3c 69 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<iEq; i++){.   
4ce0: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c     if( pLoop->aL
4cf0: 54 65 72 6d 5b 69 5d 20 26 26 20 70 4c 6f 6f 70  Term[i] && pLoop
4d00: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
4d10: 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20  pr==pX ){.      
4d20: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
4d30: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
4d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 54 61        return iTa
4d50: 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
4d60: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 45    }.    for(i=iE
4d70: 71 3b 69 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q;i<pLoop->nLTer
4d80: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  m; i++){.      a
4d90: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
4da0: 54 65 72 6d 5b 69 5d 21 3d 30 20 29 3b 0a 20 20  Term[i]!=0 );.  
4db0: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
4dc0: 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
4dd0: 3d 70 58 20 29 20 6e 45 71 2b 2b 3b 0a 20 20 20  =pX ) nEq++;.   
4de0: 20 7d 0a 0a 20 20 20 20 69 54 61 62 20 3d 20 30   }..    iTab = 0
4df0: 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 66  ;.    if( (pX->f
4e00: 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
4e10: 65 63 74 29 3d 3d 30 20 7c 7c 20 70 58 2d 3e 78  ect)==0 || pX->x
4e20: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
4e30: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ->nExpr==1 ){.  
4e40: 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
4e50: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
4e60: 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49 4e  Parse, pX, IN_IN
4e70: 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c 20 30 2c 20  DEX_LOOP, 0, 0, 
4e80: 26 69 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73  &iTab);.    }els
4e90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4ea0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4eb0: 62 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 72 65  b;.      pX = re
4ec0: 6d 6f 76 65 55 6e 69 6e 64 65 78 61 62 6c 65 49  moveUnindexableI
4ed0: 6e 43 6c 61 75 73 65 54 65 72 6d 73 28 70 50 61  nClauseTerms(pPa
4ee0: 72 73 65 2c 20 69 45 71 2c 20 70 4c 6f 6f 70 2c  rse, iEq, pLoop,
4ef0: 20 70 58 29 3b 0a 0a 20 20 20 20 20 20 69 66 28   pX);..      if(
4f00: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
4f10: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69  ed ){.        ai
4f20: 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
4f30: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
4f40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
4f50: 6f 66 28 69 6e 74 29 2a 6e 45 71 29 3b 0a 20 20  of(int)*nEq);.  
4f60: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71        eType = sq
4f70: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
4f80: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f  (pParse, pX, IN_
4f90: 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 2c 20 61  INDEX_LOOP, 0, a
4fa0: 69 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a 20 20  iMap, &iTab);.  
4fb0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78        pTerm->pEx
4fc0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pr->iTable = iTa
4fd0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  b;.      }.     
4fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ff0: 74 65 28 64 62 2c 20 70 58 29 3b 0a 20 20 20 20  te(db, pX);.    
5000: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
5010: 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xpr;.    }..    
5020: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
5030: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
5040: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
5050: 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
5060: 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20  bRev = !bRev;.  
5070: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5080: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
5090: 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
50a0: 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
50b0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
50c0: 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a  ageIf(v, bRev);.
50d0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
50e0: 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20  If(v, !bRev);.  
50f0: 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
5100: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
5110: 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29  E_MULTI_OR)==0 )
5120: 3b 0a 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  ;..    pLoop->ws
5130: 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
5140: 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
5150: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
5160: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
5170: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
5180: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5190: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
51a0: 20 7d 0a 0a 20 20 20 20 69 20 3d 20 70 4c 65 76   }..    i = pLev
51b0: 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20  el->u.in.nIn;.  
51c0: 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
51d0: 49 6e 20 2b 3d 20 6e 45 71 3b 0a 20 20 20 20 70  In += nEq;.    p
51e0: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
51f0: 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
5200: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
5210: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
5220: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
5230: 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
5260: 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
5270: 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
5280: 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
5290: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
52a0: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
52b0: 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  In ){.      int 
52c0: 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  iMap = 0;       
52d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
52e0: 20 69 6e 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20   in aiMap[] */. 
52f0: 20 20 20 20 20 70 49 6e 20 2b 3d 20 69 3b 0a 20       pIn += i;. 
5300: 20 20 20 20 20 66 6f 72 28 69 3d 69 45 71 3b 69       for(i=iEq;i
5310: 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 20  <pLoop->nLTerm; 
5320: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5330: 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  ( pLoop->aLTerm[
5340: 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b  i]->pExpr==pX ){
5350: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
5360: 4f 75 74 20 3d 20 69 52 65 67 20 2b 20 69 20 2d  Out = iReg + i -
5370: 20 69 45 71 3b 0a 20 20 20 20 20 20 20 20 20 20   iEq;.          
5380: 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
5390: 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
53a0: 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64           pIn->ad
53b0: 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
53c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
53d0: 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
53e0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
53f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5400: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69     int iCol = ai
5410: 4d 61 70 20 3f 20 61 69 4d 61 70 5b 69 4d 61 70  Map ? aiMap[iMap
5420: 2b 2b 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ++] : 0;.       
5430: 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
5440: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
5450: 65 41 64 64 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c  eAddOp3(v,OP_Col
5460: 75 6d 6e 2c 69 54 61 62 2c 20 69 43 6f 6c 2c 20  umn,iTab, iCol, 
5470: 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iOut);.         
5480: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
54a0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 4f 75  , OP_IsNull, iOu
54b0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
54c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
54d0: 66 28 20 69 3d 3d 69 45 71 20 29 7b 0a 20 20 20  f( i==iEq ){.   
54e0: 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 43           pIn->iC
54f0: 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
5500: 20 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64         pIn->eEnd
5510: 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20  LoopOp = bRev ? 
5520: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
5530: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
5540: 66 28 20 69 45 71 3e 30 20 26 26 20 28 70 4c 6f  f( iEq>0 && (pLo
5550: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
5560: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
5570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5580: 20 20 20 20 20 20 70 49 6e 2d 3e 69 42 61 73 65        pIn->iBase
5590: 20 3d 20 69 52 65 67 20 2d 20 69 3b 0a 20 20 20   = iReg - i;.   
55a0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
55b0: 6e 50 72 65 66 69 78 20 3d 20 69 3b 0a 20 20 20  nPrefix = i;.   
55c0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
55d0: 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
55e0: 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 3b 0a  RE_IN_EARLYOUT;.
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
5600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
5610: 20 70 49 6e 2d 3e 6e 50 72 65 66 69 78 20 3d 20   pIn->nPrefix = 
5620: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
5630: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5640: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
5650: 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
5660: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
5670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
5680: 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  In++;.        }.
5690: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
56a0: 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
56b0: 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
56c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
56d0: 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
56e0: 62 2c 20 61 69 4d 61 70 29 3b 0a 23 65 6e 64 69  b, aiMap);.#endi
56f0: 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
5700: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
5710: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
5720: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
5730: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
5740: 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
5750: 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
5760: 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
5770: 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
5780: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
5790: 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
57a0: 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
57b0: 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
57c0: 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
57d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
57e0: 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
57f0: 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
5800: 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
5810: 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
5820: 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
5830: 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
5840: 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
5850: 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
5860: 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
5870: 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
5880: 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
5890: 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
58a0: 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
58b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
58c0: 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
58d0: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
58e0: 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
58f0: 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
5900: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
5910: 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
5920: 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
5930: 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
5940: 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
5950: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
5960: 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
5970: 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
5980: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
5990: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
59a0: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
59b0: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
59c0: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
59d0: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
59e0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
59f0: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
5a00: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
5a10: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
5a20: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
5a30: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
5a40: 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
5a50: 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
5a60: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
5a70: 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
5a80: 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
5a90: 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
5aa0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
5ab0: 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
5ac0: 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
5ad0: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
5ae0: 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
5af0: 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
5b00: 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
5b10: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
5b20: 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
5b30: 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
5b40: 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
5b50: 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
5b60: 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
5b70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
5b80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5b90: 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
5ba0: 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
5bb0: 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
5bc0: 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
5bd0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5be0: 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
5bf0: 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
5c00: 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
5c10: 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
5c20: 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
5c30: 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
5c40: 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
5c50: 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
5c60: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
5c70: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
5c80: 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
5c90: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
5ca0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
5cb0: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
5cc0: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
5cd0: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
5ce0: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
5cf0: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
5d00: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
5d10: 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
5d20: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
5d30: 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
5d40: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5d50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
5d60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
5d70: 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
5d80: 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
5d90: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
5da0: 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
5db0: 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
5dc0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
5dd0: 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
5de0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
5df0: 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
5e00: 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
5e10: 65 20 42 4c 4f 42 20 6f 72 20 4e 4f 4e 45 20 61  e BLOB or NONE a
5e20: 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
5e30: 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
5e40: 5f 42 4c 4f 42 2e 20 54 68 69 73 20 69 73 20 74  _BLOB. This is t
5e50: 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
5e60: 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
5e70: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
5e80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
5e90: 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
5ea0: 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
5eb0: 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
5ec0: 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
5ed0: 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
5ee0: 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
5ef0: 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
5f00: 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
5f10: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
5f20: 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
5f30: 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
5f40: 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
5f50: 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
5f60: 20 68 61 73 20 42 4c 4f 42 2f 4e 4f 4e 45 20 61   has BLOB/NONE a
5f70: 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
5f80: 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
5f90: 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
5fa0: 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
5fb0: 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
5fc0: 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
5fd0: 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
5fe0: 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
5ff0: 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
6000: 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
6010: 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
6020: 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
6030: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
6040: 41 46 46 5f 42 4c 4f 42 2e 0a 2a 2f 0a 73 74 61  AFF_BLOB..*/.sta
6050: 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
6060: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
6070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6080: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6090: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
60a0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
60b0: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
60c0: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
60d0: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
60e0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
60f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6100: 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
6110: 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
6120: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
6130: 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
6140: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
6150: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
6160: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
6170: 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
6180: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
6190: 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
61a0: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
61b0: 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
61e0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
61f0: 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
6200: 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6220: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
6230: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
6240: 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
6250: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
6260: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
6270: 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
6280: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
6290: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
62a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
62b0: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
62c0: 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
62d0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
62e0: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
62f0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
6300: 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
6310: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
6320: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
6330: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
6340: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
6350: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6370: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
6380: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
63b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
63e0: 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
63f0: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
6400: 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
6410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
6420: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
6430: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
6440: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
6450: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
6460: 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
6470: 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
6480: 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
6490: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
64a0: 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
64b0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
64c0: 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
64d0: 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
64e0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
64f0: 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53  Skip = pLoop->nS
6500: 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c  kip;.  pIdx = pL
6510: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6520: 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dex;.  assert( p
6530: 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Idx!=0 );..  /* 
6540: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
6550: 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
6560: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
6570: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
6580: 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
6590: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
65a0: 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
65b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
65c0: 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
65d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
65e0: 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
65f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
6600: 70 50 61 72 73 65 2d 3e 64 62 2c 73 71 6c 69 74  pParse->db,sqlit
6610: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
6620: 74 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 49  tr(pParse->db,pI
6630: 64 78 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx));.  assert( 
6640: 7a 41 66 66 21 3d 30 20 7c 7c 20 70 50 61 72 73  zAff!=0 || pPars
6650: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6660: 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53  led );..  if( nS
6670: 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  kip ){.    int i
6680: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
6690: 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71  >iIdxCur;.    sq
66a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
66b0: 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74  v, (bRev?OP_Last
66c0: 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64  :OP_Rewind), iId
66d0: 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43  xCur);.    VdbeC
66e0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
66f0: 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v==0);.    VdbeC
6700: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
6710: 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v!=0);.    VdbeC
6720: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
6730: 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  n skip-scan on %
6740: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
6750: 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  );.    j = sqlit
6760: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
6770: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c  OP_Goto);.    pL
6780: 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d  evel->addrSkip =
6790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67a0: 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f  p4Int(v, (bRev?O
67b0: 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b  P_SeekLT:OP_Seek
67c0: 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GT),.           
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67   iIdxCur, 0, reg
67f0: 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20  Base, nSkip);.  
6800: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
6810: 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
6820: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
6830: 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
6840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6850: 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20  pHere(v, j);.   
6860: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69   for(j=0; j<nSki
6870: 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; j++){.      s
6880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6890: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
68a0: 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61  IdxCur, j, regBa
68b0: 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65 73  se+j);.      tes
68c0: 74 63 61 73 65 28 20 70 49 64 78 2d 3e 61 69 43  tcase( pIdx->aiC
68d0: 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58 50  olumn[j]==XN_EXP
68e0: 52 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  R );.      VdbeC
68f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6900: 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c   explainIndexCol
6910: 75 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a 29  umnName(pIdx, j)
6920: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ));.    }.  }   
6930: 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65   ..  /* Evaluate
6940: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
6950: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
6960: 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30   assert( zAff==0
6970: 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   || (int)strlen(
6980: 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  zAff)>=nEq );.  
6990: 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e  for(j=nSkip; j<n
69a0: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
69b0: 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20  t r1;.    pTerm 
69c0: 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
69d0: 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  j];.    assert( 
69e0: 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
69f0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
6a00: 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75   testcase is tru
6a10: 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
6a20: 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
6a30: 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
6a40: 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
6a50: 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
6a60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6a70: 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
6a80: 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
6a90: 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
6aa0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
6ab0: 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
6ac0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
6ad0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
6ae0: 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
6af0: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
6b00: 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
6b10: 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
6b20: 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
6b30: 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
6b40: 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
6b50: 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
6b60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
6b70: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6b80: 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
6b90: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
6ba0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6bb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6bc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
6bd0: 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
6be0: 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
6bf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
6c00: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
6c10: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  O_IN ){.      if
6c20: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
6c30: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
6c40: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
6c50: 2f 2a 20 4e 6f 20 61 66 66 69 6e 69 74 79 20 65  /* No affinity e
6c60: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6c70: 28 6f 72 20 73 68 6f 75 6c 64 20 62 65 29 20 61  (or should be) a
6c80: 70 70 6c 69 65 64 20 74 6f 20 61 20 76 61 6c 75  pplied to a valu
6c90: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f  e.        ** fro
6ca0: 6d 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20  m the RHS of an 
6cb0: 22 3f 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "? IN (SELECT ..
6cc0: 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .)" expression. 
6cd0: 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  The .        ** 
6ce0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
6cf0: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 68 61 73  ex() routine has
6d00: 20 61 6c 72 65 61 64 79 20 65 6e 73 75 72 65 64   already ensured
6d10: 20 74 68 61 74 20 74 68 65 20 0a 20 20 20 20 20   that the .     
6d20: 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f     ** affinity o
6d30: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
6d40: 20 68 61 73 20 62 65 65 6e 20 61 70 70 6c 69 65   has been applie
6d50: 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 2e 20  d to the value. 
6d60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
6d70: 7a 41 66 66 20 29 20 7a 41 66 66 5b 6a 5d 20 3d  zAff ) zAff[j] =
6d80: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
6d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6da0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
6db0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
6dc0: 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  SNULL)==0 ){.   
6dd0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
6de0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
6df0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
6e00: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
6e10: 73 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d 30 20  s & TERM_IS)==0 
6e20: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
6e30: 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20  nBeNull(pRight) 
6e40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6e50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6e60: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
6e70: 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
6e80: 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  drBrk);.        
6e90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6eb0: 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20  f( zAff ){.     
6ec0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
6ed0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
6ee0: 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
6ef0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
6f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
6f10: 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
6f20: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
6f30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
6f40: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
6f50: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6f60: 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20  Right, zAff[j]) 
6f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
6f80: 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
6f90: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
6fa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6fb0: 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a    }.  *pzAff = z
6fc0: 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Aff;.  return re
6fd0: 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  gBase;.}..#ifnde
6fe0: 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f  f SQLITE_LIKE_DO
6ff0: 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53  ESNT_MATCH_BLOBS
7000: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f  ./*.** If the mo
7010: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
7020: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  d instruction is
7030: 20 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67   a constant rang
7040: 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  e constraint.** 
7050: 28 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61  (a string litera
7060: 6c 29 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  l) that originat
7070: 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45  ed from the LIKE
7080: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
7090: 68 65 6e 20 0a 2a 2a 20 73 65 74 20 50 33 20 61  hen .** set P3 a
70a0: 6e 64 20 50 35 20 6f 6e 20 74 68 65 20 4f 50 5f  nd P5 on the OP_
70b0: 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 20 73 6f  String opcode so
70c0: 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
70d0: 20 77 69 6c 6c 20 62 65 20 63 61 73 74 0a 2a 2a   will be cast.**
70e0: 20 74 6f 20 61 20 42 4c 4f 42 20 61 74 20 61 70   to a BLOB at ap
70f0: 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73 2e  propriate times.
7100: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4c 49 4b 45 20  .**.** The LIKE 
7110: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 79  optimization try
7120: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 78  s to evaluate "x
7130: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 61 73   LIKE 'abc%'" as
7140: 20 61 20 72 61 6e 67 65 0a 2a 2a 20 65 78 70 72   a range.** expr
7150: 65 73 73 69 6f 6e 3a 20 22 78 3e 3d 27 41 42 43  ession: "x>='ABC
7160: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 22 2e 20  ' AND x<'abd'". 
7170: 20 42 75 74 20 74 68 69 73 20 72 65 71 75 69 72   But this requir
7180: 65 73 20 74 68 61 74 20 74 68 65 20 72 61 6e 67  es that the rang
7190: 65 0a 2a 2a 20 73 63 61 6e 20 6c 6f 6f 70 20 72  e.** scan loop r
71a0: 75 6e 20 74 77 69 63 65 2c 20 6f 6e 63 65 20 66  un twice, once f
71b0: 6f 72 20 73 74 72 69 6e 67 73 20 61 6e 64 20 61  or strings and a
71c0: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 66 6f 72   second time for
71d0: 20 42 4c 4f 42 73 2e 0a 2a 2a 20 54 68 65 20 4f   BLOBs..** The O
71e0: 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73  P_String opcodes
71f0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 70   on the second p
7200: 61 73 73 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ass convert the 
7210: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 0a  upper and lower.
7220: 2a 2a 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  ** bound string 
7230: 63 6f 6e 73 74 61 6e 74 73 20 74 6f 20 62 6c 6f  constants to blo
7240: 62 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  bs.  This routin
7250: 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
7260: 73 73 61 72 79 20 63 68 61 6e 67 65 73 0a 2a 2a  ssary changes.**
7270: 20 74 6f 20 74 68 65 20 4f 50 5f 53 74 72 69 6e   to the OP_Strin
7280: 67 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 74 68  g opcodes for th
7290: 61 74 20 74 6f 20 68 61 70 70 65 6e 2e 0a 2a 2a  at to happen..**
72a0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 6f 66 20 63  .** Except, of c
72b0: 6f 75 72 73 65 2c 20 69 66 20 53 51 4c 49 54 45  ourse, if SQLITE
72c0: 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
72d0: 43 48 5f 42 4c 4f 42 53 20 69 73 20 64 65 66 69  CH_BLOBS is defi
72e0: 6e 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 6c  ned, then.** onl
72f0: 79 20 74 68 65 20 6f 6e 65 20 70 61 73 73 20 74  y the one pass t
7300: 68 72 6f 75 67 68 20 74 68 65 20 73 74 72 69 6e  hrough the strin
7310: 67 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  g space is requi
7320: 72 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  red, so this rou
7330: 74 69 6e 65 0a 2a 2a 20 62 65 63 6f 6d 65 73 20  tine.** becomes 
7340: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
7350: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b  ic void whereLik
7360: 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
7370: 69 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65  ingFixup(.  Vdbe
7380: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
7390: 20 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20      /* prepared 
73a0: 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
73b0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
73c0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
73d0: 65 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65  evel,     /* The
73e0: 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61   loop that conta
73f0: 69 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  ins the LIKE ope
7400: 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65  rator */.  Where
7410: 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20  Term *pTerm     
7420: 20 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20     /* The upper 
7430: 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a  or lower bound j
7440: 75 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a  ust coded */.){.
7450: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
7460: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
7470: 4f 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  OPT ){.    VdbeO
7480: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65  p *pOp;.    asse
7490: 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  rt( pLevel->iLik
74a0: 65 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20  eRepCntr>0 );.  
74b0: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
74c0: 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b  dbeGetOp(v, -1);
74d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
74e0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
74f0: 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
7500: 4f 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20  OP_String8 .    
7510: 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d          || pTerm
7520: 2d 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ->pWC->pWInfo->p
7530: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7540: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
7550: 4f 70 2d 3e 70 33 20 3d 20 28 69 6e 74 29 28 70  Op->p3 = (int)(p
7560: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
7570: 6e 74 72 3e 3e 31 29 3b 20 20 2f 2a 20 52 65 67  ntr>>1);  /* Reg
7580: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
7590: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 4f 70  unter */.    pOp
75a0: 2d 3e 70 35 20 3d 20 28 75 38 29 28 70 4c 65 76  ->p5 = (u8)(pLev
75b0: 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
75c0: 26 31 29 3b 20 20 20 20 2f 2a 20 41 53 43 20 6f  &1);    /* ASC o
75d0: 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 7d 0a  r DESC */.  }.}.
75e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
75f0: 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61  hereLikeOptimiza
7600: 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28  tionStringFixup(
7610: 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 23  A,B,C).#endif..#
7620: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7630: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
7640: 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
7650: 6f 6e 20 69 73 20 70 61 73 73 65 64 20 66 72 6f  on is passed fro
7660: 6d 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  m codeCursorHint
7670: 28 29 20 64 6f 77 6e 20 74 6f 20 69 6e 64 69 76  () down to indiv
7680: 69 64 75 61 6c 20 6e 6f 64 65 73 20 6f 66 0a 2a  idual nodes of.*
7690: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
76a0: 20 74 72 65 65 20 28 62 79 20 73 71 6c 69 74 65   tree (by sqlite
76b0: 33 57 61 6c 6b 45 78 70 72 28 29 29 20 75 73 69  3WalkExpr()) usi
76c0: 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ng an instance o
76d0: 66 20 74 68 69 73 0a 2a 2a 20 73 74 72 75 63 74  f this.** struct
76e0: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43  ure..*/.struct C
76f0: 43 75 72 48 69 6e 74 20 7b 0a 20 20 69 6e 74 20  CurHint {.  int 
7700: 69 54 61 62 43 75 72 3b 20 20 20 20 2f 2a 20 43  iTabCur;    /* C
7710: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d 61  ursor for the ma
7720: 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  in table */.  in
7730: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 2f 2a  t iIdxCur;    /*
7740: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   Cursor for the 
7750: 69 6e 64 65 78 2c 20 69 66 20 70 49 64 78 21 3d  index, if pIdx!=
7760: 30 2e 20 20 55 6e 75 73 65 64 20 6f 74 68 65 72  0.  Unused other
7770: 77 69 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  wise */.  Index 
7780: 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20 54 68 65  *pIdx;    /* The
7790: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   index used to a
77a0: 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20  ccess the table 
77b0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
77c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
77d0: 6c 6c 65 64 20 66 6f 72 20 65 76 65 72 79 20 6e  lled for every n
77e0: 6f 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ode of an expres
77f0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 63  sion that is a c
7800: 61 6e 64 69 64 61 74 65 0a 2a 2a 20 66 6f 72 20  andidate.** for 
7810: 61 20 63 75 72 73 6f 72 20 68 69 6e 74 20 6f 6e  a cursor hint on
7820: 20 61 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72   an index cursor
7830: 2e 20 20 46 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e  .  For TK_COLUMN
7840: 20 6e 6f 64 65 73 20 74 68 61 74 20 72 65 66 65   nodes that refe
7850: 72 65 6e 63 65 0a 2a 2a 20 74 68 65 20 74 61 62  rence.** the tab
7860: 6c 65 20 43 43 75 72 48 69 6e 74 2e 69 54 61 62  le CCurHint.iTab
7870: 43 75 72 2c 20 76 65 72 69 66 79 20 74 68 61 74  Cur, verify that
7880: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
7890: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 63 63 65 73   can be.** acces
78a0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 68 65 20  sed through the 
78b0: 69 6e 64 65 78 2e 20 20 49 66 20 69 74 20 63 61  index.  If it ca
78c0: 6e 6e 6f 74 2c 20 74 68 65 6e 20 73 65 74 20 70  nnot, then set p
78d0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
78e0: 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
78f0: 74 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74  t codeCursorHint
7900: 43 68 65 63 6b 45 78 70 72 28 57 61 6c 6b 65 72  CheckExpr(Walker
7910: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
7920: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
7930: 74 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69 6e  t CCurHint *pHin
7940: 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  t = pWalker->u.p
7950: 43 43 75 72 48 69 6e 74 3b 0a 20 20 61 73 73 65  CCurHint;.  asse
7960: 72 74 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21  rt( pHint->pIdx!
7970: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
7980: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
7990: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
79a0: 61 62 6c 65 3d 3d 70 48 69 6e 74 2d 3e 69 54 61  able==pHint->iTa
79b0: 62 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74  bCur.   && sqlit
79c0: 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
79d0: 70 48 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78  pHint->pIdx, pEx
79e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
79f0: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
7a00: 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 0a  >eCode = 1;.  }.
7a10: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
7a20: 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
7a30: 54 65 73 74 20 77 68 65 74 68 65 72 20 6f 72 20  Test whether or 
7a40: 6e 6f 74 20 65 78 70 72 65 73 73 69 6f 6e 20 70  not expression p
7a50: 45 78 70 72 2c 20 77 68 69 63 68 20 77 61 73 20  Expr, which was 
7a60: 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
7a70: 63 6c 61 75 73 65 2c 0a 2a 2a 20 73 68 6f 75 6c  clause,.** shoul
7a80: 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  d be included in
7a90: 20 74 68 65 20 63 75 72 73 6f 72 2d 68 69 6e 74   the cursor-hint
7aa0: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
7ab0: 74 20 69 73 20 6f 6e 20 74 68 65 20 72 68 73 0a  t is on the rhs.
7ac0: 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ** of a LEFT JOI
7ad0: 4e 2e 20 53 65 74 20 57 61 6c 6b 65 72 2e 65 43  N. Set Walker.eC
7ae0: 6f 64 65 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20  ode to non-zero 
7af0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
7b00: 20 69 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   if the .** expr
7b10: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 73 75  ession is not su
7b20: 69 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  itable..**.** An
7b30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
7b40: 6e 73 75 69 74 61 62 6c 65 20 69 66 20 69 74 20  nsuitable if it 
7b50: 6d 69 67 68 74 20 65 76 61 6c 75 61 74 65 20 74  might evaluate t
7b60: 6f 20 6e 6f 6e 20 4e 55 4c 4c 20 65 76 65 6e 20  o non NULL even 
7b70: 69 66 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d  if.** a TK_COLUM
7b80: 4e 20 6e 6f 64 65 20 74 68 61 74 20 64 6f 65 73  N node that does
7b90: 20 61 66 66 65 63 74 20 74 68 65 20 76 61 6c 75   affect the valu
7ba0: 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
7bb0: 69 6f 6e 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  ion is set.** to
7bc0: 20 4e 55 4c 4c 2e 20 46 6f 72 20 65 78 61 6d 70   NULL. For examp
7bd0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 6f 6c 20  le:.**.**   col 
7be0: 49 53 20 4e 55 4c 4c 0a 2a 2a 20 20 20 63 6f 6c  IS NULL.**   col
7bf0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 2a 2a 20   IS NOT NULL.** 
7c00: 20 20 63 6f 61 6c 65 73 63 65 28 63 6f 6c 2c 20    coalesce(col, 
7c10: 31 29 0a 2a 2a 20 20 20 43 41 53 45 20 57 48 45  1).**   CASE WHE
7c20: 4e 20 63 6f 6c 20 54 48 45 4e 20 30 20 45 4c 53  N col THEN 0 ELS
7c30: 45 20 31 20 45 4e 44 0a 2a 2f 0a 73 74 61 74 69  E 1 END.*/.stati
7c40: 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72  c int codeCursor
7c50: 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e  HintIsOrFunction
7c60: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
7c70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
7c80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
7c90: 3d 54 4b 5f 49 53 20 0a 20 20 20 7c 7c 20 70 45  =TK_IS .   || pE
7ca0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55  xpr->op==TK_ISNU
7cb0: 4c 4c 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  LL || pExpr->op=
7cc0: 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 7c 7c  =TK_ISNOT .   ||
7cd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
7ce0: 4f 54 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72 2d  OTNULL || pExpr-
7cf0: 3e 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 0a 20 20  >op==TK_CASE .  
7d00: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
7d10: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  eCode = 1;.  }el
7d20: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
7d30: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
7d40: 0a 20 20 20 20 69 6e 74 20 64 31 3b 0a 20 20 20  .    int d1;.   
7d50: 20 63 68 61 72 20 64 32 5b 34 5d 3b 0a 20 20 20   char d2[4];.   
7d60: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 49   if( 0==sqlite3I
7d70: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 70 57  sLikeFunction(pW
7d80: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64  alker->pParse->d
7d90: 62 2c 20 70 45 78 70 72 2c 20 26 64 31 2c 20 64  b, pExpr, &d1, d
7da0: 32 29 20 29 7b 0a 20 20 20 20 20 20 70 57 61 6c  2) ){.      pWal
7db0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
7dc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
7dd0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
7de0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
7df0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7e00: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 6e 6f 64  led on every nod
7e10: 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  e of an expressi
7e20: 6f 6e 20 74 72 65 65 20 75 73 65 64 20 61 73 20  on tree used as 
7e30: 61 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  an.** argument t
7e40: 6f 20 74 68 65 20 4f 50 5f 43 75 72 73 6f 72 48  o the OP_CursorH
7e50: 69 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  int instruction.
7e60: 20 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20   If the node is 
7e70: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 74  a TK_COLUMN.** t
7e80: 68 61 74 20 61 63 63 65 73 73 65 73 20 61 6e 79  hat accesses any
7e90: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
7ea0: 6e 20 74 68 65 20 6f 6e 65 20 69 64 65 6e 74 69  n the one identi
7eb0: 66 69 65 64 20 62 79 0a 2a 2a 20 43 43 75 72 48  fied by.** CCurH
7ec0: 69 6e 74 2e 69 54 61 62 43 75 72 2c 20 74 68 65  int.iTabCur, the
7ed0: 6e 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n do the followi
7ee0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 61  ng:.**.**   1) a
7ef0: 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
7f00: 65 72 20 61 6e 64 20 63 6f 64 65 20 61 6e 20 4f  er and code an O
7f10: 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63  P_Column instruc
7f20: 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a 2a 2a  tion to read .**
7f30: 20 20 20 20 20 20 74 68 65 20 73 70 65 63 69 66        the specif
7f40: 69 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  ied column into 
7f50: 74 68 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  the new register
7f60: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29  , and.**.**   2)
7f70: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 65   transform the e
7f80: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
7f90: 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20  o a TK_REGISTER 
7fa0: 6e 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20  node that reads 
7fb0: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
7fc0: 65 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61 74 65  e newly populate
7fd0: 64 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  d register..**.*
7fe0: 2a 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 6e  * Also, if the n
7ff0: 6f 64 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55  ode is a TK_COLU
8000: 4d 4e 20 74 68 61 74 20 64 6f 65 73 20 61 63 63  MN that does acc
8010: 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 69 64  ess the table id
8020: 65 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 43  enified.** by pC
8030: 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c  CurHint.iTabCur,
8040: 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73   and an index is
8050: 20 62 65 69 6e 67 20 75 73 65 64 20 28 77 68 69   being used (whi
8060: 63 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 6b 6e  ch we will.** kn
8070: 6f 77 20 62 65 63 61 75 73 65 20 43 43 75 72 48  ow because CCurH
8080: 69 6e 74 2e 70 49 64 78 21 3d 30 29 20 74 68 65  int.pIdx!=0) the
8090: 6e 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  n transform the 
80a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f 0a 2a  TK_COLUMN into.*
80b0: 2a 20 61 6e 20 61 63 63 65 73 73 20 6f 66 20 74  * an access of t
80c0: 68 65 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  he index rather 
80d0: 74 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  than the origina
80e0: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
80f0: 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f  ic int codeCurso
8100: 72 48 69 6e 74 46 69 78 45 78 70 72 28 57 61 6c  rHintFixExpr(Wal
8110: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
8120: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
8130: 74 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e 74 69  t rc = WRC_Conti
8140: 6e 75 65 3b 0a 20 20 73 74 72 75 63 74 20 43 43  nue;.  struct CC
8150: 75 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20  urHint *pHint = 
8160: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72  pWalker->u.pCCur
8170: 48 69 6e 74 3b 0a 20 20 69 66 28 20 70 45 78 70  Hint;.  if( pExp
8180: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
8190: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
81a0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69 6e 74  r->iTable!=pHint
81b0: 2d 3e 69 54 61 62 43 75 72 20 29 7b 0a 20 20 20  ->iTabCur ){.   
81c0: 20 20 20 69 6e 74 20 72 65 67 20 3d 20 2b 2b 70     int reg = ++p
81d0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
81e0: 6e 4d 65 6d 3b 20 20 20 2f 2a 20 52 65 67 69 73  nMem;   /* Regis
81f0: 74 65 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 76  ter for column v
8200: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  alue */.      sq
8210: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 57  lite3ExprCode(pW
8220: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
8230: 45 78 70 72 2c 20 72 65 67 29 3b 0a 20 20 20 20  Expr, reg);.    
8240: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
8250: 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
8260: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
8270: 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20   reg;.    }else 
8280: 69 66 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21  if( pHint->pIdx!
8290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
82a0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 48 69 6e  r->iTable = pHin
82b0: 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  t->iIdxCur;.    
82c0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
82d0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
82e0: 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70  OfIndex(pHint->p
82f0: 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
8300: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  umn);.      asse
8310: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
8320: 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  mn>=0 );.    }. 
8330: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
8340: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
8350: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  CTION ){.    /* 
8360: 41 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  An aggregate fun
8370: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 57 48 45  ction in the WHE
8380: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  RE clause of a q
8390: 75 65 72 79 20 6d 65 61 6e 73 20 74 68 69 73 20  uery means this 
83a0: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 61  must.    ** be a
83b0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
83c0: 71 75 65 72 79 2c 20 61 6e 64 20 65 78 70 72 65  query, and expre
83d0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
83e0: 6e 20 61 67 67 72 65 67 61 74 65 20 66 72 6f 6d  n aggregate from
83f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 65  .    ** the pare
8400: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44 6f 20 6e  nt context. Do n
8410: 6f 74 20 77 61 6c 6b 20 74 68 65 20 66 75 6e 63  ot walk the func
8420: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
8430: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
8440: 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a   **.    ** todo:
8450: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 6f   It should be po
8460: 73 73 69 62 6c 65 20 74 6f 20 72 65 70 6c 61 63  ssible to replac
8470: 65 20 74 68 69 73 20 6e 6f 64 65 20 77 69 74 68  e this node with
8480: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20   a TK_REGISTER. 
8490: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
84a0: 2c 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  , as the result 
84b0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
84c0: 6e 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  n must be stored
84d0: 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a 20 72 65   in a .    ** re
84e0: 67 69 73 74 65 72 20 61 74 20 74 68 69 73 20 70  gister at this p
84f0: 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d 65 20 68  oint. The same h
8500: 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41 47 47 5f  olds for TK_AGG_
8510: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f  COLUMN nodes. */
8520: 0a 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72  .    rc = WRC_Pr
8530: 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
8540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
8550: 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43 75 72 73  nsert an OP_Curs
8560: 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69  orHint instructi
8570: 6f 6e 20 69 66 20 69 74 20 69 73 20 61 70 70 72  on if it is appr
8580: 6f 70 72 69 61 74 65 20 74 6f 20 64 6f 20 73 6f  opriate to do so
8590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
85a0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
85b0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
85c0: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
85d0: 2c 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ,  /* FROM claus
85e0: 65 20 69 74 65 6d 20 2a 2f 0a 20 20 57 68 65 72  e item */.  Wher
85f0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
8600: 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 63    /* The where c
8610: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
8620: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
8630: 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 74   /* Which loop t
8640: 6f 20 70 72 6f 76 69 64 65 20 68 69 6e 74 73 20  o provide hints 
8650: 66 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  for */.  WhereTe
8660: 72 6d 20 2a 70 45 6e 64 52 61 6e 67 65 20 20 2f  rm *pEndRange  /
8670: 2a 20 48 69 6e 74 20 74 68 69 73 20 65 6e 64 2d  * Hint this end-
8680: 6f 66 2d 73 63 61 6e 20 62 6f 75 6e 64 61 72 79  of-scan boundary
8690: 20 74 65 72 6d 20 69 66 20 6e 6f 74 20 4e 55 4c   term if not NUL
86a0: 4c 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  L */.){.  Parse 
86b0: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
86c0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
86d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
86e0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
86f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
8700: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
8710: 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   0;.  WhereLoop 
8720: 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d  *pLoop = pLevel-
8730: 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69  >pWLoop;.  int i
8740: 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
8750: 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
8760: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
8770: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
8780: 74 20 43 43 75 72 48 69 6e 74 20 73 48 69 6e 74  t CCurHint sHint
8790: 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  ;.  Walker sWalk
87a0: 65 72 3b 0a 0a 20 20 69 66 28 20 4f 70 74 69 6d  er;..  if( Optim
87b0: 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
87c0: 64 62 2c 20 53 51 4c 49 54 45 5f 43 75 72 73 6f  db, SQLITE_Curso
87d0: 72 48 69 6e 74 73 29 20 29 20 72 65 74 75 72 6e  rHints) ) return
87e0: 3b 0a 20 20 69 43 75 72 20 3d 20 70 4c 65 76 65  ;.  iCur = pLeve
87f0: 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 61 73  l->iTabCur;.  as
8800: 73 65 72 74 28 20 69 43 75 72 3d 3d 70 57 49 6e  sert( iCur==pWIn
8810: 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
8820: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
8830: 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 48 69 6e  Cursor );.  sHin
8840: 74 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  t.iTabCur = iCur
8850: 3b 0a 20 20 73 48 69 6e 74 2e 69 49 64 78 43 75  ;.  sHint.iIdxCu
8860: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
8870: 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e 70 49 64  Cur;.  sHint.pId
8880: 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
8890: 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 6d 65 6d  ee.pIndex;.  mem
88a0: 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
88b0: 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29   sizeof(sWalker)
88c0: 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  );.  sWalker.pPa
88d0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
88e0: 73 57 61 6c 6b 65 72 2e 75 2e 70 43 43 75 72 48  sWalker.u.pCCurH
88f0: 69 6e 74 20 3d 20 26 73 48 69 6e 74 3b 0a 20 20  int = &sHint;.  
8900: 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
8910: 57 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  WC;.  for(i=0; i
8920: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
8930: 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  ){.    pTerm = &
8940: 70 57 43 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69  pWC->a[i];.    i
8950: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
8960: 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
8970: 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
8980: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8990: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ( pTerm->prereqA
89a0: 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
89b0: 52 65 61 64 79 20 29 20 63 6f 6e 74 69 6e 75 65  Ready ) continue
89c0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 74 65  ;..    /* Any te
89d0: 72 6d 73 20 73 70 65 63 69 66 69 65 64 20 61 73  rms specified as
89e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 4f 4e 28   part of the ON(
89f0: 2e 2e 2e 29 20 63 6c 61 75 73 65 20 66 6f 72 20  ...) clause for 
8a00: 61 6e 79 20 4c 45 46 54 20 0a 20 20 20 20 2a 2a  any LEFT .    **
8a10: 20 4a 4f 49 4e 20 66 6f 72 20 77 68 69 63 68 20   JOIN for which 
8a20: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
8a30: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 72 68 73  e is not the rhs
8a40: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20   are omitted.   
8a50: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75 72   ** from the cur
8a60: 73 6f 72 2d 68 69 6e 74 2e 20 0a 20 20 20 20 2a  sor-hint. .    *
8a70: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
8a80: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 68   table is the rh
8a90: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
8aa0: 2c 20 22 49 53 22 20 6f 72 20 22 49 53 20 4e 55  , "IS" or "IS NU
8ab0: 4c 4c 22 20 74 65 72 6d 73 20 0a 20 20 20 20 2a  LL" terms .    *
8ac0: 2a 20 74 68 61 74 20 77 65 72 65 20 73 70 65 63  * that were spec
8ad0: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
8ae0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8af0: 65 20 6d 75 73 74 20 62 65 20 65 78 63 6c 75 64  e must be exclud
8b00: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ed..    ** This 
8b10: 69 73 20 74 6f 20 61 64 64 72 65 73 73 20 74 68  is to address th
8b20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
8b30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
8b40: 45 43 54 20 2e 2e 2e 20 74 31 20 4c 45 46 54 20  ECT ... t1 LEFT 
8b50: 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 74 31 2e 61  JOIN t2 ON (t1.a
8b60: 3d 74 32 2e 62 29 20 57 48 45 52 45 20 74 32 2e  =t2.b) WHERE t2.
8b70: 63 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 2a  c IS NULL;.    *
8b80: 2a 0a 20 20 20 20 2a 2a 20 53 61 79 20 74 68 65  *.    ** Say the
8b90: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72  re is a single r
8ba0: 6f 77 20 69 6e 20 74 32 20 74 68 61 74 20 6d 61  ow in t2 that ma
8bb0: 74 63 68 65 73 20 28 74 31 2e 61 3d 74 32 2e 62  tches (t1.a=t2.b
8bc0: 29 2c 20 62 75 74 20 69 74 73 0a 20 20 20 20 2a  ), but its.    *
8bd0: 2a 20 74 32 2e 63 20 76 61 6c 75 65 73 20 69 73  * t2.c values is
8be0: 20 6e 6f 74 20 4e 55 4c 4c 2e 20 49 66 20 74 68   not NULL. If th
8bf0: 65 20 28 74 32 2e 63 20 49 53 20 4e 55 4c 4c 29  e (t2.c IS NULL)
8c00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 0a   constraint is .
8c10: 20 20 20 20 2a 2a 20 70 75 73 68 65 64 20 64 6f      ** pushed do
8c20: 77 6e 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  wn to the cursor
8c30: 2c 20 74 68 69 73 20 72 6f 77 20 69 73 20 66 69  , this row is fi
8c40: 6c 74 65 72 65 64 20 6f 75 74 2c 20 63 61 75 73  ltered out, caus
8c50: 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ing.    ** SQLit
8c60: 65 20 74 6f 20 73 79 6e 74 68 65 73 69 7a 65 20  e to synthesize 
8c70: 61 20 72 6f 77 20 6f 66 20 4e 55 4c 4c 20 76 61  a row of NULL va
8c80: 6c 75 65 73 2e 20 57 68 69 63 68 20 64 6f 65 73  lues. Which does
8c90: 20 6d 61 74 63 68 20 74 68 65 0a 20 20 20 20 2a   match the.    *
8ca0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  * WHERE clause, 
8cb0: 61 6e 64 20 73 6f 20 74 68 65 20 71 75 65 72 79  and so the query
8cc0: 20 72 65 74 75 72 6e 73 20 61 20 72 6f 77 2e 20   returns a row. 
8cd0: 57 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  Which is incorre
8ce0: 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
8cf0: 2a 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  * For the same r
8d00: 65 61 73 6f 6e 2c 20 57 48 45 52 45 20 74 65 72  eason, WHERE ter
8d10: 6d 73 20 73 75 63 68 20 61 73 3a 0a 20 20 20 20  ms such as:.    
8d20: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 57 48 45 52  **.    **   WHER
8d30: 45 20 31 20 3d 20 28 74 32 2e 63 20 49 53 20 4e  E 1 = (t2.c IS N
8d40: 55 4c 4c 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ULL).    **.    
8d50: 2a 2a 20 61 72 65 20 61 6c 73 6f 20 65 78 63 6c  ** are also excl
8d60: 75 64 65 64 2e 20 53 65 65 20 63 6f 64 65 43 75  uded. See codeCu
8d70: 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e 63  rsorHintIsOrFunc
8d80: 74 69 6f 6e 28 29 20 66 6f 72 20 64 65 74 61 69  tion() for detai
8d90: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
8da0: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
8db0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
8dc0: 46 54 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  FT ){.      Expr
8dd0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
8de0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
8df0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8e00: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
8e10: 6d 4a 6f 69 6e 29 20 0a 20 20 20 20 20 20 20 7c  mJoin) .       |
8e20: 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
8e30: 6f 69 6e 54 61 62 6c 65 21 3d 70 54 61 62 49 74  oinTable!=pTabIt
8e40: 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20 20  em->iCursor.    
8e50: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 57 61    ){.        sWa
8e60: 6c 6b 65 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a  lker.eCode = 0;.
8e70: 20 20 20 20 20 20 20 20 73 57 61 6c 6b 65 72 2e          sWalker.
8e80: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
8e90: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73  codeCursorHintIs
8ea0: 4f 72 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20  OrFunction;.    
8eb0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
8ec0: 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 54  xpr(&sWalker, pT
8ed0: 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
8ee0: 20 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72       if( sWalker
8ef0: 2e 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75  .eCode ) continu
8f00: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
8f10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
8f20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8f30: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
8f40: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
8f50: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
8f60: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 69    /* All terms i
8f70: 6e 20 70 57 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  n pWLoop->aLTerm
8f80: 5b 5d 20 65 78 63 65 70 74 20 70 45 6e 64 52 61  [] except pEndRa
8f90: 6e 67 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  nge are used to 
8fa0: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
8fb0: 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  * the cursor.  T
8fc0: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e  hese terms are n
8fd0: 6f 74 20 6e 65 65 64 65 64 20 61 73 20 68 69 6e  ot needed as hin
8fe0: 74 73 20 66 6f 72 20 61 20 70 75 72 65 20 72 61  ts for a pure ra
8ff0: 6e 67 65 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20  nge.    ** scan 
9000: 28 74 68 61 74 20 68 61 73 20 6e 6f 20 3d 3d 20  (that has no == 
9010: 74 65 72 6d 73 29 20 73 6f 20 6f 6d 69 74 20 74  terms) so omit t
9020: 68 65 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  hem. */.    if( 
9030: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
9040: 45 71 3d 3d 30 20 26 26 20 70 54 65 72 6d 21 3d  Eq==0 && pTerm!=
9050: 70 45 6e 64 52 61 6e 67 65 20 29 7b 0a 20 20 20  pEndRange ){.   
9060: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
9070: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
9080: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21  Loop->aLTerm[j]!
9090: 3d 70 54 65 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20  =pTerm; j++){}. 
90a0: 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
90b0: 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69  ->nLTerm ) conti
90c0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
90d0: 2f 2a 20 4e 6f 20 73 75 62 71 75 65 72 69 65 73  /* No subqueries
90e0: 20 6f 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   or non-determin
90f0: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  istic functions 
9100: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69  allowed */.    i
9110: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
9120: 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 70  ntainsSubquery(p
9130: 54 65 72 6d 2d 3e 70 45 78 70 72 29 20 29 20 63  Term->pExpr) ) c
9140: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
9150: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
9160: 61 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  an, make sure re
9170: 66 65 72 65 6e 63 65 64 20 63 6f 6c 75 6d 6e 73  ferenced columns
9180: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 69 6e   are actually in
9190: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
91a0: 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 48  x. */.    if( sH
91b0: 69 6e 74 2e 70 49 64 78 21 3d 30 20 29 7b 0a 20  int.pIdx!=0 ){. 
91c0: 20 20 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f       sWalker.eCo
91d0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 57  de = 0;.      sW
91e0: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
91f0: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
9200: 48 69 6e 74 43 68 65 63 6b 45 78 70 72 3b 0a 20  HintCheckExpr;. 
9210: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
9220: 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
9230: 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
9240: 20 20 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e      if( sWalker.
9250: 65 43 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  eCode ) continue
9260: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9270: 49 66 20 77 65 20 73 75 72 76 69 76 65 20 61 6c  If we survive al
9280: 6c 20 70 72 69 6f 72 20 74 65 73 74 73 2c 20 74  l prior tests, t
9290: 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 74  hat means this t
92a0: 65 72 6d 20 69 73 20 77 6f 72 74 68 20 68 69 6e  erm is worth hin
92b0: 74 69 6e 67 20 2a 2f 0a 20 20 20 20 70 45 78 70  ting */.    pExp
92c0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
92d0: 6e 64 28 64 62 2c 20 70 45 78 70 72 2c 20 73 71  nd(db, pExpr, sq
92e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
92f0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
9300: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  ));.  }.  if( pE
9310: 78 70 72 21 3d 30 20 29 7b 0a 20 20 20 20 73 57  xpr!=0 ){.    sW
9320: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
9330: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
9340: 48 69 6e 74 46 69 78 45 78 70 72 3b 0a 20 20 20  HintFixExpr;.   
9350: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
9360: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  (&sWalker, pExpr
9370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9380: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
9390: 75 72 73 6f 72 48 69 6e 74 2c 20 0a 20 20 20 20  ursorHint, .    
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 28 73 48 69 6e 74 2e 70 49 64 78 20 3f 20    (sHint.pIdx ? 
93c0: 73 48 69 6e 74 2e 69 49 64 78 43 75 72 20 3a 20  sHint.iIdxCur : 
93d0: 73 48 69 6e 74 2e 69 54 61 62 43 75 72 29 2c 20  sHint.iTabCur), 
93e0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
9400: 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2c 20  st char*)pExpr, 
9410: 50 34 5f 45 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a  P4_EXPR);.  }.}.
9420: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63  #else.# define c
9430: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 41 2c  odeCursorHint(A,
9440: 42 2c 43 2c 44 29 20 20 2f 2a 20 4e 6f 2d 6f 70  B,C,D)  /* No-op
9450: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
9460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9470: 4f 52 5f 48 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a  OR_HINTS */../*.
9480: 2a 2a 20 43 75 72 73 6f 72 20 69 43 75 72 20 69  ** Cursor iCur i
9490: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
94a0: 6b 65 79 20 62 2d 74 72 65 65 20 28 61 20 74 61  key b-tree (a ta
94b0: 62 6c 65 29 2e 20 52 65 67 69 73 74 65 72 20 69  ble). Register i
94c0: 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 0a 2a  Rowid contains.*
94d0: 2a 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 20  * a rowid value 
94e0: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 63  just read from c
94f0: 75 72 73 6f 72 20 69 49 64 78 43 75 72 2c 20 6f  ursor iIdxCur, o
9500: 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 70 49 64  pen on index pId
9510: 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  x. This.** funct
9520: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ion generates co
9530: 64 65 20 74 6f 20 64 6f 20 61 20 64 65 66 65 72  de to do a defer
9540: 72 65 64 20 73 65 65 6b 20 6f 66 20 63 75 72 73  red seek of curs
9550: 6f 72 20 69 43 75 72 20 74 6f 20 74 68 65 20 0a  or iCur to the .
9560: 2a 2a 20 72 6f 77 69 64 20 73 74 6f 72 65 64 20  ** rowid stored 
9570: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 6f 77  in register iRow
9580: 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  id..**.** Normal
9590: 6c 79 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74  ly, this is just
95a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 50 5f 44 65 66  :.**.**   OP_Def
95b0: 65 72 72 65 64 53 65 65 6b 20 24 69 43 75 72 20  erredSeek $iCur 
95c0: 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f  $iRowid.**.** Ho
95d0: 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 63  wever, if the sc
95e0: 61 6e 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  an currently bei
95f0: 6e 67 20 63 6f 64 65 64 20 69 73 20 61 20 62 72  ng coded is a br
9600: 61 6e 63 68 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f  anch of an OR-lo
9610: 6f 70 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 74  op and.** the st
9620: 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
9630: 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73  y being coded is
9640: 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20   a SELECT, then 
9650: 50 33 20 6f 66 20 4f 50 5f 44 65 66 65 72 72 65  P3 of OP_Deferre
9660: 64 53 65 65 6b 0a 2a 2a 20 69 73 20 73 65 74 20  dSeek.** is set 
9670: 74 6f 20 69 49 64 78 43 75 72 20 61 6e 64 20 50  to iIdxCur and P
9680: 34 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  4 is set to poin
9690: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
96a0: 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 63 6f 6e   integers.** con
96b0: 74 61 69 6e 69 6e 67 20 6f 6e 65 20 65 6e 74 72  taining one entr
96c0: 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  y for each colum
96d0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  n of the table c
96e0: 75 72 73 6f 72 20 69 43 75 72 20 69 73 20 6f 70  ursor iCur is op
96f0: 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46 6f 72 20 65  en .** on. For e
9700: 61 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ach table column
9710: 2c 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , if the column 
9720: 69 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  is the i'th colu
9730: 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  mn of the .** in
9740: 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  dex, then the co
9750: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72 72 61  rresponding arra
9760: 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74  y entry is set t
9770: 6f 20 28 69 2b 31 29 2e 20 49 66 20 74 68 65 20  o (i+1). If the 
9780: 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f 65 73 20 6e  column.** does n
9790: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ot appear in the
97a0: 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2c 20 74   index at all, t
97b0: 68 65 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  he array entry i
97c0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
97d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
97e0: 65 66 65 72 72 65 64 53 65 65 6b 28 0a 20 20 57  eferredSeek(.  W
97f0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
9800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9810: 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 63  * Where clause c
9820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
9830: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
9840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9850: 6e 64 65 78 20 73 63 61 6e 20 69 73 20 75 73 69  ndex scan is usi
9860: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ng */.  int iCur
9870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9880: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
9890: 72 20 66 6f 72 20 49 50 4b 20 62 2d 74 72 65 65  r for IPK b-tree
98a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
98b0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
98c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
98d0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 50 61  ursor */.){.  Pa
98e0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
98f0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 2f 2a  Info->pParse; /*
9900: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
9910: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
9920: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
9930: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 67      /* Vdbe to g
9940: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 69 74  enerate code wit
9950: 68 69 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hin */..  assert
9960: 28 20 69 49 64 78 43 75 72 3e 30 20 29 3b 0a 20  ( iIdxCur>0 );. 
9970: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
9980: 69 43 6f 6c 75 6d 6e 5b 70 49 64 78 2d 3e 6e 43  iColumn[pIdx->nC
9990: 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31 20 29 3b 0a  olumn-1]==-1 );.
99a0: 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65    .  sqlite3Vdbe
99b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 66  AddOp3(v, OP_Def
99c0: 65 72 72 65 64 53 65 65 6b 2c 20 69 49 64 78 43  erredSeek, iIdxC
99d0: 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a 20 20  ur, 0, iCur);.  
99e0: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
99f0: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
9a00: 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a 20 20  OR_SUBCLAUSE).  
9a10: 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   && DbMaskAllZer
9a20: 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  o(sqlite3ParseTo
9a30: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 2d 3e  plevel(pParse)->
9a40: 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29 7b 0a  writeMask).  ){.
9a50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54      int i;.    T
9a60: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
9a70: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 69  x->pTable;.    i
9a80: 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a 29 73  nt *ai = (int*)s
9a90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9aa0: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
9ab0: 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54 61 62  izeof(int)*(pTab
9ac0: 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  ->nCol+1));.    
9ad0: 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20 20 20  if( ai ){.      
9ae0: 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 43  ai[0] = pTab->nC
9af0: 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ol;.      for(i=
9b00: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
9b10: 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn-1; i++){.    
9b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9b30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 70 54  ->aiColumn[i]<pT
9b40: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
9b50: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9b60: 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 20 61  Column[i]>=0 ) a
9b70: 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  i[pIdx->aiColumn
9b80: 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a 20 20  [i]+1] = i+1;.  
9b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9ba0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
9bb0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 61 69  v, -1, (char*)ai
9bc0: 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
9bd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9be0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9bf0: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
9c00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
9c10: 6e 74 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  nt is a vector, 
9c20: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
9c30: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 66 69   to write the fi
9c40: 72 73 74 20 6e 52 65 67 20 65 6c 65 6d 65 6e 74  rst nReg element
9c50: 73 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  s of the vector 
9c60: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 0a 2a 2a  into an array.**
9c70: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
9c80: 61 72 74 69 6e 67 20 77 69 74 68 20 69 52 65 67  arting with iReg
9c90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9ca0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
9cb0: 20 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20   a vector, then 
9cc0: 6e 52 65 67 20 6d 75 73 74 20 62 65 20 70 61 73  nReg must be pas
9cd0: 73 65 64 20 31 2e 20 49 6e 0a 2a 2a 20 74 68 69  sed 1. In.** thi
9ce0: 73 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65  s case, generate
9cf0: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
9d00: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
9d10: 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 0a 2a   and leave the.*
9d20: 2a 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  * result in regi
9d30: 73 74 65 72 20 69 52 65 67 2e 0a 2a 2f 0a 73 74  ster iReg..*/.st
9d40: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 78  atic void codeEx
9d50: 70 72 4f 72 56 65 63 74 6f 72 28 50 61 72 73 65  prOrVector(Parse
9d60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
9d70: 70 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  p, int iReg, int
9d80: 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
9d90: 28 20 6e 52 65 67 3e 30 20 29 3b 0a 20 20 69 66  ( nReg>0 );.  if
9da0: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 45 78  ( p && sqlite3Ex
9db0: 70 72 49 73 56 65 63 74 6f 72 28 70 29 20 29 7b  prIsVector(p) ){
9dc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9dd0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9de0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
9df0: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
9e00: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
9e10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9e20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 6c  ;.      int iSel
9e30: 65 63 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ect;.      asser
9e40: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  t( p->op==TK_SEL
9e50: 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 53 65  ECT );.      iSe
9e60: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  lect = sqlite3Co
9e70: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
9e80: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 73 71  se, p);.      sq
9e90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9ea0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 53 65 6c  v, OP_Copy, iSel
9eb0: 65 63 74 2c 20 69 52 65 67 2c 20 6e 52 65 67 2d  ect, iReg, nReg-
9ec0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  1);.    }else.#e
9ed0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
9ee0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78   int i;.      Ex
9ef0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9f00: 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  p->x.pList;.    
9f10: 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3c 3d    assert( nReg<=
9f20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
9f30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9f40: 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nReg; i++){.   
9f50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9f60: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
9f70: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
9f80: 69 52 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d  iReg+i);.      }
9f90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
9fa0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 67      assert( nReg
9fb0: 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
9fc0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
9fd0: 65 2c 20 70 2c 20 69 52 65 67 29 3b 0a 20 20 7d  e, p, iReg);.  }
9fe0: 0a 7d 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  .}../* An instan
9ff0: 63 65 20 6f 66 20 74 68 65 20 49 64 78 45 78 70  ce of the IdxExp
a000: 72 54 72 61 6e 73 20 6f 62 6a 65 63 74 20 63 61  rTrans object ca
a010: 72 72 69 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  rries informatio
a020: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 6d 61 70  n about a.** map
a030: 70 69 6e 67 20 66 72 6f 6d 20 61 6e 20 65 78 70  ping from an exp
a040: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 61 62 6c 65  ression on table
a050: 20 63 6f 6c 75 6d 6e 73 20 69 6e 74 6f 20 61 20   columns into a 
a060: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 20 69 6e 64  column in an ind
a070: 65 78 0a 2a 2a 20 64 6f 77 6e 20 74 68 72 6f 75  ex.** down throu
a080: 67 68 20 74 68 65 20 57 61 6c 6b 65 72 2e 0a 2a  gh the Walker..*
a090: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
a0a0: 20 49 64 78 45 78 70 72 54 72 61 6e 73 20 7b 0a   IdxExprTrans {.
a0b0: 20 20 45 78 70 72 20 2a 70 49 64 78 45 78 70 72    Expr *pIdxExpr
a0c0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ;    /* The inde
a0d0: 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
a0e0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
a0f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
a100: 6f 72 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  or of the corres
a110: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f  ponding table */
a120: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
a130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
a140: 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
a150: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  x */.  int iIdxC
a160: 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ol;       /* The
a170: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74 68 65 20   column for the 
a180: 69 6e 64 65 78 20 2a 2f 0a 7d 20 49 64 78 45 78  index */.} IdxEx
a190: 70 72 54 72 61 6e 73 3b 0a 0a 2f 2a 20 54 68 65  prTrans;../* The
a1a0: 20 77 61 6c 6b 65 72 20 6e 6f 64 65 20 63 61 6c   walker node cal
a1b0: 6c 62 61 63 6b 20 75 73 65 64 20 74 6f 20 74 72  lback used to tr
a1c0: 61 6e 73 66 6f 72 6d 20 6d 61 74 63 68 69 6e 67  ansform matching
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74   expressions int
a1e0: 6f 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  o.** a reference
a1f0: 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   to an index col
a200: 75 6d 6e 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  umn for an index
a210: 20 6f 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   on an expressio
a220: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  n..**.** If pExp
a230: 72 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20  r matches, then 
a240: 74 72 61 6e 73 66 6f 72 6d 20 69 74 20 69 6e 74  transform it int
a250: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  o a reference to
a260: 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
a270: 6e 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  n.** that contai
a280: 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
a290: 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
a2a0: 20 69 6e 74 20 77 68 65 72 65 49 6e 64 65 78 45   int whereIndexE
a2b0: 78 70 72 54 72 61 6e 73 4e 6f 64 65 28 57 61 6c  xprTransNode(Wal
a2c0: 6b 65 72 20 2a 70 2c 20 45 78 70 72 20 2a 70 45  ker *p, Expr *pE
a2d0: 78 70 72 29 7b 0a 20 20 49 64 78 45 78 70 72 54  xpr){.  IdxExprT
a2e0: 72 61 6e 73 20 2a 70 58 20 3d 20 70 2d 3e 75 2e  rans *pX = p->u.
a2f0: 70 49 64 78 54 72 61 6e 73 3b 0a 20 20 69 66 28  pIdxTrans;.  if(
a300: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
a310: 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 58  are(0, pExpr, pX
a320: 2d 3e 70 49 64 78 45 78 70 72 2c 20 70 58 2d 3e  ->pIdxExpr, pX->
a330: 69 54 61 62 43 75 72 29 3d 3d 30 20 29 7b 0a 20  iTabCur)==0 ){. 
a340: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
a350: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 70 45  K_COLUMN;.    pE
a360: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 58  xpr->iTable = pX
a370: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70  ->iIdxCur;.    p
a380: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
a390: 70 58 2d 3e 69 49 64 78 43 6f 6c 3b 0a 20 20 20  pX->iIdxCol;.   
a3a0: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d   pExpr->y.pTab =
a3b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
a3c0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73  RC_Prune;.  }els
a3d0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  e{.    return WR
a3e0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
a3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  }../*.** For an 
a400: 69 6e 64 65 78 65 73 20 6f 6e 20 65 78 70 72 65  indexes on expre
a410: 73 73 69 6f 6e 20 58 2c 20 6c 6f 63 61 74 65 20  ssion X, locate 
a420: 65 76 65 72 79 20 69 6e 73 74 61 6e 63 65 20 6f  every instance o
a430: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 58 0a 2a  f expression X.*
a440: 2a 20 69 6e 20 70 45 78 70 72 20 61 6e 64 20 63  * in pExpr and c
a450: 68 61 6e 67 65 20 74 68 61 74 20 73 75 62 65 78  hange that subex
a460: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
a470: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a480: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
a490: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
a4a0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
a4b0: 6f 69 64 20 77 68 65 72 65 49 6e 64 65 78 45 78  oid whereIndexEx
a4c0: 70 72 54 72 61 6e 73 28 0a 20 20 49 6e 64 65 78  prTrans(.  Index
a4d0: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 2f 2a 20   *pIdx,      /* 
a4e0: 54 68 65 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69  The Index */.  i
a4f0: 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 20  nt iTabCur,     
a500: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
a510: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
a520: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
a530: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20  .  int iIdxCur, 
a540: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
a550: 66 20 74 68 65 20 69 6e 64 65 78 20 69 74 73 65  f the index itse
a560: 6c 66 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  lf */.  WhereInf
a570: 6f 20 2a 70 57 49 6e 66 6f 20 2f 2a 20 54 72 61  o *pWInfo /* Tra
a580: 6e 73 66 6f 72 6d 20 65 78 70 72 65 73 73 69 6f  nsform expressio
a590: 6e 73 20 69 6e 20 74 68 69 73 20 57 48 45 52 45  ns in this WHERE
a5a0: 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   clause */.){.  
a5b0: 69 6e 74 20 69 49 64 78 43 6f 6c 3b 20 20 20 20  int iIdxCol;    
a5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
a5d0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74  lumn number of t
a5e0: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 45 78  he index */.  Ex
a5f0: 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72  prList *aColExpr
a600: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ;        /* Expr
a610: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
a620: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 57 61   indexed */.  Wa
a630: 6c 6b 65 72 20 77 3b 0a 20 20 49 64 78 45 78 70  lker w;.  IdxExp
a640: 72 54 72 61 6e 73 20 78 3b 0a 20 20 61 43 6f 6c  rTrans x;.  aCol
a650: 45 78 70 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f  Expr = pIdx->aCo
a660: 6c 45 78 70 72 3b 0a 20 20 69 66 28 20 61 43 6f  lExpr;.  if( aCo
a670: 6c 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  lExpr==0 ) retur
a680: 6e 3b 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 69 6e  n;  /* Not an in
a690: 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f  dex on expressio
a6a0: 6e 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ns */.  memset(&
a6b0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
a6c0: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
a6d0: 61 63 6b 20 3d 20 77 68 65 72 65 49 6e 64 65 78  ack = whereIndex
a6e0: 45 78 70 72 54 72 61 6e 73 4e 6f 64 65 3b 0a 20  ExprTransNode;. 
a6f0: 20 77 2e 75 2e 70 49 64 78 54 72 61 6e 73 20 3d   w.u.pIdxTrans =
a700: 20 26 78 3b 0a 20 20 78 2e 69 54 61 62 43 75 72   &x;.  x.iTabCur
a710: 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 78 2e   = iTabCur;.  x.
a720: 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75  iIdxCur = iIdxCu
a730: 72 3b 0a 20 20 66 6f 72 28 69 49 64 78 43 6f 6c  r;.  for(iIdxCol
a740: 3d 30 3b 20 69 49 64 78 43 6f 6c 3c 61 43 6f 6c  =0; iIdxCol<aCol
a750: 45 78 70 72 2d 3e 6e 45 78 70 72 3b 20 69 49 64  Expr->nExpr; iId
a760: 78 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 69 66 28  xCol++){.    if(
a770: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
a780: 69 49 64 78 43 6f 6c 5d 21 3d 58 4e 5f 45 58 50  iIdxCol]!=XN_EXP
a790: 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
a7a0: 20 20 61 73 73 65 72 74 28 20 61 43 6f 6c 45 78    assert( aColEx
a7b0: 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
a7c0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 78  Expr!=0 );.    x
a7d0: 2e 69 49 64 78 43 6f 6c 20 3d 20 69 49 64 78 43  .iIdxCol = iIdxC
a7e0: 6f 6c 3b 0a 20 20 20 20 78 2e 70 49 64 78 45 78  ol;.    x.pIdxEx
a7f0: 70 72 20 3d 20 61 43 6f 6c 45 78 70 72 2d 3e 61  pr = aColExpr->a
a800: 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 3b  [iIdxCol].pExpr;
a810: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
a820: 45 78 70 72 28 26 77 2c 20 70 57 49 6e 66 6f 2d  Expr(&w, pWInfo-
a830: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
a840: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
a850: 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  t(&w, pWInfo->pO
a860: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
a870: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
a880: 28 26 77 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  (&w, pWInfo->pRe
a890: 73 75 6c 74 53 65 74 29 3b 0a 20 20 7d 0a 7d 0a  sultSet);.  }.}.
a8a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 54 72 75 74  ./*.** The pTrut
a8b0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  h expression is 
a8c0: 61 6c 77 61 79 73 20 74 72 65 65 20 62 65 63 61  always tree beca
a8d0: 75 73 65 20 69 74 20 69 73 20 74 68 65 20 57 48  use it is the WH
a8e0: 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 61 20  ERE clause.** a 
a8f0: 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 74 68  partial index th
a900: 61 74 20 69 73 20 64 72 69 76 69 6e 67 20 61 20  at is driving a 
a910: 71 75 65 72 79 20 6c 6f 6f 70 2e 20 20 4c 6f 6f  query loop.  Loo
a920: 6b 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 66  k through all of
a930: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
a940: 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68  ause terms on th
a950: 65 20 71 75 65 72 79 2c 20 61 6e 64 20 69 66 20  e query, and if 
a960: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 65 72  any of those ter
a970: 6d 73 20 6d 75 73 74 20 62 65 0a 2a 2a 20 74 72  ms must be.** tr
a980: 75 65 20 62 65 63 61 75 73 65 20 70 54 72 75 74  ue because pTrut
a990: 68 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  h is true, then 
a9a0: 6d 61 72 6b 20 74 68 6f 73 65 20 57 48 45 52 45  mark those WHERE
a9b0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 61 73   clause terms as
a9c0: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  .** coded..*/.st
a9d0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
a9e0: 70 70 6c 79 50 61 72 74 69 61 6c 49 6e 64 65 78  pplyPartialIndex
a9f0: 43 6f 6e 73 74 72 61 69 6e 74 73 28 0a 20 20 45  Constraints(.  E
aa00: 78 70 72 20 2a 70 54 72 75 74 68 2c 0a 20 20 69  xpr *pTruth,.  i
aa10: 6e 74 20 69 54 61 62 43 75 72 2c 0a 20 20 57 68  nt iTabCur,.  Wh
aa20: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 0a 29  ereClause *pWC.)
aa30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
aa40: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
aa50: 20 77 68 69 6c 65 28 20 70 54 72 75 74 68 2d 3e   while( pTruth->
aa60: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
aa70: 20 20 77 68 65 72 65 41 70 70 6c 79 50 61 72 74    whereApplyPart
aa80: 69 61 6c 49 6e 64 65 78 43 6f 6e 73 74 72 61 69  ialIndexConstrai
aa90: 6e 74 73 28 70 54 72 75 74 68 2d 3e 70 4c 65 66  nts(pTruth->pLef
aaa0: 74 2c 20 69 54 61 62 43 75 72 2c 20 70 57 43 29  t, iTabCur, pWC)
aab0: 3b 0a 20 20 20 20 70 54 72 75 74 68 20 3d 20 70  ;.    pTruth = p
aac0: 54 72 75 74 68 2d 3e 70 52 69 67 68 74 3b 0a 20  Truth->pRight;. 
aad0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54   }.  for(i=0, pT
aae0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
aaf0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
ab00: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
ab10: 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
ab20: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
ab30: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 20   & TERM_CODED ) 
ab40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
ab50: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
ab60: 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
ab70: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
ab80: 2c 20 70 45 78 70 72 2c 20 70 54 72 75 74 68 2c  , pExpr, pTruth,
ab90: 20 69 54 61 62 43 75 72 29 3d 3d 30 20 29 7b 0a   iTabCur)==0 ){.
aba0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
abb0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
abc0: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ED;.    }.  }.}.
abd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
abe0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
abf0: 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
ac00: 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
ac10: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
ac20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
ac30: 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
ac40: 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73  fo..*/.Bitmask s
ac50: 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f  qlite3WhereCodeO
ac60: 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 50  neLoopStart(.  P
ac70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ac80: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ac90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
aca0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
acb0: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
acc0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
acd0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
ace0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
acf0: 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
ad00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
ad10: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
ad20: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
ad30: 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
ad40: 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
ad50: 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
ad60: 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
ad70: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
ad80: 65 6c 2c 20 20 2f 2a 20 54 68 65 20 63 75 72 72  el,  /* The curr
ad90: 65 6e 74 20 6c 65 76 65 6c 20 70 6f 69 6e 74 65  ent level pointe
ada0: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  r */.  Bitmask n
adb0: 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
adc0: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
add0: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
ade0: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
adf0: 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
ae00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ae10: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae30: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
ae40: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
ae50: 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
ae60: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
ae70: 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
ae80: 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
ae90: 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
aea0: 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
aeb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
aec0: 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
aed0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
aee0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
aef0: 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65  pLoop;    /* The
af00: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
af10: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
af20: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
af30: 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
af40: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
af50: 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
af60: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
af70: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
af80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
af90: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
afa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
afb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
afc0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
afd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
afe0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
aff0: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
b000: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b010: 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
b020: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
b030: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
b040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
b050: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
b060: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
b070: 20 69 6e 74 20 61 64 64 72 48 61 6c 74 3b 20 20   int addrHalt;  
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 2f 2a 20 61 64 64 72 42 72 6b 20 66 6f 72 20   /* addrBrk for 
b0a0: 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  the outermost lo
b0b0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
b0c0: 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
b0d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
b0e0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
b0f0: 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
b100: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
b110: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
b120: 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
b130: 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
b140: 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
b150: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
b160: 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
b170: 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
b180: 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
b190: 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 49  returning */.  I
b1a0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 20  ndex *pIdx = 0; 
b1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
b1c0: 78 20 75 73 65 64 20 62 79 20 6c 6f 6f 70 20 28  x used by loop (
b1d0: 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 6e 74  if any) */.  int
b1e0: 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
b1f0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b200: 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ion of constrain
b210: 74 20 67 65 6e 65 72 61 74 6f 72 20 6c 6f 6f 70  t generator loop
b220: 20 2a 2f 0a 0a 20 20 70 57 43 20 3d 20 26 70 57   */..  pWC = &pW
b230: 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20  Info->sWC;.  db 
b240: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b250: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
b260: 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74  pWLoop;.  pTabIt
b270: 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
b280: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
b290: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
b2a0: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
b2b0: 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  rsor;.  pLevel->
b2c0: 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  notReady = notRe
b2d0: 61 64 79 20 26 20 7e 73 71 6c 69 74 65 33 57 68  ady & ~sqlite3Wh
b2e0: 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
b2f0: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
b300: 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  ur);.  bRev = (p
b310: 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e  WInfo->revMask>>
b320: 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 56 64 62  iLevel)&1;.  Vdb
b330: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
b340: 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
b350: 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65 76  loop%d: %s",iLev
b360: 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  el,pTabItem->pTa
b370: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  b->zName));..  /
b380: 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
b390: 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
b3a0: 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
b3b0: 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
b3c0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
b3d0: 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
b3e0: 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
b3f0: 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
b400: 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
b410: 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
b420: 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
b430: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
b440: 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
b450: 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
b460: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
b470: 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
b480: 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
b490: 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
b4a0: 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
b4b0: 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
b4c0: 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
b4d0: 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
b4e0: 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
b4f0: 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
b500: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
b510: 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
b520: 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
b530: 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
b540: 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
b550: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
b560: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
b570: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
b580: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
b590: 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
b5a0: 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
b5b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b5c0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
b5d0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
b5e0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
b5f0: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
b600: 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
b610: 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
b620: 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
b630: 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
b640: 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
b650: 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
b660: 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
b670: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
b680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b690: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
b6a0: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
b6b0: 55 42 43 4c 41 55 53 45 29 0a 20 20 20 20 20 20  UBCLAUSE).      
b6c0: 20 7c 7c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   || pLevel->iFro
b6d0: 6d 3e 30 20 7c 7c 20 28 70 54 61 62 49 74 65 6d  m>0 || (pTabItem
b6e0: 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
b6f0: 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 0a 20 20  & JT_LEFT)==0.  
b700: 29 3b 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  );.  if( pLevel-
b710: 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
b720: 62 49 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69 6e  bItem[0].fg.join
b730: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
b740: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
b750: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
b760: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b780: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b790: 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
b7a0: 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
b7b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
b7c0: 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
b7d0: 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
b7e0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
b7f0: 65 20 61 20 73 61 66 65 20 61 64 64 72 65 73 73  e a safe address
b800: 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 77   to jump to if w
b810: 65 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  e discover that 
b820: 74 68 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  the table for.  
b830: 2a 2a 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  ** this loop is 
b840: 65 6d 70 74 79 20 61 6e 64 20 63 61 6e 20 6e 65  empty and can ne
b850: 76 65 72 20 63 6f 6e 74 72 69 62 75 74 65 20 63  ver contribute c
b860: 6f 6e 74 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72  ontent. */.  for
b870: 28 6a 3d 69 4c 65 76 65 6c 3b 20 6a 3e 30 20 26  (j=iLevel; j>0 &
b880: 26 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 69  & pWInfo->a[j].i
b890: 4c 65 66 74 4a 6f 69 6e 3d 3d 30 3b 20 6a 2d 2d  LeftJoin==0; j--
b8a0: 29 7b 7d 0a 20 20 61 64 64 72 48 61 6c 74 20 3d  ){}.  addrHalt =
b8b0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 61 64   pWInfo->a[j].ad
b8c0: 64 72 42 72 6b 3b 0a 0a 20 20 2f 2a 20 53 70 65  drBrk;..  /* Spe
b8d0: 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
b8e0: 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
b8f0: 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
b900: 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
b910: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
b920: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
b930: 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
b940: 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
b950: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
b960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b970: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
b980: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
b990: 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e  d, 0, pTabItem->
b9a0: 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
b9b0: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20    pLevel->p2 =  
b9c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b9d0: 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
b9e0: 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b  egYield, addrBrk
b9f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
ba00: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
ba10: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
ba20: 74 20 72 6f 77 20 6f 66 20 25 73 22 2c 20 70 54  t row of %s", pT
ba30: 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
ba40: 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  ame));.    pLeve
ba50: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
ba60: 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
ba70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ba80: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
ba90: 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
baa0: 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
bab0: 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
bac0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
bad0: 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
bae0: 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
baf0: 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
bb00: 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
bb10: 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
bb20: 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
bb30: 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
bb40: 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
bb50: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
bb60: 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
bb70: 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
bb80: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
bb90: 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  p->nLTerm;.    i
bba0: 6e 74 20 69 49 6e 3b 20 20 20 20 2f 2a 20 43 6f  nt iIn;    /* Co
bbb0: 75 6e 74 65 72 20 66 6f 72 20 49 4e 20 63 6f 6e  unter for IN con
bbc0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
bbd0: 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
bbe0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
bbf0: 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
bc00: 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46  2);.    addrNotF
bc10: 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
bc20: 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28  ddrBrk;.    for(
bc30: 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
bc40: 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
bc50: 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52  int iTarget = iR
bc60: 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54  eg+j+2;.      pT
bc70: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
bc80: 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
bc90: 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30  ( NEVER(pTerm==0
bca0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
bcb0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
bcc0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
bcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
bce0: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
bcf0: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
bd00: 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
bd10: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
bd20: 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
bd30: 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
bd40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bd50: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
bd60: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
bd70: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
bd80: 20 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f   codeExprOrVecto
bd90: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
bda0: 2c 20 69 54 61 72 67 65 74 2c 20 31 29 3b 0a 20  , iTarget, 1);. 
bdb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bdc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bdd0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bde0: 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
bdf0: 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
be00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
be20: 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
be30: 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
be40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
be50: 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
be60: 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
be70: 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
be90: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
bea0: 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
beb0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
bec0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
bed0: 65 20 3f 20 50 34 5f 44 59 4e 41 4d 49 43 20 3a  e ? P4_DYNAMIC :
bee0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
bef0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
bf00: 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
bf10: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
bf20: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
bf30: 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
bf40: 76 65 6c 2d 3e 6f 70 20 3d 20 70 57 49 6e 66 6f  vel->op = pWInfo
bf50: 2d 3e 65 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  ->eOnePass ? OP_
bf60: 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e 65 78 74 3b  Noop : OP_VNext;
bf70: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
bf80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
bf90: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
bfa0: 20 69 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   iIn = pLevel->u
bfb0: 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20 20 66 6f 72  .in.nIn;.    for
bfc0: 28 6a 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  (j=nConstraint-1
bfd0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
bfe0: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
bff0: 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
c000: 20 20 20 20 69 66 28 20 6a 3c 31 36 20 26 26 20      if( j<16 && 
c010: 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f  (pLoop->u.vtab.o
c020: 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b  mitMask>>j)&1 ){
c030: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
c040: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
c050: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
c060: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
c070: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
c080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
c090: 70 72 20 2a 70 43 6f 6d 70 61 72 65 3b 20 20 2f  pr *pCompare;  /
c0a0: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
c0b0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
c0c0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
c0d0: 74 3b 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20  t;    /* RHS of 
c0e0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a  the comparison *
c0f0: 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  /.        VdbeOp
c100: 20 2a 70 4f 70 3b 20 20 20 20 20 2f 2a 20 4f 70   *pOp;     /* Op
c110: 63 6f 64 65 20 74 6f 20 61 63 63 65 73 73 20 74  code to access t
c120: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c130: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  IN constraint */
c140: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c  ..        /* Rel
c150: 6f 61 64 20 74 68 65 20 63 6f 6e 73 74 72 61 69  oad the constrai
c160: 6e 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  nt value into re
c170: 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e 20 20 54 68  g[iReg+j+2].  Th
c180: 65 20 73 61 6d 65 20 76 61 6c 75 65 0a 20 20 20  e same value.   
c190: 20 20 20 20 20 2a 2a 20 77 61 73 20 6c 6f 61 64       ** was load
c1a0: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 61 6d 65  ed into the same
c1b0: 20 72 65 67 69 73 74 65 72 20 70 72 69 6f 72 20   register prior 
c1c0: 74 6f 20 74 68 65 20 4f 50 5f 56 46 69 6c 74 65  to the OP_VFilte
c1d0: 72 2c 20 62 75 74 0a 20 20 20 20 20 20 20 20 2a  r, but.        *
c1e0: 2a 20 74 68 65 20 78 46 69 6c 74 65 72 20 69 6d  * the xFilter im
c1f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
c200: 68 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ht have changed 
c210: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 72 0a  the datatype or.
c220: 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64          ** encod
c230: 69 6e 67 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ing of the value
c240: 20 69 6e 20 74 68 65 20 72 65 67 69 73 74 65 72   in the register
c250: 2c 20 73 6f 20 69 74 20 2a 6d 75 73 74 2a 20 62  , so it *must* b
c260: 65 20 72 65 6c 6f 61 64 65 64 2e 20 2a 2f 0a 20  e reloaded. */. 
c270: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c280: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
c290: 6f 6f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  oop!=0 || db->ma
c2a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c2b0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
c2c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c2d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
c2e0: 20 69 49 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20   iIn>0 );.      
c2f0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
c300: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 4c  3VdbeGetOp(v, pL
c310: 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
c320: 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64 64 72 49 6e  op[--iIn].addrIn
c330: 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Top);.          
c340: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
c350: 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 7c  ode==OP_Column |
c360: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
c370: 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  P_Rowid );.     
c380: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
c390: 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 43 6f 6c  ->opcode!=OP_Col
c3a0: 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d  umn || pOp->p3==
c3b0: 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20  iReg+j+2 );.    
c3c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
c3d0: 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 6f  p->opcode!=OP_Ro
c3e0: 77 69 64 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d  wid || pOp->p2==
c3f0: 69 52 65 67 2b 6a 2b 32 20 29 3b 0a 20 20 20 20  iReg+j+2 );.    
c400: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c410: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
c420: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
c430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c440: 64 4f 70 33 28 76 2c 20 70 4f 70 2d 3e 6f 70 63  dOp3(v, pOp->opc
c450: 6f 64 65 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  ode, pOp->p1, pO
c460: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29 3b  p->p2, pOp->p3);
c470: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
c480: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
c490: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
c4a0: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
c4b0: 65 78 74 20 72 6f 77 20 69 66 20 0a 20 20 20 20  ext row if .    
c4c0: 20 20 20 20 2a 2a 20 74 68 65 20 49 4e 20 63 6f      ** the IN co
c4d0: 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
c4e0: 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20 20  satisfied */.   
c4f0: 20 20 20 20 20 70 43 6f 6d 70 61 72 65 20 3d 20       pCompare = 
c500: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c510: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 30 2c 20 30  rse, TK_EQ, 0, 0
c520: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c530: 74 28 20 70 43 6f 6d 70 61 72 65 21 3d 30 20 7c  t( pCompare!=0 |
c540: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c550: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
c560: 28 20 70 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20  ( pCompare ){.  
c570: 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65          pCompare
c580: 2d 3e 70 4c 65 66 74 20 3d 20 70 54 65 72 6d 2d  ->pLeft = pTerm-
c590: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  >pExpr->pLeft;. 
c5a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72           pCompar
c5b0: 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  e->pRight = pRig
c5c0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
c5d0: 28 64 62 2c 20 54 4b 5f 52 45 47 49 53 54 45 52  (db, TK_REGISTER
c5e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
c5f0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
c600: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
c610: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 2b  ->iTable = iReg+
c620: 6a 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j+2;.           
c630: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
c640: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 6d  lse(pParse, pCom
c650: 70 61 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  pare, pLevel->ad
c660: 64 72 43 6f 6e 74 2c 20 30 29 3b 0a 20 20 20 20  drCont, 0);.    
c670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c680: 20 20 70 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66    pCompare->pLef
c690: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
c6a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c6b0: 74 65 28 64 62 2c 20 70 43 6f 6d 70 61 72 65 29  te(db, pCompare)
c6c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c6d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
c6e0: 20 54 68 65 73 65 20 72 65 67 69 73 74 65 72 73   These registers
c6f0: 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 65 73   need to be pres
c700: 65 72 76 65 64 20 69 6e 20 63 61 73 65 20 74 68  erved in case th
c710: 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
c720: 72 61 74 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f  rator.    ** loo
c730: 70 2e 20 20 53 6f 20 77 65 20 63 6f 75 6c 64 20  p.  So we could 
c740: 64 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  deallocate the r
c750: 65 67 69 73 74 65 72 73 20 68 65 72 65 20 28 61  egisters here (a
c760: 6e 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  nd potentially. 
c770: 20 20 20 2a 2a 20 72 65 75 73 65 20 74 68 65 6d     ** reuse them
c780: 20 6c 61 74 65 72 29 20 69 66 20 28 70 4c 6f 6f   later) if (pLoo
c790: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
c7a0: 52 45 5f 49 4e 5f 41 42 4c 45 29 3d 3d 30 2e 20  RE_IN_ABLE)==0. 
c7b0: 20 42 75 74 20 69 74 20 73 65 65 6d 73 0a 20 20   But it seems.  
c7c0: 20 20 2a 2a 20 73 69 6d 70 6c 65 72 20 61 6e 64    ** simpler and
c7d0: 20 73 61 66 65 72 20 74 6f 20 73 69 6d 70 6c 79   safer to simply
c7e0: 20 6e 6f 74 20 72 65 75 73 65 20 74 68 65 20 72   not reuse the r
c7f0: 65 67 69 73 74 65 72 73 2e 0a 20 20 20 20 2a 2a  egisters..    **
c800: 0a 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74  .    **    sqlit
c810: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
c820: 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
c830: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
c840: 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 0a  .    */.  }else.
c850: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c860: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c870: 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c  LE */..  if( (pL
c880: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
c890: 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20  HERE_IPK)!=0.   
c8a0: 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
c8b0: 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
c8c0: 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
c8d0: 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a  MN_EQ))!=0.  ){.
c8e0: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
c8f0: 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
c900: 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
c910: 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
c920: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
c930: 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
c940: 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
c950: 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
c960: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
c970: 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
c980: 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
c990: 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
c9a0: 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
c9b0: 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
c9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
c9d0: 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
c9e0: 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  e.nEq==1 );.    
c9f0: 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
ca00: 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
ca10: 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
ca20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
ca30: 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
ca40: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
ca50: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
ca60: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
ca70: 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
ca80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
ca90: 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20  ;.    iRowidReg 
caa0: 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
cab0: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
cac0: 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65  , pLevel, 0, bRe
cad0: 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  v, iReleaseReg);
cae0: 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 52  .    if( iRowidR
caf0: 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20  eg!=iReleaseReg 
cb00: 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
cb10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
cb20: 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
cb30: 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
cb40: 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
cb50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb60: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
cb70: 69 64 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  id, iCur, addrNx
cb80: 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
cb90: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
cba0: 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
cbb0: 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
cbc0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
cbd0: 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
cbe0: 2d 3e 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  ->notReady)==0 )
cbf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  {.      pTerm->w
cc00: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
cc10: 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ODED;.    }.  }e
cc20: 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
cc30: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
cc40: 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
cc50: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
cc60: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
cc70: 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
cc80: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
cc90: 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
cca0: 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
ccb0: 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
ccc0: 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
ccd0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
cce0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
ccf0: 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
cd00: 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
cd10: 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
cd20: 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
cd30: 64 3b 0a 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  d;..    j = 0;. 
cd40: 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
cd50: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
cd60: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
cd70: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
cd80: 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
cd90: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
cda0: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
cdb0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
cdc0: 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
cdd0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
cde0: 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
cdf0: 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
ce00: 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
ce10: 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
ce20: 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
ce30: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
ce40: 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
ce50: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
ce60: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
ce70: 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f  pTabItem, pWInfo
ce80: 2c 20 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  , pLevel, pEnd);
ce90: 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
cea0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ceb0: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  X;             /
cec0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ced0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
cee0: 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f  e start bound */
cef0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
cf00: 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Temp;        /* 
cf10: 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f  Registers for ho
cf20: 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  lding the start 
cf30: 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 20 20 20 20  boundary */.    
cf40: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
cf50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
cf60: 72 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  r seek operation
cf70: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
cf80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
cf90: 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
cfa0: 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
cfb0: 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
cfc0: 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
cfd0: 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
cfe0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
cff0: 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
d000: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
d010: 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
d020: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
d030: 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
d040: 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20  SeekGT,.        
d050: 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
d060: 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20  OP_SeekLE,.     
d070: 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
d080: 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20  /  OP_SeekLT,.  
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
d0a0: 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a  E */  OP_SeekGE.
d0b0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
d0c0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
d0d0: 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
d0e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
d0f0: 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
d100: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
d110: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
d120: 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
d130: 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
d140: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
d150: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
d160: 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
d170: 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
d180: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
d190: 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  (pStart->wtFlags
d1a0: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
d1b0: 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
d1c0: 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
d1d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
d1e0: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20  UAL );.      pX 
d1f0: 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
d200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d210: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  X!=0 );.      te
d220: 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
d230: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
d240: 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76   ); /* transitiv
d250: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
d260: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
d270: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
d280: 58 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20  X->pRight) ){.  
d290: 20 20 20 20 20 20 72 31 20 3d 20 72 54 65 6d 70        r1 = rTemp
d2a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
d2b0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
d2c0: 20 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72        codeExprOr
d2d0: 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70  Vector(pParse, p
d2e0: 58 2d 3e 70 52 69 67 68 74 2c 20 72 31 2c 20 31  X->pRight, r1, 1
d2f0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
d300: 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
d310: 47 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  GT );.        te
d320: 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
d330: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20  TK_GE );.       
d340: 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
d350: 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
d360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
d370: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ->op==TK_LE );. 
d380: 20 20 20 20 20 20 20 6f 70 20 3d 20 61 4d 6f 76         op = aMov
d390: 65 4f 70 5b 28 28 70 58 2d 3e 6f 70 20 2d 20 54  eOp[((pX->op - T
d3a0: 4b 5f 47 54 20 2d 20 31 29 20 26 20 30 78 33 29  K_GT - 1) & 0x3)
d3b0: 20 7c 20 30 78 31 5d 3b 0a 20 20 20 20 20 20 20   | 0x1];.       
d3c0: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 21   assert( pX->op!
d3d0: 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
d3e0: 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20 20  _SeekGE );.     
d3f0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
d400: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
d410: 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20  OP_SeekGE );.   
d420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
d430: 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
d440: 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20  ==OP_SeekLE );. 
d450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d460: 58 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  X->op!=TK_LE || 
d470: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b  op==OP_SeekLE );
d480: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d490: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
d4a0: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
d4b0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
d4c0: 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
d4d0: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
d4e0: 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
d4f0: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 61 4d  .        op = aM
d500: 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f 70 20 2d 20  oveOp[(pX->op - 
d510: 54 4b 5f 47 54 29 5d 3b 0a 20 20 20 20 20 20 7d  TK_GT)];.      }
d520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d530: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
d540: 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
d550: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
d560: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
d570: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d580: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
d590: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
d5a0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
d5b0: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
d5c0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d5d0: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
d5e0: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
d5f0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
d600: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
d610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
d620: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d630: 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
d640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
d650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d660: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
d670: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
d680: 69 43 75 72 2c 20 61 64 64 72 48 61 6c 74 29 3b  iCur, addrHalt);
d690: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
d6a0: 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
d6b0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
d6c0: 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21  erageIf(v, bRev!
d6d0: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
d6e0: 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
d6f0: 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
d700: 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
d710: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
d720: 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
d730: 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77  assert( (pEnd->w
d740: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
d750: 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
d760: 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
d770: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
d780: 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69  r ); /* Transiti
d790: 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
d7a0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
d7b0: 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ( pEnd->wtFlags 
d7c0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
d7d0: 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  ;.      memEndVa
d7e0: 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
d7f0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64 65  nMem;.      code
d800: 45 78 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61  ExprOrVector(pPa
d810: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
d820: 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 31 29   memEndValue, 1)
d830: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
d840: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
d850: 6f 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20 0a  or(pX->pRight) .
d860: 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e 6f         && (pX->o
d870: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
d880: 6f 70 3d 3d 54 4b 5f 47 54 29 20 0a 20 20 20 20  op==TK_GT) .    
d890: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73    ){.        tes
d8a0: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
d8b0: 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
d8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d8d0: 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
d8e0: 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
d8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d900: 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ( 0==sqlite3Expr
d910: 49 73 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69  IsVector(pX->pRi
d920: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
d930: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
d940: 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20  el, pEnd);.     
d950: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61   }.    }.    sta
d960: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d970: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
d980: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
d990: 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
d9a0: 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
d9b0: 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
d9c0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
d9d0: 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
d9e0: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
d9f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
da00: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
da10: 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
da20: 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
da30: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
da40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
da50: 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
da60: 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
da70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da80: 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65  p3(v, testOp, me
da90: 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42  mEndValue, addrB
daa0: 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  rk, iRowidReg);.
dab0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
dac0: 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
dad0: 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Le);.      Vd
dae0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
daf0: 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  testOp==OP_Lt);.
db00: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
db10: 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d  geIf(v, testOp==
db20: 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ge);.      Vd
db30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
db40: 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  testOp==OP_Gt);.
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
db70: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
db80: 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
db90: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ULL);.    }.  }e
dba0: 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
dbb0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
dbc0: 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a  NDEXED ){.    /*
dbd0: 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20   Case 4: A scan 
dbe0: 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
dbf0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
dc00: 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
dc10: 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
dc20: 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
dc30: 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
dc40: 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
dc50: 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
dc60: 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
dc70: 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
dc80: 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
dc90: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
dca0: 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
dcb0: 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
dcc0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
dcd0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
dce0: 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
dcf0: 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
dd00: 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
dd10: 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
dd20: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
dd30: 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
dd40: 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
dd50: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
dd60: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
dd70: 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
dd80: 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
dd90: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
dda0: 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
ddb0: 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
ddc0: 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
ddd0: 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
dde0: 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
ddf0: 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
de00: 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
de10: 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
de20: 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
de30: 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
de40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
de50: 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
de60: 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
de70: 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
de80: 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
de90: 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
dea0: 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
deb0: 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
dec0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
ded0: 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
dee0: 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
def0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
df00: 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
df10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
df20: 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
df30: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
df40: 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
df50: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
df60: 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
df70: 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
df80: 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
df90: 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
dfa0: 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
dfb0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
dfc0: 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
dfd0: 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
dfe0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
dff0: 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
e000: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
e010: 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
e020: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
e030: 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
e040: 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
e050: 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
e060: 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
e070: 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
e080: 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
e090: 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
e0a0: 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
e0b0: 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
e0c0: 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
e0d0: 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
e0e0: 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
e0f0: 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
e100: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
e110: 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
e120: 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
e130: 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
e140: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
e150: 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
e160: 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
e170: 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
e180: 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
e190: 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
e1a0: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
e1b0: 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
e1c0: 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
e1d0: 4f 50 5f 53 65 65 6b 47 54 2c 20 20 20 20 20 20  OP_SeekGT,      
e1e0: 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
e1f0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
e200: 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
e210: 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
e220: 5f 53 65 65 6b 4c 54 2c 20 20 20 20 20 20 20 20  _SeekLT,        
e230: 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
e240: 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
e250: 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
e260: 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
e270: 65 65 6b 47 45 2c 20 20 20 20 20 20 20 20 20 20  eekGE,          
e280: 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
e290: 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
e2a0: 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
e2b0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
e2c0: 6b 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLE            /
e2d0: 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
e2e0: 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
e2f0: 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
e300: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
e310: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
e320: 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
e330: 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
e340: 20 20 20 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f       /* 0: (end_
e350: 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
e360: 62 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20  bRev && !endEq) 
e370: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
e380: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,            /*
e390: 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
e3a0: 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
e3b0: 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20    endEq) */.    
e3c0: 20 20 4f 50 5f 49 64 78 4c 45 2c 20 20 20 20 20    OP_IdxLE,     
e3d0: 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
e3e0: 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
e3f0: 20 20 62 52 65 76 20 26 26 20 21 65 6e 64 45 71    bRev && !endEq
e400: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
e410: 78 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLT,            
e420: 2f 2a 20 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 3: (end_const
e430: 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
e440: 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20  &&  endEq) */.  
e450: 20 20 7d 3b 0a 20 20 20 20 75 31 36 20 6e 45 71    };.    u16 nEq
e460: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
e470: 65 2e 6e 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75  e.nEq;     /* Nu
e480: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
e490: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 75 31   terms */.    u1
e4a0: 36 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e  6 nBtm = pLoop->
e4b0: 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 20 20 20  u.btree.nBtm;   
e4c0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 42 54 4d  /* Length of BTM
e4d0: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20 75   vector */.    u
e4e0: 31 36 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d  16 nTop = pLoop-
e4f0: 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 20 20  >u.btree.nTop;  
e500: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 54 4f   /* Length of TO
e510: 50 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20  P vector */.    
e520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e540: 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
e550: 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
e560: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 57   values */.    W
e570: 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
e580: 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
e590: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
e5a0: 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
e5b0: 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
e5c0: 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
e5d0: 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
e5e0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
e5f0: 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
e600: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
e610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e620: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
e630: 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
e640: 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
e650: 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e670: 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
e680: 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
e690: 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
e6a0: 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
e6b0: 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
e6c0: 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
e6d0: 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
e6e0: 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
e6f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
e700: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
e710: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
e720: 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b      int iIdxCur;
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
e750: 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
e760: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78  x */.    int nEx
e770: 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20  traReg = 0;     
e780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e790: 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
e7a0: 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  rs needed */.   
e7b0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7d0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63   Instruction opc
e7e0: 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ode */.    char 
e7f0: 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20  *zStartAff;     
e800: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
e810: 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ity for start of
e820: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
e830: 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
e840: 45 6e 64 41 66 66 20 3d 20 30 3b 20 20 20 20 20  EndAff = 0;     
e850: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
e860: 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e  y for end of ran
e870: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
e880: 0a 20 20 20 20 75 38 20 62 53 65 65 6b 50 61 73  .    u8 bSeekPas
e890: 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
e8a0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 65    /* True to see
e8b0: 6b 20 70 61 73 74 20 69 6e 69 74 69 61 6c 20 6e  k past initial n
e8c0: 75 6c 6c 73 20 2a 2f 0a 20 20 20 20 75 38 20 62  ulls */.    u8 b
e8d0: 53 74 6f 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20  StopAtNull = 0; 
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e8f0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 74 65 72  condition to ter
e900: 6d 69 6e 61 74 65 20 61 74 20 4e 55 4c 4c 73 20  minate at NULLs 
e910: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54  */.    int omitT
e920: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
e930: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
e940: 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
e950: 6f 6e 6c 79 20 2a 2f 0a 0a 0a 20 20 20 20 70 49  only */...    pI
e960: 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
e970: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
e980: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
e990: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
e9a0: 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
e9b0: 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20  p->nSkip );..   
e9c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
e9d0: 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
e9e0: 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
e9f0: 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
ea00: 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
ea10: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
ea20: 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
ea30: 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
ea40: 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
ea50: 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
ea60: 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
ea70: 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
ea80: 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
ea90: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
eaa0: 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
eab0: 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
eac0: 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
ead0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
eae0: 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
eaf0: 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
eb00: 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
eb10: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
eb20: 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
eb30: 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
eb40: 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
eb50: 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
eb60: 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
eb70: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
eb80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
eb90: 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  ert( pWInfo->pOr
eba0: 64 65 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20  derBy==0.       
ebb0: 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72    || pWInfo->pOr
ebc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a  derBy->nExpr==1.
ebd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49           || (pWI
ebe0: 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
ebf0: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
ec00: 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  N)==0 );.    if(
ec10: 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
ec20: 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
ec30: 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
ec40: 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
ec50: 74 3e 30 0a 20 20 20 20 20 26 26 20 28 70 49 64  t>0.     && (pId
ec60: 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a  x->nKeyCol>nEq).
ec70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
ec80: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ert( pLoop->nSki
ec90: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53  p==0 );.      bS
eca0: 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
ecb0: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
ecc0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
ecd0: 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
ece0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
ecf0: 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
ed00: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
ed10: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
ed20: 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
ed30: 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
ed40: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
ed50: 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
ed60: 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
ed70: 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
ed80: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
ed90: 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
eda0: 4d 41 58 28 6e 45 78 74 72 61 52 65 67 2c 20 70  MAX(nExtraReg, p
edb0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  Loop->u.btree.nB
edc0: 74 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 69  tm);.      /* Li
edd0: 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ke optimization 
ede0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
edf0: 73 20 61 6c 77 61 79 73 20 6f 63 63 75 72 20 69  s always occur i
ee00: 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20  n pairs */.     
ee10: 20 61 73 73 65 72 74 28 20 28 70 52 61 6e 67 65   assert( (pRange
ee20: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
ee30: 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d 3d   TERM_LIKEOPT)==
ee40: 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  0 || .          
ee50: 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c      (pLoop->wsFl
ee60: 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
ee70: 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a 20 20 20  LIMIT)!=0 );.   
ee80: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
ee90: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
eea0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
eeb0: 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d       pRangeEnd =
eec0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
eed0: 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
eee0: 61 52 65 67 20 3d 20 4d 41 58 28 6e 45 78 74 72  aReg = MAX(nExtr
eef0: 61 52 65 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62  aReg, pLoop->u.b
ef00: 74 72 65 65 2e 6e 54 6f 70 29 3b 0a 23 69 66 6e  tree.nTop);.#ifn
ef10: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
ef20: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
ef30: 42 53 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  BS.      if( (pR
ef40: 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
ef50: 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29   & TERM_LIKEOPT)
ef60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
ef70: 73 73 65 72 74 28 20 70 52 61 6e 67 65 53 74 61  ssert( pRangeSta
ef80: 72 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  rt!=0 );        
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efa0: 4c 49 4b 45 20 6f 70 74 20 63 6f 6e 73 74 72 61  LIKE opt constra
efb0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
efc0: 61 73 73 65 72 74 28 20 70 52 61 6e 67 65 53 74  assert( pRangeSt
efd0: 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
efe0: 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 20 20  ERM_LIKEOPT );  
eff0: 20 2f 2a 20 6f 63 63 75 72 20 69 6e 20 70 61 69   /* occur in pai
f000: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  rs */.        pL
f010: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
f020: 74 72 20 3d 20 28 75 33 32 29 2b 2b 70 50 61 72  tr = (u32)++pPar
f030: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f040: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f050: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f060: 72 2c 20 31 2c 20 28 69 6e 74 29 70 4c 65 76 65  r, 1, (int)pLeve
f070: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29  l->iLikeRepCntr)
f080: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
f090: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4b 45 20  mment((v, "LIKE 
f0a0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 22 29 29 3b  loop counter"));
f0b0: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
f0c0: 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 3d 20 73  >addrLikeRep = s
f0d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f0e0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
f0f0: 20 20 2f 2a 20 69 4c 69 6b 65 52 65 70 43 6e 74    /* iLikeRepCnt
f100: 72 20 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65  r actually store
f110: 73 20 32 78 20 74 68 65 20 63 6f 75 6e 74 65 72  s 2x the counter
f120: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
f130: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
f140: 2a 20 62 6f 74 74 6f 6d 20 62 69 74 20 69 6e 64  * bottom bit ind
f150: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74  icates whether t
f160: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
f170: 69 73 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20  is ASC or DESC. 
f180: 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
f190: 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
f1a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f1b0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
f1c0: 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
f1d0: 44 45 53 43 20 29 3b 0a 20 20 20 20 20 20 20 20  DESC );.        
f1e0: 61 73 73 65 72 74 28 20 28 62 52 65 76 20 26 20  assert( (bRev & 
f1f0: 7e 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ~1)==0 );.      
f200: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
f210: 65 70 43 6e 74 72 20 3c 3c 3d 31 3b 0a 20 20 20  epCntr <<=1;.   
f220: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69       pLevel->iLi
f230: 6b 65 52 65 70 43 6e 74 72 20 7c 3d 20 62 52 65  keRepCntr |= bRe
f240: 76 20 5e 20 28 70 49 64 78 2d 3e 61 53 6f 72 74  v ^ (pIdx->aSort
f250: 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
f260: 54 45 5f 53 4f 5f 44 45 53 43 29 3b 0a 20 20 20  TE_SO_DESC);.   
f270: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f280: 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
f290: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
f2a0: 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  j = pIdx->aiColu
f2b0: 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20  mn[nEq];.       
f2c0: 20 69 66 28 20 28 6a 3e 3d 30 20 26 26 20 70 49   if( (j>=0 && pI
f2d0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
f2e0: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 20  [j].notNull==0) 
f2f0: 7c 7c 20 6a 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  || j==XN_EXPR ){
f300: 0a 20 20 20 20 20 20 20 20 20 20 62 53 65 65 6b  .          bSeek
f310: 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  PastNull = 1;.  
f320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f330: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f340: 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c  ( pRangeEnd==0 |
f350: 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  | (pRangeEnd->wt
f360: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
f370: 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  LL)==0 );..    /
f380: 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
f390: 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
f3a0: 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
f3b0: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
f3c0: 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
f3d0: 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
f3e0: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
f3f0: 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
f400: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
f410: 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
f420: 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
f430: 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
f440: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71   */.    if( (nEq
f450: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26  <pIdx->nKeyCol &
f460: 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  & bRev==(pIdx->a
f470: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
f480: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a  SQLITE_SO_ASC)).
f490: 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26       || (bRev &&
f4a0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
f4b0: 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
f4c0: 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
f4d0: 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
f4e0: 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
f4f0: 20 20 20 53 57 41 50 28 75 38 2c 20 62 53 65 65     SWAP(u8, bSee
f500: 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70  kPastNull, bStop
f510: 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 53  AtNull);.      S
f520: 57 41 50 28 75 38 2c 20 6e 42 74 6d 2c 20 6e 54  WAP(u8, nBtm, nT
f530: 6f 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  op);.    }..    
f540: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
f550: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
f560: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
f570: 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
f580: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
f590: 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
f5a0: 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
f5b0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
f5c0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
f5d0: 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
f5e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 64 65  .    */.    code
f5f0: 43 75 72 73 6f 72 48 69 6e 74 28 70 54 61 62 49  CursorHint(pTabI
f600: 74 65 6d 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65  tem, pWInfo, pLe
f610: 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
f620: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
f630: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
f640: 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65  rms(pParse,pLeve
f650: 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67  l,bRev,nExtraReg
f660: 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  ,&zStartAff);.  
f670: 20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74    assert( zStart
f680: 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Aff==0 || sqlite
f690: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74  3Strlen30(zStart
f6a0: 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20  Aff)>=nEq );.   
f6b0: 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 26   if( zStartAff &
f6c0: 26 20 6e 54 6f 70 20 29 7b 0a 20 20 20 20 20 20  & nTop ){.      
f6d0: 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65  zEndAff = sqlite
f6e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 26 7a  3DbStrDup(db, &z
f6f0: 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3b 0a  StartAff[nEq]);.
f700: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 4e 78      }.    addrNx
f710: 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
f720: 4e 78 74 3b 0a 0a 20 20 20 20 74 65 73 74 63 61  Nxt;..    testca
f730: 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
f740: 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
f750: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f760: 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
f770: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
f780: 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
f790: 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
f7a0: 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
f7b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
f7c0: 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
f7d0: 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
f7e0: 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
f7f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
f800: 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
f810: 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
f820: 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
f830: 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
f840: 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
f850: 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
f860: 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
f870: 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
f880: 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
f890: 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
f8a0: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
f8b0: 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
f8c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
f8d0: 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
f8e0: 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
f8f0: 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
f900: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
f910: 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
f920: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
f930: 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
f940: 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
f950: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
f960: 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
f970: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
f980: 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56       codeExprOrV
f990: 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52  ector(pParse, pR
f9a0: 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
f9b0: 71 2c 20 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20  q, nBtm);.      
f9c0: 77 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a  whereLikeOptimiz
f9d0: 61 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70  ationStringFixup
f9e0: 28 76 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e  (v, pLevel, pRan
f9f0: 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  geStart);.      
fa00: 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
fa10: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
fa20: 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
fa30: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
fa40: 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
fa50: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
fa60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa70: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
fa80: 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
fa90: 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
faa0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
fab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fac0: 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
fad0: 7b 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  {.        update
fae0: 52 61 6e 67 65 41 66 66 69 6e 69 74 79 53 74 72  RangeAffinityStr
faf0: 28 70 52 69 67 68 74 2c 20 6e 42 74 6d 2c 20 26  (pRight, nBtm, &
fb00: 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3b  zStartAff[nEq]);
fb10: 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
fb20: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d 20   nConstraint += 
fb30: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 74 65 73 74  nBtm;.      test
fb40: 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
fb50: 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
fb60: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
fb70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fb80: 70 72 49 73 56 65 63 74 6f 72 28 70 52 69 67 68  prIsVector(pRigh
fb90: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
fba0: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
fbb0: 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
fbc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fbd0: 20 20 20 20 20 20 20 20 73 74 61 72 74 45 71 20          startEq 
fbe0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
fbf0: 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
fc00: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
fc10: 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75 6c  if( bSeekPastNul
fc20: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
fc30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc40: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
fc50: 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
fc60: 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
fc70: 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
fc80: 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
fc90: 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
fca0: 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
fcb0: 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
fcc0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
fcd0: 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b 50  straint - bSeekP
fce0: 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41  astNull, zStartA
fcf0: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ff);.    if( pLo
fd00: 6f 70 2d 3e 6e 53 6b 69 70 3e 30 20 26 26 20 6e  op->nSkip>0 && n
fd10: 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 70 4c 6f 6f  Constraint==pLoo
fd20: 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  p->nSkip ){.    
fd30: 20 20 2f 2a 20 54 68 65 20 73 6b 69 70 2d 73 63    /* The skip-sc
fd40: 61 6e 20 6c 6f 67 69 63 20 69 6e 73 69 64 65 20  an logic inside 
fd50: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 64 65  the call to code
fd60: 41 6c 6c 45 71 75 61 6c 69 74 79 43 6f 6e 73 74  AllEqualityConst
fd70: 72 61 69 6e 74 73 28 29 0a 20 20 20 20 20 20 2a  raints().      *
fd80: 2a 20 61 62 6f 76 65 20 68 61 73 20 61 6c 72 65  * above has alre
fd90: 61 64 79 20 6c 65 66 74 20 74 68 65 20 63 75 72  ady left the cur
fda0: 73 6f 72 20 73 69 74 74 69 6e 67 20 6f 6e 20 74  sor sitting on t
fdb0: 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 2c 0a  he correct row,.
fdc0: 20 20 20 20 20 20 2a 2a 20 73 6f 20 6e 6f 20 66        ** so no f
fdd0: 75 72 74 68 65 72 20 73 65 65 6b 69 6e 67 20 69  urther seeking i
fde0: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
fdf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
fe00: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
fe10: 26 20 57 48 45 52 45 5f 49 4e 5f 45 41 52 4c 59  & WHERE_IN_EARLY
fe20: 4f 55 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OUT ){.        s
fe30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fe40: 28 76 2c 20 4f 50 5f 53 65 65 6b 48 69 74 2c 20  (v, OP_SeekHit, 
fe50: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
fe60: 7d 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 53 74  }.      op = aSt
fe70: 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
fe80: 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
fe90: 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
fea0: 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ev];.      asser
feb0: 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
fec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fed0: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
fee0: 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
fef0: 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
ff00: 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 56 64 62  aint);.      Vdb
ff10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ff20: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ff30: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77  If(v, op==OP_Rew
ff40: 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65 28  ind);  testcase(
ff50: 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
ff60: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ff70: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
ff80: 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74 63  _Last);    testc
ff90: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  ase( op==OP_Last
ffa0: 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
ffb0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
ffc0: 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65 73  OP_SeekGT);  tes
ffd0: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
ffe0: 65 6b 47 54 20 29 3b 0a 20 20 20 20 20 20 56 64  ekGT );.      Vd
fff0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
10000 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20  op==OP_SeekGE); 
10010 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
10020 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20  P_SeekGE );.    
10030 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
10040 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
10050 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
10060 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a  p==OP_SeekLE );.
10070 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10080 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
10090 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
100a0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
100b0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
100c0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
100d0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
100e0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
100f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10100 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
10110 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
10120 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
10130 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
10140 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
10150 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
10160 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
10170 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
10180 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72  codeExprOrVector
10190 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
101a0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54   regBase+nEq, nT
101b0 6f 70 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  op);.      where
101c0 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  LikeOptimization
101d0 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70  StringFixup(v, p
101e0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
101f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
10200 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
10210 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
10220 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
10230 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
10240 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
10250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10260 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10270 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
10280 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
10290 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
102a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
102b0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
102c0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Aff ){.        u
102d0 70 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69  pdateRangeAffini
102e0 74 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 54  tyStr(pRight, nT
102f0 6f 70 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  op, zEndAff);.  
10300 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
10310 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
10320 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 54 6f  regBase+nEq, nTo
10330 70 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20  p, zEndAff);.   
10340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10350 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
10360 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10370 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
10380 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
10390 2b 3d 20 6e 54 6f 70 3b 0a 20 20 20 20 20 20 74  += nTop;.      t
103a0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
103b0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
103c0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 0a 20  RM_VIRTUAL );.. 
103d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
103e0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 52 69  ExprIsVector(pRi
103f0 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ght)==0 ){.     
10400 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
10410 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
10420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10430 20 20 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20          endEq = 
10440 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10450 65 6c 73 65 20 69 66 28 20 62 53 74 6f 70 41 74  else if( bStopAt
10460 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
10470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10480 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
10490 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
104a0 20 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20     endEq = 0;.  
104b0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
104c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
104d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
104e0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
104f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10500 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20   zEndAff);..    
10510 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
10520 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70  op body */.    p
10530 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
10540 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10550 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  dr(v);..    /* C
10560 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
10570 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
10580 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10590 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66  range. */.    if
105a0 28 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ( nConstraint ){
105b0 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  .      op = aEnd
105c0 4f 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45  Op[bRev*2 + endE
105d0 71 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  q];.      sqlite
105e0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
105f0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
10600 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
10610 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
10620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
10630 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20  p==OP_IdxGT );  
10640 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
10650 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29  , op==OP_IdxGT )
10660 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10670 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
10680 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
10690 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  f(v, op==OP_IdxG
106a0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
106b0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
106c0 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  T );  VdbeCovera
106d0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
106e0 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  dxLT );.      te
106f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
10700 64 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76  dxLE );  VdbeCov
10710 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
10720 50 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d  P_IdxLE );.    }
10730 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ..    if( pLoop-
10740 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10750 5f 49 4e 5f 45 41 52 4c 59 4f 55 54 20 29 7b 0a  _IN_EARLYOUT ){.
10760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
10780 65 6b 48 69 74 2c 20 69 49 64 78 43 75 72 2c 20  ekHit, iIdxCur, 
10790 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
107a0 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
107b0 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
107c0 69 72 65 64 20 2a 2f 0a 20 20 20 20 6f 6d 69 74  ired */.    omit
107d0 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e  Table = (pLoop->
107e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
107f0 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20  IDX_ONLY)!=0 .  
10800 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
10810 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
10820 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
10830 41 55 53 45 29 3d 3d 30 3b 0a 20 20 20 20 69 66  AUSE)==0;.    if
10840 28 20 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20  ( omitTable ){. 
10850 20 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20       /* pIdx is 
10860 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
10870 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63  .  No need to ac
10880 63 65 73 73 20 74 68 65 20 6d 61 69 6e 20 74 61  cess the main ta
10890 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  ble. */.    }els
108a0 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70  e if( HasRowid(p
108b0 49 64 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a  Idx->pTable) ){.
108c0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
108d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
108e0 57 48 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45  WHERE_SEEK_TABLE
108f0 29 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 20  ) || (.         
10900 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
10910 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 45 45  lags & WHERE_SEE
10920 4b 5f 55 4e 49 51 5f 54 41 42 4c 45 29 20 0a 20  K_UNIQ_TABLE) . 
10930 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
10940 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
10950 41 53 53 5f 53 49 4e 47 4c 45 29 0a 20 20 20 20  ASS_SINGLE).    
10960 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 69 52    )){.        iR
10970 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72  owidReg = ++pPar
10980 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
109a0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
109b0 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
109c0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20  widReg);.       
109d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109e0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
109f0 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 69 52 6f  ts, iCur, 0, iRo
10a00 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20  widReg);.       
10a10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10a30 20 20 20 20 20 20 20 63 6f 64 65 44 65 66 65 72         codeDefer
10a40 72 65 64 53 65 65 6b 28 70 57 49 6e 66 6f 2c 20  redSeek(pWInfo, 
10a50 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49 64 78  pIdx, iCur, iIdx
10a60 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
10a70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
10a80 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
10a90 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
10aa0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
10ab0 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
10ac0 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
10ad0 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
10ae0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
10af0 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
10b00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
10b10 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
10b20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
10b30 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
10b40 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
10b50 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
10b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10b70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10b80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
10b90 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
10ba0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
10bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10bc0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
10bd0 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
10be0 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
10c10 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
10c20 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10c30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 49   }..    /* If pI
10c40 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
10c50 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65 78  n one or more ex
10c60 70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20  pressions, then 
10c70 6c 6f 6f 6b 20 74 68 72 6f 75 67 68 0a 20 20 20  look through.   
10c80 20 2a 2a 20 61 6c 6c 20 74 68 65 20 65 78 70 72   ** all the expr
10c90 65 73 73 69 6f 6e 73 20 69 6e 20 70 57 49 6e 66  essions in pWInf
10ca0 6f 20 61 6e 64 20 74 72 79 20 74 6f 20 74 72 61  o and try to tra
10cb0 6e 73 66 6f 72 6d 20 6d 61 74 63 68 69 6e 67 20  nsform matching 
10cc0 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20 20 20  expressions.    
10cd0 2a 2a 20 69 6e 74 6f 20 72 65 66 65 72 65 6e 63  ** into referenc
10ce0 65 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  e to index colum
10cf0 6e 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns..    **.    *
10d00 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  * Do not do this
10d10 20 66 6f 72 20 74 68 65 20 52 48 53 20 6f 66 20   for the RHS of 
10d20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 54 68 69  a LEFT JOIN. Thi
10d30 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
10d40 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73   .    ** express
10d50 69 6f 6e 20 6d 61 79 20 62 65 20 65 76 61 6c 75  ion may be evalu
10d60 61 74 65 64 20 61 66 74 65 72 20 4f 50 5f 4e 75  ated after OP_Nu
10d70 6c 6c 52 6f 77 20 68 61 73 20 62 65 65 6e 20 65  llRow has been e
10d80 78 65 63 75 74 65 64 20 6f 6e 0a 20 20 20 20 2a  xecuted on.    *
10d90 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 20 49 6e  * the cursor. In
10da0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
10db0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 64 6f   important to do
10dc0 20 74 68 65 20 66 75 6c 6c 20 65 76 61 6c 75 61   the full evalua
10dd0 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 61 73 20  tion,.    ** as 
10de0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10df0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79  e expression may
10e00 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2c 20 65 76   not be NULL, ev
10e10 65 6e 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 0a  en if all table.
10e20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61      ** column va
10e30 6c 75 65 73 20 61 72 65 2e 20 20 68 74 74 70 73  lues are.  https
10e40 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
10e50 67 2f 73 72 63 2f 69 6e 66 6f 2f 37 66 61 38 30  g/src/info/7fa80
10e60 34 39 36 38 35 62 35 30 62 35 61 0a 20 20 20 20  49685b50b5a.    
10e70 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
10e80 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 77  do not do this w
10e90 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  hen processing o
10ea0 6e 65 20 69 6e 64 65 78 20 61 6e 20 61 20 6d 75  ne index an a mu
10eb0 6c 74 69 2d 69 6e 64 65 78 0a 20 20 20 20 2a 2a  lti-index.    **
10ec0 20 4f 52 20 63 6c 61 75 73 65 2c 20 73 69 6e 63   OR clause, sinc
10ed0 65 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  e the transforma
10ee0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 63 6f 6d 65  tion will become
10ef0 20 69 6e 76 61 6c 69 64 20 6f 6e 63 65 20 77 65   invalid once we
10f00 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 66 6f 72  .    ** move for
10f10 77 61 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ward to the next
10f20 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 68   index..    ** h
10f30 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  ttps://sqlite.or
10f40 67 2f 73 72 63 2f 69 6e 66 6f 2f 34 65 38 65 34  g/src/info/4e8e4
10f50 38 35 37 64 33 32 64 34 30 31 66 0a 20 20 20 20  857d32d401f.    
10f60 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
10f70 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
10f80 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
10f90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
10fa0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
10fb0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 49 6e  ){.      whereIn
10fc0 64 65 78 45 78 70 72 54 72 61 6e 73 28 70 49 64  dexExprTrans(pId
10fd0 78 2c 20 69 43 75 72 2c 20 69 49 64 78 43 75 72  x, iCur, iIdxCur
10fe0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  , pWInfo);.    }
10ff0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 70 61  ..    /* If a pa
11000 72 74 69 61 6c 20 69 6e 64 65 78 20 69 73 20 64  rtial index is d
11010 72 69 76 69 6e 67 20 74 68 65 20 6c 6f 6f 70 2c  riving the loop,
11020 20 74 72 79 20 74 6f 20 65 6c 69 6d 69 6e 61 74   try to eliminat
11030 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  e WHERE clause. 
11040 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
11050 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
11060 6d 75 73 74 20 62 65 20 74 72 75 65 20 64 75 65  must be true due
11070 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
11080 61 75 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  ause of.    ** t
11090 68 65 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  he partial index
110a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
110b0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
110c0 65 72 65 20 29 7b 0a 20 20 20 20 20 20 77 68 65  ere ){.      whe
110d0 72 65 41 70 70 6c 79 50 61 72 74 69 61 6c 49 6e  reApplyPartialIn
110e0 64 65 78 43 6f 6e 73 74 72 61 69 6e 74 73 28 70  dexConstraints(p
110f0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
11100 72 65 2c 20 69 43 75 72 2c 20 70 57 43 29 3b 0a  re, iCur, pWC);.
11110 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
11120 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
11130 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
11140 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
11150 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
11160 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11170 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
11180 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
11190 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
111a0 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
111b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
111c0 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
111d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
111e0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
111f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
11200 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
11210 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33  ;.    pLevel->p3
11220 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61   = (pLoop->wsFla
11230 67 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  gs&WHERE_UNQ_WAN
11240 54 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20  TED)!=0 ? 1:0;. 
11250 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
11260 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
11270 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b  ONSTRAINT)==0 ){
11280 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
11290 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
112a0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
112b0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
112c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
112d0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
112e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6d 69     }.    if( omi
112f0 74 54 61 62 6c 65 20 29 20 70 49 64 78 20 3d 20  tTable ) pIdx = 
11300 30 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  0;.  }else..#ifn
11310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11320 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
11330 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
11340 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
11350 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
11360 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
11370 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
11380 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
11390 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
113a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
113b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
113c0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
113d0 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
113e0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
113f0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
11400 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
11410 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
11420 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
11430 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
11440 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
11450 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
11460 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
11470 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
11480 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
11490 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
114a0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
114b0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
114c0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
114d0 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
114e0 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
114f0 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
11500 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
11510 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
11520 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
11530 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
11540 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
11550 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
11560 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
11570 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
11580 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
11590 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
115a0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
115b0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
115c0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
115d0 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
115e0 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
115f0 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
11600 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
11610 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
11620 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
11630 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
11640 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
11650 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
11660 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
11670 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
11680 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
11690 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
116a0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
116b0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
116c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
116d0 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
116e0 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
116f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
11700 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
11710 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
11720 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
11730 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
11740 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
11750 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
11760 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
11770 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
11780 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
11790 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
117a0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
117b0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
117c0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
117d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
117e0 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
11800 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
11810 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
11820 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
11830 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
11840 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
11850 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
11860 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
11870 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
11890 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
118a0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
118b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
118c0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
118d0 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
118e0 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
118f0 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
11900 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
11910 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
11920 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20  **.    ** Added 
11930 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74  2014-05-26: If t
11940 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49  he table is a WI
11950 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
11960 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75  e, then.    ** u
11970 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  se an ephemeral 
11980 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
11990 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63   a RowSet to rec
119a0 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a  ord the primary.
119b0 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74      ** keys of t
119c0 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20  he rows we have 
119d0 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20  already seen..  
119e0 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
119f0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
11a00 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
11a10 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
11a20 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
11a30 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
11a40 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
11a50 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
11a60 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
11a70 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
11a80 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
11a90 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
11aa0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
11ab0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
11ac0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
11ad0 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
11ae0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
11af0 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
11b00 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
11b10 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
11b20 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
11b30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
11b40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11b50 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
11b60 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
11b70 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
11b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11ba0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
11bb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
11bc0 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11bf0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
11c00 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
11c10 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
11c20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
11c30 61 72 73 65 29 3b 2f 2a 20 53 74 61 72 74 20 6f  arse);/* Start o
11c40 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
11c50 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c80 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
11c90 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
11ca0 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
11cb0 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
11cc0 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
11cd0 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
11ce0 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
11cf0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
11d20 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  r */.    u16 wct
11d30 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
11d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11d50 6c 61 67 73 20 66 6f 72 20 73 75 62 2d 57 48 45  lags for sub-WHE
11d60 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
11d70 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
11d80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11d90 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
11da0 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
11db0 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
11dc0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
11dd0 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 70 54  m->pTab;..    pT
11de0 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
11df0 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
11e00 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
11e10 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
11e20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
11e30 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
11e40 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
11e50 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
11e60 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
11e70 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
11e80 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
11e90 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
11ea0 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
11eb0 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
11ec0 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
11ed0 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
11ee0 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
11ef0 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
11f00 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
11f10 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
11f20 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
11f30 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
11f40 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
11f50 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
11f60 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
11f70 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
11f80 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
11f90 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
11fa0 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
11fb0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
11fc0 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
11fd0 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
11fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ff0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
12000 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
12010 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
12020 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12030 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
12040 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
12050 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
12060 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
12070 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
12080 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
12090 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
120a0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
120b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
120d0 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
120e0 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
120f0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
12100 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
12110 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
12120 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
12130 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
12140 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  u8)(nNotReady + 
12150 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
12160 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
12170 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
12180 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
12190 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
121a0 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
121b0 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
121c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
121d0 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
121e0 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
121f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
12200 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
12210 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
12220 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
12230 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
12240 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
12250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12260 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
12270 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
12280 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
12290 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
122a0 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
122b0 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
122c0 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
122d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
122e0 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20   empty rowset.  
122f0 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70  Or, create an ep
12300 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20  hemeral index.  
12310 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20    ** capable of 
12320 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20  holding primary 
12330 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65  keys in the case
12340 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
12350 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  WID..    **.    
12360 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
12370 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
12380 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
12390 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
123a0 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
123b0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
123c0 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
123d0 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
123e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
123f0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
12400 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
12410 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
12420 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
12430 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
12440 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
12450 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
12460 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
12470 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
12480 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
12490 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
124a0 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
124b0 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
124c0 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
124d0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
124e0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
124f0 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
12500 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
12510 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
12520 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
12530 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
12540 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
12550 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
12560 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
12570 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
12580 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
12590 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
125a0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
125b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
125c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
125d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
125e0 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
125f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12600 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
12610 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
12620 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
12630 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
12640 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  et = pParse->nTa
12650 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b++;.        sql
12660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12670 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12680 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70  al, regRowset, p
12690 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
126b0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
126c0 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20  arse, pPk);.    
126d0 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77    }.      regRow
126e0 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
126f0 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Mem;.    }.    i
12700 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
12710 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12720 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
12730 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
12740 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
12750 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
12760 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
12770 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
12780 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
12790 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
127a0 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
127b0 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
127c0 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
127d0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
127e0 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
127f0 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
12800 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
12810 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
12820 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
12830 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
12840 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
12850 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
12860 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12870 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
12880 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
12890 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
128a0 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
128b0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
128c0 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
128d0 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
128e0 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
128f0 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
12900 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
12910 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
12920 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
12930 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
12940 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
12950 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
12960 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
12970 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
12980 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
12990 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
129a0 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
129b0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
129c0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
129d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
129e0 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
129f0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
12a00 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
12a10 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
12a20 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
12a30 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
12a40 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
12a50 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
12a60 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
12a70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
12a80 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
12a90 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
12aa0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
12ab0 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
12ac0 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
12ad0 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
12ae0 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65  case( pWC->a[iTe
12af0 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45  rm].wtFlags & TE
12b00 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
12b10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12b20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
12b30 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
12b40 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ED );.        if
12b50 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
12b60 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  .wtFlags & (TERM
12b70 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
12b80 44 45 44 29 29 21 3d 30 20 29 20 63 6f 6e 74 69  DED))!=0 ) conti
12b90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
12ba0 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e   (pWC->a[iTerm].
12bb0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
12bc0 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  LL)==0 ) continu
12bd0 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
12be0 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72  ase( pWC->a[iTer
12bf0 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m].wtFlags & TER
12c00 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20  M_ORINFO );.    
12c10 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
12c20 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12c30 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
12c40 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
12c50 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
12c60 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
12c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c80 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
12c90 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
12ca0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
12cb0 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 7c 54  pParse, TK_AND|T
12cc0 4b 46 4c 47 5f 44 4f 4e 54 46 4f 4c 44 2c 20 30  KFLG_DONTFOLD, 0
12cd0 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
12ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12cf0 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61 74  /* Run a separat
12d00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
12d10 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  or each term of 
12d20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20 20  the OR clause.  
12d30 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69  After.    ** eli
12d40 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63 61  minating duplica
12d50 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 57  tes from other W
12d60 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74 68  HERE clauses, th
12d70 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  e action for eac
12d80 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48 45  h.    ** sub-WHE
12d90 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
12da0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61  to invoke the ma
12db0 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20  in loop body as 
12dc0 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20  a subroutine..  
12dd0 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46 6c    */.    wctrlFl
12de0 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 52 5f  ags =  WHERE_OR_
12df0 53 55 42 43 4c 41 55 53 45 20 7c 20 28 70 57 49  SUBCLAUSE | (pWI
12e00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
12e10 26 20 57 48 45 52 45 5f 53 45 45 4b 5f 54 41 42  & WHERE_SEEK_TAB
12e20 4c 45 29 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e  LE);.    Explain
12e30 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
12e40 65 2c 20 31 2c 20 22 4d 55 4c 54 49 2d 49 4e 44  e, 1, "MULTI-IND
12e50 45 58 20 4f 52 22 29 29 3b 0a 20 20 20 20 66 6f  EX OR"));.    fo
12e60 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
12e70 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
12e80 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
12e90 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
12ea0 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
12eb0 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
12ec0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
12ed0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
12ee0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
12ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
12f00 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
12f10 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
12f20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20  Info for single 
12f30 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a  OR-term scan */.
12f40 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
12f50 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d  rExpr = pOrTerm-
12f60 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72 65  >pExpr; /* Curre
12f70 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  nt OR clause ter
12f80 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  m */.        int
12f90 20 6a 6d 70 31 20 3d 20 30 3b 20 20 20 20 20 20   jmp1 = 0;      
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12fb0 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20  Address of jump 
12fc0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  operation */.   
12fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
12fe0 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69  abItem[0].fg.joi
12ff0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
13000 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
13010 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70    || ExprHasProp
13020 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45 50  erty(pOrExpr, EP
13030 5f 46 72 6f 6d 4a 6f 69 6e 29 20 0a 20 20 20 20  _FromJoin) .    
13040 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
13050 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
13060 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
13070 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
13080 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
13090 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
130a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
130b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
130c0 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
130d0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
130e0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
130f0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
13100 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
13110 31 2c 20 22 49 4e 44 45 58 20 25 64 22 2c 20 69  1, "INDEX %d", i
13120 69 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 57  i+1));.        W
13130 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
13140 2c 20 28 22 53 75 62 70 6c 61 6e 20 66 6f 72 20  , ("Subplan for 
13150 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e 22 29 29 3b  OR-clause:\n"));
13160 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
13170 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
13180 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
13190 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
131a0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
131d0 6c 46 6c 61 67 73 2c 20 69 43 6f 76 43 75 72 29  lFlags, iCovCur)
131e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
131f0 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
13200 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
13210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13230 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  SubWInfo ){.    
13240 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
13250 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20  *pSubLoop;.     
13260 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70       int addrExp
13270 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
13280 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
13290 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
132a0 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
132b0 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
132c0 5d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  ], 0.          )
132d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
132e0 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
132f0 74 61 74 75 73 28 76 2c 20 70 4f 72 54 61 62 2c  tatus(v, pOrTab,
13300 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
13310 5d 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b  ], addrExplain);
13320 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
13330 68 69 73 20 69 73 20 74 68 65 20 73 75 62 2d 57  his is the sub-W
13340 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f 64 79  HERE clause body
13350 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20 6f 76  .  First skip ov
13360 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
13370 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 66  duplicate rows f
13380 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
13390 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61 6e 64  ERE clauses, and
133a0 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20   record the.    
133b0 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 28        ** rowid (
133c0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  or PRIMARY KEY) 
133d0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
133e0 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68 65 20  row so that the 
133f0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
13400 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 73 6b  * row will be sk
13410 69 70 70 65 64 20 69 6e 20 73 75 62 73 65 71 75  ipped in subsequ
13420 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ent sub-WHERE cl
13430 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 20  auses..         
13440 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13450 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
13460 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
13470 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
13480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
13490 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d  nt iSet = ((ii==
134a0 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f  pOrWc->nTerm-1)?
134b0 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20  -1:ii);.        
134c0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
134d0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
134e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
134f0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
13500 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
13510 20 69 43 75 72 2c 20 2d 31 2c 20 72 65 67 52 6f   iCur, -1, regRo
13520 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
13530 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c 69 74      jmp1 = sqlit
13540 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
13550 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
13560 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 0a  , regRowset, 0,.
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77            regRow
135a0 69 64 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20  id, iSet);.     
135b0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
135c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
135d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
135e0 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
135f0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
13600 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
13610 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
13620 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50      int nPk = pP
13630 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
13640 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
13650 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
13660 20 69 6e 74 20 72 3b 0a 0a 20 20 20 20 20 20 20   int r;..       
13670 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
13680 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72  he PK into an ar
13690 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
136a0 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  sters. */.      
136b0 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
136c0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
136d0 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20  pParse, nPk);.  
136e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
136f0 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20  iPk=0; iPk<nPk; 
13700 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPk++){.        
13710 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
13720 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
13730 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  [iPk];.         
13740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13750 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
13760 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
13770 69 43 75 72 2c 20 69 43 6f 6c 2c 20 72 2b 69 50  iCur, iCol, r+iP
13780 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
13790 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
137a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
137b0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6c  he temp table al
137c0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 74  ready contains t
137d0 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c 0a  his key. If so,.
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
137f0 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c 72   the row has alr
13800 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75 64  eady been includ
13810 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
13820 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20 20   set and.       
13830 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65         ** can be
13840 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75 6d   ignored (by jum
13850 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47 6f  ping past the Go
13860 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68 65  sub below). Othe
13870 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20  rwise,.         
13880 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 74       ** insert t
13890 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20  he key into the 
138a0 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20 70  temp table and p
138b0 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f 63  roceed with proc
138c0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20 20  essing.         
138d0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 2e       ** the row.
138e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
138f0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *.              
13900 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20 74  ** Use some of t
13910 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a 61  he same optimiza
13920 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77 53  tions as OP_RowS
13930 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74 0a  etTest: If iSet.
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
13950 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d 65   is zero, assume
13960 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63 61   that the key ca
13970 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 20  nnot already be 
13980 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20  present in.     
13990 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
139a0 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64 20  temp table. And 
139b0 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20 61  if iSet is -1, a
139c0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72 65  ssume that there
139d0 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20 20   is no .        
139e0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
139f0 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
13a00 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
13a10 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 20  ble, as it will 
13a20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20 20  never .         
13a30 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74 65       ** be teste
13a40 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20 20  d for.  */ .    
13a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
13a60 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
13a70 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c        jmp1 = sql
13a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
13a90 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72  t(v, OP_Found, r
13aa0 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20  egRowset, 0, r, 
13ab0 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
13ac0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
13ad0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
13ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13af0 20 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30       if( iSet>=0
13b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13b20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
13b30 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20  Record, r, nPk, 
13b40 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
13b50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13b60 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
13b70 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
13b80 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52   regRowset, regR
13b90 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 20 20 20 20 20 20 20 20 72 2c 20 6e 50             r, nP
13bc0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
13bd0 20 20 20 20 69 66 28 20 69 53 65 74 20 29 20 73      if( iSet ) s
13be0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13bf0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
13c00 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
13c10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
13c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13c30 65 6c 65 61 73 65 20 74 68 65 20 61 72 72 61 79  elease the array
13c40 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74 65   of temp registe
13c50 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
13c60 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
13c70 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
13c80 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20  se, r, nPk);.   
13c90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13ca0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
13cb0 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
13cc0 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61  main loop body a
13cd0 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  s a subroutine *
13ce0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
13cf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d00 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
13d10 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
13d20 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
13d30 4a 75 6d 70 20 68 65 72 65 20 28 73 6b 69 70 70  Jump here (skipp
13d40 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  ing the main loo
13d50 70 20 62 6f 64 79 20 73 75 62 72 6f 75 74 69 6e  p body subroutin
13d60 65 29 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  e) if the.      
13d70 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
13d80 75 62 2d 57 48 45 52 45 20 72 6f 77 20 69 73 20  ub-WHERE row is 
13d90 61 20 64 75 70 6c 69 63 61 74 65 20 66 72 6f 6d  a duplicate from
13da0 20 70 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45   prior sub-WHERE
13db0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
13dc0 69 66 28 20 6a 6d 70 31 20 29 20 73 71 6c 69 74  if( jmp1 ) sqlit
13dd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13de0 2c 20 6a 6d 70 31 29 3b 0a 0a 20 20 20 20 20 20  , jmp1);..      
13df0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
13e00 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
13e10 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
13e20 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
13e30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
13e40 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
13e50 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
13e60 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
13e70 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
13e80 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
13e90 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
13ea0 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
13eb0 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
13ec0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
13ed0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
13ee0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
13ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13f00 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
13f10 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
13f20 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
13f30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
13f40 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
13f50 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
13f60 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
13f70 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
13f80 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
13f90 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
13fa0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
13fb0 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
13fc0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
13fd0 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
13fe0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
13ff0 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
14000 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
14010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
14020 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
14030 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
14040 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
14050 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
14060 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
14070 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
14080 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
14090 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
140a0 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
140b0 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
140c0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
140d0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
140e0 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
140f0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
14100 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
14110 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
14120 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
14130 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
14140 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
14150 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
14160 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
14170 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
14180 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
14190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
141a0 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
141b0 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
141c0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
141d0 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
141e0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
141f0 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
14200 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14210 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
14220 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
14230 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
14240 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
14250 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14260 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
14270 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14280 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
14290 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
142a0 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
142b0 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
142c0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
142d0 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
142e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48 61            && (Ha
142f0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
14300 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
14310 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  ex(pSubLoop->u.b
14320 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20  tree.pIndex)).  
14330 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
14340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14350 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69  SubWInfo->a[0].i
14360 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20  IdxCur==iCovCur 
14370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
14380 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e  Cov = pSubLoop->
14390 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
143a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
143b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
143c0 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
143d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
143e0 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
143f0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
14400 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
14410 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
14420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
14430 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
14440 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
14450 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
14460 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
14470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14480 7d 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70 6c  }.    }.    Expl
14490 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
144a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 4c 65  pParse);.    pLe
144b0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d  vel->u.pCovidx =
144c0 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70   pCov;.    if( p
144d0 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49  Cov ) pLevel->iI
144e0 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b  dxCur = iCovCur;
144f0 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70  .    if( pAndExp
14500 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45  r ){.      pAndE
14510 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
14520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14530 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64  rDelete(db, pAnd
14540 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
14550 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14560 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
14570 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
14580 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
14590 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
145a0 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
145b0 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
145c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
145d0 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
145e0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
145f0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
14600 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
14610 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
14620 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
14630 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
14640 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
14650 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
14660 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
14670 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
14680 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
14690 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
146a0 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
146b0 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
146c0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
146d0 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
146e0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
146f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
14700 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
14710 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
14720 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
14730 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
14740 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
14750 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
14760 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
14770 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
14780 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
14790 61 62 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63  abItem->fg.isRec
147a0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
147b0 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64  /* Tables marked
147c0 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61 76   isRecursive hav
147d0 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
147e0 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f 72  row that is stor
147f0 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ed in.      ** a
14800 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20   pseudo-cursor. 
14810 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69   No need to Rewi
14820 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20  nd or Next such 
14830 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20  cursors. */.    
14840 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
14850 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
14860 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 43 75 72  e{.      codeCur
14870 73 6f 72 48 69 6e 74 28 70 54 61 62 49 74 65 6d  sorHint(pTabItem
14880 2c 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c  , pWInfo, pLevel
14890 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  , 0);.      pLev
148a0 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
148b0 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76  Rev];.      pLev
148c0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
148d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
148e0 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
148f0 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
14900 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
14910 64 64 72 48 61 6c 74 29 3b 0a 20 20 20 20 20 20  ddrHalt);.      
14920 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
14930 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
14940 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
14950 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
14960 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
14970 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
14980 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
14990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
149a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
149b0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
149c0 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  S.  pLevel->addr
149d0 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65 33 56  Visit = sqlite3V
149e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
149f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
14a00 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
14a10 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
14a20 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
14a30 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
14a40 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
14a50 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
14a60 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
14a70 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
14a80 70 20 6d 61 79 20 72 75 6e 20 62 65 74 77 65 65  p may run betwee
14a90 6e 20 6f 6e 65 20 61 6e 64 20 74 68 72 65 65 20  n one and three 
14aa0 74 69 6d 65 73 2c 20 64 65 70 65 6e 64 69 6e 67  times, depending
14ab0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e   on the.  ** con
14ac0 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 67  straints to be g
14ad0 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 76 61  enerated. The va
14ae0 6c 75 65 20 6f 66 20 73 74 61 63 6b 20 76 61 72  lue of stack var
14af0 69 61 62 6c 65 20 69 4c 6f 6f 70 0a 20 20 2a 2a  iable iLoop.  **
14b00 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
14b10 63 6f 6e 73 74 72 61 69 6e 74 73 20 63 6f 64 65  constraints code
14b20 64 20 62 79 20 65 61 63 68 20 69 74 65 72 61 74  d by each iterat
14b30 69 6f 6e 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ion, as follows:
14b40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 4c 6f 6f 70  .  **.  ** iLoop
14b50 3d 3d 31 3a 20 43 6f 64 65 20 6f 6e 6c 79 20 65  ==1: Code only e
14b60 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
14b70 61 72 65 20 65 6e 74 69 72 65 6c 79 20 63 6f 76  are entirely cov
14b80 65 72 65 64 20 62 79 20 70 49 64 78 2e 0a 20 20  ered by pIdx..  
14b90 2a 2a 20 69 4c 6f 6f 70 3d 3d 32 3a 20 43 6f 64  ** iLoop==2: Cod
14ba0 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 78 70 72  e remaining expr
14bb0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 64 6f 20  essions that do 
14bc0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63 6f 72 72  not contain corr
14bd0 65 6c 61 74 65 64 0a 20 20 2a 2a 20 20 20 20 20  elated.  **     
14be0 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
14bf0 73 2e 20 20 0a 20 20 2a 2a 20 69 4c 6f 6f 70 3d  s.  .  ** iLoop=
14c00 3d 33 3a 20 43 6f 64 65 20 61 6c 6c 20 72 65 6d  =3: Code all rem
14c10 61 69 6e 69 6e 67 20 65 78 70 72 65 73 73 69 6f  aining expressio
14c20 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ns..  **.  ** An
14c30 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
14c40 74 6f 20 73 6b 69 70 20 75 6e 6e 65 63 65 73 73  to skip unnecess
14c50 61 72 79 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ary iterations o
14c60 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2f  f the loop..  */
14c70 0a 20 20 69 4c 6f 6f 70 20 3d 20 28 70 49 64 78  .  iLoop = (pIdx
14c80 20 3f 20 31 20 3a 20 32 29 3b 0a 20 20 64 6f 7b   ? 1 : 2);.  do{
14c90 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 20 3d  .    int iNext =
14ca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14cb0 20 20 20 2f 2a 20 4e 65 78 74 20 76 61 6c 75 65     /* Next value
14cc0 20 66 6f 72 20 69 4c 6f 6f 70 20 2a 2f 0a 20 20   for iLoop */.  
14cd0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
14ce0 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
14cf0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
14d00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  m++){.      Expr
14d10 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20   *pE;.      int 
14d20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 30  skipLikeAddr = 0
14d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d40 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
14d50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
14d60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d70 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
14d80 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
14d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
14da0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
14db0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
14dc0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
14dd0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
14de0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
14df0 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
14e00 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)!=0 ){.       
14e10 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
14e20 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
14e30 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
14e40 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
14e50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
14e60 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
14e70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
14e80 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
14e90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 1;.        co
14ea0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
14eb0 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
14ec0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
14ed0 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
14ee0 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49        if( (pTabI
14ef0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
14f00 26 4a 54 5f 4c 45 46 54 29 20 26 26 20 21 45 78  &JT_LEFT) && !Ex
14f10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14f20 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
14f30 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
14f40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
14f50 20 0a 20 20 20 20 20 20 69 66 28 20 69 4c 6f 6f   .      if( iLoo
14f60 70 3d 3d 31 20 26 26 20 21 73 71 6c 69 74 65 33  p==1 && !sqlite3
14f70 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
14f80 65 78 28 70 45 2c 20 70 4c 65 76 65 6c 2d 3e 69  ex(pE, pLevel->i
14f90 54 61 62 43 75 72 2c 20 70 49 64 78 29 20 29 7b  TabCur, pIdx) ){
14fa0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 20 3d  .        iNext =
14fb0 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
14fc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
14fd0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 33 20      if( iLoop<3 
14fe0 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
14ff0 67 73 20 26 20 54 45 52 4d 5f 56 41 52 53 45 4c  gs & TERM_VARSEL
15000 45 43 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ECT) ){.        
15010 69 66 28 20 69 4e 65 78 74 3d 3d 30 20 29 20 69  if( iNext==0 ) i
15020 4e 65 78 74 20 3d 20 33 3b 0a 20 20 20 20 20 20  Next = 3;.      
15030 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15040 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28    }..      if( (
15050 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15060 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 29 21   TERM_LIKECOND)!
15070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
15080 20 49 66 20 74 68 65 20 54 45 52 4d 5f 4c 49 4b   If the TERM_LIK
15090 45 43 4f 4e 44 20 66 6c 61 67 20 69 73 20 73 65  ECOND flag is se
150a0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
150b0 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 65 61  at the range sea
150c0 72 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rch.        ** i
150d0 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
150e0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
150f0 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
15100 20 69 73 20 74 72 75 65 2c 20 73 6f 20 77 65 0a   is true, so we.
15110 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 73          ** can s
15120 6b 69 70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  kip the call to 
15130 74 68 65 20 6c 69 6b 65 28 41 2c 42 29 20 66 75  the like(A,B) fu
15140 6e 63 74 69 6f 6e 2e 20 20 42 75 74 20 74 68 69  nction.  But thi
15150 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 0a 20 20 20  s only works.   
15160 20 20 20 20 20 2a 2a 20 66 6f 72 20 73 74 72 69       ** for stri
15170 6e 67 73 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ngs.  So do not 
15180 73 6b 69 70 20 74 68 65 20 63 61 6c 6c 20 74 6f  skip the call to
15190 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   the function on
151a0 20 74 68 65 20 70 61 73 73 0a 20 20 20 20 20 20   the pass.      
151b0 20 20 2a 2a 20 74 68 61 74 20 63 6f 6d 70 61 72    ** that compar
151c0 65 73 20 42 4c 4f 42 73 2e 20 2a 2f 0a 23 69 66  es BLOBs. */.#if
151d0 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
151e0 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
151f0 42 53 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  BS.        conti
15200 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  nue;.#else.     
15210 20 20 20 75 33 32 20 78 20 3d 20 70 4c 65 76 65     u32 x = pLeve
15220 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3b  l->iLikeRepCntr;
15230 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 30  .        if( x>0
15240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 6b   ){.          sk
15250 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73 71 6c  ipLikeAddr = sql
15260 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15270 2c 20 28 78 26 31 29 3f 4f 50 5f 49 66 4e 6f 74  , (x&1)?OP_IfNot
15280 3a 4f 50 5f 49 66 2c 28 69 6e 74 29 28 78 3e 3e  :OP_If,(int)(x>>
15290 31 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1));.        }. 
152a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
152b0 61 67 65 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20  age(v);.#endif. 
152c0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 57 48       }.#ifdef WH
152d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
152e0 20 2f 2a 20 30 78 66 66 66 66 20 2a 2f 0a 20 20   /* 0xffff */.  
152f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
15300 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
15310 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
15320 6d 65 6e 74 28 28 76 2c 20 22 57 68 65 72 65 54  ment((v, "WhereT
15330 65 72 6d 5b 25 64 5d 20 28 25 70 29 20 70 72 69  erm[%d] (%p) pri
15340 6f 72 69 74 79 3d 25 64 22 2c 0a 20 20 20 20 20  ority=%d",.     
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2d 6a      pWC->nTerm-j
15370 2c 20 70 54 65 72 6d 2c 20 69 4c 6f 6f 70 29 29  , pTerm, iLoop))
15380 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
15390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
153a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
153b0 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
153c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
153d0 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 6b  L);.      if( sk
153e0 69 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71 6c  ipLikeAddr ) sql
153f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15400 28 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64 72  (v, skipLikeAddr
15410 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
15420 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
15430 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  CODED;.    }.   
15440 20 69 4c 6f 6f 70 20 3d 20 69 4e 65 78 74 3b 0a   iLoop = iNext;.
15450 20 20 7d 77 68 69 6c 65 28 20 69 4c 6f 6f 70 3e    }while( iLoop>
15460 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  0 );..  /* Inser
15470 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
15480 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
15490 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
154a0 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
154b0 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
154c0 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
154d0 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
154e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
154f0 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
15500 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
15510 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
15520 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
15530 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
15540 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
15550 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
15560 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
15570 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
15580 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
15590 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
155a0 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
155b0 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
155c0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
155d0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
155e0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
155f0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
15600 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 73 45      Expr *pE, sE
15610 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  Alt;.    WhereTe
15620 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66  rm *pAlt;.    if
15630 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15640 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
15650 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
15660 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15670 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
15680 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
15690 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
156a0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
156b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
156c0 4f 5f 45 51 55 49 56 29 3d 3d 30 20 29 20 63 6f  O_EQUIV)==0 ) co
156d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
156e0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
156f0 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
15700 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
15710 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
15720 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
15730 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
15740 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
15750 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15760 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
15770 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
15780 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
15790 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  t & pLevel->notR
157a0 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
157b0 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 57 68  pAlt = sqlite3Wh
157c0 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
157d0 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
157e0 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
157f0 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
15800 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51 7c            WO_EQ|
15810 57 4f 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_IN|WO_IS, 0);
15820 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
15830 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15840 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
15850 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
15860 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
15870 20 20 69 66 28 20 28 70 41 6c 74 2d 3e 65 4f 70    if( (pAlt->eOp
15880 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
15890 0a 20 20 20 20 20 26 26 20 28 70 41 6c 74 2d 3e  .     && (pAlt->
158a0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
158b0 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
158c0 20 20 26 26 20 28 70 41 6c 74 2d 3e 70 45 78 70    && (pAlt->pExp
158d0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
158e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 29 0a 20  List->nExpr>1). 
158f0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74     ){.      cont
15900 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
15910 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
15920 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
15930 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
15940 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
15950 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
15960 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
15970 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15980 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d  _IN );.    VdbeM
15990 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
159a0 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69   "begin transiti
159b0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29  ve constraint"))
159c0 3b 0a 20 20 20 20 73 45 41 6c 74 20 3d 20 2a 70  ;.    sEAlt = *p
159d0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
159e0 73 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20 70 45  sEAlt.pLeft = pE
159f0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c  ->pLeft;.    sql
15a00 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15a10 70 50 61 72 73 65 2c 20 26 73 45 41 6c 74 2c 20  pParse, &sEAlt, 
15a20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
15a30 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
15a40 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
15a50 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
15a60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
15a70 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
15a80 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
15a90 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
15aa0 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
15ab0 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
15ac0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
15ad0 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
15ae0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
15af0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
15b00 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
15b10 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15b20 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
15b30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15b40 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
15b50 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
15b60 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
15b70 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
15b80 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
15b90 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
15ba0 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
15bb0 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
15bc0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
15bd0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
15be0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
15bf0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
15c00 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
15c10 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
15c20 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
15c30 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15c40 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
15c50 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
15c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
15c70 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
15c80 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
15c90 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
15ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15cb0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
15cc0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
15cd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15ce0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
15cf0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
15d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15d10 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
15d20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
15d30 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
15d40 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
15d50 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
15d60 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
15d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
15d80 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
15d90 52 65 61 64 79 3b 0a 7d 0a                       Ready;.}.