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

Artifact 8dee26eb181ea9daa8b1a4d96f34c0860aaf99bd:


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 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2fd0: 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
2fe0: 20 6e 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 29 3b   n, 0, zAff, n);
2ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3000: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
3010: 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
3020: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
3030: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3040: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
3050: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
3060: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3070: 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
3080: 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
3090: 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
30a0: 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
30b0: 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
30c0: 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
30d0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
30e0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
30f0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
3100: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
3110: 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
3120: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
3130: 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
3140: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3150: 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
3160: 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
3170: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
3180: 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
3190: 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
31a0: 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
31b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
31c0: 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
31d0: 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
31e0: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
31f0: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
3200: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
3210: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
3220: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
3230: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
3240: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
3250: 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
3260: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
3270: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
3280: 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
3290: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
32a0: 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
32b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
32c0: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
32d0: 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20  */.  int iEq,   
32e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
32f0: 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  x of the equalit
3300: 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
3310: 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  is level */.  in
3320: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
3330: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65    /* True for re
3340: 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f  verse-order IN o
3350: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
3360: 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
3370: 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
3380: 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
3390: 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
33a0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
33b0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
33c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
33d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
33e0: 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
3400: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
3410: 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
3420: 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
3430: 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
3440: 5f 45 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _EQ || pX->op==T
3450: 4b 5f 49 53 20 29 7b 0a 20 20 20 20 69 52 65 67  K_IS ){.    iReg
3460: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
3470: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
3480: 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
3490: 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
34a0: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
34b0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
34c0: 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
34d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
34f0: 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
3500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3510: 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
3520: 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
3530: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
3540: 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
3550: 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  n;.    WhereLoop
3560: 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c   *pLoop = pLevel
3570: 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69  ->pWLoop;..    i
3580: 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
3590: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
35a0: 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20  ALTABLE)==0.    
35b0: 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
35c0: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20  ree.pIndex!=0.  
35d0: 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
35e0: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53  btree.pIndex->aS
35f0: 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
3600: 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
3610: 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
3620: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
3630: 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
3640: 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
3650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
3660: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
3670: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
3680: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
3690: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
36a0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f  (pParse, pX, IN_
36b0: 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 29 3b 0a  INDEX_LOOP, 0);.
36c0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
36d0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
36e0: 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  SC ){.      test
36f0: 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
3700: 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
3710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62  ;.    }.    iTab
3720: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
3730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3740: 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
3750: 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
3760: 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
3770: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
3780: 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56  (v, bRev);.    V
3790: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
37a0: 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73   !bRev);.    ass
37b0: 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
37c0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
37d0: 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20  TI_OR)==0 );.   
37e0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
37f0: 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  |= WHERE_IN_ABLE
3800: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
3810: 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b  ->u.in.nIn==0 ){
3820: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  .      pLevel->a
3830: 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
3840: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
3860: 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a  el->u.in.nIn++;.
3870: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
3880: 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20  .aInLoop =.     
3890: 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
38a0: 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
38b0: 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  >db, pLevel->u.i
38c0: 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  n.aInLoop,.     
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
38f0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
3900: 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d  Loop[0])*pLevel-
3910: 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20  >u.in.nIn);.    
3920: 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  pIn = pLevel->u.
3930: 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20  in.aInLoop;.    
3940: 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20  if( pIn ){.     
3950: 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   pIn += pLevel->
3960: 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20  u.in.nIn - 1;.  
3970: 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20      pIn->iCur = 
3980: 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  iTab;.      if( 
3990: 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
39a0: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
39b0: 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
39c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
39d0: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
39e0: 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
39f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3a00: 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
3a10: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
3a20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
3a30: 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65  mn, iTab, 0, iRe
3a40: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
3a50: 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f    pIn->eEndLoopO
3a60: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
3a70: 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65  evIfOpen : OP_Ne
3a80: 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20  xtIfOpen;.      
3a90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3aa0: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
3ab0: 69 52 65 67 29 3b 20 56 64 62 65 43 6f 76 65 72  iReg); VdbeCover
3ac0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
3ad0: 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
3ae0: 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
3af0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
3b00: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
3b10: 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
3b20: 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
3b30: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3b40: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
3b50: 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
3b60: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
3b70: 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
3b80: 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   scan..**.** For
3b90: 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
3ba0: 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
3bb0: 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
3bc0: 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
3bd0: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
3be0: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
3bf0: 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
3c00: 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
3c10: 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
3c20: 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
3c30: 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
3c40: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
3c50: 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
3c60: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
3c70: 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
3c80: 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
3c90: 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
3ca0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
3cb0: 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
3cc0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
3cd0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
3ce0: 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
3cf0: 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
3d00: 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
3d10: 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
3d20: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
3d30: 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
3d40: 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
3d50: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
3d60: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
3d70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
3d80: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
3d90: 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
3da0: 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
3db0: 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
3dc0: 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
3dd0: 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
3de0: 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
3df0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
3e00: 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
3e10: 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
3e20: 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
3e30: 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
3e40: 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
3e50: 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
3e60: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
3e70: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  g..**.** The nEx
3e80: 74 72 61 52 65 67 20 70 61 72 61 6d 65 74 65 72  traReg parameter
3e90: 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74 20   is 0 or 1.  It 
3ea0: 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45 52  is 0 if all WHER
3eb0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
3ec0: 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f  ints.** are == o
3ed0: 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f 76  r IN and are cov
3ee0: 65 72 65 64 20 62 79 20 74 68 65 20 6e 45 71 2e  ered by the nEq.
3ef0: 20 20 6e 45 78 74 72 61 52 65 67 20 69 73 20 31    nExtraReg is 1
3f00: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
3f10: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
3f20: 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68 20 61  nstraint (such a
3f30: 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44 20  s the "c>=5 AND 
3f40: 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78 61  c<10" in the exa
3f50: 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63  mple) that.** oc
3f60: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 6e  curs after the n
3f70: 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Eq quality const
3f80: 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  raints..**.** Th
3f90: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
3fa0: 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66 20  ates a range of 
3fb0: 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d 65  nEq+nExtraReg me
3fc0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 72  mory cells and r
3fd0: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
3fe0: 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
3ff0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
4000: 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65 20  that range. The 
4010: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
4020: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
4030: 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
4040: 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73 74  mory range to st
4050: 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20  ore keys for.** 
4060: 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e  start and termin
4070: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73  ation conditions
4080: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
4090: 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
40a0: 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
40b0: 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
40c0: 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
40d0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
40e0: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
40f0: 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
4100: 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
4110: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
4120: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
4130: 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
4140: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
4150: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
4160: 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
4170: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
4180: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
4190: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
41a0: 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
41b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
41c0: 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
41d0: 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
41e0: 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
41f0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
4200: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
4210: 74 73 20 74 68 61 74 20 75 73 65 20 42 4c 4f 42  ts that use BLOB
4220: 20 6f 72 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74   or NONE affinit
4230: 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
4240: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2e  SQLITE_AFF_BLOB.
4250: 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
4260: 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
4270: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
4280: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
4290: 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
42a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
42b0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
42c0: 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
42d0: 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
42e0: 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
42f0: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
4300: 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
4310: 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
4320: 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
4330: 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
4340: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
4350: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
4360: 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 42  int (t2.b) has B
4370: 4c 4f 42 2f 4e 4f 4e 45 20 61 66 66 69 6e 69 74  LOB/NONE affinit
4380: 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
4390: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
43a0: 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
43b0: 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
43c0: 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
43d0: 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
43e0: 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
43f0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
4400: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
4410: 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
4420: 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
4430: 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
4440: 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  to SQLITE_AFF_BL
4450: 4f 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OB..*/.static in
4460: 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
4470: 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
44a0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
44b0: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
44c0: 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
44d0: 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
44e0: 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
44f0: 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
4500: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
4510: 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
4520: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
4530: 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
4540: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4550: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
4560: 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
4570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
4580: 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
4590: 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
45a0: 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
45b0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ing */.){.  u16 
45c0: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
45d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
45e0: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
45f0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
4600: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  to code */.  u16
4610: 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   nSkip;         
4620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4630: 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73  mber of left-mos
4640: 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69  t columns to ski
4650: 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  p */.  Vdbe *v =
4660: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
4670: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
4680: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4690: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
46a0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
46b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
46c0: 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
46d0: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
46e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
46f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4700: 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
4710: 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57  aint term */.  W
4720: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4740: 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
4750: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ject */.  int j;
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
4780: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4790: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
47a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
47b0: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
47c0: 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
47f0: 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
4800: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  e */.  char *zAf
4810: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4820: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
4830: 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   string to retur
4840: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n */..  /* This 
4850: 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63  module is only c
4860: 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70  alled on query p
4870: 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e  lans that use an
4880: 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f   index. */.  pLo
4890: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
48a0: 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28  oop;.  assert( (
48b0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
48c0: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
48d0: 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71  BLE)==0 );.  nEq
48e0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
48f0: 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d  e.nEq;.  nSkip =
4900: 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20   pLoop->nSkip;. 
4910: 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
4920: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
4930: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
4940: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
4950: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
4960: 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
4970: 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
4980: 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
4990: 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
49a0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
49b0: 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nReg = pLoop->u
49c0: 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78  .btree.nEq + nEx
49d0: 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
49e0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
49f0: 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
4a00: 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
4a10: 2d 3e 64 62 2c 73 71 6c 69 74 65 33 49 6e 64 65  ->db,sqlite3Inde
4a20: 78 41 66 66 69 6e 69 74 79 53 74 72 28 70 50 61  xAffinityStr(pPa
4a30: 72 73 65 2d 3e 64 62 2c 70 49 64 78 29 29 3b 0a  rse->db,pIdx));.
4a40: 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20    if( !zAff ){. 
4a50: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
4a60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
4a70: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69  .  }..  if( nSki
4a80: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  p ){.    int iId
4a90: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
4aa0: 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c 69  IdxCur;.    sqli
4ab0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4ac0: 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f   (bRev?OP_Last:O
4ad0: 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78 43  P_Rewind), iIdxC
4ae0: 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ur);.    VdbeCov
4af0: 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
4b00: 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  =0);.    VdbeCov
4b10: 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21  erageIf(v, bRev!
4b20: 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  =0);.    VdbeCom
4b30: 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
4b40: 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
4b50: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
4b60: 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  .    j = sqlite3
4b70: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
4b80: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76  _Goto);.    pLev
4b90: 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20 73  el->addrSkip = s
4ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
4bb0: 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f  Int(v, (bRev?OP_
4bc0: 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54  SeekLT:OP_SeekGT
4bd0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4bf0: 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42 61  IdxCur, 0, regBa
4c00: 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20  se, nSkip);.    
4c10: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4c20: 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
4c30: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4c40: 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
4c50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c60: 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66  ere(v, j);.    f
4c70: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b  or(j=0; j<nSkip;
4c80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
4c90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4ca0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
4cb0: 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73 65  xCur, j, regBase
4cc0: 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  +j);.      testc
4cd0: 61 73 65 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ase( pIdx->aiCol
4ce0: 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58 50 52 20  umn[j]==XN_EXPR 
4cf0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
4d00: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 65  ment((v, "%s", e
4d10: 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c 75 6d  xplainIndexColum
4d20: 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a 29 29 29  nName(pIdx, j)))
4d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a  ;.    }.  }    .
4d40: 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
4d50: 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
4d60: 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
4d70: 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c  ssert( zAff==0 |
4d80: 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  | (int)strlen(zA
4d90: 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  ff)>=nEq );.  fo
4da0: 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71  r(j=nSkip; j<nEq
4db0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
4dc0: 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  r1;.    pTerm = 
4dd0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
4de0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
4df0: 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  erm!=0 );.    /*
4e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
4e10: 65 73 74 63 61 73 65 20 69 73 20 74 72 75 65 20  estcase is true 
4e20: 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
4e30: 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
4e40: 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
4e50: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
4e60: 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
4e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
4e80: 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
4e90: 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
4ea0: 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
4eb0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
4ec0: 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
4ed0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
4ee0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
4ef0: 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63  AL );.    r1 = c
4f00: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
4f10: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
4f20: 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
4f30: 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
4f40: 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
4f50: 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
4f60: 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
4f70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4f80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4f90: 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
4fa0: 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
4fb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
4fe0: 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
4ff0: 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
5000: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
5010: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
5020: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
5030: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
5040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
5050: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
5060: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
5070: 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
5080: 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
5090: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
50a0: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
50b0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
50c0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
50d0: 61 67 73 20 26 20 54 45 52 4d 5f 49 53 29 3d 3d  ags & TERM_IS)==
50e0: 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
50f0: 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
5100: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
5110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5120: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
5130: 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
5140: 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
5150: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5160: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5170: 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
5180: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5190: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
51a0: 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
51b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
51c0: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  B ){.          z
51d0: 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
51e0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
51f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5200: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
5210: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
5220: 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
5230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
5240: 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
5250: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
5260: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5270: 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
5280: 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
5290: 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
52a0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
52b0: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
52c0: 42 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  BS./*.** If the 
52d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
52e0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ded instruction 
52f0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 72 61  is a constant ra
5300: 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 0a 2a 2a  nge contraint.**
5310: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 64   that originated
5320: 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f   from the LIKE o
5330: 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65  ptimization, the
5340: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 50 33 20  n change the P3 
5350: 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f 6f 70 2d 3e  to be.** pLoop->
5360: 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 61 6e 64  iLikeRepCntr and
5370: 20 73 65 74 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 54   set P5..**.** T
5380: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
5390: 74 69 6f 6e 20 74 72 79 73 20 74 6f 20 65 76 61  tion trys to eva
53a0: 6c 75 61 74 65 20 22 78 20 4c 49 4b 45 20 27 61  luate "x LIKE 'a
53b0: 62 63 25 27 22 20 61 73 20 61 20 72 61 6e 67 65  bc%'" as a range
53c0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 3a 20  .** expression: 
53d0: 22 78 3e 3d 27 41 42 43 27 20 41 4e 44 20 78 3c  "x>='ABC' AND x<
53e0: 27 61 62 64 27 22 2e 20 20 42 75 74 20 74 68 69  'abd'".  But thi
53f0: 73 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  s requires that 
5400: 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61  the range.** sca
5410: 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77 69 63 65  n loop run twice
5420: 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74 72 69 6e  , once for strin
5430: 67 73 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  gs and a second 
5440: 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a  time for BLOBs..
5450: 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72 69 6e 67  ** The OP_String
5460: 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 20   opcodes on the 
5470: 73 65 63 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76  second pass conv
5480: 65 72 74 20 74 68 65 20 75 70 70 65 72 20 61 6e  ert the upper an
5490: 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  d lower.** bound
54a0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 6e 74 73   string contants
54b0: 20 74 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69 73   to blobs.  This
54c0: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
54d0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 68 61  he necessary cha
54e0: 6e 67 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f  nges.** to the O
54f0: 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73  P_String opcodes
5500: 20 66 6f 72 20 74 68 61 74 20 74 6f 20 68 61 70   for that to hap
5510: 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  pen..**.** Excep
5520: 74 2c 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 66  t, of course, if
5530: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
5540: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 20  SNT_MATCH_BLOBS 
5550: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
5560: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65  .** only the one
5570: 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
5580: 65 20 73 74 72 69 6e 67 20 73 70 61 63 65 20 69  e string space i
5590: 73 20 72 65 71 75 69 72 65 64 2c 20 73 6f 20 74  s required, so t
55a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 62  his routine.** b
55b0: 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ecomes a no-op..
55c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
55d0: 68 65 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61  hereLikeOptimiza
55e0: 74 69 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28  tionStringFixup(
55f0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72             /* pr
5610: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5620: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5630: 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ion */.  WhereLe
5640: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
5650: 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61   /* The loop tha
5660: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 4c  t contains the L
5670: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5680: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5690: 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rm        /* The
56a0: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
56b0: 62 6f 75 6e 64 20 6a 75 73 74 20 63 6f 64 65 64  bound just coded
56c0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 65   */.){.  if( pTe
56d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
56e0: 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20  RM_LIKEOPT ){.  
56f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
5700: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
5710: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e  l->iLikeRepCntr>
5720: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73  0 );.    pOp = s
5730: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5740: 76 2c 20 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  v, -1);.    asse
5750: 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20  rt( pOp!=0 );.  
5760: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
5770: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 72 69 6e 67  pcode==OP_String
5780: 38 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  8 .            |
5790: 7c 20 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 70 57  | pTerm->pWC->pW
57a0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
57b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
57c0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20  ;.    pOp->p3 = 
57d0: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
57e0: 43 6e 74 72 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  Cntr;.    pOp->p
57f0: 35 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  5 = 1;.  }.}.#el
5800: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 68 65 72  se.# define wher
5810: 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f  eLikeOptimizatio
5820: 6e 53 74 72 69 6e 67 46 69 78 75 70 28 41 2c 42  nStringFixup(A,B
5830: 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,C).#endif..#ifd
5840: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5850: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
5860: 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
5870: 69 73 20 70 61 73 73 65 64 20 66 72 6f 6d 20 63  is passed from c
5880: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 29 20  odeCursorHint() 
5890: 64 6f 77 6e 20 74 6f 20 69 6e 64 69 76 69 64 75  down to individu
58a0: 61 6c 20 6e 6f 64 65 73 20 6f 66 0a 2a 2a 20 74  al nodes of.** t
58b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
58c0: 65 65 20 28 62 79 20 73 71 6c 69 74 65 33 57 61  ee (by sqlite3Wa
58d0: 6c 6b 45 78 70 72 28 29 29 20 75 73 69 6e 67 20  lkExpr()) using 
58e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
58f0: 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  his.** structure
5900: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43 43 75 72  ..*/.struct CCur
5910: 48 69 6e 74 20 7b 0a 20 20 69 6e 74 20 69 54 61  Hint {.  int iTa
5920: 62 43 75 72 3b 20 20 20 20 2f 2a 20 43 75 72 73  bCur;    /* Curs
5930: 6f 72 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  or for the main 
5940: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
5950: 49 64 78 43 75 72 3b 20 20 20 20 2f 2a 20 43 75  IdxCur;    /* Cu
5960: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
5970: 65 78 2c 20 69 66 20 70 49 64 78 21 3d 30 2e 20  ex, if pIdx!=0. 
5980: 20 55 6e 75 73 65 64 20 6f 74 68 65 72 77 69 73   Unused otherwis
5990: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
59a0: 64 78 3b 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx;    /* The in
59b0: 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
59c0: 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ss the table */.
59d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
59e0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
59f0: 64 20 66 6f 72 20 65 76 65 72 79 20 6e 6f 64 65  d for every node
5a00: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5a10: 6e 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64  n that is a cand
5a20: 69 64 61 74 65 0a 2a 2a 20 66 6f 72 20 61 20 63  idate.** for a c
5a30: 75 72 73 6f 72 20 68 69 6e 74 20 6f 6e 20 61 6e  ursor hint on an
5a40: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 20   index cursor.  
5a50: 46 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  For TK_COLUMN no
5a60: 64 65 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  des that referen
5a70: 63 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ce.** the table 
5a80: 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72  CCurHint.iTabCur
5a90: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  , verify that th
5aa0: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 63 61  e same column ca
5ab0: 6e 20 62 65 0a 2a 2a 20 61 63 63 65 73 73 65 64  n be.** accessed
5ac0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64   through the ind
5ad0: 65 78 2e 20 20 49 66 20 69 74 20 63 61 6e 6e 6f  ex.  If it canno
5ae0: 74 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c  t, then set pWal
5af0: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 2e  ker->eCode to 1.
5b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5b10: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 43 68 65  odeCursorHintChe
5b20: 63 6b 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  ckExpr(Walker *p
5b30: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
5b40: 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20 43  xpr){.  struct C
5b50: 43 75 72 48 69 6e 74 20 2a 70 48 69 6e 74 20 3d  CurHint *pHint =
5b60: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43 75   pWalker->u.pCCu
5b70: 72 48 69 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  rHint;.  assert(
5b80: 20 70 48 69 6e 74 2d 3e 70 49 64 78 21 3d 30 20   pHint->pIdx!=0 
5b90: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
5ba0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
5bb0: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
5bc0: 65 3d 3d 70 48 69 6e 74 2d 3e 69 54 61 62 43 75  e==pHint->iTabCu
5bd0: 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
5be0: 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69  olumnOfIndex(pHi
5bf0: 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d  nt->pIdx, pExpr-
5c00: 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b  >iColumn)<0.  ){
5c10: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
5c20: 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ode = 1;.  }.  r
5c30: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
5c40: 75 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ue;.}.../*.** Th
5c50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5c60: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 6e  alled on every n
5c70: 6f 64 65 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ode of an expres
5c80: 73 69 6f 6e 20 74 72 65 65 20 75 73 65 64 20 61  sion tree used a
5c90: 73 20 61 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  s an.** argument
5ca0: 20 74 6f 20 74 68 65 20 4f 50 5f 43 75 72 73 6f   to the OP_Curso
5cb0: 72 48 69 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rHint instructio
5cc0: 6e 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 69  n. If the node i
5cd0: 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a  s a TK_COLUMN.**
5ce0: 20 74 68 61 74 20 61 63 63 65 73 73 65 73 20 61   that accesses a
5cf0: 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ny table other t
5d00: 68 61 6e 20 74 68 65 20 6f 6e 65 20 69 64 65 6e  han the one iden
5d10: 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 43 43 75  tified by.** CCu
5d20: 72 48 69 6e 74 2e 69 54 61 62 43 75 72 2c 20 74  rHint.iTabCur, t
5d30: 68 65 6e 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f  hen do the follo
5d40: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  wing:.**.**   1)
5d50: 20 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69   allocate a regi
5d60: 73 74 65 72 20 61 6e 64 20 63 6f 64 65 20 61 6e  ster and code an
5d70: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72   OP_Column instr
5d80: 75 63 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 0a  uction to read .
5d90: 2a 2a 20 20 20 20 20 20 74 68 65 20 73 70 65 63  **      the spec
5da0: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  ified column int
5db0: 6f 20 74 68 65 20 6e 65 77 20 72 65 67 69 73 74  o the new regist
5dc0: 65 72 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  er, and.**.**   
5dd0: 32 29 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  2) transform the
5de0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
5df0: 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
5e00: 52 20 6e 6f 64 65 20 74 68 61 74 20 72 65 61 64  R node that read
5e10: 73 20 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  s .**      from 
5e20: 74 68 65 20 6e 65 77 6c 79 20 70 6f 70 75 6c 61  the newly popula
5e30: 74 65 64 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  ted register..**
5e40: 0a 2a 2a 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  .** Also, if the
5e50: 20 6e 6f 64 65 20 69 73 20 61 20 54 4b 5f 43 4f   node is a TK_CO
5e60: 4c 55 4d 4e 20 74 68 61 74 20 64 6f 65 73 20 61  LUMN that does a
5e70: 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20  ccess the table 
5e80: 69 64 65 6e 69 66 69 65 64 0a 2a 2a 20 62 79 20  idenified.** by 
5e90: 70 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75  pCCurHint.iTabCu
5ea0: 72 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  r, and an index 
5eb0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 28 77  is being used (w
5ec0: 68 69 63 68 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  hich we will.** 
5ed0: 6b 6e 6f 77 20 62 65 63 61 75 73 65 20 43 43 75  know because CCu
5ee0: 72 48 69 6e 74 2e 70 49 64 78 21 3d 30 29 20 74  rHint.pIdx!=0) t
5ef0: 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  hen transform th
5f00: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 69 6e 74 6f  e TK_COLUMN into
5f10: 0a 2a 2a 20 61 6e 20 61 63 63 65 73 73 20 6f 66  .** an access of
5f20: 20 74 68 65 20 69 6e 64 65 78 20 72 61 74 68 65   the index rathe
5f30: 72 20 74 68 61 6e 20 74 68 65 20 6f 72 69 67 69  r than the origi
5f40: 6e 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  nal table..*/.st
5f50: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72  atic int codeCur
5f60: 73 6f 72 48 69 6e 74 46 69 78 45 78 70 72 28 57  sorHintFixExpr(W
5f70: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5f80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5f90: 69 6e 74 20 72 63 20 3d 20 57 52 43 5f 43 6f 6e  int rc = WRC_Con
5fa0: 74 69 6e 75 65 3b 0a 20 20 73 74 72 75 63 74 20  tinue;.  struct 
5fb0: 43 43 75 72 48 69 6e 74 20 2a 70 48 69 6e 74 20  CCurHint *pHint 
5fc0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 43  = pWalker->u.pCC
5fd0: 75 72 48 69 6e 74 3b 0a 20 20 69 66 28 20 70 45  urHint;.  if( pE
5fe0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
5ff0: 4d 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  MN ){.    if( pE
6000: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 48 69  xpr->iTable!=pHi
6010: 6e 74 2d 3e 69 54 61 62 43 75 72 20 29 7b 0a 20  nt->iTabCur ){. 
6020: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
6030: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
6040: 70 56 64 62 65 3b 0a 20 20 20 20 20 20 69 6e 74  pVdbe;.      int
6050: 20 72 65 67 20 3d 20 2b 2b 70 57 61 6c 6b 65 72   reg = ++pWalker
6060: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ->pParse->nMem; 
6070: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
6080: 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 2a  r column value *
6090: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
60a0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
60b0: 4f 66 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20  OfTable(.       
60c0: 20 20 20 76 2c 20 70 45 78 70 72 2d 3e 70 54 61     v, pExpr->pTa
60d0: 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  b, pExpr->iTable
60e0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
60f0: 2c 20 72 65 67 0a 20 20 20 20 20 20 29 3b 0a 20  , reg.      );. 
6100: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
6110: 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
6120: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6130: 65 20 3d 20 72 65 67 3b 0a 20 20 20 20 7d 65 6c  e = reg;.    }el
6140: 73 65 20 69 66 28 20 70 48 69 6e 74 2d 3e 70 49  se if( pHint->pI
6150: 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  dx!=0 ){.      p
6160: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
6170: 48 69 6e 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20  Hint->iIdxCur;. 
6180: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6190: 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  umn = sqlite3Col
61a0: 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48 69 6e 74  umnOfIndex(pHint
61b0: 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
61c0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
61d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
61e0: 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20  olumn>=0 );.    
61f0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45  }.  }else if( pE
6200: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
6210: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
6220: 2f 2a 20 41 6e 20 61 67 67 72 65 67 61 74 65 20  /* An aggregate 
6230: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
6240: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
6250: 61 20 71 75 65 72 79 20 6d 65 61 6e 73 20 74 68  a query means th
6260: 69 73 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  is must.    ** b
6270: 65 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  e a correlated s
6280: 75 62 2d 71 75 65 72 79 2c 20 61 6e 64 20 65 78  ub-query, and ex
6290: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
62a0: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66  s an aggregate f
62b0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  rom.    ** the p
62c0: 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 20 44  arent context. D
62d0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 74 68 65 20 66  o not walk the f
62e0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
62f0: 73 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  s in this case..
6300: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 74 6f      **.    ** to
6310: 64 6f 3a 20 49 74 20 73 68 6f 75 6c 64 20 62 65  do: It should be
6320: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 70   possible to rep
6330: 6c 61 63 65 20 74 68 69 73 20 6e 6f 64 65 20 77  lace this node w
6340: 69 74 68 20 61 20 54 4b 5f 52 45 47 49 53 54 45  ith a TK_REGISTE
6350: 52 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  R.    ** express
6360: 69 6f 6e 2c 20 61 73 20 74 68 65 20 72 65 73 75  ion, as the resu
6370: 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
6380: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 6f  sion must be sto
6390: 72 65 64 20 69 6e 20 61 20 0a 20 20 20 20 2a 2a  red in a .    **
63a0: 20 72 65 67 69 73 74 65 72 20 61 74 20 74 68 69   register at thi
63b0: 73 20 70 6f 69 6e 74 2e 20 54 68 65 20 73 61 6d  s point. The sam
63c0: 65 20 68 6f 6c 64 73 20 66 6f 72 20 54 4b 5f 41  e holds for TK_A
63d0: 47 47 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e  GG_COLUMN nodes.
63e0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 57 52 43   */.    rc = WRC
63f0: 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65  _Prune;.  }.  re
6400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6410: 2a 20 49 6e 73 65 72 74 20 61 6e 20 4f 50 5f 43  * Insert an OP_C
6420: 75 72 73 6f 72 48 69 6e 74 20 69 6e 73 74 72 75  ursorHint instru
6430: 63 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 61  ction if it is a
6440: 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 64 6f  ppropriate to do
6450: 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   so..*/.static v
6460: 6f 69 64 20 63 6f 64 65 43 75 72 73 6f 72 48 69  oid codeCursorHi
6470: 6e 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  nt(.  WhereInfo 
6480: 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
6490: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
64a0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
64b0: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
64c0: 69 63 68 20 6c 6f 6f 70 20 74 6f 20 70 72 6f 76  ich loop to prov
64d0: 69 64 65 20 68 69 6e 74 73 20 66 6f 72 20 2a 2f  ide hints for */
64e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 45  .  WhereTerm *pE
64f0: 6e 64 52 61 6e 67 65 20 20 2f 2a 20 48 69 6e 74  ndRange  /* Hint
6500: 20 74 68 69 73 20 65 6e 64 2d 6f 66 2d 73 63 61   this end-of-sca
6510: 6e 20 62 6f 75 6e 64 61 72 79 20 74 65 72 6d 20  n boundary term 
6520: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
6530: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
6540: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
6550: 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
6560: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6570: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6580: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
6590: 72 20 2a 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  r *pExpr = 0;.  
65a0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
65b0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
65c0: 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  p;.  int iCur;. 
65d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
65e0: 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
65f0: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
6600: 6a 3b 0a 20 20 73 74 72 75 63 74 20 43 43 75 72  j;.  struct CCur
6610: 48 69 6e 74 20 73 48 69 6e 74 3b 0a 20 20 57 61  Hint sHint;.  Wa
6620: 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20  lker sWalker;.. 
6630: 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
6640: 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
6650: 4c 49 54 45 5f 43 75 72 73 6f 72 48 69 6e 74 73  LITE_CursorHints
6660: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 43  ) ) return;.  iC
6670: 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
6680: 62 43 75 72 3b 0a 20 20 61 73 73 65 72 74 28 20  bCur;.  assert( 
6690: 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 54  iCur==pWInfo->pT
66a0: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
66b0: 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
66c0: 20 29 3b 0a 20 20 73 48 69 6e 74 2e 69 54 61 62   );.  sHint.iTab
66d0: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 48  Cur = iCur;.  sH
66e0: 69 6e 74 2e 69 49 64 78 43 75 72 20 3d 20 70 4c  int.iIdxCur = pL
66f0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
6700: 20 73 48 69 6e 74 2e 70 49 64 78 20 3d 20 70 4c   sHint.pIdx = pL
6710: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6720: 64 65 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  dex;.  memset(&s
6730: 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Walker, 0, sizeo
6740: 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73  f(sWalker));.  s
6750: 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20  Walker.pParse = 
6760: 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65  pParse;.  sWalke
6770: 72 2e 75 2e 70 43 43 75 72 48 69 6e 74 20 3d 20  r.u.pCCurHint = 
6780: 26 73 48 69 6e 74 3b 0a 20 20 70 57 43 20 3d 20  &sHint;.  pWC = 
6790: 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
67a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e  for(i=0; i<pWC->
67b0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
67c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
67d0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 65  [i];.    if( pTe
67e0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
67f0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
6800: 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
6810: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
6820: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
6830: 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
6840: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6850: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6860: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
6870: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
6880: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
6890: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 69 6e 20  /* All terms in 
68a0: 70 57 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d  pWLoop->aLTerm[]
68b0: 20 65 78 63 65 70 74 20 70 45 6e 64 52 61 6e 67   except pEndRang
68c0: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6e  e are used to in
68d0: 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
68e0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
68f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e 6f 74  se terms are not
6900: 20 6e 65 65 64 65 64 20 61 73 20 68 69 6e 74 73   needed as hints
6910: 20 66 6f 72 20 61 20 70 75 72 65 20 72 61 6e 67   for a pure rang
6920: 65 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20 28 74  e.    ** scan (t
6930: 68 61 74 20 68 61 73 20 6e 6f 20 3d 3d 20 74 65  hat has no == te
6940: 72 6d 73 29 20 73 6f 20 6f 6d 69 74 20 74 68 65  rms) so omit the
6950: 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  m. */.    if( pL
6960: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
6970: 3d 3d 30 20 26 26 20 70 54 65 72 6d 21 3d 70 45  ==0 && pTerm!=pE
6980: 6e 64 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  ndRange ){.     
6990: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f   for(j=0; j<pLoo
69a0: 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70 4c 6f  p->nLTerm && pLo
69b0: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 21 3d 70  op->aLTerm[j]!=p
69c0: 54 65 72 6d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  Term; j++){}.   
69d0: 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
69e0: 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75  nLTerm ) continu
69f0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
6a00: 20 4e 6f 20 73 75 62 71 75 65 72 69 65 73 20 6f   No subqueries o
6a10: 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  r non-determinis
6a20: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  tic functions al
6a30: 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  lowed */.    if(
6a40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
6a50: 61 69 6e 73 53 75 62 71 75 65 72 79 28 70 54 65  ainsSubquery(pTe
6a60: 72 6d 2d 3e 70 45 78 70 72 29 20 29 20 63 6f 6e  rm->pExpr) ) con
6a70: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 46  tinue;..    /* F
6a80: 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e  or an index scan
6a90: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 66 65  , make sure refe
6aa0: 72 65 6e 63 65 64 20 63 6f 6c 75 6d 6e 73 20 61  renced columns a
6ab0: 72 65 20 61 63 74 75 61 6c 6c 79 20 69 6e 0a 20  re actually in. 
6ac0: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e     ** the index.
6ad0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 48 69 6e   */.    if( sHin
6ae0: 74 2e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20  t.pIdx!=0 ){.   
6af0: 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65     sWalker.eCode
6b00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 57 61 6c   = 0;.      sWal
6b10: 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
6b20: 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69  k = codeCursorHi
6b30: 6e 74 43 68 65 63 6b 45 78 70 72 3b 0a 20 20 20  ntCheckExpr;.   
6b40: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
6b50: 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 54 65  pr(&sWalker, pTe
6b60: 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
6b70: 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43    if( sWalker.eC
6b80: 6f 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ode ) continue;.
6b90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6ba0: 20 77 65 20 73 75 72 76 69 76 65 20 61 6c 6c 20   we survive all 
6bb0: 70 72 69 6f 72 20 74 65 73 74 73 2c 20 74 68 61  prior tests, tha
6bc0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 74 65 72  t means this ter
6bd0: 6d 20 69 73 20 77 6f 72 74 68 20 68 69 6e 74 69  m is worth hinti
6be0: 6e 67 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 20  ng */.    pExpr 
6bf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
6c00: 28 64 62 2c 20 70 45 78 70 72 2c 20 73 71 6c 69  (db, pExpr, sqli
6c10: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6c20: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 29  Term->pExpr, 0))
6c30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
6c40: 72 21 3d 30 20 29 7b 0a 20 20 20 20 73 57 61 6c  r!=0 ){.    sWal
6c50: 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
6c60: 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72 48 69  k = codeCursorHi
6c70: 6e 74 46 69 78 45 78 70 72 3b 0a 20 20 20 20 73  ntFixExpr;.    s
6c80: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
6c90: 73 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  sWalker, pExpr);
6ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6cb0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 75 72  AddOp4(v, OP_Cur
6cc0: 73 6f 72 48 69 6e 74 2c 20 0a 20 20 20 20 20 20  sorHint, .      
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 28 73 48 69 6e 74 2e 70 49 64 78 20 3f 20 73 48  (sHint.pIdx ? sH
6cf0: 69 6e 74 2e 69 49 64 78 43 75 72 20 3a 20 73 48  int.iIdxCur : sH
6d00: 69 6e 74 2e 69 54 61 62 43 75 72 29 2c 20 30 2c  int.iTabCur), 0,
6d10: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
6d20: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
6d30: 20 63 68 61 72 2a 29 70 45 78 70 72 2c 20 50 34   char*)pExpr, P4
6d40: 5f 45 58 50 52 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _EXPR);.  }.}.#e
6d50: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6f 64  lse.# define cod
6d60: 65 43 75 72 73 6f 72 48 69 6e 74 28 41 2c 42 2c  eCursorHint(A,B,
6d70: 43 29 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a  C)  /* No-op */.
6d80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6d90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6da0: 49 4e 54 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  INTS */../*.** G
6db0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
6dc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
6dd0: 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
6de0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
6df0: 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
6e00: 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
6e10: 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 42   by pWInfo..*/.B
6e20: 69 74 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68  itmask sqlite3Wh
6e30: 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
6e40: 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
6e50: 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
6e60: 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
6e70: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
6e80: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
6e90: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
6ea0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
6eb0: 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
6ec0: 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
6ed0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
6ee0: 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
6ef0: 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
6f00: 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
6f10: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
6f20: 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
6f30: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
6f40: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
6f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6f60: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
6f70: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
6f80: 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
6f90: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
6fa0: 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
6fb0: 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
6fc0: 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
6fd0: 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
6fe0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6ff0: 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
7000: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
7010: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
7020: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
7030: 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
7040: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
7050: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
7060: 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
7070: 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
7080: 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
7090: 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
70a0: 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
70b0: 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
70c0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
70d0: 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
70e0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
70f0: 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
7100: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
7110: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7130: 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
7140: 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
7150: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
7160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
7170: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7180: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
71b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
71c0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
71f0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
7200: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
7210: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7220: 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
7230: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
7240: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
7250: 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7280: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
7290: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
72a0: 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
72c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
72d0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
72e0: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
72f0: 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
7300: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
7310: 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
7320: 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
7330: 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
7340: 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
7350: 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
7360: 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
7370: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
7380: 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
7390: 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
73a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
73b0: 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
73c0: 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70  o->sWC;.  db = p
73d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65  Parse->db;.  pLe
73e0: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
73f0: 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
7400: 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
7410: 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
7420: 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
7430: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
7440: 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
7450: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
7460: 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  ;.  pLevel->notR
7470: 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20  eady = notReady 
7480: 26 20 7e 73 71 6c 69 74 65 33 57 68 65 72 65 47  & ~sqlite3WhereG
7490: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
74a0: 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
74b0: 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66  .  bRev = (pWInf
74c0: 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76  o->revMask>>iLev
74d0: 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62  el)&1;.  omitTab
74e0: 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  le = (pLoop->wsF
74f0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
7500: 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
7510: 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
7520: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
7530: 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
7540: 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75  )==0;.  VdbeModu
7550: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  leComment((v, "B
7560: 65 67 69 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25  egin WHERE-loop%
7570: 64 3a 20 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54  d: %s",iLevel,pT
7580: 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
7590: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  ame));..  /* Cre
75a0: 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
75b0: 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
75c0: 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
75d0: 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20  ctions.  ** for 
75e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
75f0: 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42  .  Jump to addrB
7600: 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
7610: 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  of a loop..  ** 
7620: 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
7630: 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
7640: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
7650: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
7660: 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   loop..  **.  **
7670: 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
7680: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
7690: 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61  e also have a "a
76a0: 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68  ddrNxt" label th
76b0: 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  at.  ** means to
76c0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
76d0: 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
76e0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
76f0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61  hen.  ** there a
7700: 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
7710: 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
7720: 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72  aints, the "addr
7730: 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20  Nxt" label.  ** 
7740: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
7750: 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20  addrBrk"..  */. 
7760: 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65   addrBrk = pLeve
7770: 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  l->addrBrk = pLe
7780: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
7790: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
77a0: 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f  bel(v);.  addrCo
77b0: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nt = pLevel->add
77c0: 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
77d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
77e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
77f0: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
7800: 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
7810: 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
7820: 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61   and.  ** initia
7830: 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
7840: 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
7850: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
7860: 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72  tches any.  ** r
7870: 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
7880: 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
7890: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  ..  */.  if( pLe
78a0: 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
78b0: 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 66 67 2e  (pTabItem[0].fg.
78c0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
78d0: 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
78e0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
78f0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7910: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7920: 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
7930: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
7940: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
7950: 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
7960: 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
7970: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
7980: 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
7990: 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
79a0: 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
79b0: 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
79c0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
79d0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
79e0: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
79f0: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
7a00: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
7a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a20: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
7a30: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
7a40: 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
7a50: 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
7a60: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
7a70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7a80: 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
7a90: 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42 72  regYield, addrBr
7aa0: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
7ab0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
7ac0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
7ad0: 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22  xt row of \"%s\"
7ae0: 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
7af0: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
7b00: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
7b10: 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Goto;.  }else..#
7b20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7b30: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7b40: 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77    if(  (pLoop->w
7b50: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
7b60: 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
7b70: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
7b80: 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
7b90: 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
7ba0: 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
7bb0: 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
7bc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
7bd0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
7be0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
7bf0: 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
7c00: 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
7c10: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
7c20: 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69  rNotFound;.    i
7c30: 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
7c40: 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a   pLoop->nLTerm;.
7c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7c60: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
7c70: 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
7c80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
7c90: 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
7ca0: 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64  raint+2);.    ad
7cb0: 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
7cc0: 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20  vel->addrBrk;.  
7cd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
7ce0: 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
7cf0: 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65        int iTarge
7d00: 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20  t = iReg+j+2;.  
7d10: 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
7d20: 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
7d30: 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
7d40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d50: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
7d60: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
7d70: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  ){.        codeE
7d80: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
7d90: 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
7da0: 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72  l, j, bRev, iTar
7db0: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64  get);.        ad
7dc0: 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
7dd0: 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
7de0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7df0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
7e00: 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  de(pParse, pTerm
7e10: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
7e20: 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
7e30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
7e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c  , OP_Integer, pL
7e60: 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
7e70: 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
7e80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7e90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7ea0: 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65  nConstraint, iRe
7eb0: 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
7ec0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7ed0: 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
7ee0: 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69   addrNotFound, i
7ef0: 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Reg,.           
7f00: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
7f10: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
7f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f30: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
7f40: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20  vtab.needFree ? 
7f50: 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
7f60: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64 62  STATIC);.    Vdb
7f70: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7f80: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
7f90: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
7fa0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
7fb0: 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
7fc0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
7fd0: 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
7fe0: 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
7ff0: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
8000: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
8010: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29  Loop->aLTerm[j])
8020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8030: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
8040: 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
8050: 6c 2d 3e 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  l->op = pWInfo->
8060: 65 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4e 6f  eOnePass ? OP_No
8070: 6f 70 20 3a 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op : OP_VNext;. 
8080: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
8090: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
80a0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
80b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
80c0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
80d0: 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
80e0: 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
80f0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
8100: 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rse);.  }else.#e
8110: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8120: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8130: 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
8140: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
8150: 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
8160: 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
8170: 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
8180: 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
8190: 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
81a0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
81b0: 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
81c0: 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
81d0: 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
81e0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
81f0: 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
8200: 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
8210: 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
8220: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
8230: 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
8240: 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
8250: 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
8260: 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
8270: 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
8280: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
8290: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
82a0: 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  nEq==1 );.    pT
82b0: 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
82c0: 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
82d0: 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
82e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
82f0: 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
8300: 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
8310: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
8320: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
8330: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8340: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69 52  IRTUAL );.    iR
8350: 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70 50  eleaseReg = ++pP
8360: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8370: 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
8380: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
8390: 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
83a0: 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
83b0: 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 69  leaseReg);.    i
83c0: 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69 52  f( iRowidReg!=iR
83d0: 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c 69  eleaseReg ) sqli
83e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
83f0: 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
8400: 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
8410: 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
8420: 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
8430: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8440: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
8450: 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
8460: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8470: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
8480: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8490: 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
84a0: 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
84b0: 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
84c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
84d0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
84e0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
84f0: 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
8500: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
8510: 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
8520: 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
8530: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
8540: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
8550: 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
8560: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
8570: 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
8580: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
8590: 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
85a0: 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
85b0: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
85c0: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
85d0: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
85e0: 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
85f0: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
8600: 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
8610: 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
8620: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
8630: 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
8640: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
8650: 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
8660: 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
8670: 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
8680: 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
8690: 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
86a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
86b0: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
86c0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
86d0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
86e0: 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
86f0: 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
8700: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
8710: 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
8720: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
8730: 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
8740: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
8750: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
8760: 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
8770: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
8780: 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
8790: 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
87a0: 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
87b0: 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
87c0: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
87d0: 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69      codeCursorHi
87e0: 6e 74 28 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65  nt(pWInfo, pLeve
87f0: 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 69 66  l, pEnd);.    if
8800: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
8810: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
8820: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
8830: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
8840: 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
8850: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
8860: 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
8870: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
8880: 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
8890: 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
88a0: 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
88b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
88c0: 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
88d0: 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
88e0: 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
88f0: 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
8900: 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
8910: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
8920: 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
8930: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
8940: 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
8950: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
8960: 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
8970: 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20  _SeekGT,.       
8980: 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
8990: 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20   OP_SeekLE,.    
89a0: 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
89b0: 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20  */  OP_SeekLT,. 
89c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
89d0: 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45  GE */  OP_SeekGE
89e0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
89f0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
8a00: 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
8a10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
8a20: 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
8a30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
8a40: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
8a50: 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
8a60: 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
8a70: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
8a80: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
8a90: 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
8aa0: 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
8ab0: 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
8ac0: 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
8ad0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
8ae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
8af0: 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
8b00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8b10: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
8b20: 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
8b30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8b40: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
8b50: 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
8b60: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
8b70: 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
8b80: 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
8b90: 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
8ba0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
8bb0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
8bc0: 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
8bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8be0: 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
8bf0: 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
8c00: 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
8c10: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
8c20: 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
8c30: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
8c40: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
8c50: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
8c60: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
8c70: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
8c80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
8c90: 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
8ca0: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
8cb0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
8cc0: 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
8cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
8ce0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8cf0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8d00: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
8d10: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
8d20: 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
8d30: 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
8d40: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
8d50: 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
8d60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8d70: 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
8d80: 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
8d90: 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
8da0: 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  drBrk);.      Vd
8db0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
8dc0: 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20  bRev==0);.      
8dd0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
8de0: 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
8df0: 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
8e00: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
8e10: 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
8e20: 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
8e30: 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
8e40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8e50: 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
8e60: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
8e70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8e80: 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
8e90: 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
8ea0: 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
8eb0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
8ec0: 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
8ed0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8ee0: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
8ef0: 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
8f00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8f10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
8f20: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
8f30: 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
8f40: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
8f50: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
8f60: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
8f70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
8f80: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
8f90: 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
8fa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
8fb0: 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
8fc0: 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
8fd0: 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
8fe0: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
8ff0: 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
9000: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
9010: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9020: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
9030: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
9040: 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
9050: 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
9060: 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
9070: 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
9080: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
9090: 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
90a0: 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
90b0: 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
90c0: 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
90d0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
90e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
90f0: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
9100: 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
9110: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
9120: 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
9130: 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
9140: 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
9150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9160: 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
9170: 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
9180: 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
9190: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
91a0: 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c  (v, testOp==OP_L
91b0: 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
91c0: 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
91d0: 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  Op==OP_Lt);.    
91e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
91f0: 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47  (v, testOp==OP_G
9200: 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
9210: 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
9220: 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  Op==OP_Gt);.    
9230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9240: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
9250: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
9260: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
9270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
9280: 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
9290: 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
92a0: 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
92b0: 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
92c0: 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
92d0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
92e0: 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
92f0: 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
9300: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
9310: 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
9320: 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
9330: 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
9340: 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
9350: 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
9360: 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
9370: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
9380: 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
9390: 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
93a0: 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
93b0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
93c0: 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
93d0: 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
93e0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
93f0: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
9400: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
9410: 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
9420: 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
9430: 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
9440: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
9450: 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
9460: 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
9470: 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
9480: 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
9490: 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
94a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
94b0: 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
94c0: 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
94d0: 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
94e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
94f0: 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
9500: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
9510: 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
9520: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
9530: 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
9540: 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
9550: 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
9560: 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
9570: 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
9580: 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
9590: 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
95a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
95b0: 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
95c0: 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
95d0: 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
95e0: 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
95f0: 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
9600: 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
9610: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
9620: 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
9630: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
9640: 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
9650: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
9660: 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
9670: 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
9680: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
9690: 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
96a0: 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
96b0: 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
96c0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
96d0: 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
96e0: 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
96f0: 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
9700: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
9710: 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
9720: 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
9730: 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
9740: 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
9750: 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
9760: 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
9770: 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
9780: 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
9790: 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
97a0: 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
97b0: 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
97c0: 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
97d0: 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
97e0: 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
97f0: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
9800: 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
9810: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
9820: 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
9830: 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
9840: 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
9850: 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
9860: 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
9870: 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
9880: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
9890: 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
98a0: 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
98b0: 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20  eekGT,          
98c0: 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
98d0: 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
98e0: 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
98f0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
9900: 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLT,           /
9910: 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
9920: 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
9930: 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
9940: 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
9950: 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E,           /* 
9960: 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
9970: 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
9980: 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
9990: 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20        OP_SeekLE 
99a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
99b0: 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
99c0: 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
99d0: 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
99e0: 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
99f0: 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
9a00: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49  ] = {.      OP_I
9a10: 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
9a20: 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 0: (end_cons
9a30: 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
9a40: 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
9a50: 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20       OP_IdxGT,  
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
9a70: 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
9a80: 20 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e   && !bRev &&  en
9a90: 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
9aa0: 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20  _IdxLE,         
9ab0: 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
9ac0: 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52  nstraints &&  bR
9ad0: 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
9ae0: 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c  .      OP_IdxLT,
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
9b00: 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
9b10: 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20  ts &&  bRev &&  
9b20: 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b  endEq) */.    };
9b30: 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70  .    u16 nEq = p
9b40: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
9b50: 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  q;     /* Number
9b60: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
9b70: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ms */.    int re
9b80: 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
9b90: 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
9ba0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
9bb0: 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
9bc0: 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
9bd0: 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
9be0: 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
9bf0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
9c00: 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
9c10: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
9c20: 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
9c30: 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
9c40: 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
9c50: 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
9c60: 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9c80: 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
9c90: 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
9ca0: 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
9cb0: 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
9cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9cd0: 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
9ce0: 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
9cf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
9d00: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
9d10: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
9d20: 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
9d30: 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
9d40: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9d60: 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
9d70: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
9d80: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9da0: 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
9db0: 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
9dc0: 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9de0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
9df0: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
9e00: 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
9e10: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
9e20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
9e30: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
9e40: 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
9e50: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
9e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
9e70: 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
9e80: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
9e90: 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
9ea0: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
9eb0: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
9ec0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
9ed0: 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66  .    char cEndAf
9ee0: 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
9ef0: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
9f00: 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
9f10: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
9f20: 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c   u8 bSeekPastNul
9f30: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
9f40: 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61   True to seek pa
9f50: 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73  st initial nulls
9f60: 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70   */.    u8 bStop
9f70: 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20  AtNull = 0;     
9f80: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64       /* Add cond
9f90: 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61  ition to termina
9fa0: 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a  te at NULLs */..
9fb0: 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
9fc0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
9fd0: 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
9fe0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
9ff0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71  .    assert( nEq
a000: 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29  >=pLoop->nSkip )
a010: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a020: 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
a030: 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
a040: 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
a050: 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
a060: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
a070: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
a080: 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
a090: 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
a0a0: 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
a0b0: 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
a0c0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
a0d0: 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
a0e0: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
a0f0: 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
a100: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
a110: 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
a120: 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
a130: 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
a140: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
a150: 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
a160: 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
a170: 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
a180: 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
a190: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
a1a0: 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
a1b0: 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
a1c0: 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
a1d0: 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
a1e0: 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
a1f0: 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20  o->pOrderBy==0. 
a200: 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66          || pWInf
a210: 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
a220: 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  pr==1.         |
a230: 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
a240: 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
a250: 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20  RBY_MIN)==0 );. 
a260: 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
a270: 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
a280: 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
a290: 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  .     && pWInfo-
a2a0: 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26  >nOBSat>0.     &
a2b0: 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
a2c0: 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
a2d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
a2e0: 2d 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  ->nSkip==0 );.  
a2f0: 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
a300: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  l = 1;.      nEx
a310: 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
a320: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
a330: 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
a340: 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
a350: 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
a360: 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
a370: 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
a380: 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
a390: 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
a3a0: 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
a3b0: 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
a3c0: 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
a3d0: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
a3e0: 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
a3f0: 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  Reg = 1;.      /
a400: 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  * Like optimizat
a410: 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
a420: 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63  aints always occ
a430: 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
a440: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
a450: 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
a460: 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
a470: 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  T)==0 || .      
a480: 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e          (pLoop->
a490: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
a4a0: 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b  TOP_LIMIT)!=0 );
a4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a4c0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
a4d0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
a4e0: 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
a4f0: 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
a500: 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
a510: 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 23 69  ExtraReg = 1;.#i
a520: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
a530: 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
a540: 4c 4f 42 53 0a 20 20 20 20 20 20 69 66 28 20 28  LOBS.      if( (
a550: 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
a560: 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
a570: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  T)!=0 ){.       
a580: 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65 53   assert( pRangeS
a590: 74 61 72 74 21 3d 30 20 29 3b 20 20 20 20 20 20  tart!=0 );      
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5b0: 2a 20 4c 49 4b 45 20 6f 70 74 20 63 6f 6e 73 74  * LIKE opt const
a5c0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
a5d0: 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65    assert( pRange
a5e0: 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
a5f0: 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b   TERM_LIKEOPT );
a600: 20 20 20 2f 2a 20 6f 63 63 75 72 20 69 6e 20 70     /* occur in p
a610: 61 69 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  airs */.        
a620: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
a630: 43 6e 74 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Cntr = ++pParse-
a640: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 74  >nMem;.        t
a650: 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
a660: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a670: 65 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  e( pIdx->aSortOr
a680: 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
a690: 5f 53 4f 5f 44 45 53 43 20 29 3b 0a 20 20 20 20  _SO_DESC );.    
a6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a6c0: 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ger,.           
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a6e0: 52 65 76 20 5e 20 28 70 49 64 78 2d 3e 61 53 6f  Rev ^ (pIdx->aSo
a6f0: 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
a700: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 29 2c 0a 20  LITE_SO_DESC),. 
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
a730: 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29 3b 0a  >iLikeRepCntr);.
a740: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
a750: 65 6e 74 28 28 76 2c 20 22 4c 49 4b 45 20 6c 6f  ent((v, "LIKE lo
a760: 6f 70 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  op counter"));. 
a770: 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61         pLevel->a
a780: 64 64 72 4c 69 6b 65 52 65 70 20 3d 20 73 71 6c  ddrLikeRep = sql
a790: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a7a0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  ddr(v);.      }.
a7b0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
a7c0: 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a   pRangeStart==0.
a7d0: 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70         && (j = p
a7e0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
a7f0: 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  q])>=0 .       &
a800: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
a810: 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
a820: 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
a830: 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
a840: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
a850: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
a860: 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c   pRangeEnd==0 ||
a870: 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
a880: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
a890: 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  L)==0 );..    /*
a8a0: 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
a8b0: 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
a8c0: 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
a8d0: 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
a8e0: 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
a8f0: 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
a900: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
a910: 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
a920: 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
a930: 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
a940: 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
a950: 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
a960: 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
a970: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26  pIdx->nKeyCol &&
a980: 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
a990: 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
a9a0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
a9b0: 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
a9c0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  pIdx->nKeyCol==n
a9d0: 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
a9e0: 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
a9f0: 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
aa00: 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
aa10: 20 20 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b    SWAP(u8, bSeek
aa20: 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41  PastNull, bStopA
aa30: 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  tNull);.    }.. 
aa40: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
aa50: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
aa60: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
aa70: 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
aa80: 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
aa90: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
aaa0: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
aab0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
aac0: 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
aad0: 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
aae0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
aaf0: 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 28 70 57  odeCursorHint(pW
ab00: 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 52  Info, pLevel, pR
ab10: 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 72 65  angeEnd);.    re
ab20: 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
ab30: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
ab40: 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c  rse,pLevel,bRev,
ab50: 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72  nExtraReg,&zStar
ab60: 74 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  tAff);.    asser
ab70: 74 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20  t( zStartAff==0 
ab80: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  || sqlite3Strlen
ab90: 33 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e  30(zStartAff)>=n
aba0: 45 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  Eq );.    if( zS
abb0: 74 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66  tartAff ) cEndAf
abc0: 66 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  f = zStartAff[nE
abd0: 71 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  q];.    addrNxt 
abe0: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
abf0: 74 3b 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65  t;..    testcase
ac00: 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
ac10: 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65   (pRangeStart->e
ac20: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
ac30: 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
ac40: 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
ac50: 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
ac60: 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
ac70: 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
ac80: 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
ac90: 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
aca0: 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
acb0: 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
acc0: 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
acd0: 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
ace0: 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
acf0: 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
ad00: 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
ad10: 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
ad20: 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
ad30: 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
ad40: 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
ad50: 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
ad60: 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
ad70: 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
ad80: 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
ad90: 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
ada0: 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
adb0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
adc0: 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
add0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
ade0: 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
adf0: 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
ae00: 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
ae10: 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
ae20: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
ae30: 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
ae40: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
ae50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ae60: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ae70: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
ae80: 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65  .      whereLike
ae90: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
aea0: 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65  ngFixup(v, pLeve
aeb0: 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
aec0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
aed0: 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
aee0: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
aef0: 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
af00: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
af10: 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
af20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
af30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
af40: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
af50: 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
af60: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
af70: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
af80: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
af90: 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
afa0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
afb0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
afc0: 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
afd0: 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
afe0: 42 4c 4f 42 29 7b 0a 20 20 20 20 20 20 20 20 20  BLOB){.         
aff0: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
b000: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
b010: 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
b020: 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
b030: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
b040: 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
b050: 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
b060: 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
b070: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
b080: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
b090: 45 5f 41 46 46 5f 42 4c 4f 42 2e 20 20 2a 2f 0a  E_AFF_BLOB.  */.
b0a0: 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
b0b0: 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
b0c0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
b0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
b0e0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
b0f0: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
b100: 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
b110: 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
b120: 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
b130: 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
b140: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
b150: 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
b160: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
b170: 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
b180: 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
b190: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
b1a0: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
b1b0: 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73  lse if( bSeekPas
b1c0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  tNull ){.      s
b1d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b1e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b1f0: 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
b200: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
b210: 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
b220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
b230: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
b240: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
b250: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
b260: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
b270: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53  nConstraint - bS
b280: 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74  eekPastNull, zSt
b290: 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
b2a0: 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
b2b0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
b2c0: 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
b2d0: 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
b2e0: 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
b2f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b300: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
b310: 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
b320: 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
b330: 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65  raint);.    Vdbe
b340: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b350: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
b360: 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  v, op==OP_Rewind
b370: 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
b380: 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
b390: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
b3a0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  f(v, op==OP_Last
b3b0: 29 3b 20 20 20 20 74 65 73 74 63 61 73 65 28 20  );    testcase( 
b3c0: 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
b3d0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
b3e0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
b3f0: 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GT);  testcase( 
b400: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b  op==OP_SeekGT );
b410: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
b420: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
b430: 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekGE);  testcase
b440: 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20  ( op==OP_SeekGE 
b450: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
b460: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
b470: 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61  SeekLE);  testca
b480: 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
b490: 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  E );.    VdbeCov
b4a0: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
b4b0: 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74  P_SeekLT);  test
b4c0: 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
b4d0: 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  kLT );..    /* L
b4e0: 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
b4f0: 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
b500: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
b510: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
b520: 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
b530: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
b540: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
b550: 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
b560: 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
b570: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
b580: 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
b590: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
b5a0: 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
b5b0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
b5c0: 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
b5d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b5e0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
b5f0: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
b600: 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65  .      whereLike
b610: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
b620: 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65  ngFixup(v, pLeve
b630: 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
b640: 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
b650: 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
b660: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
b670: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
b680: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
b690: 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
b6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b6b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
b6c0: 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
b6d0: 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
b6e0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b6f0: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
b700: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
b710: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
b720: 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
b730: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
b740: 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
b750: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
b760: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
b770: 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
b780: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
b790: 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
b7a0: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
b7b0: 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
b7c0: 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
b7d0: 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
b7e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b7f0: 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
b800: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
b810: 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
b820: 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
b830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b840: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b850: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
b860: 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
b870: 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
b880: 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
b890: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
b8a0: 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
b8b0: 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
b8c0: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
b8d0: 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
b8e0: 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
b8f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b900: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
b910: 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
b920: 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
b930: 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
b940: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
b950: 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
b960: 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
b970: 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
b980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b990: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
b9a0: 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
b9b0: 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
b9c0: 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
b9d0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
b9e0: 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
b9f0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
ba00: 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
ba10: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
ba20: 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
ba30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
ba40: 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
ba50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ba60: 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
ba70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
ba80: 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
ba90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
baa0: 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
bab0: 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
bac0: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
bad0: 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
bae0: 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
baf0: 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
bb00: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
bb10: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
bb20: 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
bb30: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
bb40: 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
bb50: 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
bb60: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
bb70: 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
bb80: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
bb90: 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
bba0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
bbb0: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
bbc0: 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
bbd0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
bbe0: 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
bbf0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
bc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bc10: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
bc20: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
bc30: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
bc40: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
bc50: 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
bc60: 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
bc70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
bc80: 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
bc90: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
bca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bcb0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
bcc0: 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 30  tExists, iCur, 0
bcd0: 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
bce0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
bcf0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
bd00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
bd10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bd20: 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
bd30: 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
bd40: 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
bd50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
bd60: 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49 64  se if( iCur!=iId
bd70: 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49 6e  xCur ){.      In
bd80: 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
bd90: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
bda0: 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
bdb0: 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
bdc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
bdd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
bde0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
bdf0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
be00: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
be10: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
be20: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
be30: 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
be40: 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
be50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
be70: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
be80: 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20   iRowidReg+j);. 
be90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
bea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
beb0: 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
bec0: 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74  , iCur, addrCont
bed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52 6f               iRo
bef0: 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65  widReg, pPk->nKe
bf00: 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
bf10: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  age(v);.    }.. 
bf20: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
bf30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
bf40: 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
bf50: 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
bf60: 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
bf70: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
bf80: 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
bf90: 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
bfa0: 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
bfb0: 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
bfc0: 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
bfd0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
bfe0: 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
bff0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
c000: 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
c010: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
c020: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c030: 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
c040: 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
c050: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
c060: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65  iIdxCur;.    pLe
c070: 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70  vel->p3 = (pLoop
c080: 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
c090: 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f  UNQ_WANTED)!=0 ?
c0a0: 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28 70   1:0;.    if( (p
c0b0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c0c0: 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
c0d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  )==0 ){.      pL
c0e0: 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
c0f0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
c100: 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
c110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
c120: 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
c130: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  =0 );.    }.  }e
c140: 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
c150: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
c160: 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70  MIZATION.  if( p
c170: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
c180: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
c190: 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
c1a0: 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
c1b0: 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
c1c0: 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
c1d0: 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
c1e0: 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
c1f0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
c200: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
c210: 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
c220: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
c230: 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
c240: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
c250: 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
c260: 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
c270: 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
c280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
c290: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c2a0: 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
c2b0: 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
c2c0: 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
c2d0: 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
c2e0: 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
c2f0: 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
c300: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
c310: 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
c320: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  p of the loop lo
c330: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
c340: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
c350: 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
c360: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
c370: 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
c380: 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
c390: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c   **.    ** Then,
c3a0: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
c3b0: 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c  d term, the foll
c3c0: 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d  owing. The argum
c3d0: 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52  ents to.    ** R
c3e0: 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75  owSetTest are su
c3f0: 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  ch that the rowi
c400: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
c410: 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
c420: 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
c430: 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69   RowSet. If it i
c440: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
c450: 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73  t, control skips
c460: 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75   the.    ** Gosu
c470: 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d  b opcode and jum
c480: 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74  ps straight to t
c490: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
c4a0: 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e  d by WhereEnd().
c4b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
c4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
c4d0: 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a  reBegin(<term>).
c4e0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
c4f0: 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20  RowSetTest      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e              # In
c510: 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20  sert rowid into 
c520: 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20  rowset.    **   
c530: 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20         Gosub    
c540: 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20    2 A.    **    
c550: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
c560: 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20  End().    **.   
c570: 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** Following th
c580: 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f  e above, code to
c590: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
c5a0: 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68  oop. Label A, th
c5b0: 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
c5c0: 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f  of the Gosub abo
c5d0: 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ve, jumps to the
c5e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67   instruction rig
c5f0: 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74  ht after the Got
c600: 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
c610: 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
c620: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
c630: 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
c640: 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
c650: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
c660: 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20   Goto       B   
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54               # T
c680: 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73  he loop is finis
c690: 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
c6a0: 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f  **       A: <loo
c6b0: 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20  p body>         
c6c0: 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e          # Return
c6d0: 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e   data, whatever.
c6e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
c6f0: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20          Return  
c700: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c710: 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20      # Jump back 
c720: 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20  to the Gosub.   
c730: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
c740: 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c   B: <after the l
c750: 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop>.    **.    
c760: 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30 35  ** Added 2014-05
c770: 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62 6c  -26: If the tabl
c780: 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52  e is a WITHOUT R
c790: 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 6e  OWID table, then
c7a0: 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20 65  .    ** use an e
c7b0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 69  phemeral index i
c7c0: 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77 53  nstead of a RowS
c7d0: 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  et to record the
c7e0: 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a 20   primary.    ** 
c7f0: 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77 73  keys of the rows
c800: 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
c810: 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20   seen..    **.  
c820: 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
c830: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
c840: 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
c850: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
c860: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
c870: 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
c880: 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
c890: 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
c8a0: 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
c8b0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49  eration */.    I
c8c0: 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20  ndex *pCov = 0; 
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c8e0: 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e  otential coverin
c8f0: 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c  g index (or NULL
c900: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  ) */.    int iCo
c910: 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vCur = pParse->n
c920: 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f  Tab++;  /* Curso
c930: 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  r used for index
c940: 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29 20   scans (if any) 
c950: 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
c960: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
c970: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
c980: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
c990: 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
c9a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
c9b0: 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
c9e0: 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
c9f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
ca00: 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
ca30: 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
ca40: 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
ca50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ca60: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
ca70: 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
ca80: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
ca90: 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
cac0: 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
cad0: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
cae0: 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
caf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
cb00: 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
cb10: 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
cb20: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
cb50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
cb60: 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20  16 wctrlFlags;  
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
cb90: 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
cba0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e  */.    Expr *pAn
cbb0: 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20  dExpr = 0;      
cbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
cbd0: 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65  ".. AND (...)" e
cbe0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
cbf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cc00: 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
cc10: 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
cc20: 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
cc30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
cc40: 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
cc50: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
cc60: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
cc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
cc80: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
cc90: 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
cca0: 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
ccb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
ccc0: 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
ccd0: 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
cce0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
ccf0: 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
cd00: 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
cd10: 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
cd20: 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
cd30: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
cd40: 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
cd50: 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
cd60: 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
cd70: 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
cd80: 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
cd90: 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
cda0: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
cdb0: 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
cdc0: 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
cdd0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
cde0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
cdf0: 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
ce00: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
ce10: 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
ce20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ce30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
ce40: 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
ce50: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
ce60: 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
ce70: 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
ce80: 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
ce90: 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
cea0: 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
ceb0: 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
cec0: 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
ced0: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
cee0: 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20  llocRaw(db,.    
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
cf10: 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61  pOrTab)+ nNotRea
cf20: 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  dy*sizeof(pOrTab
cf30: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[0]));.      
cf40: 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20  if( pOrTab==0 ) 
cf50: 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
cf60: 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
cf70: 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f  Alloc = (u8)(nNo
cf80: 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
cf90: 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
cfa0: 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
cfb0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
cfc0: 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
cfd0: 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
cfe0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
cff0: 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
d000: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
d010: 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
d020: 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
d030: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
d040: 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
d050: 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
d060: 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
d070: 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
d080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d090: 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
d0a0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
d0b0: 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
d0c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d0d0: 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
d0e0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
d0f0: 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
d100: 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
d110: 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
d120: 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63 72 65  rowset.  Or, cre
d130: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
d140: 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
d150: 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e 67  pable of holding
d160: 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e   primary keys in
d170: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 57   the case of a W
d180: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20 20  ITHOUT ROWID..  
d190: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
d1a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52   initialize regR
d1b0: 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e  eturn to contain
d1c0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
d1d0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
d1e0: 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74  .    ** immediat
d1f0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
d200: 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74  e OP_Return at t
d210: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
d220: 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20   loop. This.    
d230: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ** is required i
d240: 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20  n a few obscure 
d250: 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20  LEFT JOIN cases 
d260: 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75  where control ju
d270: 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20  mps.    ** over 
d280: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
d290: 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  oop into the bod
d2a0: 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73  y of it. In this
d2b0: 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
d2c0: 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e  * correct respon
d2d0: 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f  se for the end-o
d2e0: 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65  f-loop code (the
d2f0: 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74   OP_Return) is t
d300: 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74  o .    ** fall t
d310: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
d320: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  xt instruction, 
d330: 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65  just as an OP_Ne
d340: 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a  xt does if.    *
d350: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75  * called on an u
d360: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72  ninitialized cur
d370: 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
d380: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
d390: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
d3a0: 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
d3b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  0 ){.      if( H
d3c0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
d3d0: 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
d3e0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
d3f0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
d400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d410: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
d420: 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20  gRowset);.      
d430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 49  }else{.        I
d440: 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
d450: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
d460: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
d470: 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 70 50    regRowset = pP
d480: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
d4b0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72 65 67  enEphemeral, reg
d4c0: 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b 65  Rowset, pPk->nKe
d4d0: 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  yCol);.        s
d4e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
d4f0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
d500: 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pk);.      }.   
d510: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
d520: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d530: 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74    }.    iRetInit
d540: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d550: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d560: 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e  er, 0, regReturn
d570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
d580: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
d590: 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20   clause is z of 
d5a0: 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f  the form:  (x1 O
d5b0: 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44  R x2 OR ...) AND
d5c0: 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66   y.    ** Then f
d5d0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e  or every term xN
d5e0: 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68  , evaluate as th
d5f0: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a  e subexpression:
d600: 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a   xN AND z.    **
d610: 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73   That way, terms
d620: 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66   in y that are f
d630: 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65  actored into the
d640: 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c   disjunction wil
d650: 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b  l.    ** be pick
d660: 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63  ed up by the rec
d670: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
d680: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
d690: 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  n() below..    *
d6a0: 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c  *.    ** Actuall
d6b0: 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65  y, each subexpre
d6c0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74  ssion is convert
d6d0: 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22  ed to "xN AND w"
d6e0: 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20   where w is.    
d6f0: 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74  ** the "interest
d700: 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20  ing" terms of z 
d710: 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64  - terms that did
d720: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
d730: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20  n the.    ** ON 
d740: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
d750: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
d760: 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61  and terms that a
d770: 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20  re usable as .  
d780: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20    ** indices..  
d790: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
d7a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c   optimization al
d7b0: 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  so only applies 
d7c0: 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32  if the (x1 OR x2
d7d0: 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20   OR ...) term.  
d7e0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74    ** is not cont
d7f0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ained in the ON 
d800: 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
d810: 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65   JOIN..    ** Se
d820: 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f  e ticket http://
d830: 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
d840: 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34  rc/info/f2369304
d850: 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e4.    */.    if
d860: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29  ( pWC->nTerm>1 )
d870: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72  {.      int iTer
d880: 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65  m;.      for(iTe
d890: 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d  rm=0; iTerm<pWC-
d8a0: 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29  >nTerm; iTerm++)
d8b0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
d8c0: 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69  pExpr = pWC->a[i
d8d0: 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20  Term].pExpr;.   
d8e0: 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61       if( &pWC->a
d8f0: 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d  [iTerm] == pTerm
d900: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d910: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
d920: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d930: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63  EP_FromJoin) ) c
d940: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d950: 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65   if( (pWC->a[iTe
d960: 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45  rm].wtFlags & TE
d970: 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20 29  RM_VIRTUAL)!=0 )
d980: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d990: 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
d9a0: 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
d9b0: 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
d9c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d9d0: 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
d9e0: 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
d9f0: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
da00: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
da10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
da20: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
da30: 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
da40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
da50: 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
da60: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
da70: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
da80: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
da90: 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
daa0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
dab0: 5f 41 4e 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46  _AND|TKFLG_DONTF
dac0: 4f 4c 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  OLD, 0, pAndExpr
dad0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
dae0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20    }..    /* Run 
daf0: 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52 45  a separate WHERE
db00: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
db10: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
db20: 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a 20  clause.  After. 
db30: 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e     ** eliminatin
db40: 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72 6f  g duplicates fro
db50: 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63 6c  m other WHERE cl
db60: 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69 6f  auses, the actio
db70: 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a  n for each.    *
db80: 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  * sub-WHERE clau
db90: 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f  se is to to invo
dba0: 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  ke the main loop
dbb0: 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f   body as a subro
dbc0: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
dbd0: 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 20    wctrlFlags =  
dbe0: 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
dbf0: 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20 20 20  CLOSE.          
dc00: 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 46 4f        | WHERE_FO
dc10: 52 43 45 5f 54 41 42 4c 45 0a 20 20 20 20 20 20  RCE_TABLE.      
dc20: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
dc30: 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 0a  E_ONETABLE_ONLY.
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 7c 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49  | WHERE_NO_AUTOI
dc60: 4e 44 45 58 3b 0a 20 20 20 20 66 6f 72 28 69 69  NDEX;.    for(ii
dc70: 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54  =0; ii<pOrWc->nT
dc80: 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
dc90: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
dca0: 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61  Term = &pOrWc->a
dcb0: 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [ii];.      if( 
dcc0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
dcd0: 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f  sor==iCur || (pO
dce0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
dcf0: 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
dd00: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e  .        WhereIn
dd10: 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20  fo *pSubWInfo;  
dd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
dd30: 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
dd40: 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
dd50: 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70      Expr *pOrExp
dd60: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  r = pOrTerm->pEx
dd70: 70 72 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f  pr; /* Current O
dd80: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  R clause term */
dd90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70  .        int jmp
dda0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
ddc0: 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72  ess of jump oper
ddd0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
dde0: 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 26 26   if( pAndExpr &&
ddf0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
de00: 79 28 70 4f 72 45 78 70 72 2c 20 45 50 5f 46 72  y(pOrExpr, EP_Fr
de10: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
de20: 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
de30: 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a  Left = pOrExpr;.
de40: 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78 70            pOrExp
de50: 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20 20  r = pAndExpr;.  
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
de70: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
de80: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
de90: 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
dea0: 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
deb0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
dec0: 66 66 66 2c 20 28 22 53 75 62 70 6c 61 6e 20 66  fff, ("Subplan f
ded0: 6f 72 20 4f 52 2d 63 6c 61 75 73 65 3a 5c 6e 22  or OR-clause:\n"
dee0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62  ));.        pSub
def0: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
df00: 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
df10: 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70  , pOrTab, pOrExp
df20: 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
df50: 63 74 72 6c 46 6c 61 67 73 2c 20 69 43 6f 76 43  ctrlFlags, iCovC
df60: 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ur);.        ass
df70: 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c  ert( pSubWInfo |
df80: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
df90: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
dfa0: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
dfb0: 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
dfc0: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 6f           WhereLo
dfd0: 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20 20  op *pSubLoop;.  
dfe0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
dff0: 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
e000: 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
e010: 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Scan(.          
e020: 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54      pParse, pOrT
e030: 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  ab, &pSubWInfo->
e040: 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c  a[0], iLevel, pL
e050: 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20  evel->iFrom, 0. 
e060: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
e080: 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28  reAddScanStatus(
e090: 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  v, pOrTab, &pSub
e0a0: 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64  WInfo->a[0], add
e0b0: 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20  rExplain);..    
e0c0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
e0d0: 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20 63   the sub-WHERE c
e0e0: 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72  lause body.  Fir
e0f0: 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20  st skip over.   
e100: 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63         ** duplic
e110: 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72  ate rows from pr
e120: 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ior sub-WHERE cl
e130: 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72  auses, and recor
e140: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
e150: 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49  ** rowid (or PRI
e160: 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68  MARY KEY) for th
e170: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f  e current row so
e180: 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20   that the same. 
e190: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20           ** row 
e1a0: 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
e1b0: 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73 75  in subsequent su
e1c0: 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  b-WHERE clauses.
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
e1e0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
e1f0: 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
e200: 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
e210: 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
e220: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
e230: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
e240: 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
e250: 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
e260: 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
e270: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
e280: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
e290: 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
e2a0: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
e2b0: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
e2c0: 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77  -1, iCur, regRow
e2d0: 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
e2e0: 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73 71 6c        jmp1 = sql
e2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
e300: 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
e310: 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30  st, regRowset, 0
e320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 2c 69               r,i
e350: 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
e360: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e370: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
e380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e390: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
e3a0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e3b0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
e3d0: 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  nt nPk = pPk->nK
e3e0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  eyCol;.         
e3f0: 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20       int iPk;.. 
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e410: 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f  Read the PK into
e420: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d   an array of tem
e430: 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  p registers. */.
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
e450: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e460: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
e470: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
e480: 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b    for(iPk=0; iPk
e490: 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20  <nPk; iPk++){.  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
e4b0: 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69  t iCol = pPk->ai
e4c0: 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20  Column[iPk];.   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e4e0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
e4f0: 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
e500: 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69  e, pTab, iCol, i
e510: 43 75 72 2c 20 72 2b 69 50 6b 29 3b 0a 20 20 20  Cur, r+iPk);.   
e520: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e540: 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70  heck if the temp
e550: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63   table already c
e560: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79  ontains this key
e570: 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20  . If so,.       
e580: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f         ** the ro
e590: 77 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  w has already be
e5a0: 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  en included in t
e5b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
e5c0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
e5d0: 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  ** can be ignore
e5e0: 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61  d (by jumping pa
e5f0: 73 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c  st the Gosub bel
e600: 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ow). Otherwise,.
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
e620: 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20   insert the key 
e630: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
e640: 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20  ble and proceed 
e650: 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a  with processing.
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
e670: 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20   the row..      
e680: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e690: 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20           ** Use 
e6a0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65  some of the same
e6b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61   optimizations a
e6c0: 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  s OP_RowSetTest:
e6d0: 20 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20   If iSet.       
e6e0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72         ** is zer
e6f0: 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  o, assume that t
e700: 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c  he key cannot al
e710: 72 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74  ready be present
e720: 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
e730: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61    ** the temp ta
e740: 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74  ble. And if iSet
e750: 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74   is -1, assume t
e760: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
e770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
e780: 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74  * need to insert
e790: 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68   the key into th
e7a0: 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73  e temp table, as
e7b0: 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a   it will never .
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
e7d0: 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20   be tested for. 
e7e0: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20   */ .           
e7f0: 20 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20     if( iSet ){. 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
e810: 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp1 = sqlite3Vdb
e820: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
e830: 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65  _Found, regRowse
e840: 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  t, 0, r, nPk);. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
e860: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e890: 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e8c0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
e8d0: 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69   r, nPk, regRowi
e8e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e900: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
e910: 6e 73 65 72 74 2c 20 72 65 67 52 6f 77 73 65 74  nsert, regRowset
e920: 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a  , regRowid, 0);.
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 69 66 28 20 69 53 65 74 20 29 20 73 71 6c 69 74  if( iSet ) sqlit
e950: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e960: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
e970: 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20  RESULT);.       
e980: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e990: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
e9a0: 73 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  se the array of 
e9b0: 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a  temp registers *
e9c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
e9d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
e9e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
e9f0: 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
ea00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ea10: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
ea20: 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e   Invoke the main
ea30: 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20   loop body as a 
ea40: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
ea50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ea60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ea70: 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
ea80: 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
ea90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
eaa0: 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20   here (skipping 
eab0: 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
eac0: 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69  dy subroutine) i
ead0: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
eae0: 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57  ** current sub-W
eaf0: 48 45 52 45 20 72 6f 77 20 69 73 20 61 20 64 75  HERE row is a du
eb00: 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69  plicate from pri
eb10: 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a  or sub-WHEREs. *
eb20: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
eb30: 6a 6d 70 31 20 29 20 73 71 6c 69 74 65 33 56 64  jmp1 ) sqlite3Vd
eb40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
eb50: 70 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  p1);..          
eb60: 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
eb70: 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
eb80: 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
eb90: 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
eba0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
ebb0: 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
ebc0: 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
ebd0: 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
ebe0: 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
ebf0: 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
ec00: 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
ec10: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
ec20: 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
ec30: 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
ec40: 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
ec50: 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
ec60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
ec70: 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
ec80: 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
ec90: 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
eca0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
ecb0: 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65   of the OR-conne
ecc0: 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f  cted terms are o
ecd0: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
ece0: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
ecf0: 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20    ** index, and 
ed00: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65  the index is ope
ed10: 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ned using the sa
ed20: 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  me cursor number
ed30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
ed40: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
ed50: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
ed60: 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c  ) made by this l
ed70: 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20  oop, it may.    
ed80: 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73        ** be poss
ed90: 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74  ible to use that
eda0: 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65   index as a cove
edb0: 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20  ring index..    
edc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
edd0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c     ** If the cal
ede0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
edf0: 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72  eBegin() above r
ee00: 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61  esulted in a sca
ee10: 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
ee20: 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65   ** uses an inde
ee30: 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65  x, and this is e
ee40: 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
ee50: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
ee60: 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  m.          ** p
ee70: 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20  rocessed or the 
ee80: 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d  index is the sam
ee90: 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62  e as that used b
eea0: 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20  y all previous. 
eeb0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
eec0: 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74  s, set pCov to t
eed0: 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  he candidate cov
eee0: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68  ering index. Oth
eef0: 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20  erwise, set .   
ef00: 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74         ** pCov t
ef10: 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61  o NULL to indica
ef20: 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69  te that no candi
ef30: 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
ef40: 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20  dex will .      
ef50: 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61      ** be availa
ef60: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ble..          *
ef70: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  /.          pSub
ef80: 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f  Loop = pSubWInfo
ef90: 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  ->a[0].pWLoop;. 
efa0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
efb0: 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
efc0: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
efd0: 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20  _INDEX)==0 );.  
efe0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75          if( (pSu
eff0: 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
f000: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
f010: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
f020: 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c   (ii==0 || pSubL
f030: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
f040: 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20  dex==pCov).     
f050: 20 20 20 20 20 20 26 26 20 28 48 61 73 52 6f 77        && (HasRow
f060: 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
f070: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
f080: 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
f090: 2e 70 49 6e 64 65 78 29 29 0a 20 20 20 20 20 20  .pIndex)).      
f0a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
f0b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
f0c0: 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43  Info->a[0].iIdxC
f0d0: 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
f0f0: 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  = pSubLoop->u.bt
f100: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
f110: 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
f120: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 4f 50  gs |= WHERE_REOP
f130: 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20 20 20 20  EN_IDX;.        
f140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f150: 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20       pCov = 0;. 
f160: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
f170: 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
f180: 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  the loop through
f190: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
f1a0: 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
f1b0: 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
f1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
f1d0: 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b  eEnd(pSubWInfo);
f1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f1f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
f200: 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d  vel->u.pCovidx =
f210: 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70   pCov;.    if( p
f220: 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49  Cov ) pLevel->iI
f230: 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b  dxCur = iCovCur;
f240: 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70  .    if( pAndExp
f250: 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45  r ){.      pAndE
f260: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
f270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f280: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e 64  rDelete(db, pAnd
f290: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
f2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f2b0: 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
f2c0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
f2d0: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
f2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
f2f0: 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
f300: 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
f310: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f320: 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
f330: 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
f340: 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
f350: 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
f360: 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
f370: 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
f380: 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
f390: 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
f3a0: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
f3b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
f3c0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
f3d0: 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
f3e0: 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
f3f0: 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
f400: 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
f410: 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
f420: 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
f430: 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
f440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
f450: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
f460: 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
f470: 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
f480: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
f490: 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
f4a0: 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
f4b0: 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
f4c0: 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
f4d0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
f4e0: 61 62 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63  abItem->fg.isRec
f4f0: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
f500: 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64  /* Tables marked
f510: 20 69 73 52 65 63 75 72 73 69 76 65 20 68 61 76   isRecursive hav
f520: 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
f530: 72 6f 77 20 74 68 61 74 20 69 73 20 73 74 6f 72  row that is stor
f540: 65 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ed in.      ** a
f550: 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20   pseudo-cursor. 
f560: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69   No need to Rewi
f570: 6e 64 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20  nd or Next such 
f580: 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20  cursors. */.    
f590: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
f5a0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
f5b0: 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 43 75 72  e{.      codeCur
f5c0: 73 6f 72 48 69 6e 74 28 70 57 49 6e 66 6f 2c 20  sorHint(pWInfo, 
f5d0: 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  pLevel, 0);.    
f5e0: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
f5f0: 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
f600: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
f610: 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
f620: 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
f630: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f640: 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
f650: 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
f660: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
f670: 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b  eIf(v, bRev==0);
f680: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f690: 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
f6a0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
f6b0: 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
f6c0: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
f6d0: 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d  _STEP;.    }.  }
f6e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f6f0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
f700: 53 54 41 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d  STATUS.  pLevel-
f710: 3e 61 64 64 72 56 69 73 69 74 20 3d 20 73 71 6c  >addrVisit = sql
f720: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f730: 64 64 72 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a  ddr(v);.#endif..
f740: 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
f750: 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73   to test every s
f760: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
f770: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74  t can be complet
f780: 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65  ely.  ** compute
f790: 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
f7a0: 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
f7b0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  s..  */.  for(pT
f7c0: 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
f7d0: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
f7e0: 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
f7f0: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
f800: 69 6e 74 20 73 6b 69 70 4c 69 6b 65 41 64 64 72  int skipLikeAddr
f810: 20 3d 20 30 3b 0a 20 20 20 20 74 65 73 74 63 61   = 0;.    testca
f820: 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
f830: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
f840: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
f850: 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
f860: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
f870: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
f880: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
f890: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
f8a0: 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
f8b0: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
f8c0: 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
f8d0: 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
f8e0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
f8f0: 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
f900: 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f920: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
f940: 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
f950: 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
f960: 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
f970: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
f980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
f990: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
f9a0: 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
f9b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
f9c0: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
f9d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f9e0: 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
f9f0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
fa00: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
fa10: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
fa20: 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f  gs & TERM_LIKECO
fa30: 4e 44 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ND ){.#ifdef SQL
fa40: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
fa50: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
fa60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73    continue;.#els
fa70: 65 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  e.      assert( 
fa80: 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
fa90: 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cntr>0 );.      
faa0: 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73  skipLikeAddr = s
fab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fac0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c  (v, OP_IfNot, pL
fad0: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
fae0: 74 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  tr);.      VdbeC
faf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 65 6e 64  overage(v);.#end
fb00: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  if.    }.    sql
fb10: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
fb20: 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
fb30: 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
fb40: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  PIFNULL);.    if
fb50: 28 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 29  ( skipLikeAddr )
fb60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fb70: 48 65 72 65 28 76 2c 20 73 6b 69 70 4c 69 6b 65  Here(v, skipLike
fb80: 41 64 64 72 29 3b 0a 20 20 20 20 70 54 65 72 6d  Addr);.    pTerm
fb90: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
fba0: 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20  M_CODED;.  }..  
fbb0: 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
fbc0: 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69  o test for impli
fbd0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  ed constraints b
fbe0: 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69  ased on transiti
fbf0: 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65  vity.  ** of the
fc00: 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a   "==" operator..
fc10: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
fc20: 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  e: If the WHERE 
fc30: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
fc40: 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20  "t1.a=t2.b" and 
fc50: 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20  "t2.b=123".  ** 
fc60: 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e  and we are codin
fc70: 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  g the t1 loop an
fc80: 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61  d the t2 loop ha
fc90: 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c  s not yet coded,
fca0: 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61  .  ** then we ca
fcb0: 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31  nnot use the "t1
fcc0: 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61  .a=t2.b" constra
fcd0: 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20  int, but we can 
fce0: 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d  code.  ** the im
fcf0: 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22  plied "t1.a=123"
fd00: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
fd10: 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
fd20: 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
fd30: 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
fd40: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
fd50: 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20   *pE, *pEAlt;.  
fd60: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c    WhereTerm *pAl
fd70: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  t;.    if( pTerm
fd80: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
fd90: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
fda0: 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
fdb0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fdc0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
fdd0: 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20  O_EQ|WO_IS))==0 
fde0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fdf0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
fe00: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
fe10: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
fe20: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
fe30: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
fe40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fe50: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
fe60: 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75  ftJoin ) continu
fe70: 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
fe80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
fe90: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
fea0: 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
feb0: 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
fec0: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
fed0: 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c 65  rereqRight & pLe
fee0: 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
fef0: 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20  0 );.    pAlt = 
ff00: 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
ff10: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
ff20: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
ff30: 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20  umn, notReady,. 
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57     WO_EQ|WO_IN|W
ff60: 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_IS, 0);.    if
ff70: 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74  ( pAlt==0 ) cont
ff80: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41  inue;.    if( pA
ff90: 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  lt->wtFlags & (T
ffa0: 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
ffb0: 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63  tinue;.    testc
ffc0: 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72  ase( pAlt->eOper
ffd0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
ffe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
fff0: 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
10000 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
10010 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70  tcase( pAlt->eOp
10020 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
10030 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65  ;.    VdbeModule
10040 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
10050 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  in transitive co
10060 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20  nstraint"));.   
10070 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33   pEAlt = sqlite3
10080 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
10090 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29  , sizeof(*pEAlt)
100a0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74  );.    if( pEAlt
100b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74   ){.      *pEAlt
100c0 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b   = *pAlt->pExpr;
100d0 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c  .      pEAlt->pL
100e0 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
100f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10100 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10110 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e  , pEAlt, addrCon
10120 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
10130 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
10140 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
10150 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a  , pEAlt);.    }.
10160 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
10170 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
10180 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
10190 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20  hat will record 
101a0 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
101b0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
101c0 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
101d0 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
101e0 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
101f0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e.  .  */.  if( 
10200 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10210 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n ){.    pLevel-
10220 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c  >addrFirst = sql
10230 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10240 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
10250 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10260 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10270 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
10280 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
10290 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20  ent((v, "record 
102a0 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29  LEFT JOIN hit"))
102b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
102c0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
102d0 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  se);.    for(pTe
102e0 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
102f0 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
10300 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
10310 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
10320 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
10330 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
10340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10350 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
10360 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
10370 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
10380 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
10390 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
103a0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
103b0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
103c0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76  prereqAll & pLev
103d0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30  el->notReady)!=0
103e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
103f0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
10400 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
10410 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
10420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
10430 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
10440 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
10450 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
10460 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
10470 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
10480 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
10490 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
104a0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
104b0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
104c0 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c  .  return pLevel
104d0 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a        ->notReady;.}.