/ Hex Artifact Content
Login

Artifact 0e76672930bea322eb3606d891a4744be55c09bcd3a995bfd501af62a46e0625:


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 70 50 61 72 73 65 2c 20 70 45 78 70 72  nd(pParse, pExpr
92e0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
92f0: 28 64 62 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  (db, pTerm->pExp
9300: 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66  r, 0));.  }.  if
9310: 28 20 70 45 78 70 72 21 3d 30 20 29 7b 0a 20 20  ( pExpr!=0 ){.  
9320: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
9330: 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65 43 75  allback = codeCu
9340: 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70 72 3b  rsorHintFixExpr;
9350: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
9360: 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
9370: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
9380: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9390: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 2c 20 0a  OP_CursorHint, .
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 28 73 48 69 6e 74 2e 70 49 64        (sHint.pId
93c0: 78 20 3f 20 73 48 69 6e 74 2e 69 49 64 78 43 75  x ? sHint.iIdxCu
93d0: 72 20 3a 20 73 48 69 6e 74 2e 69 54 61 62 43 75  r : sHint.iTabCu
93e0: 72 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r), 0, 0,.      
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 45 78  (const char*)pEx
9410: 70 72 2c 20 50 34 5f 45 58 50 52 29 3b 0a 20 20  pr, P4_EXPR);.  
9420: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
9430: 6e 65 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e  ne codeCursorHin
9440: 74 28 41 2c 42 2c 43 2c 44 29 20 20 2f 2a 20 4e  t(A,B,C,D)  /* N
9450: 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  o-op */.#endif /
9460: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
9470: 43 55 52 53 4f 52 5f 48 49 4e 54 53 20 2a 2f 0a  CURSOR_HINTS */.
9480: 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 69 43  ./*.** Cursor iC
9490: 75 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  ur is open on an
94a0: 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 28   intkey b-tree (
94b0: 61 20 74 61 62 6c 65 29 2e 20 52 65 67 69 73 74  a table). Regist
94c0: 65 72 20 69 52 6f 77 69 64 20 63 6f 6e 74 61 69  er iRowid contai
94d0: 6e 73 0a 2a 2a 20 61 20 72 6f 77 69 64 20 76 61  ns.** a rowid va
94e0: 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  lue just read fr
94f0: 6f 6d 20 63 75 72 73 6f 72 20 69 49 64 78 43 75  om cursor iIdxCu
9500: 72 2c 20 6f 70 65 6e 20 6f 6e 20 69 6e 64 65 78  r, open on index
9510: 20 70 49 64 78 2e 20 54 68 69 73 0a 2a 2a 20 66   pIdx. This.** f
9520: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
9530: 73 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 20 64  s code to do a d
9540: 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f 66 20  eferred seek of 
9550: 63 75 72 73 6f 72 20 69 43 75 72 20 74 6f 20 74  cursor iCur to t
9560: 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20 73 74 6f  he .** rowid sto
9570: 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
9580: 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  iRowid..**.** No
9590: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  rmally, this is 
95a0: 6a 75 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 50  just:.**.**   OP
95b0: 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20 24 69  _DeferredSeek $i
95c0: 43 75 72 20 24 69 52 6f 77 69 64 0a 2a 2a 0a 2a  Cur $iRowid.**.*
95d0: 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
95e0: 65 20 73 63 61 6e 20 63 75 72 72 65 6e 74 6c 79  e scan currently
95f0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73 20   being coded is 
9600: 61 20 62 72 61 6e 63 68 20 6f 66 20 61 6e 20 4f  a branch of an O
9610: 52 2d 6c 6f 6f 70 20 61 6e 64 0a 2a 2a 20 74 68  R-loop and.** th
9620: 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
9630: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 64 65  ently being code
9640: 64 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 74  d is a SELECT, t
9650: 68 65 6e 20 50 33 20 6f 66 20 4f 50 5f 44 65 66  hen P3 of OP_Def
9660: 65 72 72 65 64 53 65 65 6b 0a 2a 2a 20 69 73 20  erredSeek.** is 
9670: 73 65 74 20 74 6f 20 69 49 64 78 43 75 72 20 61  set to iIdxCur a
9680: 6e 64 20 50 34 20 69 73 20 73 65 74 20 74 6f 20  nd P4 is set to 
9690: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61  point to an arra
96a0: 79 20 6f 66 20 69 6e 74 65 67 65 72 73 0a 2a 2a  y of integers.**
96b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 65 20   containing one 
96c0: 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 63  entry for each c
96d0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
96e0: 6c 65 20 63 75 72 73 6f 72 20 69 43 75 72 20 69  le cursor iCur i
96f0: 73 20 6f 70 65 6e 20 0a 2a 2a 20 6f 6e 2e 20 46  s open .** on. F
9700: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 63 6f  or each table co
9710: 6c 75 6d 6e 2c 20 69 66 20 74 68 65 20 63 6f 6c  lumn, if the col
9720: 75 6d 6e 20 69 73 20 74 68 65 20 69 27 74 68 20  umn is the i'th 
9730: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a  column of the .*
9740: 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68  * index, then th
9750: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9760: 61 72 72 61 79 20 65 6e 74 72 79 20 69 73 20 73  array entry is s
9770: 65 74 20 74 6f 20 28 69 2b 31 29 2e 20 49 66 20  et to (i+1). If 
9780: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 64 6f  the column.** do
9790: 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
97a0: 20 74 68 65 20 69 6e 64 65 78 20 61 74 20 61 6c   the index at al
97b0: 6c 2c 20 74 68 65 20 61 72 72 61 79 20 65 6e 74  l, the array ent
97c0: 72 79 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ry is set to 0..
97d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
97e0: 6f 64 65 44 65 66 65 72 72 65 64 53 65 65 6b 28  odeDeferredSeek(
97f0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
9800: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
9810: 20 20 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75     /* Where clau
9820: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
9830: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 2f 2a 20 49 6e 64 65 78 20 73 63 61 6e 20 69 73  /* Index scan is
9860: 20 75 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20   using */.  int 
9870: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9890: 75 72 73 6f 72 20 66 6f 72 20 49 50 4b 20 62 2d  ursor for IPK b-
98a0: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  tree */.  int iI
98b0: 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
98c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
98d0: 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ex cursor */.){.
98e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
98f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
9900: 3b 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65  ; /* Parse conte
9910: 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  xt */.  Vdbe *v 
9920: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9930: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
9940: 74 6f 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  to generate code
9950: 20 77 69 74 68 69 6e 20 2a 2f 0a 0a 20 20 61 73   within */..  as
9960: 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 30 20  sert( iIdxCur>0 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
9980: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 49 64 78  x->aiColumn[pIdx
9990: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 2d 31  ->nColumn-1]==-1
99a0: 20 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33   );.  .  sqlite3
99b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
99c0: 5f 44 65 66 65 72 72 65 64 53 65 65 6b 2c 20 69  _DeferredSeek, i
99d0: 49 64 78 43 75 72 2c 20 30 2c 20 69 43 75 72 29  IdxCur, 0, iCur)
99e0: 3b 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  ;.  if( (pWInfo-
99f0: 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
9a00: 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
9a10: 29 0a 20 20 20 26 26 20 44 62 4d 61 73 6b 41 6c  ).   && DbMaskAl
9a20: 6c 5a 65 72 6f 28 73 71 6c 69 74 65 33 50 61 72  lZero(sqlite3Par
9a30: 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
9a40: 65 29 2d 3e 77 72 69 74 65 4d 61 73 6b 29 0a 20  e)->writeMask). 
9a50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
9a60: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
9a70: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9a80: 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 28 69 6e     int *ai = (in
9a90: 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
9aa0: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
9ab0: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
9ac0: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a  pTab->nCol+1));.
9ad0: 20 20 20 20 69 66 28 20 61 69 20 29 7b 0a 20 20      if( ai ){.  
9ae0: 20 20 20 20 61 69 5b 30 5d 20 3d 20 70 54 61 62      ai[0] = pTab
9af0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f  ->nCol;.      fo
9b00: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
9b10: 43 6f 6c 75 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a  Column-1; i++){.
9b20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9b30: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
9b40: 5d 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ]<pTab->nCol );.
9b50: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
9b60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
9b70: 20 29 20 61 69 5b 70 49 64 78 2d 3e 61 69 43 6f   ) ai[pIdx->aiCo
9b80: 6c 75 6d 6e 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31  lumn[i]+1] = i+1
9b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ba0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9bb0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
9bc0: 2a 29 61 69 2c 20 50 34 5f 49 4e 54 41 52 52 41  *)ai, P4_INTARRA
9bd0: 59 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Y);.    }.  }.}.
9be0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
9bf0: 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20  pression passed 
9c00: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
9c10: 67 75 6d 65 6e 74 20 69 73 20 61 20 76 65 63 74  gument is a vect
9c20: 6f 72 2c 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20  or, generate.** 
9c30: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
9c40: 65 20 66 69 72 73 74 20 6e 52 65 67 20 65 6c 65  e first nReg ele
9c50: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 76 65 63  ments of the vec
9c60: 74 6f 72 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  tor into an arra
9c70: 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72  y.** of register
9c80: 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
9c90: 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iReg..**.** If t
9ca0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9cb0: 20 6e 6f 74 20 61 20 76 65 63 74 6f 72 2c 20 74   not a vector, t
9cc0: 68 65 6e 20 6e 52 65 67 20 6d 75 73 74 20 62 65  hen nReg must be
9cd0: 20 70 61 73 73 65 64 20 31 2e 20 49 6e 0a 2a 2a   passed 1. In.**
9ce0: 20 74 68 69 73 20 63 61 73 65 2c 20 67 65 6e 65   this case, gene
9cf0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
9d00: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
9d10: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74  sion and leave t
9d20: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  he.** result in 
9d30: 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
9d40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
9d50: 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72 28 50  deExprOrVector(P
9d60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9d70: 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 2c  pr *p, int iReg,
9d80: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
9d90: 73 65 72 74 28 20 6e 52 65 67 3e 30 20 29 3b 0a  sert( nReg>0 );.
9da0: 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74    if( p && sqlit
9db0: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
9dc0: 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ) ){.#ifndef SQL
9dd0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9de0: 59 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 6c  Y.    if( (p->fl
9df0: 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
9e00: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62  ct) ){.      Vdb
9e10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9e20: 56 64 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Vdbe;.      int 
9e30: 69 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 61  iSelect;.      a
9e40: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
9e50: 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
9e60: 20 69 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74   iSelect = sqlit
9e70: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
9e80: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
9e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ea0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
9eb0: 69 53 65 6c 65 63 74 2c 20 69 52 65 67 2c 20 6e  iSelect, iReg, n
9ec0: 52 65 67 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  Reg-1);.    }els
9ed0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
9ee0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9ef0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9f00: 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a  t = p->x.pList;.
9f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
9f20: 65 67 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  eg<=pList->nExpr
9f30: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
9f40: 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b  0; i<nReg; i++){
9f50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9f60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9f70: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
9f80: 70 72 2c 20 69 52 65 67 2b 69 29 3b 0a 20 20 20  pr, iReg+i);.   
9f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9fa0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9fb0: 6e 52 65 67 3d 3d 31 20 29 3b 0a 20 20 20 20 73  nReg==1 );.    s
9fc0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
9fd0: 50 61 72 73 65 2c 20 70 2c 20 69 52 65 67 29 3b  Parse, p, iReg);
9fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 69 6e  .  }.}../* An in
9ff0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 49 64  stance of the Id
a000: 78 45 78 70 72 54 72 61 6e 73 20 6f 62 6a 65 63  xExprTrans objec
a010: 74 20 63 61 72 72 69 65 73 20 69 6e 66 6f 72 6d  t carries inform
a020: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
a030: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 61 6e   mapping from an
a040: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
a050: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 74  able columns int
a060: 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e  o a column in an
a070: 20 69 6e 64 65 78 0a 2a 2a 20 64 6f 77 6e 20 74   index.** down t
a080: 68 72 6f 75 67 68 20 74 68 65 20 57 61 6c 6b 65  hrough the Walke
a090: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
a0a0: 72 75 63 74 20 49 64 78 45 78 70 72 54 72 61 6e  ruct IdxExprTran
a0b0: 73 20 7b 0a 20 20 45 78 70 72 20 2a 70 49 64 78  s {.  Expr *pIdx
a0c0: 45 78 70 72 3b 20 20 20 20 2f 2a 20 54 68 65 20  Expr;    /* The 
a0d0: 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
a0e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
a0f0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
a100: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63 6f  cursor of the co
a110: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
a120: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
a130: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
a140: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
a150: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
a160: 49 64 78 43 6f 6c 3b 20 20 20 20 20 20 20 2f 2a  IdxCol;       /*
a170: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   The column for 
a180: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 20 49  the index */.} I
a190: 64 78 45 78 70 72 54 72 61 6e 73 3b 0a 0a 2f 2a  dxExprTrans;../*
a1a0: 20 54 68 65 20 77 61 6c 6b 65 72 20 6e 6f 64 65   The walker node
a1b0: 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 74   callback used t
a1c0: 6f 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74 63  o transform matc
a1d0: 68 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  hing expressions
a1e0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 66 65 72   into.** a refer
a1f0: 65 6e 63 65 20 74 6f 20 61 6e 20 69 6e 64 65 78  ence to an index
a200: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6e 20 69   column for an i
a210: 6e 64 65 78 20 6f 6e 20 61 6e 20 65 78 70 72 65  ndex on an expre
a220: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
a230: 70 45 78 70 72 20 6d 61 74 63 68 65 73 2c 20 74  pExpr matches, t
a240: 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 69 74  hen transform it
a250: 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e 63   into a referenc
a260: 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 63  e to the index c
a270: 6f 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 63 6f  olumn.** that co
a280: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
a290: 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74   of pExpr..*/.st
a2a0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
a2b0: 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64 65  dexExprTransNode
a2c0: 28 57 61 6c 6b 65 72 20 2a 70 2c 20 45 78 70 72  (Walker *p, Expr
a2d0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 49 64 78 45   *pExpr){.  IdxE
a2e0: 78 70 72 54 72 61 6e 73 20 2a 70 58 20 3d 20 70  xprTrans *pX = p
a2f0: 2d 3e 75 2e 70 49 64 78 54 72 61 6e 73 3b 0a 20  ->u.pIdxTrans;. 
a300: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
a310: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
a320: 2c 20 70 58 2d 3e 70 49 64 78 45 78 70 72 2c 20  , pX->pIdxExpr, 
a330: 70 58 2d 3e 69 54 61 62 43 75 72 29 3d 3d 30 20  pX->iTabCur)==0 
a340: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  ){.    pExpr->op
a350: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
a360: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
a370: 3d 20 70 58 2d 3e 69 49 64 78 43 75 72 3b 0a 20  = pX->iIdxCur;. 
a380: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
a390: 6e 20 3d 20 70 58 2d 3e 69 49 64 78 43 6f 6c 3b  n = pX->iIdxCol;
a3a0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54  .    pExpr->y.pT
a3b0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ab = 0;.    retu
a3c0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
a3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
a3e0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
a3f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72    }.}../*.** For
a400: 20 61 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20 65   an indexes on e
a410: 78 70 72 65 73 73 69 6f 6e 20 58 2c 20 6c 6f 63  xpression X, loc
a420: 61 74 65 20 65 76 65 72 79 20 69 6e 73 74 61 6e  ate every instan
a430: 63 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  ce of expression
a440: 20 58 0a 2a 2a 20 69 6e 20 70 45 78 70 72 20 61   X.** in pExpr a
a450: 6e 64 20 63 68 61 6e 67 65 20 74 68 61 74 20 73  nd change that s
a460: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  ubexpression int
a470: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  o a reference to
a480: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
a490: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
a4a0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  e index..*/.stat
a4b0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 64  ic void whereInd
a4c0: 65 78 45 78 70 72 54 72 61 6e 73 28 0a 20 20 49  exExprTrans(.  I
a4d0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
a4e0: 20 2f 2a 20 54 68 65 20 49 6e 64 65 78 20 2a 2f   /* The Index */
a4f0: 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
a500: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
a510: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
a520: 20 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65   is being indexe
a530: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  d */.  int iIdxC
a540: 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
a550: 6f 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  or of the index 
a560: 69 74 73 65 6c 66 20 2a 2f 0a 20 20 57 68 65 72  itself */.  Wher
a570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 2f 2a  eInfo *pWInfo /*
a580: 20 54 72 61 6e 73 66 6f 72 6d 20 65 78 70 72 65   Transform expre
a590: 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 57  ssions in this W
a5a0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
a5b0: 7b 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 3b  {.  int iIdxCol;
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
a5e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
a5f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c    ExprList *aCol
a600: 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
a610: 45 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  Expressions that
a620: 20 61 72 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a   are indexed */.
a630: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 49 64    Walker w;.  Id
a640: 78 45 78 70 72 54 72 61 6e 73 20 78 3b 0a 20 20  xExprTrans x;.  
a650: 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 64 78 2d  aColExpr = pIdx-
a660: 3e 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 66 28  >aColExpr;.  if(
a670: 20 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 72   aColExpr==0 ) r
a680: 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 20 61  eturn;  /* Not a
a690: 6e 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65  n index on expre
a6a0: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 6d 65 6d 73  ssions */.  mems
a6b0: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
a6c0: 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
a6d0: 61 6c 6c 62 61 63 6b 20 3d 20 77 68 65 72 65 49  allback = whereI
a6e0: 6e 64 65 78 45 78 70 72 54 72 61 6e 73 4e 6f 64  ndexExprTransNod
a6f0: 65 3b 0a 20 20 77 2e 75 2e 70 49 64 78 54 72 61  e;.  w.u.pIdxTra
a700: 6e 73 20 3d 20 26 78 3b 0a 20 20 78 2e 69 54 61  ns = &x;.  x.iTa
a710: 62 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b 0a  bCur = iTabCur;.
a720: 20 20 78 2e 69 49 64 78 43 75 72 20 3d 20 69 49    x.iIdxCur = iI
a730: 64 78 43 75 72 3b 0a 20 20 66 6f 72 28 69 49 64  dxCur;.  for(iId
a740: 78 43 6f 6c 3d 30 3b 20 69 49 64 78 43 6f 6c 3c  xCol=0; iIdxCol<
a750: 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3b  aColExpr->nExpr;
a760: 20 69 49 64 78 43 6f 6c 2b 2b 29 7b 0a 20 20 20   iIdxCol++){.   
a770: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
a780: 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 21 3d 58 4e  umn[iIdxCol]!=XN
a790: 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65  _EXPR ) continue
a7a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 43  ;.    assert( aC
a7b0: 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f  olExpr->a[iIdxCo
a7c0: 6c 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  l].pExpr!=0 );. 
a7d0: 20 20 20 78 2e 69 49 64 78 43 6f 6c 20 3d 20 69     x.iIdxCol = i
a7e0: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 78 2e 70 49  IdxCol;.    x.pI
a7f0: 64 78 45 78 70 72 20 3d 20 61 43 6f 6c 45 78 70  dxExpr = aColExp
a800: 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
a810: 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xpr;.    sqlite3
a820: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 57 49  WalkExpr(&w, pWI
a830: 6e 66 6f 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  nfo->pWhere);.  
a840: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
a850: 72 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f  rList(&w, pWInfo
a860: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
a870: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a880: 4c 69 73 74 28 26 77 2c 20 70 57 49 6e 66 6f 2d  List(&w, pWInfo-
a890: 3e 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20  >pResultSet);.  
a8a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
a8b0: 54 72 75 74 68 20 65 78 70 72 65 73 73 69 6f 6e  Truth expression
a8c0: 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 20   is always true 
a8d0: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 74 68  because it is th
a8e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
a8f0: 2a 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  * a partial inde
a900: 78 20 74 68 61 74 20 69 73 20 64 72 69 76 69 6e  x that is drivin
a910: 67 20 61 20 71 75 65 72 79 20 6c 6f 6f 70 2e 20  g a query loop. 
a920: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 61 6c   Look through al
a930: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52  l of the.** WHER
a940: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
a950: 6e 20 74 68 65 20 71 75 65 72 79 2c 20 61 6e 64  n the query, and
a960: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   if any of those
a970: 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 0a 2a   terms must be.*
a980: 2a 20 74 72 75 65 20 62 65 63 61 75 73 65 20 70  * true because p
a990: 54 72 75 74 68 20 69 73 20 74 72 75 65 2c 20 74  Truth is true, t
a9a0: 68 65 6e 20 6d 61 72 6b 20 74 68 6f 73 65 20 57  hen mark those W
a9b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
a9c0: 73 20 61 73 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a  s as.** coded..*
a9d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
a9e0: 65 72 65 41 70 70 6c 79 50 61 72 74 69 61 6c 49  ereApplyPartialI
a9f0: 6e 64 65 78 43 6f 6e 73 74 72 61 69 6e 74 73 28  ndexConstraints(
aa00: 0a 20 20 45 78 70 72 20 2a 70 54 72 75 74 68 2c  .  Expr *pTruth,
aa10: 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 0a  .  int iTabCur,.
aa20: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
aa30: 57 43 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  WC.){.  int i;. 
aa40: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
aa50: 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 75  m;.  while( pTru
aa60: 74 68 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  th->op==TK_AND )
aa70: 7b 0a 20 20 20 20 77 68 65 72 65 41 70 70 6c 79  {.    whereApply
aa80: 50 61 72 74 69 61 6c 49 6e 64 65 78 43 6f 6e 73  PartialIndexCons
aa90: 74 72 61 69 6e 74 73 28 70 54 72 75 74 68 2d 3e  traints(pTruth->
aaa0: 70 4c 65 66 74 2c 20 69 54 61 62 43 75 72 2c 20  pLeft, iTabCur, 
aab0: 70 57 43 29 3b 0a 20 20 20 20 70 54 72 75 74 68  pWC);.    pTruth
aac0: 20 3d 20 70 54 72 75 74 68 2d 3e 70 52 69 67 68   = pTruth->pRigh
aad0: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
aae0: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
aaf0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
ab00: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
ab10: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
ab20: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
ab30: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
ab40: 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  D ) continue;.  
ab50: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
ab60: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
ab70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ab80: 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 54 72  re(0, pExpr, pTr
ab90: 75 74 68 2c 20 69 54 61 62 43 75 72 29 3d 3d 30  uth, iTabCur)==0
aba0: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
abb0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
abc0: 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
abd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
abe0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
abf0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
ac00: 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
ac10: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ac20: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
ac30: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
ac40: 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d 61  pWInfo..*/.Bitma
ac50: 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  sk sqlite3WhereC
ac60: 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
ac70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ac80: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
ac90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
aca0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
acb0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
acc0: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
acd0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
ace0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
acf0: 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c  Info,   /* Compl
ad00: 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ete information 
ad10: 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
ad20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
ad30: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
ad40: 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20   /* Which level 
ad50: 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73  of pWInfo->a[] s
ad60: 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a  hould be coded *
ad70: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
ad80: 70 4c 65 76 65 6c 2c 20 20 2f 2a 20 54 68 65 20  pLevel,  /* The 
ad90: 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 70 6f  current level po
ada0: 69 6e 74 65 72 20 2a 2f 0a 20 20 42 69 74 6d 61  inter */.  Bitma
adb0: 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
adc0: 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
add0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
ade0: 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
adf0: 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
ae00: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ae10: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
ae20: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
ae30: 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
ae40: 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
ae50: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
ae60: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
ae70: 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
ae80: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
ae90: 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
aea0: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
aeb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
aec0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
aed0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
aee0: 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  der */.  WhereLo
aef0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a  op *pLoop;    /*
af00: 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
af10: 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65  bject being code
af20: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
af30: 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
af40: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
af50: 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
af60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
af70: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af90: 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
afa0: 65 72 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  erm */.  sqlite3
afb0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
afc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
afd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
afe0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
aff0: 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
b000: 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
b010: 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
b020: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
b030: 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
b040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
b050: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
b060: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
b070: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 48 61 6c  */.  int addrHal
b080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b090: 20 20 20 20 20 2f 2a 20 61 64 64 72 42 72 6b 20       /* addrBrk 
b0a0: 66 6f 72 20 74 68 65 20 6f 75 74 65 72 6d 6f 73  for the outermos
b0b0: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
b0c0: 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
b0e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
b0f0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
b100: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
b110: 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
b120: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
b130: 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
b140: 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
b150: 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
b160: 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
b170: 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
b180: 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
b190: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
b1a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d  .  Index *pIdx =
b1b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b1c0: 49 6e 64 65 78 20 75 73 65 64 20 62 79 20 6c 6f  Index used by lo
b1d0: 6f 70 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  op (if any) */. 
b1e0: 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
b1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
b200: 65 72 61 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  eration of const
b210: 72 61 69 6e 74 20 67 65 6e 65 72 61 74 6f 72 20  raint generator 
b220: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 70 57 43 20 3d  loop */..  pWC =
b230: 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
b240: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
b250: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
b260: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
b270: 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
b280: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
b290: 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
b2a0: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
b2b0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76  >iCursor;.  pLev
b2c0: 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e  el->notReady = n
b2d0: 6f 74 52 65 61 64 79 20 26 20 7e 73 71 6c 69 74  otReady & ~sqlit
b2e0: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
b2f0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
b300: 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20  , iCur);.  bRev 
b310: 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
b320: 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
b330: 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
b340: 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48  nt((v, "Begin WH
b350: 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
b360: 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d  iLevel,pTabItem-
b370: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
b380: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
b390: 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
b3a0: 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
b3b0: 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
b3c0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
b3d0: 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
b3e0: 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
b3f0: 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
b400: 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
b410: 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
b420: 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
b430: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
b440: 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
b450: 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
b460: 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
b470: 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
b480: 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
b490: 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
b4a0: 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
b4b0: 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
b4c0: 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
b4d0: 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
b4e0: 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
b4f0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
b500: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
b510: 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
b520: 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
b530: 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
b540: 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
b550: 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
b560: 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
b570: 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
b580: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
b590: 72 73 65 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  rse);.  addrCont
b5a0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
b5b0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
b5c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
b5d0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  e);..  /* If thi
b5e0: 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
b5f0: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
b600: 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
b610: 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
b620: 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
b630: 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
b640: 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
b650: 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
b660: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
b670: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
b680: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  oin..  */.  asse
b690: 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  rt( (pWInfo->wct
b6a0: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
b6b0: 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a 20 20  OR_SUBCLAUSE).  
b6c0: 20 20 20 20 20 7c 7c 20 70 4c 65 76 65 6c 2d 3e       || pLevel->
b6d0: 69 46 72 6f 6d 3e 30 20 7c 7c 20 28 70 54 61 62  iFrom>0 || (pTab
b6e0: 49 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74  Item[0].fg.joint
b6f0: 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
b700: 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  0.  );.  if( pLe
b710: 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
b720: 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e  (pTabItem[0].fg.
b730: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
b740: 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
b750: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
b760: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b780: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b790: 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
b7a0: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
b7b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b7c0: 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
b7d0: 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
b7e0: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
b7f0: 6d 70 75 74 65 20 61 20 73 61 66 65 20 61 64 64  mpute a safe add
b800: 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
b810: 69 66 20 77 65 20 64 69 73 63 6f 76 65 72 20 74  if we discover t
b820: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 66 6f  hat the table fo
b830: 72 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 6f 70  r.  ** this loop
b840: 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 63 61   is empty and ca
b850: 6e 20 6e 65 76 65 72 20 63 6f 6e 74 72 69 62 75  n never contribu
b860: 74 65 20 63 6f 6e 74 65 6e 74 2e 20 2a 2f 0a 20  te content. */. 
b870: 20 66 6f 72 28 6a 3d 69 4c 65 76 65 6c 3b 20 6a   for(j=iLevel; j
b880: 3e 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 61 5b  >0 && pWInfo->a[
b890: 6a 5d 2e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 3b  j].iLeftJoin==0;
b8a0: 20 6a 2d 2d 29 7b 7d 0a 20 20 61 64 64 72 48 61   j--){}.  addrHa
b8b0: 6c 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a  lt = pWInfo->a[j
b8c0: 5d 2e 61 64 64 72 42 72 6b 3b 0a 0a 20 20 2f 2a  ].addrBrk;..  /*
b8d0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
b8e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
b8f0: 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
b900: 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
b910: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
b920: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
b930: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
b940: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
b950: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
b960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b970: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b980: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
b990: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
b9a0: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
b9b0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
b9c0: 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41   =  sqlite3VdbeA
b9d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
b9e0: 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64  d, regYield, add
b9f0: 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  rBrk);.    VdbeC
ba00: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ba10: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ba20: 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 25 73 22  "next row of %s"
ba30: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
ba40: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70  ->zName));.    p
ba50: 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
ba60: 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
ba70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba80: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ba90: 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73   if(  (pLoop->ws
baa0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
bab0: 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
bac0: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
bad0: 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
bae0: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
baf0: 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
bb00: 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
bb10: 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
bb20: 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
bb30: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
bb40: 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
bb50: 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
bb60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
bb70: 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e  NotFound;.    in
bb80: 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
bb90: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 20  pLoop->nLTerm;. 
bba0: 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 2f     int iIn;    /
bbb0: 2a 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 49 4e  * Counter for IN
bbc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
bbd0: 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
bbe0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
bbf0: 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
bc00: 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72  int+2);.    addr
bc10: 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65  NotFound = pLeve
bc20: 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20  l->addrBrk;.    
bc30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
bc40: 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
bc50: 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
bc60: 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20  = iReg+j+2;.    
bc70: 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
bc80: 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
bc90: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72    if( NEVER(pTer
bca0: 6d 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  m==0) ) continue
bcb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
bcc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
bcd0: 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
bce0: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
bcf0: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
bd00: 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
bd10: 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
bd20: 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
bd30: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
bd40: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
bd50: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
bd60: 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
bd70: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
bd80: 20 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56       codeExprOrV
bd90: 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52  ector(pParse, pR
bda0: 69 67 68 74 2c 20 69 54 61 72 67 65 74 2c 20 31  ight, iTarget, 1
bdb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bdc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bdd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bde0: 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
bdf0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
be00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
be10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
be20: 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
be30: 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
be40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be50: 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
be60: 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
be70: 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
bea0: 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bec0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
bed0: 64 46 72 65 65 20 3f 20 50 34 5f 44 59 4e 41 4d  dFree ? P4_DYNAM
bee0: 49 43 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  IC : P4_STATIC);
bef0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
bf00: 65 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  e(v);.    pLoop-
bf10: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
bf20: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c   = 0;.    pLevel
bf30: 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
bf40: 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 70 57   pLevel->op = pW
bf50: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3f  Info->eOnePass ?
bf60: 20 4f 50 5f 4e 6f 6f 70 20 3a 20 4f 50 5f 56 4e   OP_Noop : OP_VN
bf70: 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
bf80: 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
bf90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
bfa0: 0a 20 20 20 20 69 49 6e 20 3d 20 70 4c 65 76 65  .    iIn = pLeve
bfb0: 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3b 0a 20 20 20  l->u.in.nIn;.   
bfc0: 20 66 6f 72 28 6a 3d 6e 43 6f 6e 73 74 72 61 69   for(j=nConstrai
bfd0: 6e 74 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  nt-1; j>=0; j--)
bfe0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
bff0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
c000: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 31 36  ;.      if( j<16
c010: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74   && (pLoop->u.vt
c020: 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
c030: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
c040: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
c050: 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
c060: 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
c070: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
c080: 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
c090: 20 20 45 78 70 72 20 2a 70 43 6f 6d 70 61 72 65    Expr *pCompare
c0a0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72  ;  /* The compar
c0b0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
c0c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
c0d0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 48 53  Right;    /* RHS
c0e0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
c0f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64  on */.        Vd
c100: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 2f  beOp *pOp;     /
c110: 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 63 63 65  * Opcode to acce
c120: 73 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ss the value of 
c130: 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  the IN constrain
c140: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
c150: 20 52 65 6c 6f 61 64 20 74 68 65 20 63 6f 6e 73   Reload the cons
c160: 74 72 61 69 6e 74 20 76 61 6c 75 65 20 69 6e 74  traint value int
c170: 6f 20 72 65 67 5b 69 52 65 67 2b 6a 2b 32 5d 2e  o reg[iReg+j+2].
c180: 20 20 54 68 65 20 73 61 6d 65 20 76 61 6c 75 65    The same value
c190: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20  .        ** was 
c1a0: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
c1b0: 73 61 6d 65 20 72 65 67 69 73 74 65 72 20 70 72  same register pr
c1c0: 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 56 46  ior to the OP_VF
c1d0: 69 6c 74 65 72 2c 20 62 75 74 0a 20 20 20 20 20  ilter, but.     
c1e0: 20 20 20 2a 2a 20 74 68 65 20 78 46 69 6c 74 65     ** the xFilte
c1f0: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
c200: 20 6d 69 67 68 74 20 68 61 76 65 20 63 68 61 6e   might have chan
c210: 67 65 64 20 74 68 65 20 64 61 74 61 74 79 70 65  ged the datatype
c220: 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   or.        ** e
c230: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 76  ncoding of the v
c240: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 65 67 69  alue in the regi
c250: 73 74 65 72 2c 20 73 6f 20 69 74 20 2a 6d 75 73  ster, so it *mus
c260: 74 2a 20 62 65 20 72 65 6c 6f 61 64 65 64 2e 20  t* be reloaded. 
c270: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
c280: 74 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  t( pLevel->u.in.
c290: 61 49 6e 4c 6f 6f 70 21 3d 30 20 7c 7c 20 64 62  aInLoop!=0 || db
c2a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c2b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
c2c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
c2e0: 65 72 74 28 20 69 49 6e 3e 30 20 29 3b 0a 20 20  ert( iIn>0 );.  
c2f0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
c300: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
c310: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
c320: 49 6e 4c 6f 6f 70 5b 2d 2d 69 49 6e 5d 2e 61 64  InLoop[--iIn].ad
c330: 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
c340: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
c350: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
c360: 6d 6e 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  mn || pOp->opcod
c370: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20  e==OP_Rowid );. 
c380: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
c390: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
c3a0: 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70 2d 3e  _Column || pOp->
c3b0: 70 33 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p3==iReg+j+2 );.
c3c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
c3d0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
c3e0: 50 5f 52 6f 77 69 64 20 7c 7c 20 70 4f 70 2d 3e  P_Rowid || pOp->
c3f0: 70 32 3d 3d 69 52 65 67 2b 6a 2b 32 20 29 3b 0a  p2==iReg+j+2 );.
c400: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
c410: 73 65 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  se( pOp->opcode=
c420: 3d 4f 50 5f 52 6f 77 69 64 20 29 3b 0a 20 20 20  =OP_Rowid );.   
c430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c440: 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4f 70 2d  beAddOp3(v, pOp-
c450: 3e 6f 70 63 6f 64 65 2c 20 70 4f 70 2d 3e 70 31  >opcode, pOp->p1
c460: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
c470: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  p3);.        }..
c480: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
c490: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
c4a0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74  ll continue to t
c4b0: 68 65 20 6e 65 78 74 20 72 6f 77 20 69 66 20 0a  he next row if .
c4c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 49          ** the I
c4d0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  N constraint is 
c4e0: 6e 6f 74 20 73 61 74 69 73 66 69 65 64 20 2a 2f  not satisfied */
c4f0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72  .        pCompar
c500: 65 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  e = sqlite3PExpr
c510: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
c520: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  0, 0);.        a
c530: 73 73 65 72 74 28 20 70 43 6f 6d 70 61 72 65 21  ssert( pCompare!
c540: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
c550: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
c560: 20 20 69 66 28 20 70 43 6f 6d 70 61 72 65 20 29    if( pCompare )
c570: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6d  {.          pCom
c580: 70 61 72 65 2d 3e 70 4c 65 66 74 20 3d 20 70 54  pare->pLeft = pT
c590: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
c5a0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  t;.          pCo
c5b0: 6d 70 61 72 65 2d 3e 70 52 69 67 68 74 20 3d 20  mpare->pRight = 
c5c0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
c5d0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 52 45 47 49  Expr(db, TK_REGI
c5e0: 53 54 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  STER, 0);.      
c5f0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
c600: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  {.            pR
c610: 69 67 68 74 2d 3e 69 54 61 62 6c 65 20 3d 20 69  ight->iTable = i
c620: 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 20  Reg+j+2;.       
c630: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c640: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
c650: 70 43 6f 6d 70 61 72 65 2c 20 70 4c 65 76 65 6c  pCompare, pLevel
c660: 2d 3e 61 64 64 72 43 6f 6e 74 2c 20 30 29 3b 0a  ->addrCont, 0);.
c670: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c680: 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e        pCompare->
c690: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
c6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c6b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6d 70  Delete(db, pComp
c6c0: 61 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  are);.        }.
c6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c6e0: 20 20 2f 2a 20 54 68 65 73 65 20 72 65 67 69 73    /* These regis
c6f0: 74 65 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ters need to be 
c700: 70 72 65 73 65 72 76 65 64 20 69 6e 20 63 61 73  preserved in cas
c710: 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  e there is an IN
c720: 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 2a 2a   operator.    **
c730: 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 6f   loop.  So we co
c740: 75 6c 64 20 64 65 61 6c 6c 6f 63 61 74 65 20 74  uld deallocate t
c750: 68 65 20 72 65 67 69 73 74 65 72 73 20 68 65 72  he registers her
c760: 65 20 28 61 6e 64 20 70 6f 74 65 6e 74 69 61 6c  e (and potential
c770: 6c 79 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 20  ly.    ** reuse 
c780: 74 68 65 6d 20 6c 61 74 65 72 29 20 69 66 20 28  them later) if (
c790: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
c7a0: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 3d   WHERE_IN_ABLE)=
c7b0: 3d 30 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d  =0.  But it seem
c7c0: 73 0a 20 20 20 20 2a 2a 20 73 69 6d 70 6c 65 72  s.    ** simpler
c7d0: 20 61 6e 64 20 73 61 66 65 72 20 74 6f 20 73 69   and safer to si
c7e0: 6d 70 6c 79 20 6e 6f 74 20 72 65 75 73 65 20 74  mply not reuse t
c7f0: 68 65 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20  he registers..  
c800: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 73    **.    **    s
c810: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
c820: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
c830: 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
c840: 2b 32 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 7d 65  +2);.    */.  }e
c850: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
c860: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
c870: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
c880: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
c890: 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
c8a0: 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  .   && (pLoop->w
c8b0: 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
c8c0: 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
c8d0: 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20  COLUMN_EQ))!=0. 
c8e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
c8f0: 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  2:  We can direc
c900: 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
c910: 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
c920: 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
c930: 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
c940: 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
c950: 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
c960: 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
c970: 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
c980: 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
c990: 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
c9a0: 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
c9b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
c9c0: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
c9d0: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
c9e0: 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a  btree.nEq==1 );.
c9f0: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
ca00: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
ca10: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
ca20: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
ca30: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
ca40: 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
ca50: 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
ca60: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ca70: 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
ca80: 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
ca90: 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64  nMem;.    iRowid
caa0: 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
cab0: 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
cac0: 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
cad0: 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
cae0: 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f  eg);.    if( iRo
caf0: 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65  widReg!=iRelease
cb00: 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  Reg ) sqlite3Rel
cb10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
cb20: 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
cb30: 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
cb40: 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
cb50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cb60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
cb70: 6b 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 61 64  kRowid, iCur, ad
cb80: 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
cb90: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
cba0: 61 67 65 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  age(v);.    pLev
cbb0: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
cbc0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
cbd0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
cbe0: 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 3d  evel->notReady)=
cbf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  =0 ){.      pTer
cc00: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
cc10: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
cc20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
cc30: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
cc40: 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
cc50: 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
cc60: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
cc70: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
cc80: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
cc90: 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
cca0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
ccb0: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
ccc0: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
ccd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
cce0: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
ccf0: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
cd00: 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
cd10: 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
cd20: 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
cd30: 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 6a 20 3d 20  *pEnd;..    j = 
cd40: 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  0;.    pStart = 
cd50: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  pEnd = 0;.    if
cd60: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
cd70: 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
cd80: 49 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c  IT ) pStart = pL
cd90: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
cda0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
cdb0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
cdc0: 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e  _TOP_LIMIT ) pEn
cdd0: 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
cde0: 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65  m[j++];.    asse
cdf0: 72 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c  rt( pStart!=0 ||
ce00: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
ce10: 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
ce20: 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74    pTerm = pStart
ce30: 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  ;.      pStart =
ce40: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e   pEnd;.      pEn
ce50: 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  d = pTerm;.    }
ce60: 0a 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48  .    codeCursorH
ce70: 69 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57  int(pTabItem, pW
ce80: 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 45  Info, pLevel, pE
ce90: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  nd);.    if( pSt
cea0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
ceb0: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
cec0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
ced0: 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
cee0: 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
cef0: 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
cf00: 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
cf10: 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
cf20: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
cf30: 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
cf40: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
cf60: 75 72 73 6f 72 20 73 65 65 6b 20 6f 70 65 72 61  ursor seek opera
cf70: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tion */..      /
cf80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
cf90: 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
cfa0: 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
cfb0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
cfc0: 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
cfd0: 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
cfe0: 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
cff0: 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
d000: 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
d010: 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
d020: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
d030: 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
d040: 20 4f 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20   OP_SeekGT,.    
d050: 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
d060: 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20  */  OP_SeekLE,. 
d070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
d080: 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54  LT */  OP_SeekLT
d090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
d0a0: 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
d0b0: 6b 47 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGE.      };.   
d0c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
d0d0: 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
d0e0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d0f0: 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
d100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d110: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
d120: 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
d130: 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
d140: 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
d150: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
d160: 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
d170: 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
d180: 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  . */..      asse
d190: 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46  rt( (pStart->wtF
d1a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
d1b0: 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
d1c0: 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
d1d0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
d1e0: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
d1f0: 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
d200: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
d210: 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
d220: 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
d230: 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rt->leftCursor!=
d240: 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73  iCur ); /* trans
d250: 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
d260: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  s */.      if( s
d270: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
d280: 6f 72 28 70 58 2d 3e 70 52 69 67 68 74 29 20 29  or(pX->pRight) )
d290: 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 72  {.        r1 = r
d2a0: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65  Temp = sqlite3Ge
d2b0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
d2c0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 78  ;.        codeEx
d2d0: 70 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73  prOrVector(pPars
d2e0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 72  e, pX->pRight, r
d2f0: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74  1, 1);.        t
d300: 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
d310: 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
d320: 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
d330: 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
d340: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d350: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  X->op==TK_LT );.
d360: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
d370: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  ( pX->op==TK_LE 
d380: 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
d390: 61 4d 6f 76 65 4f 70 5b 28 28 70 58 2d 3e 6f 70  aMoveOp[((pX->op
d3a0: 20 2d 20 54 4b 5f 47 54 20 2d 20 31 29 20 26 20   - TK_GT - 1) & 
d3b0: 30 78 33 29 20 7c 20 30 78 31 5d 3b 0a 20 20 20  0x3) | 0x1];.   
d3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
d3d0: 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
d3e0: 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20  ==OP_SeekGE );. 
d3f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d400: 58 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  X->op!=TK_GE || 
d410: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
d420: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d430: 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c   pX->op!=TK_LT |
d440: 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  | op==OP_SeekLE 
d450: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d460: 74 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  t( pX->op!=TK_LE
d470: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c   || op==OP_SeekL
d480: 45 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  E );.      }else
d490: 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
d4a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
d4b0: 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
d4c0: 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
d4d0: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
d4e0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
d4f0: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  rt);.        op 
d500: 3d 20 61 4d 6f 76 65 4f 70 5b 28 70 58 2d 3e 6f  = aMoveOp[(pX->o
d510: 70 20 2d 20 54 4b 5f 47 54 29 5d 3b 0a 20 20 20  p - TK_GT)];.   
d520: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d530: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d540: 6f 70 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  op, iCur, addrBr
d550: 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
d560: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
d570: 6b 22 29 29 3b 0a 20 20 20 20 20 20 56 64 62 65  k"));.      Vdbe
d580: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
d590: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  ->op==TK_GT);.  
d5a0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d5b0: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
d5c0: 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _LE);.      Vdbe
d5d0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58  CoverageIf(v, pX
d5e0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20  ->op==TK_LT);.  
d5f0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d600: 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  If(v, pX->op==TK
d610: 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _GE);.      sqli
d620: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
d630: 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
d640: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d660: 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
d670: 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
d680: 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 48 61  nd, iCur, addrHa
d690: 6c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  lt);.      VdbeC
d6a0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
d6b0: 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
d6c0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
d6d0: 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
d6e0: 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
d6f0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
d700: 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
d710: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d720: 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
d730: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
d740: 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
d750: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
d760: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d770: 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
d780: 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
d790: 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
d7a0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
d7b0: 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
d7c0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
d7d0: 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
d7e0: 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
d7f0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d800: 63 6f 64 65 45 78 70 72 4f 72 56 65 63 74 6f 72  codeExprOrVector
d810: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
d820: 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
d830: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
d840: 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 73  0==sqlite3ExprIs
d850: 56 65 63 74 6f 72 28 70 58 2d 3e 70 52 69 67 68  Vector(pX->pRigh
d860: 74 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  t) .       && (p
d870: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
d880: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 20 0a  pX->op==TK_GT) .
d890: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d8a0: 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
d8b0: 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
d8c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d8d0: 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
d8e0: 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
d8f0: 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Gt;.      }.    
d900: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
d910: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 58 2d  ExprIsVector(pX-
d920: 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  >pRight) ){.    
d930: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
d940: 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
d950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d960: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
d970: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d980: 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
d990: 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
d9a0: 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
d9b0: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
d9c0: 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
d9d0: 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
d9e0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
d9f0: 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->p5==0 );.    i
da00: 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
da10: 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
da20: 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  idReg = ++pParse
da30: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
da40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
da50: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
da60: 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
da70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da80: 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
da90: 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
daa0: 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
dab0: 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
dac0: 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
dad0: 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  Op==OP_Le);.    
dae0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
daf0: 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c  (v, testOp==OP_L
db00: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
db10: 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
db20: 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  Op==OP_Ge);.    
db30: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
db40: 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47  (v, testOp==OP_G
db50: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
db60: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
db70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
db80: 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
db90: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
dba0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
dbb0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
dbc0: 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
dbd0: 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73    /* Case 4: A s
dbe0: 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
dbf0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
dc00: 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
dc10: 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
dc20: 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
dc30: 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
dc40: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
dc50: 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
dc60: 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
dc70: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
dc80: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
dc90: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
dca0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
dcb0: 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
dcc0: 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
dcd0: 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
dce0: 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
dcf0: 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
dd00: 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
dd10: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
dd20: 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
dd30: 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
dd40: 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
dd50: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
dd60: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
dd70: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
dd80: 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
dd90: 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
dda0: 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
ddb0: 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
ddc0: 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
ddd0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
dde0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
ddf0: 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
de00: 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
de10: 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
de20: 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
de30: 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
de40: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
de50: 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
de60: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
de70: 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
de80: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
de90: 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
dea0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
deb0: 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
dec0: 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
ded0: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
dee0: 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
def0: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
df00: 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
df10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
df20: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
df30: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
df40: 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
df50: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
df60: 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
df70: 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
df80: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
df90: 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
dfa0: 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
dfb0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
dfc0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
dfd0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
dfe0: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
dff0: 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
e000: 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
e010: 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
e020: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
e030: 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
e040: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
e050: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
e060: 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
e070: 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
e080: 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
e090: 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
e0a0: 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
e0b0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
e0c0: 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
e0d0: 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
e0e0: 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
e0f0: 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
e100: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
e110: 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
e120: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
e130: 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
e140: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
e150: 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
e160: 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
e170: 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
e180: 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
e190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
e1a0: 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
e1b0: 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
e1c0: 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
e1d0: 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20 20      OP_SeekGT,  
e1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
e1f0: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
e200: 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
e210: 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
e220: 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20 20    OP_SeekLT,    
e230: 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
e240: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
e250: 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
e260: 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
e270: 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20 20 20  OP_SeekGE,      
e280: 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
e290: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
e2a0: 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
e2b0: 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
e2c0: 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20 20 20  _SeekLE         
e2d0: 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
e2e0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
e2f0: 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
e300: 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
e310: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
e320: 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
e330: 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
e340: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
e350: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
e360: 26 26 20 21 62 52 65 76 20 26 26 20 21 65 6e 64  && !bRev && !end
e370: 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
e380: 49 64 78 47 54 2c 20 20 20 20 20 20 20 20 20 20  IdxGT,          
e390: 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
e3a0: 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
e3b0: 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f 0a  v &&  endEq) */.
e3c0: 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c 20        OP_IdxLE, 
e3d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
e3e0: 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
e3f0: 73 20 26 26 20 20 62 52 65 76 20 26 26 20 21 65  s &&  bRev && !e
e400: 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
e410: 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20 20 20  P_IdxLT,        
e420: 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f 63      /* 3: (end_c
e430: 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62  onstraints &&  b
e440: 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a  Rev &&  endEq) *
e450: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 31 36  /.    };.    u16
e460: 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
e470: 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20 20 2f  btree.nEq;     /
e480: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
e490: 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
e4a0: 20 20 75 31 36 20 6e 42 74 6d 20 3d 20 70 4c 6f    u16 nBtm = pLo
e4b0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  op->u.btree.nBtm
e4c0: 3b 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  ;   /* Length of
e4d0: 20 42 54 4d 20 76 65 63 74 6f 72 20 2a 2f 0a 20   BTM vector */. 
e4e0: 20 20 20 75 31 36 20 6e 54 6f 70 20 3d 20 70 4c     u16 nTop = pL
e4f0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  oop->u.btree.nTo
e500: 70 3b 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  p;   /* Length o
e510: 66 20 54 4f 50 20 76 65 63 74 6f 72 20 2a 2f 0a  f TOP vector */.
e520: 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
e550: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
e560: 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
e570: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
e580: 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
e590: 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
e5a0: 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
e5b0: 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
e5c0: 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
e5d0: 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
e5e0: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
e5f0: 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
e600: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
e610: 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
e620: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
e630: 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
e640: 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
e650: 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
e680: 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
e690: 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
e6a0: 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
e6b0: 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
e6c0: 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
e6d0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
e6e0: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
e6f0: 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
e700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e710: 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
e720: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
e730: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
e740: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
e750: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
e760: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
e770: 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
e780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e790: 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
e7a0: 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
e7b0: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
e7e0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
e7f0: 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e810: 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
e820: 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
e830: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
e840: 72 20 2a 7a 45 6e 64 41 66 66 20 3d 20 30 3b 20  r *zEndAff = 0; 
e850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
e860: 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
e870: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
e880: 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 65 65  t */.    u8 bSee
e890: 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20 20  kPastNull = 0;  
e8a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
e8b0: 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69 74 69   seek past initi
e8c0: 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20 20  al nulls */.    
e8d0: 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 3d  u8 bStopAtNull =
e8e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
e8f0: 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  Add condition to
e900: 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20 4e 55   terminate at NU
e910: 4c 4c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  LLs */.    int o
e920: 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
e930: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e940: 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
e950: 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a 20 20  dex only */...  
e960: 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
e970: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
e980: 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
e990: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
e9a0: 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
e9b0: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
e9c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
e9d0: 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
e9e0: 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
e9f0: 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
ea00: 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
ea10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
ea20: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
ea30: 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
ea40: 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
ea50: 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
ea60: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
ea70: 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
ea80: 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
ea90: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
eaa0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
eab0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
eac0: 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
ead0: 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
eae0: 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
eaf0: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
eb00: 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
eb10: 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
eb20: 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
eb30: 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
eb40: 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
eb50: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
eb60: 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
eb70: 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
eb80: 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
eb90: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
eba0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
ebb0: 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
ebc0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
ebd0: 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
ebe0: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
ebf0: 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
ec00: 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
ec10: 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
ec20: 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
ec30: 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
ec40: 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
ec50: 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
ec60: 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
ec70: 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
ec80: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
ec90: 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
eca0: 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
ecb0: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
ecc0: 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
ecd0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
ece0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
ecf0: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
ed00: 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
ed10: 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
ed20: 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
ed30: 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
ed40: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
ed50: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
ed60: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
ed70: 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
ed80: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
ed90: 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
eda0: 67 20 3d 20 4d 41 58 28 6e 45 78 74 72 61 52 65  g = MAX(nExtraRe
edb0: 67 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  g, pLoop->u.btre
edc0: 65 2e 6e 42 74 6d 29 3b 0a 20 20 20 20 20 20 2f  e.nBtm);.      /
edd0: 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  * Like optimizat
ede0: 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
edf0: 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63  aints always occ
ee00: 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
ee10: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
ee20: 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
ee30: 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
ee40: 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  T)==0 || .      
ee50: 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e          (pLoop->
ee60: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
ee70: 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b  TOP_LIMIT)!=0 );
ee80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ee90: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
eea0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
eeb0: 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
eec0: 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
eed0: 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
eee0: 45 78 74 72 61 52 65 67 20 3d 20 4d 41 58 28 6e  ExtraReg = MAX(n
eef0: 45 78 74 72 61 52 65 67 2c 20 70 4c 6f 6f 70 2d  ExtraReg, pLoop-
ef00: 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 29 3b 0a  >u.btree.nTop);.
ef10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
ef20: 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
ef30: 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 69 66 28  _BLOBS.      if(
ef40: 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
ef50: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
ef60: 4f 50 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OPT)!=0 ){.     
ef70: 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
ef80: 65 53 74 61 72 74 21 3d 30 20 29 3b 20 20 20 20  eStart!=0 );    
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 2f 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f 6e   /* LIKE opt con
efb0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
efc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e      assert( pRan
efd0: 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
efe0: 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
eff0: 29 3b 20 20 20 2f 2a 20 6f 63 63 75 72 20 69 6e  );   /* occur in
f000: 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20   pairs */.      
f010: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
f020: 65 70 43 6e 74 72 20 3d 20 28 75 33 32 29 2b 2b  epCntr = (u32)++
f030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f050: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f060: 74 65 67 65 72 2c 20 31 2c 20 28 69 6e 74 29 70  teger, 1, (int)p
f070: 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
f080: 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ntr);.        Vd
f090: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f0a0: 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  IKE loop counter
f0b0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  "));.        pLe
f0c0: 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
f0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f0e0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f0f0: 20 20 20 20 20 20 2f 2a 20 69 4c 69 6b 65 52 65        /* iLikeRe
f100: 70 43 6e 74 72 20 61 63 74 75 61 6c 6c 79 20 73  pCntr actually s
f110: 74 6f 72 65 73 20 32 78 20 74 68 65 20 63 6f 75  tores 2x the cou
f120: 6e 74 65 72 20 72 65 67 69 73 74 65 72 20 6e 75  nter register nu
f130: 6d 62 65 72 2e 20 20 54 68 65 0a 20 20 20 20 20  mber.  The.     
f140: 20 20 20 2a 2a 20 62 6f 74 74 6f 6d 20 62 69 74     ** bottom bit
f150: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
f160: 65 72 20 74 68 65 20 73 65 61 72 63 68 20 6f 72  er the search or
f170: 64 65 72 20 69 73 20 41 53 43 20 6f 72 20 44 45  der is ASC or DE
f180: 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  SC. */.        t
f190: 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
f1a0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f1b0: 65 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  e( pIdx->aSortOr
f1c0: 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
f1d0: 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20 20  _SO_DESC );.    
f1e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 62 52 65      assert( (bRe
f1f0: 76 20 26 20 7e 31 29 3d 3d 30 20 29 3b 0a 20 20  v & ~1)==0 );.  
f200: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
f210: 69 6b 65 52 65 70 43 6e 74 72 20 3c 3c 3d 31 3b  ikeRepCntr <<=1;
f220: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
f230: 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 7c 3d  >iLikeRepCntr |=
f240: 20 62 52 65 76 20 5e 20 28 70 49 64 78 2d 3e 61   bRev ^ (pIdx->a
f250: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
f260: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29 3b  SQLITE_SO_DESC);
f270: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
f280: 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
f290: 53 74 61 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Start==0 ){.    
f2a0: 20 20 20 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69      j = pIdx->ai
f2b0: 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
f2c0: 20 20 20 20 20 69 66 28 20 28 6a 3e 3d 30 20 26       if( (j>=0 &
f2d0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
f2e0: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
f2f0: 3d 30 29 20 7c 7c 20 6a 3d 3d 58 4e 5f 45 58 50  =0) || j==XN_EXP
f300: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  R ){.          b
f310: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31  SeekPastNull = 1
f320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f340: 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
f350: 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
f360: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
f370: 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
f380: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
f390: 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
f3a0: 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
f3b0: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
f3c0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
f3d0: 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
f3e0: 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
f3f0: 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
f400: 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
f410: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
f420: 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
f430: 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
f440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f450: 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
f460: 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
f470: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
f480: 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
f490: 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
f4a0: 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
f4b0: 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
f4c0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
f4d0: 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
f4e0: 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
f4f0: 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20  .      SWAP(u8, 
f500: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62  bSeekPastNull, b
f510: 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20  StopAtNull);.   
f520: 20 20 20 53 57 41 50 28 75 38 2c 20 6e 42 74 6d     SWAP(u8, nBtm
f530: 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 0a  , nTop);.    }..
f540: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f550: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
f560: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
f570: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
f580: 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
f590: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
f5a0: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
f5b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
f5c0: 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
f5d0: 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
f5e0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
f5f0: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70  codeCursorHint(p
f600: 54 61 62 49 74 65 6d 2c 20 70 57 49 6e 66 6f 2c  TabItem, pWInfo,
f610: 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45   pLevel, pRangeE
f620: 6e 64 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65  nd);.    regBase
f630: 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
f640: 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
f650: 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
f660: 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
f670: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53  ;.    assert( zS
f680: 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71  tartAff==0 || sq
f690: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
f6a0: 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b  tartAff)>=nEq );
f6b0: 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41  .    if( zStartA
f6c0: 66 66 20 26 26 20 6e 54 6f 70 20 29 7b 0a 20 20  ff && nTop ){.  
f6d0: 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71      zEndAff = sq
f6e0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
f6f0: 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  , &zStartAff[nEq
f700: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  ]);.    }.    ad
f710: 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
f720: 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 74 65  addrNxt;..    te
f730: 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
f740: 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
f750: 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
f760: 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
f770: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
f780: 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
f790: 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
f7a0: 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
f7b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f7c0: 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
f7d0: 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
f7e0: 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
f7f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f800: 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
f810: 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
f820: 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
f830: 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
f840: 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
f850: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
f860: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
f870: 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
f880: 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
f890: 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
f8a0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
f8b0: 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
f8c0: 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
f8d0: 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
f8e0: 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
f8f0: 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
f900: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
f910: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
f920: 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
f930: 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
f940: 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
f950: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
f960: 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
f970: 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
f980: 74 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 78 70  t;.      codeExp
f990: 72 4f 72 56 65 63 74 6f 72 28 70 50 61 72 73 65  rOrVector(pParse
f9a0: 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
f9b0: 65 2b 6e 45 71 2c 20 6e 42 74 6d 29 3b 0a 20 20  e+nEq, nBtm);.  
f9c0: 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
f9d0: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
f9e0: 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
f9f0: 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
fa00: 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
fa10: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
fa20: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
fa30: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
fa40: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
fa50: 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
fa60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fa70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fa80: 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
fa90: 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
faa0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
fab0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
fac0: 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
fad0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70  ff ){.        up
fae0: 64 61 74 65 52 61 6e 67 65 41 66 66 69 6e 69 74  dateRangeAffinit
faf0: 79 53 74 72 28 70 52 69 67 68 74 2c 20 6e 42 74  yStr(pRight, nBt
fb00: 6d 2c 20 26 7a 53 74 61 72 74 41 66 66 5b 6e 45  m, &zStartAff[nE
fb10: 71 5d 29 3b 0a 20 20 20 20 20 20 7d 20 20 0a 20  q]);.      }  . 
fb20: 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
fb30: 20 2b 3d 20 6e 42 74 6d 3b 0a 20 20 20 20 20 20   += nBtm;.      
fb40: 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
fb50: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
fb60: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
fb70: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fb80: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
fb90: 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20  Right)==0 ){.   
fba0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
fbb0: 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
fbc0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tart);.      }el
fbd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 72  se{.        star
fbe0: 74 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  tEq = 1;.      }
fbf0: 0a 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74  .      bSeekPast
fc00: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
fc10: 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73  lse if( bSeekPas
fc20: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  tNull ){.      s
fc30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc40: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
fc50: 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
fc60: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
fc70: 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
fc80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
fc90: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
fca0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
fcb0: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
fcc0: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
fcd0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53  nConstraint - bS
fce0: 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74  eekPastNull, zSt
fcf0: 61 72 74 41 66 66 29 3b 0a 20 20 20 20 69 66 28  artAff);.    if(
fd00: 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3e 30 20   pLoop->nSkip>0 
fd10: 26 26 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3d 3d  && nConstraint==
fd20: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a  pLoop->nSkip ){.
fd30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6b 69        /* The ski
fd40: 70 2d 73 63 61 6e 20 6c 6f 67 69 63 20 69 6e 73  p-scan logic ins
fd50: 69 64 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ide the call to 
fd60: 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 43  codeAllEqualityC
fd70: 6f 6e 73 74 72 61 69 6e 74 73 28 29 0a 20 20 20  onstraints().   
fd80: 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
fd90: 61 6c 72 65 61 64 79 20 6c 65 66 74 20 74 68 65  already left the
fda0: 20 63 75 72 73 6f 72 20 73 69 74 74 69 6e 67 20   cursor sitting 
fdb0: 6f 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  on the correct r
fdc0: 6f 77 2c 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20  ow,.      ** so 
fdd0: 6e 6f 20 66 75 72 74 68 65 72 20 73 65 65 6b 69  no further seeki
fde0: 6e 67 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ng is needed */.
fdf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe00: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
fe10: 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 45  ags & WHERE_IN_E
fe20: 41 52 4c 59 4f 55 54 20 29 7b 0a 20 20 20 20 20  ARLYOUT ){.     
fe30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fe40: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 48  dOp1(v, OP_SeekH
fe50: 69 74 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20  it, iIdxCur);.  
fe60: 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 70 20 3d      }.      op =
fe70: 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
fe80: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
fe90: 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
fea0: 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 61  + bRev];.      a
feb0: 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
fec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fed0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
fee0: 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
fef0: 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
ff00: 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
ff10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ff20: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ff30: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
ff40: 5f 52 65 77 69 6e 64 29 3b 20 20 74 65 73 74 63  _Rewind);  testc
ff50: 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
ff60: 6e 64 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  nd );.      Vdbe
ff70: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
ff80: 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20 74  ==OP_Last);    t
ff90: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
ffa0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 56 64  Last );.      Vd
ffb0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
ffc0: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20  op==OP_SeekGT); 
ffd0: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
ffe0: 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20  P_SeekGT );.    
fff0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
10000 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
10010 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
10020 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
10030 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10040 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
10050 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73  eekLE);  testcas
10060 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45  e( op==OP_SeekLE
10070 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f   );.      VdbeCo
10080 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
10090 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73  OP_SeekLT);  tes
100a0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
100b0 65 6b 4c 54 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  ekLT );.    }.. 
100c0 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
100d0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
100e0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
100f0 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
10100 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
10110 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
10120 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
10130 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
10140 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
10150 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
10160 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
10170 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
10180 20 20 20 20 63 6f 64 65 45 78 70 72 4f 72 56 65      codeExprOrVe
10190 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 52 69  ctor(pParse, pRi
101a0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
101b0 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 77  , nTop);.      w
101c0 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61  hereLikeOptimiza
101d0 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28  tionStringFixup(
101e0 76 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  v, pLevel, pRang
101f0 65 45 6e 64 29 3b 0a 20 20 20 20 20 20 69 66 28  eEnd);.      if(
10200 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
10210 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
10220 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  L)==0.       && 
10230 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
10240 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20  Null(pRight).   
10250 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
10260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10270 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
10280 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
10290 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  xt);.        Vdb
102a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
102b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
102c0 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
102d0 20 20 20 75 70 64 61 74 65 52 61 6e 67 65 41 66     updateRangeAf
102e0 66 69 6e 69 74 79 53 74 72 28 70 52 69 67 68 74  finityStr(pRight
102f0 2c 20 6e 54 6f 70 2c 20 7a 45 6e 64 41 66 66 29  , nTop, zEndAff)
10300 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  ;.        codeAp
10310 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
10320 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
10330 20 6e 54 6f 70 2c 20 7a 45 6e 64 41 66 66 29 3b   nTop, zEndAff);
10340 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
10360 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
10370 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
10380 7d 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  }.      nConstra
10390 69 6e 74 20 2b 3d 20 6e 54 6f 70 3b 0a 20 20 20  int += nTop;.   
103a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
103b0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
103c0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
103d0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
103e0 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
103f0 28 70 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20  (pRight)==0 ){. 
10400 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
10410 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
10420 65 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  eEnd);.      }el
10430 73 65 7b 0a 20 20 20 20 20 20 20 20 65 6e 64 45  se{.        endE
10440 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  q = 1;.      }. 
10450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74     }else if( bSt
10460 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  opAtNull ){.    
10470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10480 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
10490 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
104a0 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 30  .      endEq = 0
104b0 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
104c0 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  int++;.    }.   
104d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
104e0 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
104f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10500 28 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a  (db, zEndAff);..
10510 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
10520 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
10530 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
10540 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10550 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
10560 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
10570 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
10580 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
10590 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
105a0 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61 69 6e    if( nConstrain
105b0 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  t ){.      op = 
105c0 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20 2b 20  aEndOp[bRev*2 + 
105d0 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20 73 71  endEq];.      sq
105e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
105f0 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
10600 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
10610 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
10620 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10630 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20  e( op==OP_IdxGT 
10640 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
10650 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
10660 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
10670 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
10680 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GE );  VdbeCover
10690 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
106a0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20 74  IdxGE );.      t
106b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
106c0 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65 43 6f  IdxLT );  VdbeCo
106d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
106e0 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
106f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10700 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56 64 62  OP_IdxLE );  Vdb
10710 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
10720 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 0a 20  p==OP_IdxLE );. 
10730 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c     }..    if( pL
10740 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
10750 48 45 52 45 5f 49 4e 5f 45 41 52 4c 59 4f 55 54  HERE_IN_EARLYOUT
10760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10780 50 5f 53 65 65 6b 48 69 74 2c 20 69 49 64 78 43  P_SeekHit, iIdxC
10790 75 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ur, 1);.    }.. 
107a0 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
107b0 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
107c0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
107d0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
107e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
107f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
10800 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
10810 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
10820 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
10830 55 42 43 4c 41 55 53 45 29 3d 3d 30 3b 0a 20 20  UBCLAUSE)==0;.  
10840 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65 20    if( omitTable 
10850 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64 78  ){.      /* pIdx
10860 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
10870 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20 74  ndex.  No need t
10880 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61 69  o access the mai
10890 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  n table. */.    
108a0 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77  }else if( HasRow
108b0 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29  id(pIdx->pTable)
108c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
108d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
108e0 73 20 26 20 57 48 45 52 45 5f 53 45 45 4b 5f 54  s & WHERE_SEEK_T
108f0 41 42 4c 45 29 20 7c 7c 20 28 0a 20 20 20 20 20  ABLE) || (.     
10900 20 20 20 20 20 28 70 57 49 6e 66 6f 2d 3e 77 63       (pWInfo->wc
10910 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
10920 5f 53 45 45 4b 5f 55 4e 49 51 5f 54 41 42 4c 45  _SEEK_UNIQ_TABLE
10930 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 57  ) .       && (pW
10940 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
10950 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 29 0a  ONEPASS_SINGLE).
10960 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20        )){.      
10970 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b    iRowidReg = ++
10980 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
109b0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
109c0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
109d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
109f0 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 30 2c  Exists, iCur, 0,
10a00 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
10a10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
10a20 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
10a30 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  e{.        codeD
10a40 65 66 65 72 72 65 64 53 65 65 6b 28 70 57 49 6e  eferredSeek(pWIn
10a50 66 6f 2c 20 70 49 64 78 2c 20 69 43 75 72 2c 20  fo, pIdx, iCur, 
10a60 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
10a70 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
10a80 69 43 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b  iCur!=iIdxCur ){
10a90 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
10aa0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
10ab0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d  ryKeyIndex(pIdx-
10ac0 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >pTable);.      
10ad0 69 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69  iRowidReg = sqli
10ae0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
10af0 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65  pParse, pPk->nKe
10b00 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72  yCol);.      for
10b10 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
10b20 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
10b30 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43      k = sqlite3C
10b40 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
10b50 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  x, pPk->aiColumn
10b60 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [j]);.        sq
10b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10b80 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
10b90 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64  dxCur, k, iRowid
10ba0 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  Reg+j);.      }.
10bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10bc0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
10bd0 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c  _NotFound, iCur,
10be0 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20   addrCont,.     
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c        iRowidReg,
10c10 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20   pPk->nKeyCol); 
10c20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10c30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10c40 66 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64  f pIdx is an ind
10c50 65 78 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  ex on one or mor
10c60 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74  e expressions, t
10c70 68 65 6e 20 6c 6f 6f 6b 20 74 68 72 6f 75 67 68  hen look through
10c80 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  .    ** all the 
10c90 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
10ca0 57 49 6e 66 6f 20 61 6e 64 20 74 72 79 20 74 6f  WInfo and try to
10cb0 20 74 72 61 6e 73 66 6f 72 6d 20 6d 61 74 63 68   transform match
10cc0 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
10cd0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 72 65 66 65      ** into refe
10ce0 72 65 6e 63 65 20 74 6f 20 69 6e 64 65 78 20 63  rence to index c
10cf0 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2a 0a 20  olumns..    **. 
10d00 20 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     ** Do not do 
10d10 74 68 69 73 20 66 6f 72 20 74 68 65 20 52 48 53  this for the RHS
10d20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
10d30 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
10d40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 65 78 70   the .    ** exp
10d50 72 65 73 73 69 6f 6e 20 6d 61 79 20 62 65 20 65  ression may be e
10d60 76 61 6c 75 61 74 65 64 20 61 66 74 65 72 20 4f  valuated after O
10d70 50 5f 4e 75 6c 6c 52 6f 77 20 68 61 73 20 62 65  P_NullRow has be
10d80 65 6e 20 65 78 65 63 75 74 65 64 20 6f 6e 0a 20  en executed on. 
10d90 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
10da0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
10db0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
10dc0 6f 20 64 6f 20 74 68 65 20 66 75 6c 6c 20 65 76  o do the full ev
10dd0 61 6c 75 61 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  aluation,.    **
10de0 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
10df0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10e00 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e 55 4c 4c   may not be NULL
10e10 2c 20 65 76 65 6e 20 69 66 20 61 6c 6c 20 74 61  , even if all ta
10e20 62 6c 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  ble.    ** colum
10e30 6e 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 68  n values are.  h
10e40 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  ttps://www.sqlit
10e50 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 37  e.org/src/info/7
10e60 66 61 38 30 34 39 36 38 35 62 35 30 62 35 61 0a  fa8049685b50b5a.
10e70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
10e80 73 6f 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  so, do not do th
10e90 69 73 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  is when processi
10ea0 6e 67 20 6f 6e 65 20 69 6e 64 65 78 20 61 6e 20  ng one index an 
10eb0 61 20 6d 75 6c 74 69 2d 69 6e 64 65 78 0a 20 20  a multi-index.  
10ec0 20 20 2a 2a 20 4f 52 20 63 6c 61 75 73 65 2c 20    ** OR clause, 
10ed0 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73 66  since the transf
10ee0 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ormation will be
10ef0 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 6f 6e 63  come invalid onc
10f00 65 20 77 65 0a 20 20 20 20 2a 2a 20 6d 6f 76 65  e we.    ** move
10f10 20 66 6f 72 77 61 72 64 20 74 6f 20 74 68 65 20   forward to the 
10f20 6e 65 78 74 20 69 6e 64 65 78 2e 0a 20 20 20 20  next index..    
10f30 2a 2a 20 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74  ** https://sqlit
10f40 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 34  e.org/src/info/4
10f50 65 38 65 34 38 35 37 64 33 32 64 34 30 31 66 0a  e8e4857d32d401f.
10f60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10f70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
10f80 3d 3d 30 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  ==0 && (pWInfo->
10f90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
10fa0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
10fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 68 65  ==0 ){.      whe
10fc0 72 65 49 6e 64 65 78 45 78 70 72 54 72 61 6e 73  reIndexExprTrans
10fd0 28 70 49 64 78 2c 20 69 43 75 72 2c 20 69 49 64  (pIdx, iCur, iId
10fe0 78 43 75 72 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  xCur, pWInfo);. 
10ff0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11000 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
11010 69 73 20 64 72 69 76 69 6e 67 20 74 68 65 20 6c  is driving the l
11020 6f 6f 70 2c 20 74 72 79 20 74 6f 20 65 6c 69 6d  oop, try to elim
11030 69 6e 61 74 65 20 57 48 45 52 45 20 63 6c 61 75  inate WHERE clau
11040 73 65 0a 20 20 20 20 2a 2a 20 74 65 72 6d 73 20  se.    ** terms 
11050 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 74  from the query t
11060 68 61 74 20 6d 75 73 74 20 62 65 20 74 72 75 65  hat must be true
11070 20 64 75 65 20 74 6f 20 74 68 65 20 57 48 45 52   due to the WHER
11080 45 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 20 20  E clause of.    
11090 2a 2a 20 74 68 65 20 70 61 72 74 69 61 6c 20 69  ** the partial i
110a0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
110b0 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
110c0 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  dxWhere ){.     
110d0 20 77 68 65 72 65 41 70 70 6c 79 50 61 72 74 69   whereApplyParti
110e0 61 6c 49 6e 64 65 78 43 6f 6e 73 74 72 61 69 6e  alIndexConstrain
110f0 74 73 28 70 49 64 78 2d 3e 70 50 61 72 74 49 64  ts(pIdx->pPartId
11100 78 57 68 65 72 65 2c 20 69 43 75 72 2c 20 70 57  xWhere, iCur, pW
11110 43 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  C);.    }..    /
11120 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
11130 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
11140 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
11150 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  oop. */.    if( 
11160 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
11170 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
11180 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
11190 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
111a0 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
111b0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
111c0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
111d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
111e0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
111f0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
11200 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
11210 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
11220 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
11230 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
11240 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
11250 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
11260 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11270 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
11280 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
11290 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
112a0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
112b0 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
112c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
112d0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
112e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
112f0 20 6f 6d 69 74 54 61 62 6c 65 20 29 20 70 49 64   omitTable ) pId
11300 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 0a 0a  x = 0;.  }else..
11310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11320 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
11330 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ION.  if( pLoop-
11340 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
11350 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
11360 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77 6f   /* Case 5:  Two
11370 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
11380 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
11390 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
113a0 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
113b0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
113c0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
113d0 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
113e0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
113f0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
11400 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
11410 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
11420 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
11430 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
11440 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
11450 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
11460 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
11470 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
11480 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
11490 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
114a0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
114b0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
114c0 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
114d0 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
114e0 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
114f0 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c  the loop looks l
11500 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
11510 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
11520 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
11540 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
11550 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20  n reg 1.    **. 
11560 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20     ** Then, for 
11570 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72  each indexed ter
11580 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  m, the following
11590 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  . The arguments 
115a0 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74  to.    ** RowSet
115b0 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68  Test are such th
115c0 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  at the rowid of 
115d0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
115e0 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  is inserted.    
115f0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  ** into the RowS
11600 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  et. If it is alr
11610 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f  eady present, co
11620 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a  ntrol skips the.
11630 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63      ** Gosub opc
11640 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74  ode and jumps st
11650 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f  raight to the co
11660 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
11670 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20  WhereEnd()..    
11680 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
11690 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
116a0 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a  in(<term>).    *
116b0 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65  *          RowSe
116c0 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20  tTest           
116d0 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20         # Insert 
116e0 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65  rowid into rowse
116f0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
11700 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41    Gosub      2 A
11710 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
11720 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
11730 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
11740 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f  ollowing the abo
11750 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d  ve, code to term
11760 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
11770 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72  Label A, the tar
11780 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  get.    ** of th
11790 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a  e Gosub above, j
117a0 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74  umps to the inst
117b0 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66  ruction right af
117c0 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20  ter the Goto..  
117d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
117e0 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
117f0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11800 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
11810 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
11820 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f  **          Goto
11830 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20         B        
11840 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f          # The lo
11850 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a  op is finished..
11860 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
11870 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64      A: <loop bod
11880 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y>              
11890 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61     # Return data
118a0 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20  , whatever..    
118b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
118c0 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20     Return     2 
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
118e0 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   Jump back to th
118f0 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20  e Gosub.    **. 
11900 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c     **       B: <
11910 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a  after the loop>.
11920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64      **.    ** Ad
11930 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36 3a 20  ded 2014-05-26: 
11940 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
11950 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
11960 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20 20 20  table, then.    
11970 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65 6d 65  ** use an epheme
11980 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74 65 61  ral index instea
11990 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20 74 6f  d of a RowSet to
119a0 20 72 65 63 6f 72 64 20 74 68 65 20 70 72 69 6d   record the prim
119b0 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79 73 20  ary.    ** keys 
119c0 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65 20 68  of the rows we h
119d0 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
119e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  ..    **.    */.
119f0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
11a00 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
11a10 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
11a20 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
11a30 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
11a40 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
11a50 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
11a60 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
11a70 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
11a80 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
11a90 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
11aa0 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
11ab0 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
11ac0 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
11ad0 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
11ae0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11af0 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
11b00 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
11b10 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
11b20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
11b30 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11b40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
11b50 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
11b60 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
11b70 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
11b80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ba0 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
11bb0 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
11bc0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
11bd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11bf0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11c00 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
11c10 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
11c20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11c30 6c 28 70 50 61 72 73 65 29 3b 2f 2a 20 53 74 61  l(pParse);/* Sta
11c40 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20  rt of loop body 
11c50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49  */.    int iRetI
11c60 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
11c90 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f  egReturn init */
11ca0 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65  .    int unteste
11cb0 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20  dTerms = 0;     
11cc0 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20          /* Some 
11cd0 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  terms not comple
11ce0 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20  tely tested */. 
11cf0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11d20 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  unter */.    u16
11d30 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20   wctrlFlags;    
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62  /* Flags for sub
11d60 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f  -WHERE clause */
11d70 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
11d80 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
11d90 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
11da0 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
11db0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  ression */.    T
11dc0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
11dd0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20  bItem->pTab;..  
11de0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
11df0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
11e00 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
11e10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11e20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11e30 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20   & WO_OR );.    
11e40 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
11e50 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
11e60 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
11e70 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
11e80 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
11e90 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
11ea0 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
11eb0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
11ec0 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
11ed0 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
11ee0 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63  List in pOrTab c
11ef0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
11f00 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
11f10 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
11f20 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
11f30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
11f40 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
11f50 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
11f60 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
11f70 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
11f80 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
11f90 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11fa0 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
11fb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
11fc0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
11fd0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
11fe0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
11ff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
12000 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
12010 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
12020 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
12030 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
12040 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
12050 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
12060 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
12070 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
12080 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
12090 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
120a0 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
120b0 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  aw(db,.         
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61     sizeof(*pOrTa
120e0 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69  b)+ nNotReady*si
120f0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30  zeof(pOrTab->a[0
12100 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ]));.      if( p
12110 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  OrTab==0 ) retur
12120 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20  n notReady;.    
12130 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63    pOrTab->nAlloc
12140 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64   = (u8)(nNotRead
12150 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f  y + 1);.      pO
12160 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72  rTab->nSrc = pOr
12170 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Tab->nAlloc;.   
12180 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62     memcpy(pOrTab
12190 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73  ->a, pTabItem, s
121a0 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29  izeof(*pTabItem)
121b0 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63  );.      origSrc
121c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
121d0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  ist->a;.      fo
121e0 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65  r(k=1; k<=nNotRe
121f0 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ady; k++){.     
12200 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61     memcpy(&pOrTa
12210 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72  b->a[k], &origSr
12220 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f  c[pLevel[k].iFro
12230 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61  m], sizeof(pOrTa
12240 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20  b->a[k]));.     
12250 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12260 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49      pOrTab = pWI
12270 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
12280 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
12290 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73  tialize the rows
122a0 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  et register to c
122b0 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20  ontain NULL. An 
122c0 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20  SQL NULL is .   
122d0 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
122e0 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  o an empty rowse
122f0 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65 20 61  t.  Or, create a
12300 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
12310 78 0a 20 20 20 20 2a 2a 20 63 61 70 61 62 6c 65  x.    ** capable
12320 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72 69 6d   of holding prim
12330 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ary keys in the 
12340 63 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55  case of a WITHOU
12350 54 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2a 0a  T ROWID..    **.
12360 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
12370 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
12380 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
12390 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
123a0 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
123b0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
123c0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
123d0 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
123e0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
123f0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
12400 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
12410 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
12420 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
12430 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
12440 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
12450 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
12460 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
12470 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
12480 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
12490 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
124a0 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
124b0 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
124c0 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
124d0 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
124e0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
124f0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
12500 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
12510 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
12520 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
12530 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
12540 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
12550 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
12560 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
12570 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
12580 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
12590 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
125a0 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
125b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
125c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
125d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
125e0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
125f0 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
12600 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
12610 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
12620 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
12630 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  ab);.        reg
12640 52 6f 77 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Rowset = pParse-
12650 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
12660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12670 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12680 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77 73 65  emeral, regRowse
12690 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  t, pPk->nKeyCol)
126a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
126b0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
126c0 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a  o(pParse, pPk);.
126d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
126e0 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
126f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
12700 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71     iRetInit = sq
12710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12720 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
12730 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
12740 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69     /* If the ori
12750 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
12760 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66  se is z of the f
12770 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20  orm:  (x1 OR x2 
12780 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20  OR ...) AND y.  
12790 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76    ** Then for ev
127a0 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61  ery term xN, eva
127b0 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62  luate as the sub
127c0 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41  expression: xN A
127d0 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74  ND z.    ** That
127e0 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79   way, terms in y
127f0 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72   that are factor
12800 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a  ed into the disj
12810 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  unction will.   
12820 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70   ** be picked up
12830 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76   by the recursiv
12840 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  e calls to sqlit
12850 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62  e3WhereBegin() b
12860 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
12870 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61   ** Actually, ea
12880 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
12890 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
128a0 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72   "xN AND w" wher
128b0 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  e w is.    ** th
128c0 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20  e "interesting" 
128d0 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72  terms of z - ter
128e0 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20  ms that did not 
128f0 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
12900 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53  .    ** ON or US
12910 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
12920 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74  LEFT JOIN, and t
12930 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73  erms that are us
12940 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  able as .    ** 
12950 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
12960 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69      ** This opti
12970 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e  mization also on
12980 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68  ly applies if th
12990 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e  e (x1 OR x2 OR .
129a0 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  ..) term.    ** 
129b0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
129c0 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
129d0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
129e0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63  ..    ** See tic
129f0 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  ket http://www.s
12a00 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
12a10 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20  fo/f2369304e4.  
12a20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43    */.    if( pWC
12a30 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20  ->nTerm>1 ){.   
12a40 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
12a50 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b      for(iTerm=0;
12a60 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72   iTerm<pWC->nTer
12a70 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  m; iTerm++){.   
12a80 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
12a90 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d   = pWC->a[iTerm]
12aa0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12ab0 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72  if( &pWC->a[iTer
12ac0 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f  m] == pTerm ) co
12ad0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12ae0 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
12af0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
12b00 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
12b10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
12b20 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  se( pWC->a[iTerm
12b30 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ].wtFlags & TERM
12b40 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
12b50 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54    if( (pWC->a[iT
12b60 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
12b70 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
12b80 4d 5f 43 4f 44 45 44 29 29 21 3d 30 20 29 20 63  M_CODED))!=0 ) c
12b90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12ba0 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
12bb0 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm].eOperator & 
12bc0 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e  WO_ALL)==0 ) con
12bd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74  tinue;.        t
12be0 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b  estcase( pWC->a[
12bf0 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
12c00 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a   TERM_ORINFO );.
12c10 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
12c20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
12c30 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
12c40 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
12c50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
12c60 70 50 61 72 73 65 2c 20 70 41 6e 64 45 78 70 72  pParse, pAndExpr
12c70 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
12c80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
12c90 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
12ca0 2f 2a 20 54 68 65 20 65 78 74 72 61 20 30 78 31  /* The extra 0x1
12cb0 30 30 30 30 20 62 69 74 20 6f 6e 20 74 68 65 20  0000 bit on the 
12cc0 6f 70 63 6f 64 65 20 69 73 20 6d 61 73 6b 65 64  opcode is masked
12cd0 20 6f 66 66 20 61 6e 64 20 64 6f 65 73 20 6e 6f   off and does no
12ce0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63  t.        ** bec
12cf0 6f 6d 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  ome part of the 
12d00 6e 65 77 20 45 78 70 72 2e 6f 70 2e 20 20 48 6f  new Expr.op.  Ho
12d10 77 65 76 65 72 2c 20 69 74 20 64 6f 65 73 20 6d  wever, it does m
12d20 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ake the.        
12d30 2a 2a 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 63 6f  ** op==TK_AND co
12d40 6d 70 61 72 69 73 6f 6e 20 69 6e 73 69 64 65 20  mparison inside 
12d50 6f 66 20 73 71 6c 69 74 65 33 50 45 78 70 72 28  of sqlite3PExpr(
12d60 29 20 66 61 6c 73 65 2c 20 61 6e 64 20 74 68 69  ) false, and thi
12d70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
12d80 76 65 6e 74 73 20 73 71 6c 69 74 65 33 50 45 78  vents sqlite3PEx
12d90 70 72 28 29 20 66 72 6f 6d 20 69 6d 70 6c 65 6d  pr() from implem
12da0 65 6e 74 69 6e 67 20 41 4e 44 20 73 68 6f 72 74  enting AND short
12db0 2d 63 69 72 63 75 69 74 20 0a 20 20 20 20 20 20  -circuit .      
12dc0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
12dd0 6e 2c 20 77 68 69 63 68 20 77 65 20 64 6f 20 6e  n, which we do n
12de0 6f 74 20 77 61 6e 74 20 68 65 72 65 2e 20 2a 2f  ot want here. */
12df0 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
12e00 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
12e10 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 7c  (pParse, TK_AND|
12e20 30 78 31 30 30 30 30 2c 20 30 2c 20 70 41 6e 64  0x10000, 0, pAnd
12e30 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
12e40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e     }..    /* Run
12e50 20 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52   a separate WHER
12e60 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
12e70 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
12e80 20 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a   clause.  After.
12e90 20 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69      ** eliminati
12ea0 6e 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72  ng duplicates fr
12eb0 6f 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63  om other WHERE c
12ec0 6c 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69  lauses, the acti
12ed0 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  on for each.    
12ee0 2a 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  ** sub-WHERE cla
12ef0 75 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76  use is to to inv
12f00 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
12f10 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
12f20 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
12f30 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20     wctrlFlags = 
12f40 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
12f50 55 53 45 20 7c 20 28 70 57 49 6e 66 6f 2d 3e 77  USE | (pWInfo->w
12f60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
12f70 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29 3b 0a 20  E_SEEK_TABLE);. 
12f80 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
12f90 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
12fa0 22 4d 55 4c 54 49 2d 49 4e 44 45 58 20 4f 52 22  "MULTI-INDEX OR"
12fb0 29 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ));.    for(ii=0
12fc0 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72  ; ii<pOrWc->nTer
12fd0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
12fe0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
12ff0 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69  rm = &pOrWc->a[i
13000 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  i];.      if( pO
13010 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
13020 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54  r==iCur || (pOrT
13030 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13040 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
13050 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f         WhereInfo
13060 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20   *pSubWInfo;    
13070 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
13080 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
13090 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
130a0 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20    Expr *pOrExpr 
130b0 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
130c0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52 20  ; /* Current OR 
130d0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
130e0 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 31 20         int jmp1 
130f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13110 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61 74  s of jump operat
13120 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ion */.        a
13130 73 73 65 72 74 28 20 28 70 54 61 62 49 74 65 6d  ssert( (pTabItem
13140 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
13150 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 0a 20  & JT_LEFT)==0 . 
13160 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 45              || E
13170 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13180 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  OrExpr, EP_FromJ
13190 6f 69 6e 29 20 0a 20 20 20 20 20 20 20 20 29 3b  oin) .        );
131a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e  .        if( pAn
131b0 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  dExpr ){.       
131c0 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
131d0 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20  ft = pOrExpr;.  
131e0 20 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20          pOrExpr 
131f0 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20  = pAndExpr;.    
13200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
13210 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
13220 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
13230 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
13240 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
13250 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
13260 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 49 4e  ((pParse, 1, "IN
13270 44 45 58 20 25 64 22 2c 20 69 69 2b 31 29 29 3b  DEX %d", ii+1));
13280 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
13290 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75  ACE(0xffff, ("Su
132a0 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61  bplan for OR-cla
132b0 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  use:\n"));.     
132c0 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
132d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
132e0 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
132f0 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73        wctrlFlags
13330 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
13340 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
13350 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
13360 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
13370 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13380 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
13390 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
133a0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
133b0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  oop;.          i
133c0 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  nt addrExplain =
133d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
133e0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
133f0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
13400 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
13410 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 0a 20  WInfo->a[0], 0. 
13420 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
13430 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
13440 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
13450 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  v, pOrTab, &pSub
13460 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64  WInfo->a[0], add
13470 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20  rExplain);..    
13480 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
13490 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20 63   the sub-WHERE c
134a0 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72  lause body.  Fir
134b0 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20  st skip over.   
134c0 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63         ** duplic
134d0 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72  ate rows from pr
134e0 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ior sub-WHERE cl
134f0 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72  auses, and recor
13500 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
13510 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49  ** rowid (or PRI
13520 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68  MARY KEY) for th
13530 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f  e current row so
13540 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20   that the same. 
13550 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20           ** row 
13560 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
13570 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73 75  in subsequent su
13580 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  b-WHERE clauses.
13590 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
135a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
135b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
135c0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
135d0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
135e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
135f0 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
13600 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
13610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
13620 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
13630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13640 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13650 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
13660 65 28 76 2c 20 70 54 61 62 2c 20 69 43 75 72 2c  e(v, pTab, iCur,
13670 20 2d 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a   -1, regRowid);.
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d                jm
13690 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p1 = sqlite3Vdbe
136a0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
136b0 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
136c0 6f 77 73 65 74 2c 20 30 2c 0a 20 20 20 20 20 20  owset, 0,.      
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 69 53      regRowid, iS
13700 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
13710 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13720 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
13730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13740 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
13750 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
13760 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
13780 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65  t nPk = pPk->nKe
13790 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  yCol;.          
137a0 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 20 20 20      int iPk;.   
137b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
137c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
137d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20   /* Read the PK 
137e0 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
137f0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e   temp registers.
13800 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13810 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74    r = sqlite3Get
13820 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13830 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
13840 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b        for(iPk=0;
13850 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29   iPk<nPk; iPk++)
13860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13870 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b    int iCol = pPk
13880 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b  ->aiColumn[iPk];
13890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
138b0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
138c0 28 76 2c 20 70 54 61 62 2c 20 69 43 75 72 2c 20  (v, pTab, iCur, 
138d0 69 43 6f 6c 2c 20 72 2b 69 50 6b 29 3b 0a 20 20  iCol, r+iPk);.  
138e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13900 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d  Check if the tem
13910 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  p table already 
13920 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65  contains this ke
13930 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  y. If so,.      
13940 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
13950 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ow has already b
13960 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  een included in 
13970 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
13980 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
13990 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   ** can be ignor
139a0 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70  ed (by jumping p
139b0 61 73 74 20 74 68 65 20 47 6f 73 75 62 20 62 65  ast the Gosub be
139c0 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  low). Otherwise,
139d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
139e0 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  * insert the key
139f0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
13a00 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64  able and proceed
13a10 20 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67   with processing
13a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
13a30 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20  * the row..     
13a40 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
13a50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65            ** Use
13a60 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d   some of the sam
13a70 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
13a80 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  as OP_RowSetTest
13a90 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20 20 20  : If iSet.      
13aa0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65          ** is ze
13ab0 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ro, assume that 
13ac0 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61  the key cannot a
13ad0 6c 72 65 61 64 79 20 62 65 20 70 72 65 73 65 6e  lready be presen
13ae0 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  t in.           
13af0 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74     ** the temp t
13b00 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65  able. And if iSe
13b10 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20  t is -1, assume 
13b20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
13b30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13b40 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72  ** need to inser
13b50 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74  t the key into t
13b60 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61  he temp table, a
13b70 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  s it will never 
13b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
13b90 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e  * be tested for.
13ba0 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
13bb0 20 20 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a      if( iSet ){.
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 6a 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp1 = sqlite3Vd
13be0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
13bf0 50 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73  P_Found, regRows
13c00 65 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a  et, 0, r, nPk);.
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13c50 66 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20  f( iSet>=0 ){.  
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13c80 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
13c90 2c 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77  , r, nPk, regRow
13ca0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
13cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13cc0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
13cd0 49 64 78 49 6e 73 65 72 74 2c 20 72 65 67 52 6f  IdxInsert, regRo
13ce0 77 73 65 74 2c 20 72 65 67 52 6f 77 69 64 2c 0a  wset, regRowid,.
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 20 20 72 2c 20 6e 50 6b 29 3b 0a 20 20       r, nPk);.  
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
13d30 28 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33  ( iSet ) sqlite3
13d40 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13d50 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
13d60 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  SULT);.         
13d70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
13d80 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65        /* Release
13d90 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65   the array of te
13da0 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  mp registers */.
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13dc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13dd0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c  Range(pParse, r,
13de0 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
13df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13e00 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
13e10 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c  nvoke the main l
13e20 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75  oop body as a su
13e30 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
13e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13e60 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
13e70 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
13e80 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
13e90 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68  ere (skipping th
13ea0 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
13eb0 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20   subroutine) if 
13ec0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
13ed0 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45   current sub-WHE
13ee0 52 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c  RE row is a dupl
13ef0 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72  icate from prior
13f00 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a   sub-WHEREs. */.
13f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
13f20 70 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p1 ) sqlite3Vdbe
13f30 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 31  JumpHere(v, jmp1
13f40 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
13f50 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
13f60 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
13f70 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
13f80 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
13f90 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
13fa0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
13fb0 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
13fc0 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
13fd0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
13fe0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
13ff0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
14000 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
14010 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
14020 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
14030 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
14040 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
14050 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
14060 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
14070 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
14080 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
14090 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f       /* If all o
140a0 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74  f the OR-connect
140b0 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74  ed terms are opt
140c0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
140d0 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
140e0 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  ** index, and th
140f0 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  e index is opene
14100 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
14110 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
14120 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65           ** by e
14130 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ach call to sqli
14140 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
14150 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f  made by this loo
14160 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20  p, it may.      
14170 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62      ** be possib
14180 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69  le to use that i
14190 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69  ndex as a coveri
141a0 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
141b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
141c0 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   ** If the call 
141d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
141e0 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73  egin() above res
141f0 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20  ulted in a scan 
14200 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
14210 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  * uses an index,
14220 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74   and this is eit
14230 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52  her the first OR
14240 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a  -connected term.
14250 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
14260 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e  cessed or the in
14270 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20  dex is the same 
14280 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20  as that used by 
14290 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20  all previous.   
142a0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c         ** terms,
142b0 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65   set pCov to the
142c0 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
142d0 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72  ing index. Other
142e0 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20  wise, set .     
142f0 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20       ** pCov to 
14300 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65  NULL to indicate
14310 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61   that no candida
14320 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
14330 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20  x will .        
14340 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c    ** be availabl
14350 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14360 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f            pSubLo
14370 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e  op = pSubWInfo->
14380 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[0].pWLoop;.   
14390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
143a0 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
143b0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
143c0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NDEX)==0 );.    
143d0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c        if( (pSubL
143e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
143f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
14400 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
14410 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f  ii==0 || pSubLoo
14420 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
14430 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20  x==pCov).       
14440 20 20 20 20 26 26 20 28 48 61 73 52 6f 77 69 64      && (HasRowid
14450 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
14460 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75  maryKeyIndex(pSu
14470 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
14480 49 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20 20  Index)).        
14490 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
144a0 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
144b0 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
144c0 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
144d0 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
144e0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
144f0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
14500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14510 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
14520 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
14530 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
14540 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
14550 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
14560 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
14570 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
14580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
14590 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
145a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  );.          Exp
145b0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
145c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
145d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
145e0 7d 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  }.    ExplainQue
145f0 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65  ryPlanPop(pParse
14600 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  );.    pLevel->u
14610 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b  .pCovidx = pCov;
14620 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20  .    if( pCov ) 
14630 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
14640 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69  = iCovCur;.    i
14650 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
14660 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
14670 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
14680 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14690 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  e(db, pAndExpr);
146a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
146b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
146c0 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
146d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
146e0 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
146f0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
14700 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
14710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14720 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14730 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
14740 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
14750 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
14760 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
14770 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
14780 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
14790 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
147a0 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
147b0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
147c0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
147d0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
147e0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
147f0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
14800 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
14810 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
14820 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
14830 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
14840 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
14850 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
14860 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
14870 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
14880 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
14890 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
148a0 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
148b0 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
148c0 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
148d0 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
148e0 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
148f0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
14900 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62   ){.      /* Tab
14910 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63  les marked isRec
14920 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79  ursive have only
14930 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68   a single row th
14940 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  at is stored in.
14950 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64        ** a pseud
14960 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65  o-cursor.  No ne
14970 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20  ed to Rewind or 
14980 4e 65 78 74 20 73 75 63 68 20 63 75 72 73 6f 72  Next such cursor
14990 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76  s. */.      pLev
149a0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
149b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
149c0 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e     codeCursorHin
149d0 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57 49 6e  t(pTabItem, pWIn
149e0 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 30 29 3b 0a  fo, pLevel, 0);.
149f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
14a00 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
14a10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
14a20 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
14a30 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
14a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a50 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
14a60 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 48 61 6c  ], iCur, addrHal
14a70 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
14a80 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
14a90 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ==0);.      Vdbe
14aa0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
14ab0 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c  ev!=0);.      pL
14ac0 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
14ad0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
14ae0 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
14af0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
14b00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
14b10 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70 4c  _SCANSTATUS.  pL
14b20 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69 74 20  evel->addrVisit 
14b30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14b40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65 6e  rentAddr(v);.#en
14b50 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  dif..  /* Insert
14b60 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
14b70 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
14b80 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
14b90 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
14ba0 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
14bb0 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
14bc0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
14bd0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20  * This loop may 
14be0 72 75 6e 20 62 65 74 77 65 65 6e 20 6f 6e 65 20  run between one 
14bf0 61 6e 64 20 74 68 72 65 65 20 74 69 6d 65 73 2c  and three times,
14c00 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
14c10 65 0a 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  e.  ** constrain
14c20 74 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ts to be generat
14c30 65 64 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  ed. The value of
14c40 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
14c50 69 4c 6f 6f 70 0a 20 20 2a 2a 20 64 65 74 65 72  iLoop.  ** deter
14c60 6d 69 6e 65 73 20 74 68 65 20 63 6f 6e 73 74 72  mines the constr
14c70 61 69 6e 74 73 20 63 6f 64 65 64 20 62 79 20 65  aints coded by e
14c80 61 63 68 20 69 74 65 72 61 74 69 6f 6e 2c 20 61  ach iteration, a
14c90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
14ca0 20 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 31 3a 20 43    ** iLoop==1: C
14cb0 6f 64 65 20 6f 6e 6c 79 20 65 78 70 72 65 73 73  ode only express
14cc0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 65 6e  ions that are en
14cd0 74 69 72 65 6c 79 20 63 6f 76 65 72 65 64 20 62  tirely covered b
14ce0 79 20 70 49 64 78 2e 0a 20 20 2a 2a 20 69 4c 6f  y pIdx..  ** iLo
14cf0 6f 70 3d 3d 32 3a 20 43 6f 64 65 20 72 65 6d 61  op==2: Code rema
14d00 69 6e 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ining expression
14d10 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
14d20 6e 74 61 69 6e 20 63 6f 72 72 65 6c 61 74 65 64  ntain correlated
14d30 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
14d40 73 75 62 2d 71 75 65 72 69 65 73 2e 20 20 0a 20  sub-queries.  . 
14d50 20 2a 2a 20 69 4c 6f 6f 70 3d 3d 33 3a 20 43 6f   ** iLoop==3: Co
14d60 64 65 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  de all remaining
14d70 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
14d80 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 66 66 6f 72  **.  ** An effor
14d90 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 6b 69  t is made to ski
14da0 70 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 74  p unnecessary it
14db0 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
14dc0 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 4c 6f  loop..  */.  iLo
14dd0 6f 70 20 3d 20 28 70 49 64 78 20 3f 20 31 20 3a  op = (pIdx ? 1 :
14de0 20 32 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69   2);.  do{.    i
14df0 6e 74 20 69 4e 65 78 74 20 3d 20 30 3b 20 20 20  nt iNext = 0;   
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 4e 65 78 74 20 76 61 6c 75 65 20 66 6f 72 20 69  Next value for i
14e20 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 66 6f 72 28  Loop */.    for(
14e30 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
14e40 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
14e50 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
14e60 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
14e70 20 20 20 20 20 20 69 6e 74 20 73 6b 69 70 4c 69        int skipLi
14e80 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  keAddr = 0;.    
14e90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14ea0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14eb0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
14ec0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14ed0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14ee0 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
14ef0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14f00 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
14f10 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
14f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14f30 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
14f40 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
14f50 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
14f60 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
14f70 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
14f80 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
14f90 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
14fa0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
14fb0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
14fc0 4c 41 55 53 45 29 21 3d 30 20 29 3b 0a 20 20 20  LAUSE)!=0 );.   
14fd0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
14fe0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
14ff0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15010 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
15020 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
15030 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pE!=0 );.      
15040 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 66  if( (pTabItem->f
15050 67 2e 6a 6f 69 6e 74 79 70 65 26 4a 54 5f 4c 45  g.jointype&JT_LE
15060 46 54 29 20 26 26 20 21 45 78 70 72 48 61 73 50  FT) && !ExprHasP
15070 72 6f 70 65 72 74 79 28 70 45 2c 45 50 5f 46 72  roperty(pE,EP_Fr
15080 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
15090 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
150a0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
150b0 20 20 69 66 28 20 69 4c 6f 6f 70 3d 3d 31 20 26    if( iLoop==1 &
150c0 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  & !sqlite3ExprCo
150d0 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 45 2c  veredByIndex(pE,
150e0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
150f0 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
15100 20 20 20 69 4e 65 78 74 20 3d 20 32 3b 0a 20 20     iNext = 2;.  
15110 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15130 28 20 69 4c 6f 6f 70 3c 33 20 26 26 20 28 70 54  ( iLoop<3 && (pT
15140 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
15150 45 52 4d 5f 56 41 52 53 45 4c 45 43 54 29 20 29  ERM_VARSELECT) )
15160 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e  {.        if( iN
15170 65 78 74 3d 3d 30 20 29 20 69 4e 65 78 74 20 3d  ext==0 ) iNext =
15180 20 33 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   3;.        cont
15190 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
151a0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
151b0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
151c0 4c 49 4b 45 43 4f 4e 44 29 21 3d 30 20 29 7b 0a  LIKECOND)!=0 ){.
151d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
151e0 65 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20  e TERM_LIKECOND 
151f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 61  flag is set, tha
15200 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
15210 20 72 61 6e 67 65 20 73 65 61 72 63 68 0a 20 20   range search.  
15220 20 20 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66        ** is suff
15230 69 63 69 65 6e 74 20 74 6f 20 67 75 61 72 61 6e  icient to guaran
15240 74 65 65 20 74 68 61 74 20 74 68 65 20 4c 49 4b  tee that the LIK
15250 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  E operator is tr
15260 75 65 2c 20 73 6f 20 77 65 0a 20 20 20 20 20 20  ue, so we.      
15270 20 20 2a 2a 20 63 61 6e 20 73 6b 69 70 20 74 68    ** can skip th
15280 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6c 69  e call to the li
15290 6b 65 28 41 2c 42 29 20 66 75 6e 63 74 69 6f 6e  ke(A,B) function
152a0 2e 20 20 42 75 74 20 74 68 69 73 20 6f 6e 6c 79  .  But this only
152b0 20 77 6f 72 6b 73 0a 20 20 20 20 20 20 20 20 2a   works.        *
152c0 2a 20 66 6f 72 20 73 74 72 69 6e 67 73 2e 20 20  * for strings.  
152d0 53 6f 20 64 6f 20 6e 6f 74 20 73 6b 69 70 20 74  So do not skip t
152e0 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 66  he call to the f
152f0 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70  unction on the p
15300 61 73 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ass.        ** t
15310 68 61 74 20 63 6f 6d 70 61 72 65 73 20 42 4c 4f  hat compares BLO
15320 42 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Bs. */.#ifdef SQ
15330 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
15340 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20  _MATCH_BLOBS.   
15350 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23       continue;.#
15360 65 6c 73 65 0a 20 20 20 20 20 20 20 20 75 33 32  else.        u32
15370 20 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c 69   x = pLevel->iLi
15380 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20 20 20 20  keRepCntr;.     
15390 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
153a0 20 20 20 20 20 20 20 20 73 6b 69 70 4c 69 6b 65          skipLike
153b0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
153c0 62 65 41 64 64 4f 70 31 28 76 2c 20 28 78 26 31  beAddOp1(v, (x&1
153d0 29 3f 4f 50 5f 49 66 4e 6f 74 3a 4f 50 5f 49 66  )?OP_IfNot:OP_If
153e0 2c 28 69 6e 74 29 28 78 3e 3e 31 29 29 3b 0a 20  ,(int)(x>>1));. 
153f0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
15400 65 72 61 67 65 49 66 28 76 2c 20 28 78 26 31 29  erageIf(v, (x&1)
15410 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==1);.          
15420 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
15430 2c 20 28 78 26 31 29 3d 3d 30 29 3b 0a 20 20 20  , (x&1)==0);.   
15440 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15450 20 20 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45      }.#ifdef WHE
15460 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
15470 2f 2a 20 30 78 66 66 66 66 20 2a 2f 0a 20 20 20  /* 0xffff */.   
15480 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
15490 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
154a0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
154b0 65 6e 74 28 28 76 2c 20 22 57 68 65 72 65 54 65  ent((v, "WhereTe
154c0 72 6d 5b 25 64 5d 20 28 25 70 29 20 70 72 69 6f  rm[%d] (%p) prio
154d0 72 69 74 79 3d 25 64 22 2c 0a 20 20 20 20 20 20  rity=%d",.      
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2d 6a 2c     pWC->nTerm-j,
15500 20 70 54 65 72 6d 2c 20 69 4c 6f 6f 70 29 29 3b   pTerm, iLoop));
15510 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15530 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
15540 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
15550 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 6b 69  );.      if( ski
15570 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69  pLikeAddr ) sqli
15580 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15590 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29  v, skipLikeAddr)
155a0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
155b0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
155c0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ODED;.    }.    
155d0 69 4c 6f 6f 70 20 3d 20 69 4e 65 78 74 3b 0a 20  iLoop = iNext;. 
155e0 20 7d 77 68 69 6c 65 28 20 69 4c 6f 6f 70 3e 30   }while( iLoop>0
155f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74   );..  /* Insert
15600 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f   code to test fo
15610 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72  r implied constr
15620 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74  aints based on t
15630 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a  ransitivity.  **
15640 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65   of the "==" ope
15650 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
15660 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
15670 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
15680 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e  ntains "t1.a=t2.
15690 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33  b" and "t2.b=123
156a0 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72  ".  ** and we ar
156b0 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20  e coding the t1 
156c0 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20  loop and the t2 
156d0 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74  loop has not yet
156e0 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65   coded,.  ** the
156f0 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  n we cannot use 
15700 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20  the "t1.a=t2.b" 
15710 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20  constraint, but 
15720 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a  we can code.  **
15730 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31   the implied "t1
15740 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69  .a=123" constrai
15750 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  nt..  */.  for(p
15760 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
15770 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
15780 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
15790 20 20 20 45 78 70 72 20 2a 70 45 2c 20 73 45 41     Expr *pE, sEA
157a0 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  lt;.    WhereTer
157b0 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28  m *pAlt;.    if(
157c0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
157d0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
157e0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
157f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15800 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
15810 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
15820 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
15830 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
15840 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
15850 5f 45 51 55 49 56 29 3d 3d 30 20 29 20 63 6f 6e  _EQUIV)==0 ) con
15860 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
15870 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
15880 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
15890 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  e;.    if( pLeve
158a0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63  l->iLeftJoin ) c
158b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
158c0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
158d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
158e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
158f0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
15900 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
15910 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
15920 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65   & pLevel->notRe
15930 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ady)!=0 );.    p
15940 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Alt = sqlite3Whe
15950 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
15960 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
15970 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
15980 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
15990 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51 7c 57           WO_EQ|W
159a0 4f 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  O_IN|WO_IS, 0);.
159b0 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20      if( pAlt==0 
159c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
159d0 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67  if( pAlt->wtFlag
159e0 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29  s & (TERM_CODED)
159f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15a00 20 69 66 28 20 28 70 41 6c 74 2d 3e 65 4f 70 65   if( (pAlt->eOpe
15a10 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 0a  rator & WO_IN) .
15a20 20 20 20 20 20 26 26 20 28 70 41 6c 74 2d 3e 70       && (pAlt->p
15a30 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
15a40 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 20  _xIsSelect).    
15a50 20 26 26 20 28 70 41 6c 74 2d 3e 70 45 78 70 72   && (pAlt->pExpr
15a60 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
15a70 69 73 74 2d 3e 6e 45 78 70 72 3e 31 29 0a 20 20  ist->nExpr>1).  
15a80 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
15a90 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  nue;.    }.    t
15aa0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
15ab0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
15ac0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
15ad0 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
15ae0 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  r & WO_IS );.   
15af0 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
15b00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
15b10 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
15b20 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
15b30 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
15b40 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
15b50 0a 20 20 20 20 73 45 41 6c 74 20 3d 20 2a 70 41  .    sEAlt = *pA
15b60 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 73  lt->pExpr;.    s
15b70 45 41 6c 74 2e 70 4c 65 66 74 20 3d 20 70 45 2d  EAlt.pLeft = pE-
15b80 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69  >pLeft;.    sqli
15b90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
15ba0 50 61 72 73 65 2c 20 26 73 45 41 6c 74 2c 20 61  Parse, &sEAlt, a
15bb0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
15bc0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
15bd0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
15be0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
15bf0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
15c00 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
15c10 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
15c20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
15c30 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
15c40 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
15c50 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
15c60 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
15c70 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
15c80 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
15c90 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
15ca0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15cb0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
15cc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15cd0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
15ce0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
15cf0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
15d00 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
15d10 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
15d20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
15d30 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
15d40 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
15d50 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
15d60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
15d70 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
15d80 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  TUAL );.      te
15d90 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
15da0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
15db0 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28  DED );.      if(
15dc0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
15dd0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
15de0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
15df0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
15e00 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
15e10 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
15e20 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
15e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
15e40 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
15e50 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
15e60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
15e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15e80 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
15e90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15ea0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15eb0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
15ec0 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
15ed0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
15ee0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
15ef0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
15f00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15f10 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  urn pLevel->notR
15f20 65 61 64 79 3b 0a 7d 0a                          eady;.}.