/ Hex Artifact Content
Login

Artifact dfbfe198e418b01f208b489e088edd230c91a4e7:


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 2f 2a 0a  OMIT_EXPLAIN./*.
0360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0370: 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
0380: 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
0390: 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
03a0: 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
03b0: 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
03c0: 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
03d0: 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
03e0: 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
03f0: 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
0400: 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
0410: 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
0420: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
0430: 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
0440: 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
0450: 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
0460: 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
0470: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
0480: 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
0490: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
04a0: 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
04b0: 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
04d0: 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
04e0: 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
04f0: 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0510: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
0520: 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
0530: 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
0540: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
0550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0560: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
0570: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0580: 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
0590: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
05a0: 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
05b0: 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
05c0: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
05d0: 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
05e0: 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
05f0: 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70  AccumAppendAll(p
0600: 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20  Str, zColumn);. 
0610: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
0620: 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
0630: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
0640: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
0650: 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
0660: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0670: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 2d 74   name of the i-t
0680: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
0690: 70 49 64 78 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  pIdx index..*/.s
06a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
06b0: 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f   *explainIndexCo
06c0: 6c 75 6d 6e 4e 61 6d 65 28 49 6e 64 65 78 20 2a  lumnName(Index *
06d0: 70 49 64 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20  pIdx, int i){.  
06e0: 69 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  i = pIdx->aiColu
06f0: 6d 6e 5b 69 5d 3b 0a 20 20 69 66 28 20 69 3d 3d  mn[i];.  if( i==
0700: 58 4e 5f 45 58 50 52 20 29 20 72 65 74 75 72 6e  XN_EXPR ) return
0710: 20 22 3c 65 78 70 72 3e 22 3b 0a 20 20 69 66 28   "<expr>";.  if(
0720: 20 69 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 20 72   i==XN_ROWID ) r
0730: 65 74 75 72 6e 20 22 72 6f 77 69 64 22 3b 0a 20  eturn "rowid";. 
0740: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70 54   return pIdx->pT
0750: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  able->aCol[i].zN
0760: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  ame;.}../*.** Ar
0770: 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
0780: 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
0790: 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
07a0: 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
07b0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70   .** function ap
07c0: 70 65 6e 64 73 20 74 65 78 74 20 74 6f 20 70 53  pends text to pS
07d0: 74 72 20 74 68 61 74 20 64 65 73 63 72 69 62 65  tr that describe
07e0: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  s the subset of 
07f0: 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 73 63  table.** rows sc
0800: 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
0810: 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
0820: 6d 20 6f 66 20 61 6e 20 53 51 4c 20 65 78 70 72  m of an SQL expr
0830: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ession..**.** Fo
0840: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
0850: 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
0860: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0870: 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
0880: 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
0890: 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
08a0: 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
08b0: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
08c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
08d0: 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
08e0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
08f0: 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2f 0a 73  =? AND b>?".*/.s
0900: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
0910: 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 53 74 72  inIndexRange(Str
0920: 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 57 68 65  Accum *pStr, Whe
0930: 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a  reLoop *pLoop){.
0940: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
0950: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
0960: 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e  .pIndex;.  u16 n
0970: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
0980: 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e  ree.nEq;.  u16 n
0990: 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53  Skip = pLoop->nS
09a0: 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  kip;.  int i, j;
09b0: 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
09c0: 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
09d0: 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
09e0: 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
09f0: 49 54 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  IT))==0 ) return
0a00: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
0a10: 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
0a20: 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
0a30: 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
0a40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0a50: 20 2a 7a 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64   *z = explainInd
0a60: 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 6e  exColumnName(pIn
0a70: 64 65 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  dex, i);.    if(
0a80: 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
0a90: 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
0aa0: 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
0ab0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
0ac0: 28 70 53 74 72 2c 20 30 2c 20 69 3e 3d 6e 53 6b  (pStr, 0, i>=nSk
0ad0: 69 70 20 3f 20 22 25 73 3d 3f 22 20 3a 20 22 41  ip ? "%s=?" : "A
0ae0: 4e 59 28 25 73 29 22 2c 20 7a 29 3b 0a 20 20 7d  NY(%s)", z);.  }
0af0: 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
0b00: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
0b10: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
0b20: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
0b30: 72 20 2a 7a 20 3d 20 65 78 70 6c 61 69 6e 49 6e  r *z = explainIn
0b40: 64 65 78 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49  dexColumnName(pI
0b50: 6e 64 65 78 2c 20 69 29 3b 0a 20 20 20 20 65 78  ndex, i);.    ex
0b60: 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
0b70: 70 53 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e  pStr, i++, z, ">
0b80: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ");.  }.  if( pL
0b90: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
0ba0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
0bb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0bc0: 7a 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  z = explainIndex
0bd0: 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 6e 64 65  ColumnName(pInde
0be0: 78 2c 20 6a 29 3b 0a 20 20 20 20 65 78 70 6c 61  x, j);.    expla
0bf0: 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74  inAppendTerm(pSt
0c00: 72 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20  r, i, z, "<");. 
0c10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
0c20: 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
0c30: 20 22 29 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   ")", 1);.}../*.
0c40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
0c50: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
0c60: 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
0c70: 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
0c80: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
0c90: 20 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 69 66 20   command, or if 
0ca0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 44 45  either SQLITE_DE
0cb0: 42 55 47 20 6f 72 20 53 51 4c 49 54 45 5f 45 4e  BUG or SQLITE_EN
0cc0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
0cd0: 41 54 55 53 20 77 61 73 0a 2a 2a 20 64 65 66 69  ATUS was.** defi
0ce0: 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
0cf0: 69 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ime. If it is no
0d00: 74 20 61 20 6e 6f 2d 6f 70 2c 20 61 20 73 69 6e  t a no-op, a sin
0d10: 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f  gle OP_Explain o
0d20: 70 63 6f 64 65 20 0a 2a 2a 20 69 73 20 61 64 64  pcode .** is add
0d30: 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
0d40: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
0d50: 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
0d60: 74 65 67 79 20 69 6e 20 70 4c 65 76 65 6c 2e 0a  tegy in pLevel..
0d70: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 50 5f 45  **.** If an OP_E
0d80: 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 69 73  xplain opcode is
0d90: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 56 4d   added to the VM
0da0: 2c 20 69 74 73 20 61 64 64 72 65 73 73 20 69 73  , its address is
0db0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74   returned..** Ot
0dc0: 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f  herwise, if no O
0dd0: 50 5f 45 78 70 6c 61 69 6e 20 69 73 20 63 6f 64  P_Explain is cod
0de0: 65 64 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75  ed, zero is retu
0df0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
0e00: 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e  ite3WhereExplain
0e10: 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
0e20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
0e40: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
0e50: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
0e60: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
0e70: 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
0e80: 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
0e90: 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
0ea0: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
0eb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
0ec0: 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
0ed0: 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
0ee0: 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
0f10: 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
0f20: 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
0f30: 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f50: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
0f60: 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
0f70: 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
0f80: 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
0f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
0fa0: 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
0fb0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
0fc0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20  */.){.  int ret 
0fd0: 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  = 0;.#if !define
0fe0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
0ff0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1000: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
1010: 43 41 4e 53 54 41 54 55 53 29 0a 20 20 69 66 28  CANSTATUS).  if(
1020: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1030: 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b  ==2 ).#endif.  {
1040: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1050: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1060: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
1070: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1080: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
1090: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10a0: 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e   /* VM being con
10b0: 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20  structed */.    
10c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10d0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a  arse->db;     /*
10e0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
10f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
1100: 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
1110: 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
1120: 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
1130: 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
1140: 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
1150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1160: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
1170: 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
1180: 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
1190: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b0: 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
11c0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
11d0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
11e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
11f0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1200: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
1210: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 63 68  s loop */.    ch
1220: 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
1230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1240: 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
1250: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
1260: 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 20 20  StrAccum str;   
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1280: 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
1290: 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  ng */.    char z
12a0: 42 75 66 5b 31 30 30 5d 3b 20 20 20 20 20 20 20  Buf[100];       
12b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
12c0: 61 6c 20 73 70 61 63 65 20 66 6f 72 20 45 51 50  al space for EQP
12d0: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2a   output string *
12e0: 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  /..    pLoop = p
12f0: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
1300: 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70     flags = pLoop
1310: 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69  ->wsFlags;.    i
1320: 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
1330: 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63  MULTI_OR) || (wc
1340: 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1350: 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20  NETABLE_ONLY) ) 
1360: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 69  return 0;..    i
1370: 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
1380: 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
1390: 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
13a0: 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
13b0: 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
13c0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
13d0: 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
13e0: 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1400: 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1410: 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1420: 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1430: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  );..    sqlite3S
1440: 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 74 72  trAccumInit(&str
1450: 2c 20 64 62 2c 20 7a 42 75 66 2c 20 73 69 7a 65  , db, zBuf, size
1460: 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45  of(zBuf), SQLITE
1470: 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
1480: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1490: 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c  mAppendAll(&str,
14a0: 20 69 73 53 65 61 72 63 68 20 3f 20 22 53 45 41   isSearch ? "SEA
14b0: 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b 0a  RCH" : "SCAN");.
14c0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
14d0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
14e0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
14f0: 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55 45  str, 0, " SUBQUE
1500: 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e 69  RY %d", pItem->i
1510: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
1520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1530: 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1540: 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22 2c   0, " TABLE %s",
1550: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1560: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1570: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
1580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1590: 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20  intf(&str, 0, " 
15a0: 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
15b0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20  Alias);.    }.  
15c0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
15d0: 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
15e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d  VIRTUALTABLE))==
15f0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
1600: 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30 3b   char *zFmt = 0;
1610: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1620: 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
1630: 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1640: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a 20  e.pIndex!=0 );. 
1650: 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
1660: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1670: 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  x;.      assert(
1680: 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41   !(flags&WHERE_A
1690: 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66  UTO_INDEX) || (f
16a0: 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f  lags&WHERE_IDX_O
16b0: 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66  NLY) );.      if
16c0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65  ( !HasRowid(pIte
16d0: 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50 72  m->pTab) && IsPr
16e0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
16f0: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
1700: 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a 20  f( isSearch ){. 
1710: 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20           zFmt = 
1720: 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20  "PRIMARY KEY";. 
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1740: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1750: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
1760: 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
1770: 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 50  t = "AUTOMATIC P
1780: 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47 20  ARTIAL COVERING 
1790: 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d 65  INDEX";.      }e
17a0: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
17b0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
17c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
17d0: 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43 4f   = "AUTOMATIC CO
17e0: 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20  VERING INDEX";. 
17f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
1800: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1810: 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
1820: 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49 4e   zFmt = "COVERIN
1830: 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20 20  G INDEX %s";.   
1840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1850: 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58 20    zFmt = "INDEX 
1860: 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
1870: 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a 20     if( zFmt ){. 
1880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
1890: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73 74  rAccumAppend(&st
18a0: 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37 29  r, " USING ", 7)
18b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18c0: 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
18d0: 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e  , zFmt, pIdx->zN
18e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78  ame);.        ex
18f0: 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1900: 26 73 74 72 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20  &str, pLoop);.  
1910: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1920: 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
1930: 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
1940: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
1950: 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
1960: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1970: 2a 7a 52 61 6e 67 65 4f 70 3b 0a 20 20 20 20 20  *zRangeOp;.     
1980: 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1990: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
19a0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
19b0: 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70          zRangeOp
19c0: 20 3d 20 22 3d 22 3b 0a 20 20 20 20 20 20 7d 65   = "=";.      }e
19d0: 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
19e0: 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
19f0: 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
1a00: 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  IT ){.        zR
1a10: 61 6e 67 65 4f 70 20 3d 20 22 3e 3f 20 41 4e 44  angeOp = ">? AND
1a20: 20 72 6f 77 69 64 3c 22 3b 0a 20 20 20 20 20 20   rowid<";.      
1a30: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1a40: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1a50: 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67  ){.        zRang
1a60: 65 4f 70 20 3d 20 22 3e 22 3b 0a 20 20 20 20 20  eOp = ">";.     
1a70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a80: 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48  assert( flags&WH
1a90: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a  ERE_TOP_LIMIT);.
1aa0: 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70          zRangeOp
1ab0: 20 3d 20 22 3c 22 3b 0a 20 20 20 20 20 20 7d 0a   = "<";.      }.
1ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1ad0: 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20  intf(&str, 0, " 
1ae0: 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
1af0: 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
1b00: 25 73 3f 29 22 2c 7a 52 61 6e 67 65 4f 70 29 3b  %s?)",zRangeOp);
1b10: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1b30: 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
1b40: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
1b50: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1b60: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
1b70: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1b80: 72 2c 20 30 2c 20 22 20 56 49 52 54 55 41 4c 20  r, 0, " VIRTUAL 
1b90: 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
1ba0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1bb0: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
1bc0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f  tab.idxNum, pLoo
1bd0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
1be0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
1c00: 50 4c 41 49 4e 5f 45 53 54 49 4d 41 54 45 44 5f  PLAIN_ESTIMATED_
1c10: 52 4f 57 53 0a 20 20 20 20 69 66 28 20 70 4c 6f  ROWS.    if( pLo
1c20: 6f 70 2d 3e 6e 4f 75 74 3e 3d 31 30 20 29 7b 0a  op->nOut>=10 ){.
1c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1c40: 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20  intf(&str, 0, " 
1c50: 28 7e 25 6c 6c 75 20 72 6f 77 73 29 22 2c 20 73  (~%llu rows)", s
1c60: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
1c70: 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  t(pLoop->nOut));
1c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c90: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1ca0: 6d 41 70 70 65 6e 64 28 26 73 74 72 2c 20 22 20  mAppend(&str, " 
1cb0: 28 7e 31 20 72 6f 77 29 22 2c 20 39 29 3b 0a 20  (~1 row)", 9);. 
1cc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1cd0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 53 74  zMsg = sqlite3St
1ce0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74  rAccumFinish(&st
1cf0: 72 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  r);.    ret = sq
1d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d10: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
1d20: 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
1d30: 6d 2c 20 7a 4d 73 67 2c 50 34 5f 44 59 4e 41 4d  m, zMsg,P4_DYNAM
1d40: 49 43 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IC);.  }.  retur
1d50: 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  n ret;.}.#endif 
1d60: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1d70: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
1d80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d90: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
1da0: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1db0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
1dc0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1dd0: 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a 2a 20 73  ent with an.** s
1de0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1df0: 73 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 63  status() entry c
1e00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1e10: 74 68 65 20 73 63 61 6e 20 75 73 65 64 20 74 6f  the scan used to
1e20: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 6c   .** implement l
1e30: 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72 67 75 6d  evel pLvl. Argum
1e40: 65 6e 74 20 70 53 72 63 6c 69 73 74 20 69 73 20  ent pSrclist is 
1e50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e60: 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61 75 73 65   FROM .** clause
1e70: 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 72   that the scan r
1e80: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 2e 0a  eads data from..
1e90: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1ea0: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 69 73  t addrExplain is
1eb0: 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75 73 74 20   not 0, it must 
1ec0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1ed0: 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45 78 70 6c  f an .** OP_Expl
1ee0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
1ef0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1f00: 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e 0a 2a 2f  he same loop..*/
1f10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
1f20: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
1f30: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
1f60: 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
1f70: 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
1f80: 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
1fa0: 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
1fb0: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
1fc0: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1fd0: 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
1fe0: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
1ff0: 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
2000: 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
2010: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2040: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
2050: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
2060: 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
2070: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2080: 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
2090: 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
20a0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
20b0: 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
20c0: 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
20d0: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
20e0: 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
20f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2100: 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
2110: 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
2120: 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
2130: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
2140: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
2150: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
2160: 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
2170: 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
2180: 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
2190: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
21a0: 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69  Obj.  );.}.#endi
21b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  f.../*.** Disabl
21c0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
21d0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
21e0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
21f0: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
2200: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
2210: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
2220: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
2230: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2240: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
2250: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
2260: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
2270: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
2280: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
2290: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
22a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
22b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22c0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
22d0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
22e0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
22f0: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
2300: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2310: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
2320: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
2330: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
2340: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
2350: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
2360: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
2370: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
2380: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
2390: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
23a0: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
23b0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
23c0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
23d0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
23e0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
23f0: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
2400: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
2410: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
2420: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
2430: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
2440: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
2450: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
2460: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
2470: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2480: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2490: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
24a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
24b0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
24c0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
24d0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
24e0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
24f0: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
2500: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
2510: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
2520: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
2530: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
2540: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
2550: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
2560: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
2570: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
2580: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
2590: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
25a0: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
25b0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
25c0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
25d0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
25e0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
25f0: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
2600: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
2610: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  3..**.** If all 
2620: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  the children of 
2630: 61 20 74 65 72 6d 20 61 72 65 20 64 69 73 61 62  a term are disab
2640: 6c 65 64 2c 20 74 68 65 6e 20 74 68 61 74 20 74  led, then that t
2650: 65 72 6d 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  erm is also.** a
2660: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 69 73  utomatically dis
2670: 61 62 6c 65 64 2e 20 20 49 6e 20 74 68 69 73 20  abled.  In this 
2680: 77 61 79 2c 20 74 65 72 6d 73 20 67 65 74 20 64  way, terms get d
2690: 69 73 61 62 6c 65 64 20 69 66 20 64 65 72 69 76  isabled if deriv
26a0: 65 64 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ed.** virtual te
26b0: 72 6d 73 20 61 72 65 20 74 65 73 74 65 64 20 66  rms are tested f
26c0: 69 72 73 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  irst.  For examp
26d0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  le:.**.**      x
26e0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 41 4e 44   GLOB 'abc*' AND
26f0: 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c   x>='abc' AND x<
2700: 27 61 63 64 27 0a 2a 2a 20 20 20 20 20 20 5c 5f  'acd'.**      \_
2710: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
2720: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  \______/     \__
2730: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
2740: 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  parent          
2750: 63 68 69 6c 64 31 20 20 20 20 20 20 20 63 68 69  child1       chi
2760: 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ld2.**.** Only t
2770: 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d 20 77  he parent term w
2780: 61 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  as in the origin
2790: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
27a0: 20 20 54 68 65 20 63 68 69 6c 64 31 0a 2a 2a 20    The child1.** 
27b0: 61 6e 64 20 63 68 69 6c 64 32 20 74 65 72 6d 73  and child2 terms
27c0: 20 77 65 72 65 20 61 64 64 65 64 20 62 79 20 74   were added by t
27d0: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
27e0: 74 69 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 6f  tion.  If both o
27f0: 66 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c  f.** the virtual
2800: 20 63 68 69 6c 64 20 74 65 72 6d 73 20 61 72 65   child terms are
2810: 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 65 73   valid, then tes
2820: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 61 72 65  ting of the pare
2830: 6e 74 20 63 61 6e 20 62 65 20 0a 2a 2a 20 73 6b  nt can be .** sk
2840: 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  ipped..**.** Usu
2850: 61 6c 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20  ally the parent 
2860: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 61  term is marked a
2870: 73 20 54 45 52 4d 5f 43 4f 44 45 44 2e 20 20 42  s TERM_CODED.  B
2880: 75 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ut if the parent
2890: 0a 2a 2a 20 74 65 72 6d 20 77 61 73 20 6f 72 69  .** term was ori
28a0: 67 69 6e 61 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b  ginally TERM_LIK
28b0: 45 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65  E, then the pare
28c0: 6e 74 20 67 65 74 73 20 54 45 52 4d 5f 4c 49 4b  nt gets TERM_LIK
28d0: 45 43 4f 4e 44 20 69 6e 73 74 65 61 64 2e 0a 2a  ECOND instead..*
28e0: 2a 20 54 68 65 20 54 45 52 4d 5f 4c 49 4b 45 43  * The TERM_LIKEC
28f0: 4f 4e 44 20 6d 61 72 6b 69 6e 67 20 69 6e 64 69  OND marking indi
2900: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 74  cates that the t
2910: 65 72 6d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  erm should be co
2920: 64 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 61 20  ded inside.** a 
2930: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 75 63 68  conditional such
2940: 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20 65 76   that is only ev
2950: 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
2960: 65 63 6f 6e 64 20 70 61 73 73 20 6f 66 20 61 0a  econd pass of a.
2970: 2a 2a 20 4c 49 4b 45 2d 6f 70 74 69 6d 69 7a 61  ** LIKE-optimiza
2980: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 77 68 65 6e 20  tion loop, when 
2990: 73 63 61 6e 6e 69 6e 67 20 42 4c 4f 42 73 20 69  scanning BLOBs i
29a0: 6e 73 74 65 61 64 20 6f 66 20 73 74 72 69 6e 67  nstead of string
29b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
29c0: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
29d0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
29e0: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
29f0: 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  rm){.  int nLoop
2a00: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
2a10: 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
2a20: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2a30: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
2a40: 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
2a50: 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
2a60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2a70: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
2a80: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
2a90: 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
2aa0: 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
2ab0: 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
2ac0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 6f   ){.    if( nLoo
2ad0: 70 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46  p && (pTerm->wtF
2ae0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
2af0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  )!=0 ){.      pT
2b00: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2b10: 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 3b 0a 20  TERM_LIKECOND;. 
2b20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b30: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
2b40: 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
2b50: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
2b60: 6d 2d 3e 69 50 61 72 65 6e 74 3c 30 20 29 20 62  m->iParent<0 ) b
2b70: 72 65 61 6b 3b 0a 20 20 20 20 70 54 65 72 6d 20  reak;.    pTerm 
2b80: 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
2b90: 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
2ba0: 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  ;.    pTerm->nCh
2bb0: 69 6c 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ild--;.    if( p
2bc0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 21 3d 30 20  Term->nChild!=0 
2bd0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 4c 6f  ) break;.    nLo
2be0: 6f 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op++;.  }.}../*.
2bf0: 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
2c00: 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
2c10: 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
2c20: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
2c30: 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
2c40: 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
2c50: 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
2c60: 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
2c70: 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
2c80: 5f 41 46 46 5f 42 4c 4f 42 20 65 6e 74 72 69 65  _AFF_BLOB entrie
2c90: 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
2ca0: 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
2cb0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
2cc0: 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
2cd0: 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
2ce0: 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
2cf0: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
2d00: 42 4c 4f 42 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  BLOB, then no co
2d10: 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
2d20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
2d30: 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
2d40: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
2d50: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
2d60: 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
2d70: 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
2d80: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2d90: 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
2da0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
2db0: 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
2dc0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
2dd0: 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
2de0: 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
2df0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2e00: 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
2e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e20: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
2e40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
2e50: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
2e60: 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
2e70: 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
2e80: 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  er SQLITE_AFF_BL
2e90: 4f 42 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  OB entries at th
2ea0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
2eb0: 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
2ec0: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
2ed0: 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
2ee0: 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
2ef0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
2f00: 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
2f10: 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
2f20: 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
2f30: 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
2f40: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
2f50: 42 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  B ){.    n--;.  
2f60: 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
2f70: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
2f80: 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
2f90: 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
2fa0: 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
2fb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2fc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fd0: 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
2fe0: 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
2ff0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
3000: 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
3010: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
3020: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
3030: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
3040: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3050: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
3060: 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
3070: 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
3080: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
3090: 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
30a0: 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
30b0: 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
30c0: 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
30d0: 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
30e0: 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
30f0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
3100: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
3110: 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
3120: 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
3130: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
3140: 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
3150: 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
3160: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
3170: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
3180: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
3190: 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
31a0: 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
31b0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
31c0: 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
31d0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
31e0: 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
31f0: 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
3200: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
3210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
3220: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
3230: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3240: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
3250: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3260: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
3270: 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
3280: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
3290: 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
32a0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
32b0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68  l *pLevel, /* Th
32c0: 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  e level of the F
32d0: 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
32e0: 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
32f0: 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20    int iEq,      
3300: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
3310: 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  f the equality t
3320: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20  erm within this 
3330: 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
3340: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Rev,           /
3350: 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65 72  * True for rever
3360: 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72  se-order IN oper
3370: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
3380: 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
3390: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
33a0: 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
33b0: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
33c0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
33d0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
33e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
33f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
3400: 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
3410: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3420: 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
3430: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
3440: 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
3450: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
3460: 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49   || pX->op==TK_I
3470: 53 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  S ){.    iReg = 
3480: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
3490: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
34a0: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
34b0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
34c0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
34d0: 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
34e0: 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
34f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3500: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
3510: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
3520: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3530: 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
3540: 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
3550: 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
3560: 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
3570: 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
3580: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
3590: 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20  WLoop;..    if( 
35a0: 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
35b0: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
35c0: 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26  ABLE)==0.      &
35d0: 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
35e0: 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20  .pIndex!=0.     
35f0: 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
3600: 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ee.pIndex->aSort
3610: 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29  Order[iEq].    )
3620: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
3630: 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20  ( iEq==0 );.    
3640: 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
3650: 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
3660: 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
3670: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
3680: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
3690: 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
36a0: 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
36b0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
36c0: 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49 4e 44  arse, pX, IN_IND
36d0: 45 58 5f 4c 4f 4f 50 2c 20 30 29 3b 0a 20 20 20  EX_LOOP, 0);.   
36e0: 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
36f0: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
3700: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
3710: 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
3720: 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
3730: 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20     }.    iTab = 
3740: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
3750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3760: 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
3770: 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
3780: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56   iTab, 0);.    V
3790: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
37a0: 20 62 52 65 76 29 3b 0a 20 20 20 20 56 64 62 65   bRev);.    Vdbe
37b0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 21 62  CoverageIf(v, !b
37c0: 52 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev);.    assert
37d0: 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
37e0: 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
37f0: 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  OR)==0 );.    pL
3800: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
3810: 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
3820: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
3830: 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
3840: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
3850: 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
3860: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
3870: 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
3880: 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
3890: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
38a0: 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
38b0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
38c0: 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
38d0: 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
38e0: 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
3910: 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
3920: 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
3930: 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
3940: 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
3950: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
3960: 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
3970: 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
3980: 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
3990: 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
39a0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
39b0: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
39c0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
39d0: 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
39e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
39f0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
3a00: 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
3a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3a20: 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
3a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a40: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
3a50: 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
3a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3a70: 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
3a80: 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 49   bRev ? OP_PrevI
3a90: 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49  fOpen : OP_NextI
3aa0: 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c  fOpen;.      sql
3ab0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3ac0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
3ad0: 67 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  g); VdbeCoverage
3ae0: 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
3af0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
3b00: 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
3b10: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
3b20: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
3b30: 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
3b40: 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
3b50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
3b60: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
3b70: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
3b80: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
3b90: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63  r an.** index sc
3ba0: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  an..**.** For ex
3bb0: 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
3bc0: 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
3bd0: 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
3be0: 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
3bf0: 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
3c00: 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
3c10: 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
3c20: 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
3c30: 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
3c40: 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
3c50: 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
3c60: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
3c70: 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
3c80: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
3c90: 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
3ca0: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
3cb0: 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
3cc0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
3cd0: 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
3ce0: 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
3cf0: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
3d00: 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
3d10: 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
3d20: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
3d30: 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
3d40: 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
3d50: 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
3d60: 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
3d70: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
3d80: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
3d90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
3da0: 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
3db0: 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
3dc0: 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
3dd0: 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
3de0: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
3df0: 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
3e00: 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
3e10: 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
3e20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
3e30: 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
3e40: 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
3e50: 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
3e60: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
3e70: 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
3e80: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
3e90: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
3ea0: 52 65 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Reg parameter is
3eb0: 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69 73 20   0 or 1.  It is 
3ec0: 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45 20 63  0 if all WHERE c
3ed0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
3ee0: 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49  s.** are == or I
3ef0: 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65 72 65  N and are covere
3f00: 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20 20 6e  d by the nEq.  n
3f10: 45 78 74 72 61 52 65 67 20 69 73 20 31 20 69 66  ExtraReg is 1 if
3f20: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
3f30: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
3f40: 72 61 69 6e 74 20 28 73 75 63 68 20 61 73 20 74  raint (such as t
3f50: 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31  he "c>=5 AND c<1
3f60: 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  0" in the exampl
3f70: 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72  e) that.** occur
3f80: 73 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  s after the nEq 
3f90: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
3fa0: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nts..**.** This 
3fb0: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
3fc0: 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e 45 71  s a range of nEq
3fd0: 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d 6f 72  +nExtraReg memor
3fe0: 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65 74 75  y cells and retu
3ff0: 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
4000: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6d 65   of the first me
4010: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 61  mory cell in tha
4020: 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63 6f 64  t range. The cod
4030: 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
4040: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
4050: 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
4060: 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f 72 65  y range to store
4070: 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61   keys for.** sta
4080: 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 69  rt and terminati
4090: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66  on conditions of
40a0: 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65   the loop..** ke
40b0: 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
40c0: 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
40d0: 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
40e0: 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
40f0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
4100: 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
4110: 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
4120: 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
4130: 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
4140: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
4150: 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
4160: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
4170: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
4180: 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
4190: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
41a0: 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
41b0: 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
41c0: 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
41d0: 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
41e0: 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
41f0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
4200: 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
4210: 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
4220: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
4230: 74 68 61 74 20 75 73 65 20 42 4c 4f 42 20 6f 72  that use BLOB or
4240: 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
4250: 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
4260: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2e 20 54 68  ITE_AFF_BLOB. Th
4270: 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
4280: 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
4290: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
42a0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
42b0: 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
42c0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
42d0: 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
42e0: 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
42f0: 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
4300: 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
4310: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
4320: 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
4330: 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
4340: 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
4350: 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
4360: 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
4370: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
4380: 20 28 74 32 2e 62 29 20 68 61 73 20 42 4c 4f 42   (t2.b) has BLOB
4390: 2f 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a  /NONE affinity,.
43a0: 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
43b0: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
43c0: 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
43d0: 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
43e0: 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
43f0: 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
4400: 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
4410: 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
4420: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
4430: 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
4440: 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
4450: 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
4460: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2e  SQLITE_AFF_BLOB.
4470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4480: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
4490: 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
44a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
44b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
44c0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
44d0: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
44e0: 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
44f0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
4500: 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
4510: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
4520: 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
4530: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
4540: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
4550: 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
4560: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4570: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
4580: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
4590: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
45a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
45b0: 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
45c0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
45d0: 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71   */.){.  u16 nEq
45e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
45f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
4600: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
4610: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
4620: 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53  code */.  u16 nS
4630: 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
4640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4650: 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  r of left-most c
4660: 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a  olumns to skip *
4670: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
4680: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4690: 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
46a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
46b0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
46e0: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
46f0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
4700: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
4710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
4720: 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
4730: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
4740: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
4770: 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
47a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
47b0: 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
47c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
47d0: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
47e0: 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4800: 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
4810: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
4820: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
4850: 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
4860: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
4870: 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
4880: 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
4890: 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
48a0: 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
48b0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
48c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
48d0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
48e0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
48f0: 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
4900: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
4910: 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c  Eq;.  nSkip = pL
4920: 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49  oop->nSkip;.  pI
4930: 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
4940: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73  ree.pIndex;.  as
4950: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
4960: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
4970: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
4980: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
4990: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
49a0: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
49b0: 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
49c0: 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
49d0: 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  eg = pLoop->u.bt
49e0: 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61  ree.nEq + nExtra
49f0: 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Reg;.  pParse->n
4a00: 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20  Mem += nReg;..  
4a10: 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  zAff = sqlite3Db
4a20: 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
4a30: 62 2c 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  b,sqlite3IndexAf
4a40: 66 69 6e 69 74 79 53 74 72 28 70 50 61 72 73 65  finityStr(pParse
4a50: 2d 3e 64 62 2c 70 49 64 78 29 29 3b 0a 20 20 69  ->db,pIdx));.  i
4a60: 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
4a70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4a80: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
4a90: 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29  }..  if( nSkip )
4aa0: 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
4ab0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
4ac0: 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
4ad0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62  VdbeAddOp1(v, (b
4ae0: 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52  Rev?OP_Last:OP_R
4af0: 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29  ewind), iIdxCur)
4b00: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
4b10: 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
4b20: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
4b30: 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
4b40: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
4b50: 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69  t((v, "begin ski
4b60: 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70  p-scan on %s", p
4b70: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
4b80: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62    j = sqlite3Vdb
4b90: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
4ba0: 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  to);.    pLevel-
4bb0: 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69  >addrSkip = sqli
4bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
4bd0: 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65  (v, (bRev?OP_See
4be0: 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a  kLT:OP_SeekGT),.
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
4c10: 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c  Cur, 0, regBase,
4c20: 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62   nSkip);.    Vdb
4c30: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
4c40: 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
4c50: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
4c60: 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c  Rev!=0);.    sql
4c70: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4c80: 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28  (v, j);.    for(
4c90: 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b  j=0; j<nSkip; j+
4ca0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4cb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4cc0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
4cd0: 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
4ce0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4cf0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
4d00: 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52 20 29 3b 0a  [j]==XN_EXPR );.
4d10: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
4d20: 74 28 28 76 2c 20 22 25 73 22 2c 20 65 78 70 6c  t((v, "%s", expl
4d30: 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d 6e 4e 61  ainIndexColumnNa
4d40: 6d 65 28 70 49 64 78 2c 20 6a 29 29 29 3b 0a 20  me(pIdx, j)));. 
4d50: 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20     }.  }    ..  
4d60: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
4d70: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
4d80: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
4d90: 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28  rt( zAff==0 || (
4da0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29  int)strlen(zAff)
4db0: 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
4dc0: 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a  =nSkip; j<nEq; j
4dd0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
4de0: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
4df0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
4e00: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
4e10: 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  !=0 );.    /* Th
4e20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
4e30: 63 61 73 65 20 69 73 20 74 72 75 65 20 66 6f 72  case is true for
4e40: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
4e50: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
4e60: 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
4e70: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
4e80: 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
4e90: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
4ea0: 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
4eb0: 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
4ec0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
4ed0: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
4ee0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
4ef0: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
4f00: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
4f10: 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
4f20: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
4f30: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
4f40: 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67  el, j, bRev, reg
4f50: 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
4f60: 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
4f70: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
4f80: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
4f90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4fa0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4fb0: 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
4fc0: 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
4fd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ff0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
5000: 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
5010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5020: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
5030: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
5040: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
5050: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
5060: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
5070: 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
5080: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
5090: 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
50a0: 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
50b0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
50c0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
50d0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
50e0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
50f0: 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d 30 20 26   & TERM_IS)==0 &
5100: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
5110: 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29  BeNull(pRight) )
5120: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5140: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
5150: 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
5160: 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  rBrk);.        V
5170: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5190: 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
51a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
51b0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
51c0: 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
51d0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
51e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
51f0: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
5200: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
5210: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
5220: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
5230: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
5240: 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
5250: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
5260: 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
5270: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
5280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5290: 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
52a0: 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
52b0: 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
52c0: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
52d0: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
52e0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 6f 73  /*.** If the mos
52f0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
5300: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5310: 61 20 63 6f 6e 73 74 61 6e 74 20 72 61 6e 67 65  a constant range
5320: 20 63 6f 6e 74 72 61 69 6e 74 0a 2a 2a 20 74 68   contraint.** th
5330: 61 74 20 6f 72 69 67 69 6e 61 74 65 64 20 66 72  at originated fr
5340: 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  om the LIKE opti
5350: 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 63  mization, then c
5360: 68 61 6e 67 65 20 74 68 65 20 50 33 20 74 6f 20  hange the P3 to 
5370: 62 65 0a 2a 2a 20 70 4c 6f 6f 70 2d 3e 69 4c 69  be.** pLoop->iLi
5380: 6b 65 52 65 70 43 6e 74 72 20 61 6e 64 20 73 65  keRepCntr and se
5390: 74 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  t P5..**.** The 
53a0: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
53b0: 6e 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75 61  n trys to evalua
53c0: 74 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  te "x LIKE 'abc%
53d0: 27 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a 2a  '" as a range.**
53e0: 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78 3e   expression: "x>
53f0: 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62  ='ABC' AND x<'ab
5400: 64 27 22 2e 20 20 42 75 74 20 74 68 69 73 20 72  d'".  But this r
5410: 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
5420: 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20 6c   range.** scan l
5430: 6f 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20 6f  oop run twice, o
5440: 6e 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73 20  nce for strings 
5450: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  and a second tim
5460: 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a 20  e for BLOBs..** 
5470: 54 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70  The OP_String op
5480: 63 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65 63  codes on the sec
5490: 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72 74  ond pass convert
54a0: 20 74 68 65 20 75 70 70 65 72 20 61 6e 64 20 6c   the upper and l
54b0: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73 74  ower.** bound st
54c0: 72 69 6e 67 20 63 6f 6e 74 61 6e 74 73 20 74 6f  ring contants to
54d0: 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72 6f   blobs.  This ro
54e0: 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
54f0: 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67 65  necessary change
5500: 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f 53  s.** to the OP_S
5510: 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66 6f  tring opcodes fo
5520: 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65 6e  r that to happen
5530: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
5540: 6f 66 20 63 6f 75 72 73 65 2c 20 69 66 20 53 51  of course, if SQ
5550: 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
5560: 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 20 69 73 20  _MATCH_BLOBS is 
5570: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 2a 2a  defined, then.**
5580: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 70 61   only the one pa
5590: 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ss through the s
55a0: 74 72 69 6e 67 20 73 70 61 63 65 20 69 73 20 72  tring space is r
55b0: 65 71 75 69 72 65 64 2c 20 73 6f 20 74 68 69 73  equired, so this
55c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 62 65 63 6f   routine.** beco
55d0: 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mes a no-op..*/.
55e0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
55f0: 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f  eLikeOptimizatio
5600: 6e 53 74 72 69 6e 67 46 69 78 75 70 28 0a 20 20  nStringFixup(.  
5610: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
5620: 20 20 20 20 20 20 20 20 2f 2a 20 70 72 65 70 61          /* prepa
5630: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
5640: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
5650: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
5660: 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 2f 2a   *pLevel,     /*
5670: 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 63   The loop that c
5680: 6f 6e 74 61 69 6e 73 20 74 68 65 20 4c 49 4b 45  ontains the LIKE
5690: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57   operator */.  W
56a0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
56b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 70         /* The up
56c0: 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
56d0: 6e 64 20 6a 75 73 74 20 63 6f 64 65 64 20 2a 2f  nd just coded */
56e0: 0a 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  .){.  if( pTerm-
56f0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
5700: 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 56  LIKEOPT ){.    V
5710: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
5720: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
5730: 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 30 20 29  iLikeRepCntr>0 )
5740: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69  ;.    pOp = sqli
5750: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
5760: 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
5770: 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 61   pOp!=0 );.    a
5780: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
5790: 64 65 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 0a  de==OP_String8 .
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
57b0: 54 65 72 6d 2d 3e 70 57 43 2d 3e 70 57 49 6e 66  Term->pWC->pWInf
57c0: 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  o->pParse->db->m
57d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
57e0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 4c 65     pOp->p3 = pLe
57f0: 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
5800: 72 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 35 20 3d  r;.    pOp->p5 =
5810: 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   1;.  }.}.#else.
5820: 23 20 64 65 66 69 6e 65 20 77 68 65 72 65 4c 69  # define whereLi
5830: 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
5840: 72 69 6e 67 46 69 78 75 70 28 41 2c 42 2c 43 29  ringFixup(A,B,C)
5850: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
5860: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
5870: 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
5880: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   Information is 
5890: 70 61 73 73 65 64 20 66 72 6f 6d 20 63 6f 64 65  passed from code
58a0: 43 75 72 73 6f 72 48 69 6e 74 28 29 20 64 6f 77  CursorHint() dow
58b0: 6e 20 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  n to individual 
58c0: 6e 6f 64 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  nodes of.** the 
58d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
58e0: 28 62 79 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  (by sqlite3WalkE
58f0: 78 70 72 28 29 29 20 75 73 69 6e 67 20 61 6e 20  xpr()) using an 
5900: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
5910: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
5920: 2f 0a 73 74 72 75 63 74 20 43 43 75 72 48 69 6e  /.struct CCurHin
5930: 74 20 7b 0a 20 20 69 6e 74 20 69 54 61 62 43 75  t {.  int iTabCu
5940: 72 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r;    /* Cursor 
5950: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
5960: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  le */.  int iIdx
5970: 43 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur;    /* Curso
5980: 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2c  r for the index,
5990: 20 69 66 20 70 49 64 78 21 3d 30 2e 20 20 55 6e   if pIdx!=0.  Un
59a0: 75 73 65 64 20 6f 74 68 65 72 77 69 73 65 20 2a  used otherwise *
59b0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
59c0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
59d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
59e0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
59f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5a00: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
5a10: 6f 72 20 65 76 65 72 79 20 6e 6f 64 65 20 6f 66  or every node of
5a20: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5a30: 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61  hat is a candida
5a40: 74 65 0a 2a 2a 20 66 6f 72 20 61 20 63 75 72 73  te.** for a curs
5a50: 6f 72 20 68 69 6e 74 20 6f 6e 20 61 6e 20 69 6e  or hint on an in
5a60: 64 65 78 20 63 75 72 73 6f 72 2e 20 20 46 6f 72  dex cursor.  For
5a70: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
5a80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 0a   that reference.
5a90: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 43 43 75  ** the table CCu
5aa0: 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20 76  rHint.iTabCur, v
5ab0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
5ac0: 61 6d 65 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ame column can b
5ad0: 65 0a 2a 2a 20 61 63 63 65 73 73 65 64 20 74 68  e.** accessed th
5ae0: 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 2e  rough the index.
5af0: 20 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 2c 20    If it cannot, 
5b00: 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65 72  then set pWalker
5b10: 2d 3e 65 43 6f 64 65 20 74 6f 20 31 2e 0a 2a 2f  ->eCode to 1..*/
5b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
5b30: 43 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b 45  CursorHintCheckE
5b40: 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  xpr(Walker *pWal
5b50: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
5b60: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 43 75 72  ){.  struct CCur
5b70: 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70 57  Hint *pHint = pW
5b80: 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48 69  alker->u.pCCurHi
5b90: 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 48  nt;.  assert( pH
5ba0: 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20 29 3b 0a  int->pIdx!=0 );.
5bb0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
5bc0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
5bd0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
5be0: 70 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 0a 20  pHint->iTabCur. 
5bf0: 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75    && sqlite3Colu
5c00: 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d  mnOfIndex(pHint-
5c10: 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
5c20: 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
5c30: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
5c40: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
5c50: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
5c60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
5c70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
5c80: 65 64 20 6f 6e 20 65 76 65 72 79 20 6e 6f 64 65  ed on every node
5c90: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5ca0: 6e 20 74 72 65 65 20 75 73 65 64 20 61 73 20 61  n tree used as a
5cb0: 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  n.** argument to
5cc0: 20 74 68 65 20 4f 50 5f 43 75 72 73 6f 72 48 69   the OP_CursorHi
5cd0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  nt instruction. 
5ce0: 49 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 61  If the node is a
5cf0: 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 74 68   TK_COLUMN.** th
5d00: 61 74 20 61 63 63 65 73 73 65 73 20 61 6e 79 20  at accesses any 
5d10: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
5d20: 20 74 68 65 20 6f 6e 65 20 69 64 65 6e 74 69 66   the one identif
5d30: 69 65 64 20 62 79 0a 2a 2a 20 43 43 75 72 48 69  ied by.** CCurHi
5d40: 6e 74 2e 69 54 61 62 43 75 72 2c 20 74 68 65 6e  nt.iTabCur, then
5d50: 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
5d60: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 61 6c  g:.**.**   1) al
5d70: 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
5d80: 72 20 61 6e 64 20 63 6f 64 65 20 61 6e 20 4f 50  r and code an OP
5d90: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
5da0: 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a 2a 2a 20  ion to read .** 
5db0: 20 20 20 20 20 74 68 65 20 73 70 65 63 69 66 69       the specifi
5dc0: 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 74  ed column into t
5dd0: 68 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 2c  he new register,
5de0: 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20   and.**.**   2) 
5df0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 65 78  transform the ex
5e00: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
5e10: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6e   a TK_REGISTER n
5e20: 6f 64 65 20 74 68 61 74 20 72 65 61 64 73 20 0a  ode that reads .
5e30: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
5e40: 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61 74 65 64   newly populated
5e50: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
5e60: 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 6e 6f   Also, if the no
5e70: 64 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d  de is a TK_COLUM
5e80: 4e 20 74 68 61 74 20 64 6f 65 73 20 61 63 63 65  N that does acce
5e90: 73 73 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  ss the table ide
5ea0: 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 43 43  nified.** by pCC
5eb0: 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20  urHint.iTabCur, 
5ec0: 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20  and an index is 
5ed0: 62 65 69 6e 67 20 75 73 65 64 20 28 77 68 69 63  being used (whic
5ee0: 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 6b 6e 6f  h we will.** kno
5ef0: 77 20 62 65 63 61 75 73 65 20 43 43 75 72 48 69  w because CCurHi
5f00: 6e 74 2e 70 49 64 78 21 3d 30 29 20 74 68 65 6e  nt.pIdx!=0) then
5f10: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 54   transform the T
5f20: 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f 0a 2a 2a  K_COLUMN into.**
5f30: 20 61 6e 20 61 63 63 65 73 73 20 6f 66 20 74 68   an access of th
5f40: 65 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  e index rather t
5f50: 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  han the original
5f60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
5f70: 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f 72  c int codeCursor
5f80: 48 69 6e 74 46 69 78 45 78 70 72 28 57 61 6c 6b  HintFixExpr(Walk
5f90: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
5fa0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
5fb0: 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e 74 69 6e   rc = WRC_Contin
5fc0: 75 65 3b 0a 20 20 73 74 72 75 63 74 20 43 43 75  ue;.  struct CCu
5fd0: 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d 20 70  rHint *pHint = p
5fe0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75 72 48  Walker->u.pCCurH
5ff0: 69 6e 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  int;.  if( pExpr
6000: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
6010: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
6020: 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69 6e 74 2d  ->iTable!=pHint-
6030: 3e 69 54 61 62 43 75 72 20 29 7b 0a 20 20 20 20  >iTabCur ){.    
6040: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 61 6c    Vdbe *v = pWal
6050: 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64  ker->pParse->pVd
6060: 62 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  be;.      int re
6070: 67 20 3d 20 2b 2b 70 57 61 6c 6b 65 72 2d 3e 70  g = ++pWalker->p
6080: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f  Parse->nMem;   /
6090: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 63  * Register for c
60a0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olumn value */. 
60b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
60c0: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
60d0: 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  able(.          
60e0: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
60f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
6100: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72  Expr->iColumn, r
6110: 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  eg.      );.    
6120: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
6130: 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
6140: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6150: 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20   reg;.    }else 
6160: 69 66 28 20 70 48 69 6e 74 2d 3e 70 49 64 78 21  if( pHint->pIdx!
6170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
6180: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 48 69 6e  r->iTable = pHin
6190: 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  t->iIdxCur;.    
61a0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
61b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
61c0: 4f 66 49 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70  OfIndex(pHint->p
61d0: 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
61e0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  umn);.      asse
61f0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
6200: 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  mn>=0 );.    }. 
6210: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
6220: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
6230: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  CTION ){.    /* 
6240: 41 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  An aggregate fun
6250: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 57 48 45  ction in the WHE
6260: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  RE clause of a q
6270: 75 65 72 79 20 6d 65 61 6e 73 20 74 68 69 73 20  uery means this 
6280: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 61  must.    ** be a
6290: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
62a0: 71 75 65 72 79 2c 20 61 6e 64 20 65 78 70 72 65  query, and expre
62b0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
62c0: 6e 20 61 67 67 72 65 67 61 74 65 20 66 72 6f 6d  n aggregate from
62d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 65  .    ** the pare
62e0: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44 6f 20 6e  nt context. Do n
62f0: 6f 74 20 77 61 6c 6b 20 74 68 65 20 66 75 6e 63  ot walk the func
6300: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
6310: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
6320: 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a   **.    ** todo:
6330: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 6f   It should be po
6340: 73 73 69 62 6c 65 20 74 6f 20 72 65 70 6c 61 63  ssible to replac
6350: 65 20 74 68 69 73 20 6e 6f 64 65 20 77 69 74 68  e this node with
6360: 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20   a TK_REGISTER. 
6370: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
6380: 2c 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  , as the result 
6390: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
63a0: 6e 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  n must be stored
63b0: 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a 20 72 65   in a .    ** re
63c0: 67 69 73 74 65 72 20 61 74 20 74 68 69 73 20 70  gister at this p
63d0: 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d 65 20 68  oint. The same h
63e0: 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41 47 47 5f  olds for TK_AGG_
63f0: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 2a 2f  COLUMN nodes. */
6400: 0a 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72  .    rc = WRC_Pr
6410: 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
6420: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
6430: 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43 75 72 73  nsert an OP_Curs
6440: 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69  orHint instructi
6450: 6f 6e 20 69 66 20 69 74 20 69 73 20 61 70 70 72  on if it is appr
6460: 6f 70 72 69 61 74 65 20 74 6f 20 64 6f 20 73 6f  opriate to do so
6470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6480: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
6490: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
64a0: 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
64b0: 77 68 65 72 65 20 63 6c 61 75 73 65 20 2a 2f 0a  where clause */.
64c0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
64d0: 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
64e0: 20 6c 6f 6f 70 20 74 6f 20 70 72 6f 76 69 64 65   loop to provide
64f0: 20 68 69 6e 74 73 20 66 6f 72 20 2a 2f 0a 20 20   hints for */.  
6500: 57 68 65 72 65 54 65 72 6d 20 2a 70 45 6e 64 52  WhereTerm *pEndR
6510: 61 6e 67 65 20 20 2f 2a 20 48 69 6e 74 20 74 68  ange  /* Hint th
6520: 69 73 20 65 6e 64 2d 6f 66 2d 73 63 61 6e 20 62  is end-of-scan b
6530: 6f 75 6e 64 61 72 79 20 74 65 72 6d 20 69 66 20  oundary term if 
6540: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
6550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
6560: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
6570: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6580: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
6590: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
65a0: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
65b0: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 57 68 65  pExpr = 0;.  Whe
65c0: 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
65d0: 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
65e0: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
65f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
6600: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
6610: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
6620: 20 20 73 74 72 75 63 74 20 43 43 75 72 48 69 6e    struct CCurHin
6630: 74 20 73 48 69 6e 74 3b 0a 20 20 57 61 6c 6b 65  t sHint;.  Walke
6640: 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 69 66  r sWalker;..  if
6650: 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
6660: 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
6670: 45 5f 43 75 72 73 6f 72 48 69 6e 74 73 29 20 29  E_CursorHints) )
6680: 20 72 65 74 75 72 6e 3b 0a 20 20 69 43 75 72 20   return;.  iCur 
6690: 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
66a0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  r;.  assert( iCu
66b0: 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  r==pWInfo->pTabL
66c0: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
66d0: 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b  From].iCursor );
66e0: 0a 20 20 73 48 69 6e 74 2e 69 54 61 62 43 75 72  .  sHint.iTabCur
66f0: 20 3d 20 69 43 75 72 3b 0a 20 20 73 48 69 6e 74   = iCur;.  sHint
6700: 2e 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65  .iIdxCur = pLeve
6710: 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 73 48  l->iIdxCur;.  sH
6720: 69 6e 74 2e 70 49 64 78 20 3d 20 70 4c 6f 6f 70  int.pIdx = pLoop
6730: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
6740: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ;.  memset(&sWal
6750: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ker, 0, sizeof(s
6760: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c  Walker));.  sWal
6770: 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61  ker.pParse = pPa
6780: 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75  rse;.  sWalker.u
6790: 2e 70 43 43 75 72 48 69 6e 74 20 3d 20 26 73 48  .pCCurHint = &sH
67a0: 69 6e 74 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  int;.  pWC = &pW
67b0: 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 66 6f 72  Info->sWC;.  for
67c0: 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  (i=0; i<pWC->nTe
67d0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54  rm; i++){.    pT
67e0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 5d  erm = &pWC->a[i]
67f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
6800: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
6810: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
6820: 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
6830: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
6840: 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76  prereqAll & pLev
6850: 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 29 20 63  el->notReady ) c
6860: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
6870: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6880: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
6890: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
68a0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
68b0: 41 6c 6c 20 74 65 72 6d 73 20 69 6e 20 70 57 4c  All terms in pWL
68c0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 65 78  oop->aLTerm[] ex
68d0: 63 65 70 74 20 70 45 6e 64 52 61 6e 67 65 20 61  cept pEndRange a
68e0: 72 65 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  re used to initi
68f0: 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 74 68 65  alize.    ** the
6900: 20 63 75 72 73 6f 72 2e 20 20 54 68 65 73 65 20   cursor.  These 
6910: 74 65 72 6d 73 20 61 72 65 20 6e 6f 74 20 6e 65  terms are not ne
6920: 65 64 65 64 20 61 73 20 68 69 6e 74 73 20 66 6f  eded as hints fo
6930: 72 20 61 20 70 75 72 65 20 72 61 6e 67 65 0a 20  r a pure range. 
6940: 20 20 20 2a 2a 20 73 63 61 6e 20 28 74 68 61 74     ** scan (that
6950: 20 68 61 73 20 6e 6f 20 3d 3d 20 74 65 72 6d 73   has no == terms
6960: 29 20 73 6f 20 6f 6d 69 74 20 74 68 65 6d 2e 20  ) so omit them. 
6970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
6980: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 30  ->u.btree.nEq==0
6990: 20 26 26 20 70 54 65 72 6d 21 3d 70 45 6e 64 52   && pTerm!=pEndR
69a0: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  ange ){.      fo
69b0: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e  r(j=0; j<pLoop->
69c0: 6e 4c 54 65 72 6d 20 26 26 20 70 4c 6f 6f 70 2d  nLTerm && pLoop-
69d0: 3e 61 4c 54 65 72 6d 5b 6a 5d 21 3d 70 54 65 72  >aLTerm[j]!=pTer
69e0: 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  m; j++){}.      
69f0: 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54  if( j<pLoop->nLT
6a00: 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  erm ) continue;.
6a10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
6a20: 20 73 75 62 71 75 65 72 69 65 73 20 6f 72 20 6e   subqueries or n
6a30: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
6a40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
6a50: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ed */.    if( sq
6a60: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
6a70: 73 53 75 62 71 75 65 72 79 28 70 54 65 72 6d 2d  sSubquery(pTerm-
6a80: 3e 70 45 78 70 72 29 20 29 20 63 6f 6e 74 69 6e  >pExpr) ) contin
6a90: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20  ue;..    /* For 
6aa0: 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 6d  an index scan, m
6ab0: 61 6b 65 20 73 75 72 65 20 72 65 66 65 72 65 6e  ake sure referen
6ac0: 63 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ced columns are 
6ad0: 61 63 74 75 61 6c 6c 79 20 69 6e 0a 20 20 20 20  actually in.    
6ae0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f  ** the index. */
6af0: 0a 20 20 20 20 69 66 28 20 73 48 69 6e 74 2e 70  .    if( sHint.p
6b00: 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx!=0 ){.      
6b10: 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 3d 20  sWalker.eCode = 
6b20: 30 3b 0a 20 20 20 20 20 20 73 57 61 6c 6b 65 72  0;.      sWalker
6b30: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
6b40: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 43   codeCursorHintC
6b50: 68 65 63 6b 45 78 70 72 3b 0a 20 20 20 20 20 20  heckExpr;.      
6b60: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
6b70: 26 73 57 61 6c 6b 65 72 2c 20 70 54 65 72 6d 2d  &sWalker, pTerm-
6b80: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6b90: 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65  f( sWalker.eCode
6ba0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6bb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65   }..    /* If we
6bc0: 20 73 75 72 76 69 76 65 20 61 6c 6c 20 70 72 69   survive all pri
6bd0: 6f 72 20 74 65 73 74 73 2c 20 74 68 61 74 20 6d  or tests, that m
6be0: 65 61 6e 73 20 74 68 69 73 20 74 65 72 6d 20 69  eans this term i
6bf0: 73 20 77 6f 72 74 68 20 68 69 6e 74 69 6e 67 20  s worth hinting 
6c00: 2a 2f 0a 20 20 20 20 70 45 78 70 72 20 3d 20 73  */.    pExpr = s
6c10: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
6c20: 2c 20 70 45 78 70 72 2c 20 73 71 6c 69 74 65 33  , pExpr, sqlite3
6c30: 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 65 72  ExprDup(db, pTer
6c40: 6d 2d 3e 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  m->pExpr, 0));. 
6c50: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 21 3d   }.  if( pExpr!=
6c60: 30 20 29 7b 0a 20 20 20 20 73 57 61 6c 6b 65 72  0 ){.    sWalker
6c70: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
6c80: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 46   codeCursorHintF
6c90: 69 78 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69  ixExpr;.    sqli
6ca0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
6cb0: 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  lker, pExpr);.  
6cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cd0: 4f 70 34 28 76 2c 20 4f 50 5f 43 75 72 73 6f 72  Op4(v, OP_Cursor
6ce0: 48 69 6e 74 2c 20 0a 20 20 20 20 20 20 20 20 20  Hint, .         
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 48               (sH
6d00: 69 6e 74 2e 70 49 64 78 20 3f 20 73 48 69 6e 74  int.pIdx ? sHint
6d10: 2e 69 49 64 78 43 75 72 20 3a 20 73 48 69 6e 74  .iIdxCur : sHint
6d20: 2e 69 54 61 62 43 75 72 29 2c 20 30 2c 20 30 2c  .iTabCur), 0, 0,
6d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d40: 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
6d50: 61 72 2a 29 70 45 78 70 72 2c 20 50 34 5f 45 58  ar*)pExpr, P4_EX
6d60: 50 52 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  PR);.  }.}.#else
6d70: 0a 23 20 64 65 66 69 6e 65 20 63 6f 64 65 43 75  .# define codeCu
6d80: 72 73 6f 72 48 69 6e 74 28 41 2c 42 2c 43 29 20  rsorHint(A,B,C) 
6d90: 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e   /* No-op */.#en
6da0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
6db0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
6dc0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  S */../*.** Gene
6dd0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
6de0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
6df0: 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
6e00: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6e10: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
6e20: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
6e30: 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 42 69 74 6d   pWInfo..*/.Bitm
6e40: 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65  ask sqlite3Where
6e50: 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  CodeOneLoopStart
6e60: 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
6e70: 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
6e80: 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
6e90: 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
6ea0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
6eb0: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
6ec0: 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
6ed0: 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
6ee0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
6ef0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
6f00: 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
6f10: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
6f20: 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
6f30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
6f40: 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
6f50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
6f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
6f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6f80: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
6f90: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
6fa0: 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
6fb0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
6fc0: 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
6fd0: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
6fe0: 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
6ff0: 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
7000: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
7010: 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
7020: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
7030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7040: 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
7050: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
7060: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
7070: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
7080: 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
7090: 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
70a0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
70b0: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54   *pLoop;    /* T
70c0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
70d0: 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ect being coded 
70e0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
70f0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
7100: 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
7110: 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
7120: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
7130: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
7140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7150: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
7160: 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
7170: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
7180: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
7190: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
71a0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71c0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
71d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
71e0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
71f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7200: 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
7210: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7220: 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
7230: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
7240: 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
7250: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
7260: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7270: 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
72a0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
72b0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
72c0: 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
72e0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
72f0: 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
7300: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
7310: 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
7320: 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
7330: 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
7340: 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
7350: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
7360: 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
7370: 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
7380: 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
7390: 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
73a0: 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
73b0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
73c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
73d0: 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
73e0: 73 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  sWC;.  db = pPar
73f0: 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c  se->db;.  pLevel
7400: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
7410: 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d  evel];.  pLoop =
7420: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
7430: 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70  .  pTabItem = &p
7440: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
7450: 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
7460: 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62  ];.  iCur = pTab
7470: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
7480: 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64   pLevel->notRead
7490: 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e  y = notReady & ~
74a0: 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
74b0: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
74c0: 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
74d0: 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
74e0: 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
74f0: 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
7500: 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
7510: 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
7520: 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
7530: 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
7540: 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
7550: 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
7560: 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
7570: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
7580: 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
7590: 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
75a0: 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
75b0: 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
75c0: 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
75d0: 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
75e0: 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
75f0: 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
7600: 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
7610: 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
7620: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
7630: 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
7640: 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
7650: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
7660: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
7670: 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
7680: 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
7690: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
76a0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
76b0: 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
76c0: 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
76d0: 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
76e0: 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
76f0: 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
7700: 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
7710: 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
7720: 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
7730: 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
7740: 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
7750: 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
7760: 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
7770: 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
7780: 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
7790: 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
77a0: 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
77b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
77c0: 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
77d0: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
77e0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
77f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
7800: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
7810: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
7820: 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
7830: 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
7840: 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
7850: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
7860: 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
7870: 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
7880: 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
7890: 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
78a0: 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
78b0: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
78c0: 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
78d0: 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e 6a 6f 69  abItem[0].fg.joi
78e0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
78f0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  !=0 ){.    pLeve
7900: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
7910: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7930: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7940: 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 0, pLevel->i
7950: 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
7960: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
7970: 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
7980: 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
7990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
79a0: 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f  al case of a FRO
79b0: 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M clause subquer
79c0: 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  y implemented as
79d0: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
79e0: 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d  .  if( pTabItem-
79f0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
7a00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
7a10: 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
7a20: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
7a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7a40: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
7a50: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
7a60: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
7a70: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
7a80: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71  pLevel->p2 =  sq
7a90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7aa0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
7ab0: 59 69 65 6c 64 2c 20 61 64 64 72 42 72 6b 29 3b  Yield, addrBrk);
7ac0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
7ad0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
7ae0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
7af0: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
7b00: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
7b10: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4c 65  zName));.    pLe
7b20: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
7b30: 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
7b40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7b50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
7b60: 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  f(  (pLoop->wsFl
7b70: 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
7b80: 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
7b90: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
7ba0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
7bb0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
7bc0: 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
7bd0: 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
7be0: 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
7bf0: 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
7c00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
7c10: 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
7c20: 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
7c30: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f  /.    int addrNo
7c40: 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20  tFound;.    int 
7c50: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c  nConstraint = pL
7c60: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20  oop->nLTerm;..  
7c70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
7c80: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
7c90: 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
7ca0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
7cb0: 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
7cc0: 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
7cd0: 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
7ce0: 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
7cf0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
7d00: 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
7d10: 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d     int iTarget =
7d20: 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20   iReg+j+2;.     
7d30: 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
7d40: 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
7d50: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
7d60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7d70: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
7d80: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
7d90: 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61          codeEqua
7da0: 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
7db0: 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
7dc0: 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67 65 74  j, bRev, iTarget
7dd0: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e  );.        addrN
7de0: 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
7df0: 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20  ->addrNxt;.     
7e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
7e20: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
7e30: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
7e40: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
7e50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7e60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7e70: 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70  P_Integer, pLoop
7e80: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
7e90: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
7ea0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7eb0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f   OP_Integer, nCo
7ec0: 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31  nstraint, iReg+1
7ed0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7ee0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
7ef0: 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64  Filter, iCur, ad
7f00: 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67  drNotFound, iReg
7f10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7f20: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
7f30: 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20  .vtab.idxStr,.  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
7f60: 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f  b.needFree ? P4_
7f70: 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
7f80: 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  TIC);.    VdbeCo
7f90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
7fa0: 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
7fb0: 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66  dFree = 0;.    f
7fc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
7fd0: 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a  raint && j<16; j
7fe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
7ff0: 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  pLoop->u.vtab.om
8000: 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a  itMask>>j)&1 ){.
8010: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
8020: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f  erm(pLevel, pLoo
8030: 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20  p->aLTerm[j]);. 
8040: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8050: 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
8060: 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
8070: 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  op = pWInfo->eOn
8080: 65 50 61 73 73 20 3f 20 4f 50 5f 4e 6f 6f 70 20  ePass ? OP_Noop 
8090: 3a 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  : OP_VNext;.    
80a0: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
80b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
80c0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
80d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
80e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
80f0: 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
8100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8110: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
8120: 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
8130: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8140: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
8150: 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  ..  if( (pLoop->
8160: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
8170: 49 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70  IPK)!=0.   && (p
8180: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
8190: 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
81a0: 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
81b0: 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  ))!=0.  ){.    /
81c0: 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61  * Case 2:  We ca
81d0: 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
81e0: 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
81f0: 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
8200: 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
8210: 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
8220: 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
8230: 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
8240: 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
8250: 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
8260: 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
8270: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
8280: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
8290: 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
82a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  /.    assert( pL
82b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
82c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 65 72 6d  ==1 );.    pTerm
82d0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
82e0: 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
82f0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
8300: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8310: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
8320: 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
8330: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
8340: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
8350: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8360: 55 41 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c 65  UAL );.    iRele
8370: 61 73 65 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  aseReg = ++pPars
8380: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f  e->nMem;.    iRo
8390: 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
83a0: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
83b0: 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
83c0: 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
83d0: 73 65 52 65 67 29 3b 0a 20 20 20 20 69 66 28 20  seReg);.    if( 
83e0: 69 52 6f 77 69 64 52 65 67 21 3d 69 52 65 6c 65  iRowidReg!=iRele
83f0: 61 73 65 52 65 67 20 29 20 73 71 6c 69 74 65 33  aseReg ) sqlite3
8400: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8410: 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
8420: 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
8430: 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
8440: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
8450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8460: 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69  MustBeInt, iRowi
8470: 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 20  dReg, addrNxt); 
8480: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
84a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
84b0: 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
84c0: 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
84d0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
84e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
84f0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
8500: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
8510: 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
8520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8530: 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
8540: 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
8550: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
8560: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
8570: 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
8580: 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
8590: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
85a0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
85b0: 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
85c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
85d0: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
85e0: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
85f0: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
8600: 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
8610: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
8620: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
8630: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
8640: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
8650: 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
8660: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
8670: 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
8680: 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
8690: 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
86a0: 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
86b0: 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
86c0: 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
86d0: 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
86e0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
86f0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
8700: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
8710: 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
8720: 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
8730: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
8740: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
8750: 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
8760: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
8770: 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
8780: 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
8790: 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
87a0: 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
87b0: 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
87c0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
87d0: 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
87e0: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
87f0: 20 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28   codeCursorHint(
8800: 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20  pWInfo, pLevel, 
8810: 70 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70  pEnd);.    if( p
8820: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
8830: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
8840: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
8850: 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
8860: 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
8870: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
8880: 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
8890: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
88a0: 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
88b0: 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
88c0: 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
88d0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
88e0: 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
88f0: 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
8900: 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
8910: 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
8920: 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
8930: 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
8940: 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
8950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
8960: 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
8970: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
8980: 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
8990: 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGT,.          
89a0: 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
89b0: 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20  _SeekLE,.       
89c0: 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
89d0: 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20   OP_SeekLT,.    
89e0: 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
89f0: 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20  */  OP_SeekGE.  
8a00: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
8a10: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
8a20: 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
8a30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
8a40: 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
8a50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
8a60: 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
8a70: 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
8a80: 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
8a90: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8aa0: 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
8ab0: 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
8ac0: 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
8ad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
8ae0: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
8af0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
8b00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8b10: 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
8b20: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
8b30: 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  L );.      pX = 
8b40: 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
8b50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
8b60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
8b70: 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
8b80: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
8b90: 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
8ba0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
8bb0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
8bc0: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
8bd0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
8be0: 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
8bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c00: 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
8c10: 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
8c20: 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
8c30: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8c40: 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
8c50: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
8c60: 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
8c70: 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
8c80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
8c90: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  X->op==TK_LE);. 
8ca0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
8cb0: 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
8cc0: 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
8cd0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
8ce0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  X->op==TK_GE);. 
8cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8d00: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8d10: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
8d20: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8d30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
8d40: 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
8d50: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
8d60: 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
8d70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8d80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8d90: 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
8da0: 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
8db0: 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
8dc0: 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
8dd0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
8de0: 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
8df0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
8e00: 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
8e10: 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
8e20: 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
8e30: 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
8e40: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
8e50: 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
8e60: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
8e70: 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
8e80: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
8e90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8ea0: 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
8eb0: 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
8ec0: 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
8ed0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
8ee0: 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
8ef0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
8f00: 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
8f10: 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
8f20: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
8f30: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
8f40: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
8f50: 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
8f60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
8f70: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
8f80: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
8f90: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
8fa0: 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
8fb0: 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
8fc0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
8fd0: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
8fe0: 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
8ff0: 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
9000: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
9010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
9020: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
9030: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
9040: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
9050: 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
9060: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
9070: 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
9080: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
9090: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
90a0: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
90b0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
90c0: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
90d0: 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
90e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
90f0: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
9100: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9110: 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
9120: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
9130: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
9140: 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
9150: 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
9160: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
9170: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
9180: 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
9190: 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
91a0: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
91b0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
91c0: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
91d0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
91e0: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
91f0: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
9200: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
9210: 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
9220: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
9230: 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
9240: 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
9250: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9260: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
9270: 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
9280: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
9290: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
92a0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
92b0: 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
92c0: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
92d0: 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
92e0: 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
92f0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
9300: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9310: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
9320: 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
9330: 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
9340: 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
9350: 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
9360: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
9370: 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
9380: 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
9390: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
93a0: 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
93b0: 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
93c0: 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
93d0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
93e0: 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
93f0: 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
9400: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
9410: 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
9420: 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
9430: 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
9440: 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
9450: 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
9460: 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
9470: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
9480: 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
9490: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
94a0: 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
94b0: 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
94c0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
94d0: 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
94e0: 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
94f0: 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
9500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
9510: 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
9520: 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
9530: 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
9540: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
9550: 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
9560: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
9570: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
9580: 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
9590: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
95a0: 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
95b0: 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
95c0: 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
95d0: 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
95e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
95f0: 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
9600: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
9610: 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
9620: 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
9630: 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
9640: 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
9650: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
9660: 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
9670: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
9680: 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
9690: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
96a0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
96b0: 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
96c0: 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
96d0: 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
96e0: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
96f0: 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
9700: 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
9710: 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
9720: 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
9730: 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
9740: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
9750: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
9760: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
9770: 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
9780: 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
9790: 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
97a0: 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
97b0: 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
97c0: 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
97d0: 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
97e0: 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
97f0: 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
9800: 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
9810: 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
9820: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
9830: 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
9840: 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
9850: 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
9860: 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
9870: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
9880: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
9890: 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
98a0: 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
98b0: 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
98c0: 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
98d0: 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
98e0: 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
98f0: 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
9900: 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
9910: 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
9920: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
9930: 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
9940: 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
9950: 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
9960: 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
9970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
9980: 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
9990: 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
99a0: 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
99b0: 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
99c0: 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
99d0: 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
99e0: 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
99f0: 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
9a00: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
9a10: 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
9a20: 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
9a30: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
9a40: 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
9a50: 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
9a60: 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
9a70: 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
9a80: 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
9a90: 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
9aa0: 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
9ab0: 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
9ac0: 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
9ad0: 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
9ae0: 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
9af0: 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
9b00: 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
9b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
9b20: 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
9b30: 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
9b40: 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
9b50: 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
9b60: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
9b70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9b80: 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
9b90: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
9ba0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
9bb0: 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
9bc0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
9bd0: 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
9be0: 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
9bf0: 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
9c00: 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
9c10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
9c20: 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
9c30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
9c40: 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
9c50: 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
9c60: 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
9c70: 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
9c80: 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
9c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9ca0: 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
9cb0: 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
9cc0: 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
9cd0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
9ce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9cf0: 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
9d00: 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
9d10: 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
9d20: 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
9d30: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
9d40: 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
9d50: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
9d60: 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
9d70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9d80: 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
9d90: 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
9da0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
9db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
9dc0: 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
9dd0: 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
9de0: 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
9df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9e00: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
9e10: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
9e20: 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
9e30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
9e40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
9e50: 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
9e60: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
9e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9e80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
9e90: 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
9ea0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
9eb0: 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
9ec0: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
9ed0: 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
9ee0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
9ef0: 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d    char cEndAff =
9f00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
9f10: 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
9f20: 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
9f30: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
9f40: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
9f50: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
9f60: 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
9f70: 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
9f80: 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
9f90: 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
9fa0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
9fb0: 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
9fc0: 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
9fd0: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
9fe0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
9ff0: 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
a000: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
a010: 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
a020: 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a  Loop->nSkip );..
a030: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
a040: 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
a050: 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
a060: 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
a070: 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
a080: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
a090: 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
a0a0: 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
a0b0: 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
a0c0: 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
a0d0: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
a0e0: 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
a0f0: 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
a100: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
a110: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
a120: 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
a130: 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
a140: 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
a150: 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
a160: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
a170: 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
a180: 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
a190: 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
a1a0: 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
a1b0: 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
a1c0: 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
a1d0: 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
a1e0: 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
a1f0: 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
a200: 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
a210: 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
a220: 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
a230: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
a240: 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
a250: 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
a260: 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
a270: 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
a280: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
a290: 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
a2a0: 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
a2b0: 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
a2c0: 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
a2d0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
a2e0: 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
a2f0: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e  assert( pLoop->n
a300: 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
a310: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
a320: 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
a330: 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
a340: 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
a350: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
a360: 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
a370: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
a380: 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
a390: 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
a3a0: 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
a3b0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
a3c0: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
a3d0: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
a3e0: 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
a3f0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
a400: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
a410: 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 4c   = 1;.      /* L
a420: 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ike optimization
a430: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
a440: 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75 72 20  ts always occur 
a450: 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20  in pairs */.    
a460: 20 20 61 73 73 65 72 74 28 20 28 70 52 61 6e 67    assert( (pRang
a470: 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
a480: 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d  & TERM_LIKEOPT)=
a490: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
a4a0: 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46       (pLoop->wsF
a4b0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
a4c0: 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a 20 20  _LIMIT)!=0 );.  
a4d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
a4e0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
a4f0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
a500: 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
a510: 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
a520: 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
a530: 72 61 52 65 67 20 3d 20 31 3b 0a 23 69 66 6e 64  raReg = 1;.#ifnd
a540: 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44  ef SQLITE_LIKE_D
a550: 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42  OESNT_MATCH_BLOB
a560: 53 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  S.      if( (pRa
a570: 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
a580: 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 21  & TERM_LIKEOPT)!
a590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
a5a0: 73 65 72 74 28 20 70 52 61 6e 67 65 53 74 61 72  sert( pRangeStar
a5b0: 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a5d0: 49 4b 45 20 6f 70 74 20 63 6f 6e 73 74 72 61 69  IKE opt constrai
a5e0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
a5f0: 73 73 65 72 74 28 20 70 52 61 6e 67 65 53 74 61  ssert( pRangeSta
a600: 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
a610: 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 20 20 20  RM_LIKEOPT );   
a620: 2f 2a 20 6f 63 63 75 72 20 69 6e 20 70 61 69 72  /* occur in pair
a630: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 65  s */.        pLe
a640: 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
a650: 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  r = ++pParse->nM
a660: 65 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  em;.        test
a670: 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
a680: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a690: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
a6a0: 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
a6b0: 5f 44 45 53 43 20 29 3b 0a 20 20 20 20 20 20 20  _DESC );.       
a6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a6d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a6e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 76              bRev
a700: 20 5e 20 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f   ^ (pIdx->aSortO
a710: 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
a720: 45 5f 53 4f 5f 44 45 53 43 29 2c 0a 20 20 20 20  E_SO_DESC),.    
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
a750: 69 6b 65 52 65 70 43 6e 74 72 29 3b 0a 20 20 20  ikeRepCntr);.   
a760: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
a770: 28 28 76 2c 20 22 4c 49 4b 45 20 6c 6f 6f 70 20  ((v, "LIKE loop 
a780: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
a790: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
a7a0: 4c 69 6b 65 52 65 70 20 3d 20 73 71 6c 69 74 65  LikeRep = sqlite
a7b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a7c0: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  (v);.      }.#en
a7d0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 52  dif.      if( pR
a7e0: 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20  angeStart==0.   
a7f0: 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78      && (j = pIdx
a800: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
a810: 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
a820: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
a830: 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  l[j].notNull==0.
a840: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
a850: 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
a860: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a870: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
a880: 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
a890: 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
a8a0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
a8b0: 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
a8c0: 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
a8d0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
a8e0: 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
a8f0: 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
a900: 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
a910: 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
a920: 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
a930: 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
a940: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
a950: 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
a960: 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
a970: 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
a980: 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64      if( (nEq<pId
a990: 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62 52  x->nKeyCol && bR
a9a0: 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
a9b0: 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
a9c0: 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20  TE_SO_ASC)).    
a9d0: 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64   || (bRev && pId
a9e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71 29  x->nKeyCol==nEq)
a9f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57  .    ){.      SW
aa00: 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
aa10: 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
aa20: 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 53  eStart);.      S
aa30: 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61 73  WAP(u8, bSeekPas
aa40: 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e 75  tNull, bStopAtNu
aa50: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ll);.    }..    
aa60: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
aa70: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
aa80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
aa90: 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
aaa0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
aab0: 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
aac0: 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
aad0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
aae0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
aaf0: 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
ab00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 64 65  .    */.    code
ab10: 43 75 72 73 6f 72 48 69 6e 74 28 70 57 49 6e 66  CursorHint(pWInf
ab20: 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  o, pLevel, pRang
ab30: 65 45 6e 64 29 3b 0a 20 20 20 20 72 65 67 42 61  eEnd);.    regBa
ab40: 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
ab50: 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
ab60: 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78  ,pLevel,bRev,nEx
ab70: 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66  traReg,&zStartAf
ab80: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
ab90: 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20  zStartAff==0 || 
aba0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
abb0: 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20  zStartAff)>=nEq 
abc0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72  );.    if( zStar
abd0: 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d  tAff ) cEndAff =
abe0: 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b   zStartAff[nEq];
abf0: 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
ac00: 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
ac10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
ac20: 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
ac30: 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
ac40: 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
ac50: 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
ac60: 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
ac70: 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
ac80: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
ac90: 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
aca0: 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
acb0: 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
acc0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
acd0: 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
ace0: 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
acf0: 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e   && (pRangeEnd->
ad00: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
ad10: 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61  E)!=0 );.    sta
ad20: 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
ad30: 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
ad40: 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
ad50: 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
ad60: 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
ad70: 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
ad80: 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
ad90: 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
ada0: 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
adb0: 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
adc0: 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
add0: 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
ade0: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
adf0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ae00: 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
ae10: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
ae20: 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
ae30: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
ae40: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
ae50: 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
ae60: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
ae70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ae80: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
ae90: 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
aea0: 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
aeb0: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
aec0: 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
aed0: 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
aee0: 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
aef0: 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
af00: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
af10: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
af20: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
af30: 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
af40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
af60: 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
af70: 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
af80: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
af90: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
afa0: 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
afb0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
afc0: 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
afd0: 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
afe0: 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
aff0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
b000: 42 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  B){.          /*
b010: 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
b020: 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
b030: 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
b040: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
b050: 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
b060: 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
b070: 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
b080: 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
b090: 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
b0a0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
b0b0: 46 46 5f 42 4c 4f 42 2e 20 20 2a 2f 0a 20 20 20  FF_BLOB.  */.   
b0c0: 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
b0d0: 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
b0e0: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
b0f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
b100: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
b110: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
b120: 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
b130: 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
b140: 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
b150: 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
b160: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
b170: 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
b180: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
b190: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b1a0: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
b1b0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
b1c0: 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
b1d0: 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75   if( bSeekPastNu
b1e0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
b1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b200: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
b210: 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
b220: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
b230: 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
b240: 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
b250: 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
b260: 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
b270: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
b280: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
b290: 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b  nstraint - bSeek
b2a0: 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74  PastNull, zStart
b2b0: 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
b2c0: 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
b2d0: 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
b2e0: 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
b2f0: 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
b300: 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
b310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b320: 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
b330: 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
b340: 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
b350: 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nt);.    VdbeCov
b360: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
b370: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
b380: 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20  op==OP_Rewind); 
b390: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
b3a0: 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
b3b0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
b3c0: 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20  , op==OP_Last); 
b3d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
b3e0: 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
b3f0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
b400: 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
b410: 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
b420: 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20  =OP_SeekGT );.  
b430: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
b440: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
b450: 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
b460: 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a  p==OP_SeekGE );.
b470: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b480: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
b490: 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLE);  testcase(
b4a0: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   op==OP_SeekLE )
b4b0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
b4c0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
b4d0: 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73  eekLT);  testcas
b4e0: 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  e( op==OP_SeekLT
b4f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   );..    /* Load
b500: 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
b510: 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
b520: 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
b530: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
b540: 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
b550: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
b560: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
b570: 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
b580: 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
b590: 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
b5a0: 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
b5b0: 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
b5c0: 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
b5d0: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
b5e0: 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
b5f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b600: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
b610: 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
b620: 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f 70 74      whereLikeOpt
b630: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
b640: 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c 2c 20  ixup(v, pLevel, 
b650: 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
b660: 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
b670: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
b680: 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
b690: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
b6a0: 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
b6b0: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
b6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
b6e0: 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
b6f0: 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
b700: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b720: 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
b730: 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
b740: 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51  ht, cEndAff)!=SQ
b750: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 20 20  LITE_AFF_BLOB.  
b760: 20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33       && !sqlite3
b770: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
b780: 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
b790: 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20  , cEndAff).     
b7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
b7b0: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
b7c0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
b7d0: 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b  q, 1, &cEndAff);
b7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
b7f0: 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
b800: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
b810: 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
b820: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
b830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
b840: 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
b850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b860: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b870: 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
b880: 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
b890: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
b8a0: 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
b8b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b8c0: 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
b8d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
b8e0: 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
b8f0: 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
b900: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
b910: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
b920: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
b930: 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
b940: 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
b950: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
b960: 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
b970: 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
b980: 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
b990: 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
b9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b9b0: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
b9c0: 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
b9d0: 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
b9e0: 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
b9f0: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
ba00: 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
ba10: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
ba20: 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
ba30: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
ba40: 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
ba50: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
ba60: 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
ba70: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
ba80: 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
ba90: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
baa0: 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
bab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bac0: 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
bad0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
bae0: 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
baf0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
bb00: 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
bb10: 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
bb20: 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
bb30: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
bb40: 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
bb50: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
bb60: 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
bb70: 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62  .    if( omitTab
bb80: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  le ){.      /* p
bb90: 49 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  Idx is a coverin
bba0: 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65  g index.  No nee
bbb0: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
bbc0: 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  main table. */. 
bbd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73     }else if( Has
bbe0: 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
bbf0: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  le) ){.      iRo
bc00: 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
bc10: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
bc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bc30: 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
bc40: 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
bc50: 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
bc60: 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
bc70: 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
bc80: 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
bc90: 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
bca0: 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
bcb0: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
bcc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bcd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
bce0: 69 73 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 69  ists, iCur, 0, i
bcf0: 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
bd00: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
bd10: 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
bd20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bd30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bd40: 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
bd50: 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
bd60: 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
bd70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
bd80: 69 66 28 20 69 43 75 72 21 3d 69 49 64 78 43 75  if( iCur!=iIdxCu
bd90: 72 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  r ){.      Index
bda0: 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
bdb0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
bdc0: 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
bdd0: 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
bde0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
bdf0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
be00: 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
be10: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
be20: 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
be30: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
be40: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
be50: 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
be60: 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
be70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be80: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
be90: 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
bea0: 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
beb0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
bec0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
bed0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
bee0: 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
bf10: 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
bf20: 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
bf30: 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
bf40: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
bf50: 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
bf60: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
bf70: 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
bf80: 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
bf90: 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
bfa0: 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
bfb0: 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
bfc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bfd0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
bfe0: 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
bff0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
c000: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
c010: 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
c020: 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
c030: 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
c040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c050: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
c060: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
c070: 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
c080: 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
c090: 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
c0a0: 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
c0b0: 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
c0c0: 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
c0d0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
c0e0: 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
c0f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
c100: 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
c110: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
c120: 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
c130: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
c140: 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
c150: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c160: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c170: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
c180: 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
c190: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
c1a0: 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
c1b0: 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
c1c0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
c1d0: 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
c1e0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
c1f0: 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
c200: 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
c210: 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
c220: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
c230: 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
c240: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
c250: 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
c260: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
c270: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
c280: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
c290: 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
c2a0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
c2b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
c2c0: 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
c2d0: 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
c2e0: 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
c2f0: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
c300: 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
c310: 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
c320: 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
c330: 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
c340: 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
c350: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
c360: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
c370: 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
c390: 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
c3a0: 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
c3b0: 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
c3c0: 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
c3d0: 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
c3e0: 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
c3f0: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
c400: 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
c410: 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
c420: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
c430: 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
c440: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
c450: 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
c460: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
c470: 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
c480: 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
c490: 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
c4a0: 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
c4b0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
c4c0: 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
c4d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
c4e0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
c4f0: 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
c500: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
c510: 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
c520: 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
c530: 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
c540: 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
c550: 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
c560: 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
c570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
c580: 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
c590: 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
c5a0: 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
c5b0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
c5c0: 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
c5d0: 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
c5e0: 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
c5f0: 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
c600: 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
c610: 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
c620: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
c630: 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
c640: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c650: 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
c660: 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
c670: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
c680: 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
c690: 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
c6a0: 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
c6b0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
c6c0: 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
c6d0: 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
c6e0: 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
c6f0: 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
c700: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
c710: 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
c720: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c730: 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
c740: 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
c750: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
c760: 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
c770: 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  >.    **.    ** 
c780: 41 64 64 65 64 20 32 30 31 34 2d 30 35 2d 32 36  Added 2014-05-26
c790: 3a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  : If the table i
c7a0: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
c7b0: 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20  D table, then.  
c7c0: 20 20 2a 2a 20 75 73 65 20 61 6e 20 65 70 68 65    ** use an ephe
c7d0: 6d 65 72 61 6c 20 69 6e 64 65 78 20 69 6e 73 74  meral index inst
c7e0: 65 61 64 20 6f 66 20 61 20 52 6f 77 53 65 74 20  ead of a RowSet 
c7f0: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 72  to record the pr
c800: 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20 6b 65 79  imary.    ** key
c810: 73 20 6f 66 20 74 68 65 20 72 6f 77 73 20 77 65  s of the rows we
c820: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
c830: 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  en..    **.    *
c840: 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
c850: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
c860: 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
c870: 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
c880: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
c890: 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
c8a0: 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
c8b0: 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
c8c0: 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
c8d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
c8e0: 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
c8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
c900: 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
c910: 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
c920: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
c930: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
c940: 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
c950: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
c960: 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
c970: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
c980: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
c990: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
c9a0: 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
c9b0: 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
c9c0: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
c9d0: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9f0: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
ca00: 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
ca10: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
ca20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca40: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
ca50: 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
ca60: 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
ca70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ca80: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
ca90: 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
caa0: 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
cab0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
cae0: 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
caf0: 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
cb00: 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
cb10: 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
cb20: 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
cb30: 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
cb40: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cb70: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
cb80: 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20  wctrlFlags;     
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cba0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d  * Flags for sub-
cbb0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
cbc0: 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
cbd0: 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
cbe0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
cbf0: 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
cc00: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ession */.    Ta
cc10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
cc20: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 0a  Item->pTab;.   .
cc30: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
cc40: 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
cc50: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
cc60: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
cc70: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
cc80: 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20  or & WO_OR );.  
cc90: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
cca0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
ccb0: 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
ccc0: 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
ccd0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
cce0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
ccf0: 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
cd00: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
cd10: 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
cd20: 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
cd30: 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62  rcList in pOrTab
cd40: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cd50: 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
cd60: 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
cd70: 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
cd80: 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
cd90: 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
cda0: 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
cdb0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
cdc0: 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
cdd0: 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
cde0: 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
cdf0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
ce00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ce10: 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
ce20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
ce30: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
ce40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
ce50: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
ce60: 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
ce70: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ce80: 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
ce90: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
cea0: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
ceb0: 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
cec0: 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
ced0: 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
cee0: 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
cef0: 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
cf00: 63 52 61 77 28 64 62 2c 0a 20 20 20 20 20 20 20  cRaw(db,.       
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
cf30: 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
cf40: 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
cf50: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
cf60: 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
cf70: 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
cf80: 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
cf90: 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65  oc = (u8)(nNotRe
cfa0: 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
cfb0: 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
cfc0: 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
cfd0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
cfe0: 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
cff0: 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
d000: 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
d010: 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
d020: 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
d030: 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
d040: 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
d050: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
d060: 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
d070: 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
d080: 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
d090: 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
d0a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d0b0: 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
d0c0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
d0d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
d0e0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
d0f0: 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
d100: 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
d110: 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
d120: 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
d130: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
d140: 73 65 74 2e 20 20 4f 72 2c 20 63 72 65 61 74 65  set.  Or, create
d150: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
d160: 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 70 61 62  dex.    ** capab
d170: 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72  le of holding pr
d180: 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68  imary keys in th
d190: 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54 48  e case of a WITH
d1a0: 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  OUT ROWID..    *
d1b0: 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
d1c0: 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
d1d0: 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
d1e0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
d1f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
d200: 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
d210: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
d220: 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
d230: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
d240: 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
d250: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
d260: 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
d270: 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
d280: 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
d290: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
d2a0: 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
d2b0: 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
d2c0: 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
d2d0: 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
d2e0: 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
d2f0: 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
d300: 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
d310: 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
d320: 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
d330: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
d340: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
d350: 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
d360: 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
d370: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
d380: 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
d390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d3a0: 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
d3b0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
d3c0: 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
d3d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
d3e0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
d3f0: 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
d400: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d410: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d430: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
d440: 77 73 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wset);.      }el
d450: 73 65 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  se{.        Inde
d460: 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
d470: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
d480: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72  pTab);.        r
d490: 65 67 52 6f 77 73 65 74 20 3d 20 70 50 61 72 73  egRowset = pPars
d4a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d4b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d4c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
d4d0: 70 68 65 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77  phemeral, regRow
d4e0: 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  set, pPk->nKeyCo
d4f0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
d500: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
d510: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29  nfo(pParse, pPk)
d520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d530: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
d540: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
d550: 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
d560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d570: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d580: 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
d590: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
d5a0: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
d5b0: 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
d5c0: 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
d5d0: 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
d5e0: 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
d5f0: 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
d600: 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
d610: 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
d620: 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
d630: 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
d640: 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
d650: 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
d660: 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
d670: 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
d680: 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
d690: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
d6a0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
d6b0: 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
d6c0: 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
d6d0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
d6e0: 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
d6f0: 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
d700: 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
d710: 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
d720: 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
d730: 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
d740: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
d750: 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
d760: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
d770: 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
d780: 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
d790: 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
d7a0: 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
d7b0: 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70  *.    ** This op
d7c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20  timization also 
d7d0: 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20  only applies if 
d7e0: 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52  the (x1 OR x2 OR
d7f0: 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a   ...) term.    *
d800: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
d810: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ed in the ON cla
d820: 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
d830: 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  IN..    ** See t
d840: 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77  icket http://www
d850: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
d860: 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a  info/f2369304e4.
d870: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
d880: 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20  WC->nTerm>1 ){. 
d890: 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a       int iTerm;.
d8a0: 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d        for(iTerm=
d8b0: 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54  0; iTerm<pWC->nT
d8c0: 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20  erm; iTerm++){. 
d8d0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
d8e0: 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72  pr = pWC->a[iTer
d8f0: 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m].pExpr;.      
d900: 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69 54    if( &pWC->a[iT
d910: 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20  erm] == pTerm ) 
d920: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d930: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
d940: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
d950: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74  FromJoin) ) cont
d960: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
d970: 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
d980: 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
d990: 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 63 6f  VIRTUAL)!=0 ) co
d9a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
d9b0: 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
d9c0: 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
d9d0: 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
d9e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
d9f0: 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
da00: 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
da10: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20  TERM_ORINFO );. 
da20: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
da30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
da40: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
da50: 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
da60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
da70: 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
da80: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
da90: 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
daa0: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
dab0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
dac0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
dad0: 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46 4f 4c 44  D|TKFLG_DONTFOLD
dae0: 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
daf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
db00: 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 20 73  ..    /* Run a s
db10: 65 70 61 72 61 74 65 20 57 48 45 52 45 20 63 6c  eparate WHERE cl
db20: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 65  ause for each te
db30: 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61  rm of the OR cla
db40: 75 73 65 2e 20 20 41 66 74 65 72 0a 20 20 20 20  use.  After.    
db50: 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64  ** eliminating d
db60: 75 70 6c 69 63 61 74 65 73 20 66 72 6f 6d 20 6f  uplicates from o
db70: 74 68 65 72 20 57 48 45 52 45 20 63 6c 61 75 73  ther WHERE claus
db80: 65 73 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 66  es, the action f
db90: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 73  or each.    ** s
dba0: 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
dbb0: 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20  is to to invoke 
dbc0: 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
dbd0: 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
dbe0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ne..    */.    w
dbf0: 63 74 72 6c 46 6c 61 67 73 20 3d 20 20 57 48 45  ctrlFlags =  WHE
dc00: 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
dc10: 53 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE.             
dc20: 20 20 20 7c 20 57 48 45 52 45 5f 46 4f 52 43 45     | WHERE_FORCE
dc30: 5f 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  _TABLE.         
dc40: 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 4f         | WHERE_O
dc50: 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 0a 20 20 20  NETABLE_ONLY.   
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
dc70: 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45  HERE_NO_AUTOINDE
dc80: 58 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  X;.    for(ii=0;
dc90: 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
dca0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
dcb0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
dcc0: 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
dcd0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
dce0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
dcf0: 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
dd00: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
dd10: 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
dd20: 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
dd30: 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
dd40: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
dd50: 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
dd60: 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
dd70: 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d   Expr *pOrExpr =
dd80: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b   pOrTerm->pExpr;
dd90: 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52 20 63   /* Current OR c
dda0: 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
ddb0: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 31 20 3d        int jmp1 =
ddc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ddd0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
dde0: 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61 74 69   of jump operati
ddf0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  on */.        if
de00: 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45  ( pAndExpr && !E
de10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
de20: 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  OrExpr, EP_FromJ
de30: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
de40: 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
de50: 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
de60: 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
de70: 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
de80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
de90: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
dea0: 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
deb0: 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
dec0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 57  rm. */.        W
ded0: 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
dee0: 2c 20 28 22 53 75 62 70 6c 61 6e 20 66 6f 72 20  , ("Subplan for 
def0: 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e 22 29 29 3b  OR-clause:\n"));
df00: 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
df10: 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
df20: 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
df30: 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
df40: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
df70: 6c 46 6c 61 67 73 2c 20 69 43 6f 76 43 75 72 29  lFlags, iCovCur)
df80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
df90: 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70  ( pSubWInfo || p
dfa0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
dfb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dfc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
dfd0: 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  SubWInfo ){.    
dfe0: 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
dff0: 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20  *pSubLoop;.     
e000: 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70       int addrExp
e010: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
e020: 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
e030: 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
e040: 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
e050: 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
e060: 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
e070: 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
e080: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
e090: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
e0a0: 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
e0b0: 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
e0c0: 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78  fo->a[0], addrEx
e0d0: 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20  plain);..       
e0e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
e0f0: 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  e sub-WHERE clau
e100: 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73 74 20  se body.  First 
e110: 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20 20 20  skip over.      
e120: 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65      ** duplicate
e130: 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f 72   rows from prior
e140: 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73   sub-WHERE claus
e150: 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  es, and record t
e160: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
e170: 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d 41 52  rowid (or PRIMAR
e180: 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65 20 63  Y KEY) for the c
e190: 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20 74 68  urrent row so th
e1a0: 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  at the same.    
e1b0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c        ** row wil
e1c0: 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 6e 20  l be skipped in 
e1d0: 73 75 62 73 65 71 75 65 6e 74 20 73 75 62 2d 57  subsequent sub-W
e1e0: 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20  HERE clauses..  
e1f0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e200: 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
e210: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
e220: 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
e230: 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
e240: 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
e250: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
e260: 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
e270: 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
e280: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
e290: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
e2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e2b0: 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
e2c0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
e2d0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c  Parse, pTab, -1,
e2e0: 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c   iCur, regRowid,
e2f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
e300: 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c 69 74 65     jmp1 = sqlite
e310: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
e320: 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
e330: 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 0a 20   regRowset, 0,. 
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 20 20 20 20 20 72 2c 69 53 65 74            r,iSet
e370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e380: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e390: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
e3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
e3b0: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
e3c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
e3d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
e3f0: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
e400: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
e410: 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20    int iPk;..    
e420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
e430: 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e  d the PK into an
e440: 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
e450: 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20  egisters. */.   
e460: 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
e470: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
e480: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b  ge(pParse, nPk);
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
e4a0: 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50  or(iPk=0; iPk<nP
e4b0: 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20  k; iPk++){.     
e4c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
e4d0: 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  Col = pPk->aiCol
e4e0: 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20  umn[iPk];.      
e4f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e500: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
e510: 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
e520: 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72  pTab, iCol, iCur
e530: 2c 20 72 2b 69 50 6b 29 3b 0a 20 20 20 20 20 20  , r+iPk);.      
e540: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e550: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
e560: 6b 20 69 66 20 74 68 65 20 74 65 6d 70 20 74 61  k if the temp ta
e570: 62 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  ble already cont
e580: 61 69 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49  ains this key. I
e590: 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  f so,.          
e5a0: 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68      ** the row h
e5b0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
e5c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
e5d0: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20  result set and. 
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
e5f0: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28  can be ignored (
e600: 62 79 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20  by jumping past 
e610: 74 68 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29  the Gosub below)
e620: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
e630: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
e640: 73 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74  sert the key int
e650: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
e660: 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
e670: 68 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  h processing.   
e680: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
e690: 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20  e row..         
e6a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e6b0: 20 20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d        ** Use som
e6c0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70  e of the same op
e6d0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f  timizations as O
e6e0: 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66  P_RowSetTest: If
e6f0: 20 69 53 65 74 0a 20 20 20 20 20 20 20 20 20 20   iSet.          
e700: 20 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20      ** is zero, 
e710: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
e720: 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61  key cannot alrea
e730: 64 79 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e  dy be present in
e740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
e750: 2a 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  * the temp table
e760: 2e 20 41 6e 64 20 69 66 20 69 53 65 74 20 69 73  . And if iSet is
e770: 20 2d 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74   -1, assume that
e780: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20   there is no .  
e790: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
e7a0: 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  eed to insert th
e7b0: 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74  e key into the t
e7c0: 65 6d 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74  emp table, as it
e7d0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20   will never .   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
e7f0: 20 74 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f   tested for.  */
e800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e810: 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20  if( iSet ){.    
e820: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 31              jmp1
e830: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e840: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
e850: 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  und, regRowset, 
e860: 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  0, r, nPk);.    
e870: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
e880: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
e890: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e8a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
e8b0: 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set>=0 ){.      
e8c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e8d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e8e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c  P_MakeRecord, r,
e8f0: 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b   nPk, regRowid);
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e920: 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p3(v, OP_IdxInse
e930: 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72  rt, regRowset, r
e940: 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
e960: 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56   iSet ) sqlite3V
e970: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
e980: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
e990: 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULT);.          
e9a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
e9b0: 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
e9c0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d  the array of tem
e9d0: 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  p registers */. 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e9f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ea00: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ange(pParse, r, 
ea10: 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
ea20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
ea30: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
ea40: 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
ea50: 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
ea60: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
ea70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ea80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
ea90: 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
eaa0: 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
eab0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
eac0: 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65  re (skipping the
ead0: 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
eae0: 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74  subroutine) if t
eaf0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
eb00: 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52  current sub-WHER
eb10: 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69  E row is a dupli
eb20: 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20  cate from prior 
eb30: 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20  sub-WHEREs. */. 
eb40: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
eb50: 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  1 ) sqlite3VdbeJ
eb60: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 31 29  umpHere(v, jmp1)
eb70: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
eb80: 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
eb90: 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
eba0: 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
ebb0: 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
ebc0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
ebd0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
ebe0: 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
ebf0: 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
ec00: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
ec10: 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
ec20: 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
ec30: 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
ec40: 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
ec50: 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
ec60: 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
ec70: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ec80: 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
ec90: 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
eca0: 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
ecb0: 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
ecc0: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
ecd0: 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
ece0: 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
ecf0: 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
ed00: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
ed10: 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
ed20: 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
ed30: 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
ed40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
ed50: 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
ed60: 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
ed70: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
ed80: 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
ed90: 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
eda0: 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
edb0: 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
edc0: 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
edd0: 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
ede0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
edf0: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
ee00: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
ee10: 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
ee20: 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
ee30: 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
ee40: 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
ee50: 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
ee60: 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
ee70: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
ee80: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
ee90: 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
eea0: 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
eeb0: 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
eec0: 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
eed0: 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
eee0: 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
eef0: 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
ef00: 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
ef10: 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
ef20: 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
ef30: 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
ef40: 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
ef50: 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
ef60: 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
ef70: 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
ef80: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
ef90: 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
efa0: 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
efb0: 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
efc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
efd0: 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
efe0: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
eff0: 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
f000: 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
f010: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
f020: 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
f030: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
f040: 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
f050: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
f060: 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
f070: 20 20 20 26 26 20 28 48 61 73 52 6f 77 69 64 28     && (HasRowid(
f080: 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
f090: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75 62  aryKeyIndex(pSub
f0a0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
f0b0: 6e 64 65 78 29 29 0a 20 20 20 20 20 20 20 20 20  ndex)).         
f0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f0d0: 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
f0e0: 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
f0f0: 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
f100: 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
f110: 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
f120: 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
f130: 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20       wctrlFlags 
f140: 7c 3d 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f  |= WHERE_REOPEN_
f150: 49 44 58 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IDX;.          }
f160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f170: 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
f180: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f190: 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
f1a0: 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
f1b0: 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
f1c0: 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
f1d0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
f1e0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
f1f0: 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
f200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f210: 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
f220: 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
f230: 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76  ov;.    if( pCov
f240: 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   ) pLevel->iIdxC
f250: 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20  ur = iCovCur;.  
f260: 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
f270: 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72  {.      pAndExpr
f280: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
f290: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
f2a0: 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70  lete(db, pAndExp
f2b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
f2c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f2d0: 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
f2e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f2f0: 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
f300: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
f310: 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
f320: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
f330: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f340: 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
f350: 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
f360: 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
f370: 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20  e3StackFree(db, 
f380: 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28  pOrTab);.    if(
f390: 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20   !untestedTerms 
f3a0: 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c  ) disableTerm(pL
f3b0: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
f3c0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
f3d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
f3e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
f3f0: 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20    {.    /* Case 
f400: 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  6:  There is no 
f410: 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
f420: 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
f430: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lete.    **     
f440: 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
f450: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
f460: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
f470: 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b   const u8 aStep[
f480: 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f  ] = { OP_Next, O
f490: 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74  P_Prev };.    st
f4a0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
f4b0: 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65  tart[] = { OP_Re
f4c0: 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b  wind, OP_Last };
f4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65  .    assert( bRe
f4e0: 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20  v==0 || bRev==1 
f4f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 49  );.    if( pTabI
f500: 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
f510: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
f520: 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
f530: 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
f540: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
f550: 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
f560: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
f570: 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
f580: 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
f590: 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
f5a0: 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
f5b0: 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
f5c0: 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
f5d0: 20 20 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72        codeCursor
f5e0: 48 69 6e 74 28 70 57 49 6e 66 6f 2c 20 70 4c 65  Hint(pWInfo, pLe
f5f0: 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  vel, 0);.      p
f600: 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
f610: 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70  p[bRev];.      p
f620: 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
f630: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
f640: 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
f650: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
f660: 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
f670: 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
f680: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
f690: 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
f6a0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
f6b0: 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
f6c0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
f6d0: 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
f6e0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
f6f0: 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  EP;.    }.  }..#
f700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f710: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
f720: 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64  TUS.  pLevel->ad
f730: 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65  drVisit = sqlite
f740: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f750: 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (v);.#endif..  /
f760: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
f770: 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
f780: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
f790: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
f7a0: 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
f7b0: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
f7c0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
f7d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
f7e0: 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
f7f0: 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
f800: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
f810: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e 74  xpr *pE;.    int
f820: 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20   skipLikeAddr = 
f830: 30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  0;.    testcase(
f840: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f850: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
f860: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f870: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
f880: 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
f890: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
f8a0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
f8b0: 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
f8c0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
f8d0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
f8e0: 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
f8f0: 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
f900: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
f910: 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
f920: 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
f930: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
f940: 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
f950: 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
f960: 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
f970: 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
f980: 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
f990: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f9a0: 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
f9b0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
f9c0: 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
f9d0: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f9e0: 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
f9f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fa00: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
fa10: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
fa20: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fa30: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
fa40: 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20  & TERM_LIKECOND 
fa50: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
fa60: 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
fa70: 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 20 20 63  CH_BLOBS.      c
fa80: 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
fa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
faa0: 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
fab0: 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 73 6b 69  r>0 );.      ski
fac0: 70 4c 69 6b 65 41 64 64 72 20 3d 20 73 71 6c 69  pLikeAddr = sqli
fad0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fae0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c 65 76 65   OP_IfNot, pLeve
faf0: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29  l->iLikeRepCntr)
fb00: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
fb10: 72 61 67 65 28 76 29 3b 0a 23 65 6e 64 69 66 0a  rage(v);.#endif.
fb20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fb30: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fb40: 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
fb50: 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
fb60: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 73  NULL);.    if( s
fb70: 6b 69 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71  kipLikeAddr ) sq
fb80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fb90: 65 28 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64  e(v, skipLikeAdd
fba0: 72 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  r);.    pTerm->w
fbb0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
fbc0: 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
fbd0: 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
fbe0: 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
fbf0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
fc00: 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
fc10: 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
fc20: 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
fc30: 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
fc40: 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
fc50: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
fc60: 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
fc70: 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
fc80: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
fc90: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
fca0: 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
fcb0: 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
fcc0: 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
fcd0: 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
fce0: 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
fcf0: 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
fd00: 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
fd10: 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
fd20: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
fd30: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
fd40: 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
fd50: 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
fd60: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
fd70: 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57  E, *pEAlt;.    W
fd80: 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
fd90: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
fda0: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
fdb0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
fdc0: 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
fdd0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
fde0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
fdf0: 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63  Q|WO_IS))==0 ) c
fe00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
fe10: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
fe20: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 3d 3d  or & WO_EQUIV)==
fe30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fe40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fe50: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20  tCursor!=iCur ) 
fe60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
fe70: 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
fe80: 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oin ) continue;.
fe90: 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
fea0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
feb0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
fec0: 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
fed0: 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  oin) );.    asse
fee0: 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  rt( (pTerm->prer
fef0: 65 71 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c  eqRight & pLevel
ff00: 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
ff10: 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 73 71 6c  ;.    pAlt = sql
ff20: 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
ff30: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65  m(pWC, iCur, pTe
ff40: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
ff50: 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
ff80: 53 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  S, 0);.    if( p
ff90: 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
ffa0: 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
ffb0: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
ffc0: 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
ffd0: 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
ffe0: 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
fff0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
10000 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
10010 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10020 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IS );.    testca
10030 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
10040 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
10050 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
10060 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
10070 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  transitive const
10080 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45  raint"));.    pE
10090 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Alt = sqlite3Sta
100a0 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  ckAllocRaw(db, s
100b0 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a  izeof(*pEAlt));.
100c0 20 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b      if( pEAlt ){
100d0 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20  .      *pEAlt = 
100e0 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20  *pAlt->pExpr;.  
100f0 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74      pEAlt->pLeft
10100 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20   = pE->pLeft;.  
10110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
10120 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
10130 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  EAlt, addrCont, 
10140 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
10150 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
10160 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
10170 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  EAlt);.    }.  }
10180 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
10190 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
101a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
101b0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
101c0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
101d0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
101e0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
101f0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
10200 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
10210 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
10220 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
10230 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
10240 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
10250 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10260 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
10270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10280 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
10290 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
102a0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
102b0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
102c0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
102d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
102e0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
102f0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
10300 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
10310 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
10320 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
10330 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
10340 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
10350 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
10360 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
10370 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
10380 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
10390 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
103a0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
103b0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
103c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
103d0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
103e0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
103f0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
10400 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10410 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
10420 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
10430 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
10440 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
10450 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
10460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10470 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10480 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
10490 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
104a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
104b0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
104c0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
104d0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
104e0 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e  return pLevel->n
104f0 6f 74 52 65 61 64 79 3b 0a 7d 0a                 otReady;.}.