/ Hex Artifact Content
Login

Artifact 99707d11907c71d289ee9553d2d1a22f1fd8ba41:


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 69 3e 3d 6e 53 6b 69 70 20  (pStr, i>=nSkip 
0ad0: 3f 20 22 25 73 3d 3f 22 20 3a 20 22 41 4e 59 28  ? "%s=?" : "ANY(
0ae0: 25 73 29 22 2c 20 7a 29 3b 0a 20 20 7d 0a 0a 20  %s)", z);.  }.. 
0af0: 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c   j = i;.  if( pL
0b00: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
0b10: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
0b20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0b30: 7a 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  z = explainIndex
0b40: 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 6e 64 65  ColumnName(pInde
0b50: 78 2c 20 69 29 3b 0a 20 20 20 20 65 78 70 6c 61  x, i);.    expla
0b60: 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74  inAppendTerm(pSt
0b70: 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  r, i++, z, ">");
0b80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
0b90: 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
0ba0: 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
0bb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
0bc0: 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f 6c   explainIndexCol
0bd0: 75 6d 6e 4e 61 6d 65 28 70 49 6e 64 65 78 2c 20  umnName(pIndex, 
0be0: 6a 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  j);.    explainA
0bf0: 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
0c00: 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a  i, z, "<");.  }.
0c10: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
0c20: 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 29  mAppend(pStr, ")
0c30: 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
0c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
0c50: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
0c60: 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
0c70: 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
0c80: 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
0c90: 6d 6d 61 6e 64 2c 20 6f 72 20 69 66 20 65 69 74  mmand, or if eit
0ca0: 68 65 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47  her SQLITE_DEBUG
0cb0: 20 6f 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   or SQLITE_ENABL
0cc0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
0cd0: 53 20 77 61 73 0a 2a 2a 20 64 65 66 69 6e 65 64  S was.** defined
0ce0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
0cf0: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  . If it is not a
0d00: 20 6e 6f 2d 6f 70 2c 20 61 20 73 69 6e 67 6c 65   no-op, a single
0d10: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
0d20: 64 65 20 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  de .** is added 
0d30: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
0d40: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
0d50: 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
0d60: 79 20 69 6e 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a  y in pLevel..**.
0d70: 2a 2a 20 49 66 20 61 6e 20 4f 50 5f 45 78 70 6c  ** If an OP_Expl
0d80: 61 69 6e 20 6f 70 63 6f 64 65 20 69 73 20 61 64  ain opcode is ad
0d90: 64 65 64 20 74 6f 20 74 68 65 20 56 4d 2c 20 69  ded to the VM, i
0da0: 74 73 20 61 64 64 72 65 73 73 20 69 73 20 72 65  ts address is re
0db0: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
0dc0: 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f 50 5f 45  wise, if no OP_E
0dd0: 78 70 6c 61 69 6e 20 69 73 20 63 6f 64 65 64 2c  xplain is coded,
0de0: 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
0df0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0e00: 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
0e10: 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
0e20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
0e30: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
0e40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
0e50: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0e70: 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
0e80: 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
0e90: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
0ea0: 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
0eb0: 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
0ec0: 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
0ed0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
0ee0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
0f10: 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
0f20: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
0f30: 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
0f50: 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
0f60: 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
0f70: 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
0f80: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
0f90: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
0fa0: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
0fb0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
0fc0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
0fd0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
0fe0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
0ff0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1000: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
1010: 53 54 41 54 55 53 29 0a 20 20 69 66 28 20 70 50  STATUS).  if( pP
1020: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
1030: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
1040: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1050: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1060: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1070: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1080: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1090: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
10a0: 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
10b0: 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
10c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10d0: 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
10e0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
10f0: 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
1100: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
1110: 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
1120: 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
1130: 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
1140: 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1160: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
1170: 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
1180: 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72  CAN. */.    Wher
1190: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11b0: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65   controlling Whe
11c0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
11d0: 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20  .    u32 flags; 
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74     /* Flags that
1200: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c   describe this l
1210: 6f 6f 70 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  oop */.    char 
1220: 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
1230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1240: 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
1250: 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 53 74 72  utput */.    Str
1260: 41 63 63 75 6d 20 73 74 72 3b 20 20 20 20 20 20  Accum str;      
1270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
1280: 50 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  P output string 
1290: 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  */.    char zBuf
12a0: 5b 31 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [100];          
12b0: 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
12c0: 73 70 61 63 65 20 66 6f 72 20 45 51 50 20 6f 75  space for EQP ou
12d0: 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  tput string */..
12e0: 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
12f0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
1300: 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  flags = pLoop->w
1310: 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  sFlags;.    if( 
1320: 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
1330: 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
1340: 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53  Flags&WHERE_OR_S
1350: 55 42 43 4c 41 55 53 45 29 20 29 20 72 65 74 75  UBCLAUSE) ) retu
1360: 72 6e 20 30 3b 0a 0a 20 20 20 20 69 73 53 65 61  rn 0;..    isSea
1370: 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48  rch = (flags&(WH
1380: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
1390: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
13a0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
13b0: 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f  | ((flags&WHERE_
13c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
13d0: 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74   && (pLoop->u.bt
13e0: 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20  ree.nEq>0)).    
13f0: 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
1400: 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
1410: 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
1420: 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
1430: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
1440: 63 75 6d 49 6e 69 74 28 26 73 74 72 2c 20 64 62  cumInit(&str, db
1450: 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a  , zBuf, sizeof(z
1460: 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 4d 41 58  Buf), SQLITE_MAX
1470: 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 73 71  _LENGTH);.    sq
1480: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1490: 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 69 73 53  endAll(&str, isS
14a0: 65 61 72 63 68 20 3f 20 22 53 45 41 52 43 48 22  earch ? "SEARCH"
14b0: 20 3a 20 22 53 43 41 4e 22 29 3b 0a 20 20 20 20   : "SCAN");.    
14c0: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
14d0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
14e0: 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
14f0: 20 22 20 53 55 42 51 55 45 52 59 20 25 64 22 2c   " SUBQUERY %d",
1500: 20 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49   pItem->iSelectI
1510: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1520: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
1530: 6e 74 66 28 26 73 74 72 2c 20 22 20 54 41 42 4c  ntf(&str, " TABL
1540: 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  E %s", pItem->zN
1550: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1560: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1570: 61 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  as ){.      sqli
1580: 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1590: 20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d   " AS %s", pItem
15a0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
15b0: 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
15c0: 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
15d0: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
15e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )==0 ){.      co
15f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
1600: 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
1610: 2a 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73  *pIdx;..      as
1620: 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1630: 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
1640: 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  ;.      pIdx = p
1650: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1660: 6e 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65  ndex;.      asse
1670: 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45 52  rt( !(flags&WHER
1680: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c  E_AUTO_INDEX) ||
1690: 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44   (flags&WHERE_ID
16a0: 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20  X_ONLY) );.     
16b0: 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
16c0: 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49  Item->pTab) && I
16d0: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
16e0: 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
16f0: 20 20 69 66 28 20 69 73 53 65 61 72 63 68 20 29    if( isSearch )
1700: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74  {.          zFmt
1710: 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22   = "PRIMARY KEY"
1720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1730: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1740: 73 20 26 20 57 48 45 52 45 5f 50 41 52 54 49 41  s & WHERE_PARTIA
1750: 4c 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20  LIDX ){.        
1760: 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49  zFmt = "AUTOMATI
1770: 43 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49  C PARTIAL COVERI
1780: 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
1790: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
17a0: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
17b0: 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  DEX ){.        z
17c0: 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43  Fmt = "AUTOMATIC
17d0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22   COVERING INDEX"
17e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17f0: 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ( flags & WHERE_
1800: 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
1810: 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45      zFmt = "COVE
1820: 52 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a  RING INDEX %s";.
1830: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1840: 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44       zFmt = "IND
1850: 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  EX %s";.      }.
1860: 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29        if( zFmt )
1870: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1880: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1890: 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c  &str, " USING ",
18a0: 20 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   7);.        sql
18b0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
18c0: 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a 4e  , zFmt, pIdx->zN
18d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78  ame);.        ex
18e0: 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
18f0: 26 73 74 72 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20  &str, pLoop);.  
1900: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1910: 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
1920: 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
1930: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
1940: 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
1950: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1960: 2a 7a 52 61 6e 67 65 4f 70 3b 0a 20 20 20 20 20  *zRangeOp;.     
1970: 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1980: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1990: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
19a0: 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70          zRangeOp
19b0: 20 3d 20 22 3d 22 3b 0a 20 20 20 20 20 20 7d 65   = "=";.      }e
19c0: 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
19d0: 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
19e0: 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
19f0: 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  IT ){.        zR
1a00: 61 6e 67 65 4f 70 20 3d 20 22 3e 3f 20 41 4e 44  angeOp = ">? AND
1a10: 20 72 6f 77 69 64 3c 22 3b 0a 20 20 20 20 20 20   rowid<";.      
1a20: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1a30: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1a40: 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67  ){.        zRang
1a50: 65 4f 70 20 3d 20 22 3e 22 3b 0a 20 20 20 20 20  eOp = ">";.     
1a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a70: 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48  assert( flags&WH
1a80: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a  ERE_TOP_LIMIT);.
1a90: 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 4f 70          zRangeOp
1aa0: 20 3d 20 22 3c 22 3b 0a 20 20 20 20 20 20 7d 0a   = "<";.      }.
1ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1ac0: 69 6e 74 66 28 26 73 74 72 2c 20 22 20 55 53 49  intf(&str, " USI
1ad0: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1ae0: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 25 73 3f  RY KEY (rowid%s?
1af0: 29 22 2c 7a 52 61 6e 67 65 4f 70 29 3b 0a 20 20  )",zRangeOp);.  
1b00: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1b10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1b20: 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66  ABLE.    else if
1b30: 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1b40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1b50: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1b60: 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
1b70: 22 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  " VIRTUAL TABLE 
1b80: 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20  INDEX %d:%s",.  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1bb0: 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1bc0: 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1bd0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1be0: 20 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f   SQLITE_EXPLAIN_
1bf0: 45 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20  ESTIMATED_ROWS. 
1c00: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f     if( pLoop->nO
1c10: 75 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  ut>=10 ){.      
1c20: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
1c30: 73 74 72 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f  str, " (~%llu ro
1c40: 77 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67  ws)", sqlite3Log
1c50: 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e  EstToInt(pLoop->
1c60: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  nOut));.    }els
1c70: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1c80: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1c90: 73 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22  str, " (~1 row)"
1ca0: 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 9);.    }.#end
1cb0: 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
1cc0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
1cd0: 69 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72  ish(&str);.    r
1ce0: 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1cf0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
1d00: 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
1d10: 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50  l, iFrom, zMsg,P
1d20: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
1d30: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
1d40: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d50: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
1d60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d70: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
1d80: 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e  STATUS./*.** Con
1d90: 66 69 67 75 72 65 20 74 68 65 20 56 4d 20 70 61  figure the VM pa
1da0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1db0: 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
1dc0: 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74  an.** sqlite3_st
1dd0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
1de0: 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
1df0: 69 6e 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20  ing to the scan 
1e00: 75 73 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c  used to .** impl
1e10: 65 6d 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c  ement level pLvl
1e20: 2e 20 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c  . Argument pSrcl
1e30: 69 73 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ist is a pointer
1e40: 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a   to the FROM .**
1e50: 20 63 6c 61 75 73 65 20 74 68 61 74 20 74 68 65   clause that the
1e60: 20 73 63 61 6e 20 72 65 61 64 73 20 64 61 74 61   scan reads data
1e70: 20 66 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   from..**.** If 
1e80: 61 72 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70  argument addrExp
1e90: 6c 61 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69  lain is not 0, i
1ea0: 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 61 64  t must be the ad
1eb0: 64 72 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  dress of an .** 
1ec0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
1ed0: 75 63 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63  uction that desc
1ee0: 72 69 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c  ribes the same l
1ef0: 6f 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oop..*/.void sql
1f00: 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
1f10: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
1f20: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
1f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1f40: 65 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  e to add scansta
1f50: 74 75 73 20 65 6e 74 72 79 20 74 6f 20 2a 2f 0a  tus entry to */.
1f60: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 6c    SrcList *pSrcl
1f70: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1f80: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1f90: 20 70 4c 76 6c 20 72 65 61 64 73 20 64 61 74 61   pLvl reads data
1fa0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 57 68 65 72 65   from */.  Where
1fb0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 2c 20 20 20 20  Level *pLvl,    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1fd0: 76 65 6c 20 74 6f 20 61 64 64 20 73 63 61 6e 73  vel to add scans
1fe0: 74 61 74 75 73 28 29 20 65 6e 74 72 79 20 66 6f  tatus() entry fo
1ff0: 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  r */.  int addrE
2000: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
2010: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
2020: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
2030: 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 63  (or 0) */.){.  c
2040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 20  onst char *zObj 
2050: 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  = 0;.  WhereLoop
2060: 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 76 6c 2d 3e   *pLoop = pLvl->
2070: 70 57 4c 6f 6f 70 3b 0a 20 20 69 66 28 20 28 70  pWLoop;.  if( (p
2080: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2090: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
20a0: 4c 45 29 3d 3d 30 20 20 26 26 20 20 70 4c 6f 6f  LE)==0  &&  pLoo
20b0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
20c0: 78 21 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 62 6a  x!=0 ){.    zObj
20d0: 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
20e0: 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  e.pIndex->zName;
20f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f  .  }else{.    zO
2100: 62 6a 20 3d 20 70 53 72 63 6c 69 73 74 2d 3e 61  bj = pSrclist->a
2110: 5b 70 4c 76 6c 2d 3e 69 46 72 6f 6d 5d 2e 7a 4e  [pLvl->iFrom].zN
2120: 61 6d 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ame;.  }.  sqlit
2130: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
2140: 28 0a 20 20 20 20 20 20 76 2c 20 61 64 64 72 45  (.      v, addrE
2150: 78 70 6c 61 69 6e 2c 20 70 4c 76 6c 2d 3e 61 64  xplain, pLvl->ad
2160: 64 72 42 6f 64 79 2c 20 70 4c 76 6c 2d 3e 61 64  drBody, pLvl->ad
2170: 64 72 56 69 73 69 74 2c 20 70 4c 6f 6f 70 2d 3e  drVisit, pLoop->
2180: 6e 4f 75 74 2c 20 7a 4f 62 6a 0a 20 20 29 3b 0a  nOut, zObj.  );.
2190: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
21a0: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
21b0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
21c0: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
21d0: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
21e0: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
21f0: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
2200: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
2210: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
2220: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
2230: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2240: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
2250: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
2260: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
2270: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2280: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
2290: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
22a0: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
22b0: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
22c0: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
22d0: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
22e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
22f0: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2300: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
2310: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
2320: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
2330: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
2340: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
2350: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
2360: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
2370: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
2380: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
2390: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
23a0: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
23b0: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
23c0: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
23d0: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
23e0: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
23f0: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
2400: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
2410: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
2420: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
2430: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
2440: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
2450: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
2460: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
2470: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
2480: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2490: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
24a0: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
24b0: 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
24c0: 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
24d0: 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
24e0: 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
24f0: 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
2500: 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
2510: 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
2520: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
2530: 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
2540: 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
2550: 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
2560: 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
2570: 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
2580: 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
2590: 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
25a0: 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
25b0: 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
25c0: 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
25d0: 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
25e0: 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
25f0: 6b 65 74 20 23 38 31 33 2e 0a 2a 2a 0a 2a 2a 20  ket #813..**.** 
2600: 49 66 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64  If all the child
2610: 72 65 6e 20 6f 66 20 61 20 74 65 72 6d 20 61 72  ren of a term ar
2620: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
2630: 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 61 6c   that term is al
2640: 73 6f 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  so.** automatica
2650: 6c 6c 79 20 64 69 73 61 62 6c 65 64 2e 20 20 49  lly disabled.  I
2660: 6e 20 74 68 69 73 20 77 61 79 2c 20 74 65 72 6d  n this way, term
2670: 73 20 67 65 74 20 64 69 73 61 62 6c 65 64 20 69  s get disabled i
2680: 66 20 64 65 72 69 76 65 64 0a 2a 2a 20 76 69 72  f derived.** vir
2690: 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 74  tual terms are t
26a0: 65 73 74 65 64 20 66 69 72 73 74 2e 20 20 46 6f  ested first.  Fo
26b0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
26c0: 20 20 20 20 20 20 78 20 47 4c 4f 42 20 27 61 62        x GLOB 'ab
26d0: 63 2a 27 20 41 4e 44 20 78 3e 3d 27 61 62 63 27  c*' AND x>='abc'
26e0: 20 41 4e 44 20 78 3c 27 61 63 64 27 0a 2a 2a 20   AND x<'acd'.** 
26f0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
2700: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 2f 20  _/     \______/ 
2710: 20 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20      \_____/.**  
2720: 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 20 20         parent   
2730: 20 20 20 20 20 20 20 63 68 69 6c 64 31 20 20 20         child1   
2740: 20 20 20 20 63 68 69 6c 64 32 0a 2a 2a 0a 2a 2a      child2.**.**
2750: 20 4f 6e 6c 79 20 74 68 65 20 70 61 72 65 6e 74   Only the parent
2760: 20 74 65 72 6d 20 77 61 73 20 69 6e 20 74 68 65   term was in the
2770: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2780: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 63 68 69  clause.  The chi
2790: 6c 64 31 0a 2a 2a 20 61 6e 64 20 63 68 69 6c 64  ld1.** and child
27a0: 32 20 74 65 72 6d 73 20 77 65 72 65 20 61 64 64  2 terms were add
27b0: 65 64 20 62 79 20 74 68 65 20 4c 49 4b 45 20 6f  ed by the LIKE o
27c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
27d0: 20 62 6f 74 68 20 6f 66 0a 2a 2a 20 74 68 65 20   both of.** the 
27e0: 76 69 72 74 75 61 6c 20 63 68 69 6c 64 20 74 65  virtual child te
27f0: 72 6d 73 20 61 72 65 20 76 61 6c 69 64 2c 20 74  rms are valid, t
2800: 68 65 6e 20 74 65 73 74 69 6e 67 20 6f 66 20 74  hen testing of t
2810: 68 65 20 70 61 72 65 6e 74 20 63 61 6e 20 62 65  he parent can be
2820: 20 0a 2a 2a 20 73 6b 69 70 70 65 64 2e 0a 2a 2a   .** skipped..**
2830: 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20  .** Usually the 
2840: 70 61 72 65 6e 74 20 74 65 72 6d 20 69 73 20 6d  parent term is m
2850: 61 72 6b 65 64 20 61 73 20 54 45 52 4d 5f 43 4f  arked as TERM_CO
2860: 44 45 44 2e 20 20 42 75 74 20 69 66 20 74 68 65  DED.  But if the
2870: 20 70 61 72 65 6e 74 0a 2a 2a 20 74 65 72 6d 20   parent.** term 
2880: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 54  was originally T
2890: 45 52 4d 5f 4c 49 4b 45 2c 20 74 68 65 6e 20 74  ERM_LIKE, then t
28a0: 68 65 20 70 61 72 65 6e 74 20 67 65 74 73 20 54  he parent gets T
28b0: 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 69 6e 73  ERM_LIKECOND ins
28c0: 74 65 61 64 2e 0a 2a 2a 20 54 68 65 20 54 45 52  tead..** The TER
28d0: 4d 5f 4c 49 4b 45 43 4f 4e 44 20 6d 61 72 6b 69  M_LIKECOND marki
28e0: 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ng indicates tha
28f0: 74 20 74 68 65 20 74 65 72 6d 20 73 68 6f 75 6c  t the term shoul
2900: 64 20 62 65 20 63 6f 64 65 64 20 69 6e 73 69 64  d be coded insid
2910: 65 0a 2a 2a 20 61 20 63 6f 6e 64 69 74 69 6f 6e  e.** a condition
2920: 61 6c 20 73 75 63 68 20 74 68 61 74 20 69 73 20  al such that is 
2930: 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20 6f  only evaluated o
2940: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73  n the second pas
2950: 73 20 6f 66 20 61 0a 2a 2a 20 4c 49 4b 45 2d 6f  s of a.** LIKE-o
2960: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6c 6f 6f 70  ptimization loop
2970: 2c 20 77 68 65 6e 20 73 63 61 6e 6e 69 6e 67 20  , when scanning 
2980: 42 4c 4f 42 73 20 69 6e 73 74 65 61 64 20 6f 66  BLOBs instead of
2990: 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61   strings..*/.sta
29a0: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
29b0: 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
29c0: 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
29d0: 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 6e  rm *pTerm){.  in
29e0: 74 20 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 77  t nLoop = 0;.  w
29f0: 68 69 6c 65 28 20 70 54 65 72 6d 0a 20 20 20 20  hile( pTerm.    
2a00: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46    && (pTerm->wtF
2a10: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
2a20: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
2a30: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2a40: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
2a50: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
2a60: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2a70: 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c  n)).      && (pL
2a80: 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26  evel->notReady &
2a90: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
2aa0: 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  l)==0.  ){.    i
2ab0: 66 28 20 6e 4c 6f 6f 70 20 26 26 20 28 70 54 65  f( nLoop && (pTe
2ac0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2ad0: 52 4d 5f 4c 49 4b 45 29 21 3d 30 20 29 7b 0a 20  RM_LIKE)!=0 ){. 
2ae0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
2af0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45  ags |= TERM_LIKE
2b00: 43 4f 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  COND;.    }else{
2b10: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
2b20: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2b30: 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  DED;.    }.    i
2b40: 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
2b50: 74 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  t<0 ) break;.   
2b60: 20 70 54 65 72 6d 20 3d 20 26 70 54 65 72 6d 2d   pTerm = &pTerm-
2b70: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
2b80: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 70 54 65  Parent];.    pTe
2b90: 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d 3b 0a 20 20  rm->nChild--;.  
2ba0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6e 43 68    if( pTerm->nCh
2bb0: 69 6c 64 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ild!=0 ) break;.
2bc0: 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b 0a 20 20 7d      nLoop++;.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
2be0: 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  n OP_Affinity op
2bf0: 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68  code to apply th
2c00: 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
2c10: 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a  y string zAff.**
2c20: 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74   to the n regist
2c30: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
2c40: 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20  base. .**.** As 
2c50: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
2c60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
2c70: 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20   entries (which 
2c80: 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74  are no-ops) at t
2c90: 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
2ca0: 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20  and end of zAff 
2cb0: 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  are ignored.  If
2cc0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
2cd0: 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49  zAff are.** SQLI
2ce0: 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 74 68 65  TE_AFF_BLOB, the
2cf0: 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67  n no code gets g
2d00: 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  enerated..**.** 
2d10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
2d20: 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  es its own copy 
2d30: 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20  of zAff so that 
2d40: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72  the caller is fr
2d50: 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  ee.** to modify 
2d60: 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20  zAff after this 
2d70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
2d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d90: 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
2da0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
2db0: 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
2dc0: 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
2dd0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2de0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
2df0: 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  zAff==0 ){.    a
2e00: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
2e10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2e30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d   }.  assert( v!=
2e40: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73  0 );..  /* Adjus
2e50: 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20  t base and n to 
2e60: 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45  skip over SQLITE
2e70: 5f 41 46 46 5f 42 4c 4f 42 20 65 6e 74 72 69 65  _AFF_BLOB entrie
2e80: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2e90: 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20  ng.  ** and end 
2ea0: 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  of the affinity 
2eb0: 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77  string..  */.  w
2ec0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66  hile( n>0 && zAf
2ed0: 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  f[0]==SQLITE_AFF
2ee0: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6e 2d 2d  _BLOB ){.    n--
2ef0: 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20  ;.    base++;.  
2f00: 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20    zAff++;.  }.  
2f10: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41  while( n>1 && zA
2f20: 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f  ff[n-1]==SQLITE_
2f30: 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  AFF_BLOB ){.    
2f40: 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n--;.  }..  /* C
2f50: 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e  ode the OP_Affin
2f60: 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68  ity opcode if th
2f70: 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ere is anything 
2f80: 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  left to do. */. 
2f90: 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fb0: 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
2fc0: 2c 20 62 61 73 65 2c 20 6e 2c 20 30 2c 20 7a 41  , base, n, 0, zA
2fd0: 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
2fe0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2ff0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
3000: 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
3010: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
3020: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
3030: 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
3040: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
3050: 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
3060: 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
3070: 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
3080: 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
3090: 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
30a0: 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
30b0: 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
30c0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
30d0: 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
30e0: 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
30f0: 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
3100: 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
3110: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
3120: 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
3130: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
3140: 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
3150: 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
3160: 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
3170: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
3180: 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
3190: 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
31a0: 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
31b0: 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
31c0: 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
31d0: 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
31e0: 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
31f0: 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
3200: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3210: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
3220: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
3230: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
3240: 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
3250: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3260: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
3270: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
3280: 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
3290: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
32a0: 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
32b0: 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
32c0: 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
32d0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
32e0: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
32f0: 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
3300: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
3310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3320: 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
3330: 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
3340: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
3350: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
3360: 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
3370: 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
3380: 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
3390: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
33a0: 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
33b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
33c0: 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
33f0: 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
3400: 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
3410: 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
3420: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 58  >op==TK_EQ || pX
3430: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a 20  ->op==TK_IS ){. 
3440: 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
3450: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
3460: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
3470: 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
3480: 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
3490: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
34a0: 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
34b0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
34c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
34d0: 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
34e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
3500: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
3510: 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
3520: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
3530: 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
3540: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
3550: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
3560: 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
3570: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
3580: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
3590: 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
35a0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
35b0: 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
35c0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
35d0: 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
35e0: 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
35f0: 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
3600: 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
3610: 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
3620: 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
3630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3640: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
3650: 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
3660: 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
3670: 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
3680: 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
3690: 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  pX, IN_INDEX_LOO
36a0: 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  P, 0);.    if( e
36b0: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
36c0: 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
36d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
36e0: 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
36f0: 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
3700: 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
3710: 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
3720: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
3730: 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
3740: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
3750: 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76   0);.    VdbeCov
3760: 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29  erageIf(v, bRev)
3770: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
3780: 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a  geIf(v, !bRev);.
3790: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
37a0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37b0: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30  ERE_MULTI_OR)==0
37c0: 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
37d0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
37e0: 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28  IN_ABLE;.    if(
37f0: 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
3800: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
3810: 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
3820: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
3830: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
3840: 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
3850: 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
3860: 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
3870: 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
3880: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
3890: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
38a0: 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
38b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
38e0: 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
38f0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
3900: 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
3910: 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
3920: 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
3930: 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
3940: 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
3950: 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
3960: 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
3970: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
3980: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
3990: 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
39a0: 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
39b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
39c0: 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
39d0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
39e0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
39f0: 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
3a00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3a10: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
3a20: 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
3a30: 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
3a40: 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
3a50: 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20  ? OP_PrevIfOpen 
3a60: 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b  : OP_NextIfOpen;
3a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3a80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3a90: 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64  sNull, iReg); Vd
3aa0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
3ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ac0: 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
3ad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
3ae0: 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
3af0: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
3b00: 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
3b10: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
3b20: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
3b30: 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
3b40: 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
3b50: 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
3b60: 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a  * index scan..**
3b70: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
3b80: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
3b90: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
3ba0: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
3bb0: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
3bc0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3bd0: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
3be0: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
3bf0: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
3c00: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
3c10: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
3c20: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
3c30: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
3c40: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
3c50: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
3c60: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
3c70: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
3c80: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
3c90: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
3ca0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
3cb0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
3cc0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
3cd0: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
3ce0: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
3cf0: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
3d00: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
3d10: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
3d20: 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
3d30: 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
3d40: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
3d50: 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
3d60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
3d70: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
3d80: 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
3d90: 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
3da0: 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
3db0: 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
3dc0: 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
3dd0: 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
3de0: 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
3df0: 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
3e00: 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
3e10: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
3e20: 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
3e30: 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
3e40: 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
3e50: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
3e60: 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61  The nExtraReg pa
3e70: 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20  rameter is 0 or 
3e80: 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61  1.  It is 0 if a
3e90: 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ll WHERE clause 
3ea0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61  constraints.** a
3eb0: 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20  re == or IN and 
3ec0: 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
3ed0: 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52  he nEq.  nExtraR
3ee0: 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65  eg is 1 if there
3ef0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61   is.** an inequa
3f00: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
3f10: 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e  (such as the "c>
3f20: 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20  =5 AND c<10" in 
3f30: 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61  the example) tha
3f40: 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65  t.** occurs afte
3f50: 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74  r the nEq qualit
3f60: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
3f70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3f80: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61  e allocates a ra
3f90: 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72  nge of nEq+nExtr
3fa0: 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  aReg memory cell
3fb0: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  s and returns.**
3fc0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
3fd0: 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63  e first memory c
3fe0: 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67  ell in that rang
3ff0: 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  e. The code that
4000: 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
4010: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
4020: 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67  that memory rang
4030: 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20  e to store keys 
4040: 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64  for.** start and
4050: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
4060: 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  ditions of the l
4070: 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  oop..** key valu
4080: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
4090: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
40a0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
40b0: 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
40c0: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
40d0: 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
40e0: 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
40f0: 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
4100: 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
4110: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
4120: 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
4130: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
4140: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
4150: 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
4160: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
4170: 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
4180: 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
4190: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
41a0: 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
41b0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
41c0: 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
41d0: 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
41e0: 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
41f0: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
4200: 73 65 20 42 4c 4f 42 20 6f 72 20 4e 4f 4e 45 20  se BLOB or NONE 
4210: 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
4220: 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
4230: 46 5f 42 4c 4f 42 2e 20 54 68 69 73 20 69 73 20  F_BLOB. This is 
4240: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
4250: 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
4260: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
4270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4280: 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
4290: 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
42a0: 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
42b0: 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
42c0: 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
42d0: 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
42e0: 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
42f0: 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
4300: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
4310: 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
4320: 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
4330: 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
4340: 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
4350: 29 20 68 61 73 20 42 4c 4f 42 2f 4e 4f 4e 45 20  ) has BLOB/NONE 
4360: 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
4370: 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
4380: 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
4390: 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
43a0: 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
43b0: 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
43c0: 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
43d0: 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
43e0: 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
43f0: 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
4400: 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
4410: 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
4420: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
4430: 5f 41 46 46 5f 42 4c 4f 42 2e 0a 2a 2f 0a 73 74  _AFF_BLOB..*/.st
4440: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
4450: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
4460: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4470: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
4480: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
4490: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
44a0: 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
44b0: 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
44c0: 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
44d0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ing */.  int bRe
44e0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
44f0: 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
4500: 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
4510: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
4520: 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
4530: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
4540: 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
4550: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
4560: 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
4570: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
4580: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
4590: 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
45a0: 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20  .  u16 nEq;     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
45d0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
45e0: 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
45f0: 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20  /.  u16 nSkip;  
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
4620: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
4630: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64   to skip */.  Vd
4640: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4650: 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
4660: 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
4670: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
4680: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
46a0: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
46b0: 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
46c0: 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  p */.  WhereTerm
46d0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
46e0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
46f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
4700: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
4710: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
4720: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
4730: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
4740: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4760: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4770: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
47a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
47b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
47c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
47d0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
47e0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
47f0: 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
4800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4810: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
4820: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
4830: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
4840: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
4850: 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
4860: 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
4870: 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  /.  pLoop = pLev
4880: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73  el->pWLoop;.  as
4890: 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
48a0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
48b0: 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
48c0: 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ;.  nEq = pLoop-
48d0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
48e0: 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  nSkip = pLoop->n
48f0: 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70  Skip;.  pIdx = p
4900: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
4910: 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ndex;.  assert( 
4920: 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pIdx!=0 );..  /*
4930: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
4940: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
4950: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
4960: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
4970: 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73  m..  */.  regBas
4980: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
4990: 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70   + 1;.  nReg = p
49a0: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
49b0: 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20  q + nExtraReg;. 
49c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
49d0: 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d   nReg;..  zAff =
49e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
49f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 73 71 6c 69  (pParse->db,sqli
4a00: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
4a10: 53 74 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 70  Str(pParse->db,p
4a20: 49 64 78 29 29 3b 0a 20 20 61 73 73 65 72 74 28  Idx));.  assert(
4a30: 20 7a 41 66 66 21 3d 30 20 7c 7c 20 70 50 61 72   zAff!=0 || pPar
4a40: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4a50: 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 6e  iled );..  if( n
4a60: 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  Skip ){.    int 
4a70: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
4a80: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73  ->iIdxCur;.    s
4a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4aa0: 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73  (v, (bRev?OP_Las
4ab0: 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49  t:OP_Rewind), iI
4ac0: 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65  dxCur);.    Vdbe
4ad0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
4ae0: 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev==0);.    Vdbe
4af0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
4b00: 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  ev!=0);.    Vdbe
4b10: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
4b20: 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20  in skip-scan on 
4b30: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
4b40: 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69  ));.    j = sqli
4b50: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
4b60: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70   OP_Goto);.    p
4b70: 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
4b80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4b90: 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f  Op4Int(v, (bRev?
4ba0: 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65  OP_SeekLT:OP_See
4bb0: 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20  kGT),.          
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65    iIdxCur, 0, re
4be0: 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20  gBase, nSkip);. 
4bf0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4c00: 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
4c10: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4c20: 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20  f(v, bRev!=0);. 
4c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4c40: 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20  mpHere(v, j);.  
4c50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b    for(j=0; j<nSk
4c60: 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ip; j++){.      
4c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c80: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4c90: 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42  iIdxCur, j, regB
4ca0: 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 74 65  ase+j);.      te
4cb0: 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 61 69  stcase( pIdx->ai
4cc0: 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 58 4e 5f 45 58  Column[j]==XN_EX
4cd0: 50 52 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  PR );.      Vdbe
4ce0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
4cf0: 2c 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 43 6f  , explainIndexCo
4d00: 6c 75 6d 6e 4e 61 6d 65 28 70 49 64 78 2c 20 6a  lumnName(pIdx, j
4d10: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  )));.    }.  }  
4d20: 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74    ..  /* Evaluat
4d30: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
4d40: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
4d50: 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d    assert( zAff==
4d60: 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e  0 || (int)strlen
4d70: 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  (zAff)>=nEq );. 
4d80: 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c   for(j=nSkip; j<
4d90: 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
4da0: 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d  nt r1;.    pTerm
4db0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
4dc0: 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [j];.    assert(
4dd0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
4de0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4df0: 67 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72  g testcase is tr
4e00: 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
4e10: 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
4e20: 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
4e30: 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
4e40: 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
4e50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4e60: 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
4e70: 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
4e80: 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
4e90: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
4ea0: 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
4eb0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
4ec0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
4ed0: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20  RTUAL );.    r1 
4ee0: 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
4ef0: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
4f00: 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
4f10: 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  v, regBase+j);. 
4f20: 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
4f30: 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
4f40: 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
4f50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
4f60: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4f70: 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
4f80: 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
4f90: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
4fa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
4fd0: 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
4fe0: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
4ff0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
5000: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
5010: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
5020: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
5030: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
5040: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
5050: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
5060: 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
5070: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
5080: 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
5090: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
50a0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
50b0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 49 53  tFlags & TERM_IS
50c0: 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )==0 && sqlite3E
50d0: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
50e0: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
50f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5100: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
5110: 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
5120: 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
5130: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5140: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
5150: 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
5160: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
5170: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
5180: 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
5190: 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
51a0: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
51b0: 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
51c0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
51d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
51e0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
51f0: 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
5200: 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
5210: 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
5220: 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
5230: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
5240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5250: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
5260: 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
5270: 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
5280: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
5290: 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
52a0: 42 4c 4f 42 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74  BLOBS./*.** If t
52b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
52c0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
52d0: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
52e0: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
52f0: 74 0a 2a 2a 20 28 61 20 73 74 72 69 6e 67 20 6c  t.** (a string l
5300: 69 74 65 72 61 6c 29 20 74 68 61 74 20 6f 72 69  iteral) that ori
5310: 67 69 6e 61 74 65 64 20 66 72 6f 6d 20 74 68 65  ginated from the
5320: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
5330: 6f 6e 2c 20 74 68 65 6e 20 0a 2a 2a 20 73 65 74  on, then .** set
5340: 20 50 33 20 61 6e 64 20 50 35 20 6f 6e 20 74 68   P3 and P5 on th
5350: 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f  e OP_String opco
5360: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  de so that the s
5370: 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 63 61  tring will be ca
5380: 73 74 0a 2a 2a 20 74 6f 20 61 20 42 4c 4f 42 20  st.** to a BLOB 
5390: 61 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  at appropriate t
53a0: 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  imes..**.** The 
53b0: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
53c0: 6e 20 74 72 79 73 20 74 6f 20 65 76 61 6c 75 61  n trys to evalua
53d0: 74 65 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  te "x LIKE 'abc%
53e0: 27 22 20 61 73 20 61 20 72 61 6e 67 65 0a 2a 2a  '" as a range.**
53f0: 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 22 78 3e   expression: "x>
5400: 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62  ='ABC' AND x<'ab
5410: 64 27 22 2e 20 20 42 75 74 20 74 68 69 73 20 72  d'".  But this r
5420: 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
5430: 20 72 61 6e 67 65 0a 2a 2a 20 73 63 61 6e 20 6c   range.** scan l
5440: 6f 6f 70 20 72 75 6e 20 74 77 69 63 65 2c 20 6f  oop run twice, o
5450: 6e 63 65 20 66 6f 72 20 73 74 72 69 6e 67 73 20  nce for strings 
5460: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  and a second tim
5470: 65 20 66 6f 72 20 42 4c 4f 42 73 2e 0a 2a 2a 20  e for BLOBs..** 
5480: 54 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70  The OP_String op
5490: 63 6f 64 65 73 20 6f 6e 20 74 68 65 20 73 65 63  codes on the sec
54a0: 6f 6e 64 20 70 61 73 73 20 63 6f 6e 76 65 72 74  ond pass convert
54b0: 20 74 68 65 20 75 70 70 65 72 20 61 6e 64 20 6c   the upper and l
54c0: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 73 74  ower.** bound st
54d0: 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 73 20 74  ring constants t
54e0: 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69 73 20 72  o blobs.  This r
54f0: 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
5500: 20 6e 65 63 65 73 73 61 72 79 20 63 68 61 6e 67   necessary chang
5510: 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20 4f 50 5f  es.** to the OP_
5520: 53 74 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 66  String opcodes f
5530: 6f 72 20 74 68 61 74 20 74 6f 20 68 61 70 70 65  or that to happe
5540: 6e 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  n..**.** Except,
5550: 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 66 20 53   of course, if S
5560: 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
5570: 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 20 69 73  T_MATCH_BLOBS is
5580: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 2a   defined, then.*
5590: 2a 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 70  * only the one p
55a0: 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
55b0: 73 74 72 69 6e 67 20 73 70 61 63 65 20 69 73 20  string space is 
55c0: 72 65 71 75 69 72 65 64 2c 20 73 6f 20 74 68 69  required, so thi
55d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 62 65 63  s routine.** bec
55e0: 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  omes a no-op..*/
55f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
5600: 72 65 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69  reLikeOptimizati
5610: 6f 6e 53 74 72 69 6e 67 46 69 78 75 70 28 0a 20  onStringFixup(. 
5620: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
5630: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 65 70           /* prep
5640: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
5650: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5660: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  n */.  WhereLeve
5670: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 2f  l *pLevel,     /
5680: 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20  * The loop that 
5690: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 4c 49 4b  contains the LIK
56a0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
56b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
56c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
56d0: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
56e0: 75 6e 64 20 6a 75 73 74 20 63 6f 64 65 64 20 2a  und just coded *
56f0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  /.){.  if( pTerm
5700: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5710: 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
5720: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
5730: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
5740: 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 30 20  >iLikeRepCntr>0 
5750: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
5760: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5770: 20 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74   -1);.    assert
5780: 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20  ( pOp!=0 );.    
5790: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
57a0: 6f 64 65 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20  ode==OP_String8 
57b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
57c0: 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 70 57 49 6e  pTerm->pWC->pWIn
57d0: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  fo->pParse->db->
57e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
57f0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 69      pOp->p3 = (i
5800: 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
5810: 65 52 65 70 43 6e 74 72 3e 3e 31 29 3b 20 20 2f  eRepCntr>>1);  /
5820: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5830: 6e 67 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ng counter */.  
5840: 20 20 70 4f 70 2d 3e 70 35 20 3d 20 28 75 38 29    pOp->p5 = (u8)
5850: 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65  (pLevel->iLikeRe
5860: 70 43 6e 74 72 26 31 29 3b 20 20 20 20 2f 2a 20  pCntr&1);    /* 
5870: 41 53 43 20 6f 72 20 44 45 53 43 20 2a 2f 0a 20  ASC or DESC */. 
5880: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
5890: 69 6e 65 20 77 68 65 72 65 4c 69 6b 65 4f 70 74  ine whereLikeOpt
58a0: 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67 46  imizationStringF
58b0: 69 78 75 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64  ixup(A,B,C).#end
58c0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
58d0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
58e0: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  HINTS./*.** Info
58f0: 72 6d 61 74 69 6f 6e 20 69 73 20 70 61 73 73 65  rmation is passe
5900: 64 20 66 72 6f 6d 20 63 6f 64 65 43 75 72 73 6f  d from codeCurso
5910: 72 48 69 6e 74 28 29 20 64 6f 77 6e 20 74 6f 20  rHint() down to 
5920: 69 6e 64 69 76 69 64 75 61 6c 20 6e 6f 64 65 73  individual nodes
5930: 20 6f 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65   of.** the expre
5940: 73 73 69 6f 6e 20 74 72 65 65 20 28 62 79 20 73  ssion tree (by s
5950: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
5960: 29 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  ) using an insta
5970: 6e 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 73  nce of this.** s
5980: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
5990: 75 63 74 20 43 43 75 72 48 69 6e 74 20 7b 0a 20  uct CCurHint {. 
59a0: 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
59b0: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
59c0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f  he main table */
59d0: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
59e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
59f0: 20 74 68 65 20 69 6e 64 65 78 2c 20 69 66 20 70   the index, if p
5a00: 49 64 78 21 3d 30 2e 20 20 55 6e 75 73 65 64 20  Idx!=0.  Unused 
5a10: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 49  otherwise */.  I
5a20: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f  ndex *pIdx;    /
5a30: 2a 20 54 68 65 20 69 6e 64 65 78 20 75 73 65 64  * The index used
5a40: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 74   to access the t
5a50: 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  able */.};../*.*
5a60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5a70: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 76  is called for ev
5a80: 65 72 79 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65  ery node of an e
5a90: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
5aa0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a  s a candidate.**
5ab0: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 68 69   for a cursor hi
5ac0: 6e 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 63  nt on an index c
5ad0: 75 72 73 6f 72 2e 20 20 46 6f 72 20 54 4b 5f 43  ursor.  For TK_C
5ae0: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74  OLUMN nodes that
5af0: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 68   reference.** th
5b00: 65 20 74 61 62 6c 65 20 43 43 75 72 48 69 6e 74  e table CCurHint
5b10: 2e 69 54 61 62 43 75 72 2c 20 76 65 72 69 66 79  .iTabCur, verify
5b20: 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
5b30: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 0a 2a 2a 20  olumn can be.** 
5b40: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
5b50: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
5b60: 69 74 20 63 61 6e 6e 6f 74 2c 20 74 68 65 6e 20  it cannot, then 
5b70: 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  set pWalker->eCo
5b80: 64 65 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74  de to 1..*/.stat
5b90: 69 63 20 69 6e 74 20 63 6f 64 65 43 75 72 73 6f  ic int codeCurso
5ba0: 72 48 69 6e 74 43 68 65 63 6b 45 78 70 72 28 57  rHintCheckExpr(W
5bb0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5bc0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5bd0: 73 74 72 75 63 74 20 43 43 75 72 48 69 6e 74 20  struct CCurHint 
5be0: 2a 70 48 69 6e 74 20 3d 20 70 57 61 6c 6b 65 72  *pHint = pWalker
5bf0: 2d 3e 75 2e 70 43 43 75 72 48 69 6e 74 3b 0a 20  ->u.pCCurHint;. 
5c00: 20 61 73 73 65 72 74 28 20 70 48 69 6e 74 2d 3e   assert( pHint->
5c10: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 69 66 28  pIdx!=0 );.  if(
5c20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
5c30: 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
5c40: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 48 69 6e 74  r->iTable==pHint
5c50: 2d 3e 69 54 61 62 43 75 72 0a 20 20 20 26 26 20  ->iTabCur.   && 
5c60: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
5c70: 6e 64 65 78 28 70 48 69 6e 74 2d 3e 70 49 64 78  ndex(pHint->pIdx
5c80: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
5c90: 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61  )<0.  ){.    pWa
5ca0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
5cb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
5cc0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
5cd0: 2a 0a 2a 2a 20 54 65 73 74 20 77 68 65 74 68 65  *.** Test whethe
5ce0: 72 20 6f 72 20 6e 6f 74 20 65 78 70 72 65 73 73  r or not express
5cf0: 69 6f 6e 20 70 45 78 70 72 2c 20 77 68 69 63 68  ion pExpr, which
5d00: 20 77 61 73 20 70 61 72 74 20 6f 66 20 61 20 57   was part of a W
5d10: 48 45 52 45 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  HERE clause,.** 
5d20: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
5d30: 65 64 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  ed in the cursor
5d40: 2d 68 69 6e 74 20 66 6f 72 20 61 20 74 61 62 6c  -hint for a tabl
5d50: 65 20 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65  e that is on the
5d60: 20 72 68 73 0a 2a 2a 20 6f 66 20 61 20 4c 45 46   rhs.** of a LEF
5d70: 54 20 4a 4f 49 4e 2e 20 53 65 74 20 57 61 6c 6b  T JOIN. Set Walk
5d80: 65 72 2e 65 43 6f 64 65 20 74 6f 20 6e 6f 6e 2d  er.eCode to non-
5d90: 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
5da0: 72 6e 69 6e 67 20 69 66 20 74 68 65 20 0a 2a 2a  rning if the .**
5db0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
5dc0: 6f 74 20 73 75 69 74 61 62 6c 65 2e 0a 2a 2a 0a  ot suitable..**.
5dd0: 2a 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  ** An expression
5de0: 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20 69   is unsuitable i
5df0: 66 20 69 74 20 6d 69 67 68 74 20 65 76 61 6c 75  f it might evalu
5e00: 61 74 65 20 74 6f 20 6e 6f 6e 20 4e 55 4c 4c 20  ate to non NULL 
5e10: 65 76 65 6e 20 69 66 0a 2a 2a 20 61 20 54 4b 5f  even if.** a TK_
5e20: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 20 74 68 61 74  COLUMN node that
5e30: 20 64 6f 65 73 20 61 66 66 65 63 74 20 74 68 65   does affect the
5e40: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78   value of the ex
5e50: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 0a  pression is set.
5e60: 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 46 6f 72 20  ** to NULL. For 
5e70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
5e80: 20 63 6f 6c 20 49 53 20 4e 55 4c 4c 0a 2a 2a 20   col IS NULL.** 
5e90: 20 20 63 6f 6c 20 49 53 20 4e 4f 54 20 4e 55 4c    col IS NOT NUL
5ea0: 4c 0a 2a 2a 20 20 20 63 6f 61 6c 65 73 63 65 28  L.**   coalesce(
5eb0: 63 6f 6c 2c 20 31 29 0a 2a 2a 20 20 20 43 41 53  col, 1).**   CAS
5ec0: 45 20 57 48 45 4e 20 63 6f 6c 20 54 48 45 4e 20  E WHEN col THEN 
5ed0: 30 20 45 4c 53 45 20 31 20 45 4e 44 0a 2a 2f 0a  0 ELSE 1 END.*/.
5ee0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
5ef0: 75 72 73 6f 72 48 69 6e 74 49 73 4f 72 46 75 6e  ursorHintIsOrFun
5f00: 63 74 69 6f 6e 28 57 61 6c 6b 65 72 20 2a 70 57  ction(Walker *pW
5f10: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
5f20: 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
5f30: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 0a 20 20 20  ->op==TK_IS .   
5f40: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
5f50: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 70 45 78 70 72  _ISNULL || pExpr
5f60: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a  ->op==TK_ISNOT .
5f70: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
5f80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 70  =TK_NOTNULL || p
5f90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
5fa0: 45 20 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  E .  ){.    pWal
5fb0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
5fc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
5fd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
5fe0: 4f 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 31  ON ){.    int d1
5ff0: 3b 0a 20 20 20 20 63 68 61 72 20 64 32 5b 33 5d  ;.    char d2[3]
6000: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
6010: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
6020: 6f 6e 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  on(pWalker->pPar
6030: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26  se->db, pExpr, &
6040: 64 31 2c 20 64 32 29 20 29 7b 0a 20 20 20 20 20  d1, d2) ){.     
6050: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
6060: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
6070: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6080: 74 69 6e 75 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tinue;.}.../*.**
6090: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
60a0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  s called on ever
60b0: 79 20 6e 6f 64 65 20 6f 66 20 61 6e 20 65 78 70  y node of an exp
60c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 75 73 65  ression tree use
60d0: 64 20 61 73 20 61 6e 0a 2a 2a 20 61 72 67 75 6d  d as an.** argum
60e0: 65 6e 74 20 74 6f 20 74 68 65 20 4f 50 5f 43 75  ent to the OP_Cu
60f0: 72 73 6f 72 48 69 6e 74 20 69 6e 73 74 72 75 63  rsorHint instruc
6100: 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 6e 6f 64  tion. If the nod
6110: 65 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  e is a TK_COLUMN
6120: 0a 2a 2a 20 74 68 61 74 20 61 63 63 65 73 73 65  .** that accesse
6130: 73 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  s any table othe
6140: 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 69  r than the one i
6150: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
6160: 43 43 75 72 48 69 6e 74 2e 69 54 61 62 43 75 72  CCurHint.iTabCur
6170: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 66 6f  , then do the fo
6180: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
6190: 20 31 29 20 61 6c 6c 6f 63 61 74 65 20 61 20 72   1) allocate a r
61a0: 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 64 65  egister and code
61b0: 20 61 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e   an OP_Column in
61c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 61  struction to rea
61d0: 64 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 73  d .**      the s
61e0: 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
61f0: 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 72 65 67  into the new reg
6200: 69 73 74 65 72 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ister, and.**.**
6210: 20 20 20 32 29 20 74 72 61 6e 73 66 6f 72 6d 20     2) transform 
6220: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
6230: 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
6240: 53 54 45 52 20 6e 6f 64 65 20 74 68 61 74 20 72  STER node that r
6250: 65 61 64 73 20 0a 2a 2a 20 20 20 20 20 20 66 72  eads .**      fr
6260: 6f 6d 20 74 68 65 20 6e 65 77 6c 79 20 70 6f 70  om the newly pop
6270: 75 6c 61 74 65 64 20 72 65 67 69 73 74 65 72 2e  ulated register.
6280: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 69 66 20  .**.** Also, if 
6290: 74 68 65 20 6e 6f 64 65 20 69 73 20 61 20 54 4b  the node is a TK
62a0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 64 6f 65  _COLUMN that doe
62b0: 73 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62  s access the tab
62c0: 6c 65 20 69 64 65 6e 69 66 69 65 64 0a 2a 2a 20  le idenified.** 
62d0: 62 79 20 70 43 43 75 72 48 69 6e 74 2e 69 54 61  by pCCurHint.iTa
62e0: 62 43 75 72 2c 20 61 6e 64 20 61 6e 20 69 6e 64  bCur, and an ind
62f0: 65 78 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ex is being used
6300: 20 28 77 68 69 63 68 20 77 65 20 77 69 6c 6c 0a   (which we will.
6310: 2a 2a 20 6b 6e 6f 77 20 62 65 63 61 75 73 65 20  ** know because 
6320: 43 43 75 72 48 69 6e 74 2e 70 49 64 78 21 3d 30  CCurHint.pIdx!=0
6330: 29 20 74 68 65 6e 20 74 72 61 6e 73 66 6f 72 6d  ) then transform
6340: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 69   the TK_COLUMN i
6350: 6e 74 6f 0a 2a 2a 20 61 6e 20 61 63 63 65 73 73  nto.** an access
6360: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 61   of the index ra
6370: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 72  ther than the or
6380: 69 67 69 6e 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  iginal table..*/
6390: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
63a0: 43 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70  CursorHintFixExp
63b0: 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
63c0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
63d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 57 52 43 5f  .  int rc = WRC_
63e0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 73 74 72 75  Continue;.  stru
63f0: 63 74 20 43 43 75 72 48 69 6e 74 20 2a 70 48 69  ct CCurHint *pHi
6400: 6e 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  nt = pWalker->u.
6410: 70 43 43 75 72 48 69 6e 74 3b 0a 20 20 69 66 28  pCCurHint;.  if(
6420: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
6430: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 69 66 28  OLUMN ){.    if(
6440: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
6450: 70 48 69 6e 74 2d 3e 69 54 61 62 43 75 72 20 29  pHint->iTabCur )
6460: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
6470: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
6480: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
6490: 69 6e 74 20 72 65 67 20 3d 20 2b 2b 70 57 61 6c  int reg = ++pWal
64a0: 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 6e 4d 65  ker->pParse->nMe
64b0: 6d 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  m;   /* Register
64c0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   for column valu
64d0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
64e0: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
64f0: 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 20 20  umnOfTable(.    
6500: 20 20 20 20 20 20 76 2c 20 70 45 78 70 72 2d 3e        v, pExpr->
6510: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61  pTab, pExpr->iTa
6520: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
6530: 75 6d 6e 2c 20 72 65 67 0a 20 20 20 20 20 20 29  umn, reg.      )
6540: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
6550: 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
6560: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
6570: 61 62 6c 65 20 3d 20 72 65 67 3b 0a 20 20 20 20  able = reg;.    
6580: 7d 65 6c 73 65 20 69 66 28 20 70 48 69 6e 74 2d  }else if( pHint-
6590: 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
65a0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
65b0: 3d 20 70 48 69 6e 74 2d 3e 69 49 64 78 43 75 72  = pHint->iIdxCur
65c0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
65d0: 43 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33  Column = sqlite3
65e0: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 48  ColumnOfIndex(pH
65f0: 69 6e 74 2d 3e 70 49 64 78 2c 20 70 45 78 70 72  int->pIdx, pExpr
6600: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
6610: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
6620: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20  >iColumn>=0 );. 
6630: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
6640: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
6650: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
6660: 20 20 20 2f 2a 20 41 6e 20 61 67 67 72 65 67 61     /* An aggrega
6670: 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  te function in t
6680: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6690: 6f 66 20 61 20 71 75 65 72 79 20 6d 65 61 6e 73  of a query means
66a0: 20 74 68 69 73 20 6d 75 73 74 0a 20 20 20 20 2a   this must.    *
66b0: 2a 20 62 65 20 61 20 63 6f 72 72 65 6c 61 74 65  * be a correlate
66c0: 64 20 73 75 62 2d 71 75 65 72 79 2c 20 61 6e 64  d sub-query, and
66d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
66e0: 72 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  r is an aggregat
66f0: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
6700: 65 20 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  e parent context
6710: 2e 20 44 6f 20 6e 6f 74 20 77 61 6c 6b 20 74 68  . Do not walk th
6720: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  e function argum
6730: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 63 61 73  ents in this cas
6740: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
6750: 20 74 6f 64 6f 3a 20 49 74 20 73 68 6f 75 6c 64   todo: It should
6760: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
6770: 72 65 70 6c 61 63 65 20 74 68 69 73 20 6e 6f 64  replace this nod
6780: 65 20 77 69 74 68 20 61 20 54 4b 5f 52 45 47 49  e with a TK_REGI
6790: 53 54 45 52 0a 20 20 20 20 2a 2a 20 65 78 70 72  STER.    ** expr
67a0: 65 73 73 69 6f 6e 2c 20 61 73 20 74 68 65 20 72  ession, as the r
67b0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
67c0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
67d0: 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 20 20 20  stored in a .   
67e0: 20 2a 2a 20 72 65 67 69 73 74 65 72 20 61 74 20   ** register at 
67f0: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 65 20  this point. The 
6800: 73 61 6d 65 20 68 6f 6c 64 73 20 66 6f 72 20 54  same holds for T
6810: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  K_AGG_COLUMN nod
6820: 65 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  es. */.    rc = 
6830: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6e 20 4f  *.** Insert an O
6860: 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 69 6e 73  P_CursorHint ins
6870: 74 72 75 63 74 69 6f 6e 20 69 66 20 69 74 20 69  truction if it i
6880: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
6890: 20 64 6f 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69   do so..*/.stati
68a0: 63 20 76 6f 69 64 20 63 6f 64 65 43 75 72 73 6f  c void codeCurso
68b0: 72 48 69 6e 74 28 0a 20 20 73 74 72 75 63 74 20  rHint(.  struct 
68c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
68d0: 61 62 49 74 65 6d 2c 20 20 2f 2a 20 46 52 4f 4d  abItem,  /* FROM
68e0: 20 63 6c 61 75 73 65 20 69 74 65 6d 20 2a 2f 0a   clause item */.
68f0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
6900: 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 77  nfo,    /* The w
6910: 68 65 72 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20  here clause */. 
6920: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
6930: 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
6940: 6c 6f 6f 70 20 74 6f 20 70 72 6f 76 69 64 65 20  loop to provide 
6950: 68 69 6e 74 73 20 66 6f 72 20 2a 2f 0a 20 20 57  hints for */.  W
6960: 68 65 72 65 54 65 72 6d 20 2a 70 45 6e 64 52 61  hereTerm *pEndRa
6970: 6e 67 65 20 20 2f 2a 20 48 69 6e 74 20 74 68 69  nge  /* Hint thi
6980: 73 20 65 6e 64 2d 6f 66 2d 73 63 61 6e 20 62 6f  s end-of-scan bo
6990: 75 6e 64 61 72 79 20 74 65 72 6d 20 69 66 20 6e  undary term if n
69a0: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
69b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
69c0: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
69d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
69e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
69f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6a00: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
6a10: 45 78 70 72 20 3d 20 30 3b 0a 20 20 57 68 65 72  Expr = 0;.  Wher
6a20: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
6a30: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
6a40: 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
6a50: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
6a60: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
6a70: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
6a80: 20 73 74 72 75 63 74 20 43 43 75 72 48 69 6e 74   struct CCurHint
6a90: 20 73 48 69 6e 74 3b 0a 20 20 57 61 6c 6b 65 72   sHint;.  Walker
6aa0: 20 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 69 66 28   sWalker;..  if(
6ab0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
6ac0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
6ad0: 5f 43 75 72 73 6f 72 48 69 6e 74 73 29 20 29 20  _CursorHints) ) 
6ae0: 72 65 74 75 72 6e 3b 0a 20 20 69 43 75 72 20 3d  return;.  iCur =
6af0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ;.  assert( iCur
6b10: 3d 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ==pWInfo->pTabLi
6b20: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
6b30: 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a  rom].iCursor );.
6b40: 20 20 73 48 69 6e 74 2e 69 54 61 62 43 75 72 20    sHint.iTabCur 
6b50: 3d 20 69 43 75 72 3b 0a 20 20 73 48 69 6e 74 2e  = iCur;.  sHint.
6b60: 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
6b70: 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 73 48 69  ->iIdxCur;.  sHi
6b80: 6e 74 2e 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  nt.pIdx = pLoop-
6b90: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
6ba0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
6bb0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
6bc0: 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
6bd0: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
6be0: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  se;.  sWalker.u.
6bf0: 70 43 43 75 72 48 69 6e 74 20 3d 20 26 73 48 69  pCCurHint = &sHi
6c00: 6e 74 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  nt;.  pWC = &pWI
6c10: 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 66 6f 72 28  nfo->sWC;.  for(
6c20: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
6c30: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 65  m; i++){.    pTe
6c40: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 5d 3b  rm = &pWC->a[i];
6c50: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
6c60: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
6c70: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
6c80: 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
6c90: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
6ca0: 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
6cb0: 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 29 20 63 6f  l->notReady ) co
6cc0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
6cd0: 41 6e 79 20 74 65 72 6d 73 20 73 70 65 63 69 66  Any terms specif
6ce0: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
6cf0: 68 65 20 4f 4e 28 2e 2e 2e 29 20 63 6c 61 75 73  he ON(...) claus
6d00: 65 20 66 6f 72 20 61 6e 79 20 4c 45 46 54 20 0a  e for any LEFT .
6d10: 20 20 20 20 2a 2a 20 4a 4f 49 4e 20 66 6f 72 20      ** JOIN for 
6d20: 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e  which the curren
6d30: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 74  t table is not t
6d40: 68 65 20 72 68 73 20 61 72 65 20 6f 6d 69 74 74  he rhs are omitt
6d50: 65 64 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ed.    ** from t
6d60: 68 65 20 63 75 72 73 6f 72 2d 68 69 6e 74 2e 20  he cursor-hint. 
6d70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
6d80: 66 20 74 68 69 73 20 74 61 62 6c 65 20 69 73 20  f this table is 
6d90: 74 68 65 20 72 68 73 20 6f 66 20 61 20 4c 45 46  the rhs of a LEF
6da0: 54 20 4a 4f 49 4e 2c 20 22 49 53 22 20 6f 72 20  T JOIN, "IS" or 
6db0: 22 49 53 20 4e 55 4c 4c 22 20 74 65 72 6d 73 20  "IS NULL" terms 
6dc0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 72  .    ** that wer
6dd0: 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  e specified as p
6de0: 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
6df0: 20 63 6c 61 75 73 65 20 6d 75 73 74 20 62 65 20   clause must be 
6e00: 65 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2a  excluded..    **
6e10: 20 54 68 69 73 20 69 73 20 74 6f 20 61 64 64 72   This is to addr
6e20: 65 73 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ess the followin
6e30: 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
6e40: 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 74 31     SELECT ... t1
6e50: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
6e60: 20 28 74 31 2e 61 3d 74 32 2e 62 29 20 57 48 45   (t1.a=t2.b) WHE
6e70: 52 45 20 74 32 2e 63 20 49 53 20 4e 55 4c 4c 3b  RE t2.c IS NULL;
6e80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
6e90: 61 79 20 74 68 65 72 65 20 69 73 20 61 20 73 69  ay there is a si
6ea0: 6e 67 6c 65 20 72 6f 77 20 69 6e 20 74 32 20 74  ngle row in t2 t
6eb0: 68 61 74 20 6d 61 74 63 68 65 73 20 28 74 31 2e  hat matches (t1.
6ec0: 61 3d 74 32 2e 62 29 2c 20 62 75 74 20 69 74 73  a=t2.b), but its
6ed0: 0a 20 20 20 20 2a 2a 20 74 32 2e 63 20 76 61 6c  .    ** t2.c val
6ee0: 75 65 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ues is not NULL.
6ef0: 20 49 66 20 74 68 65 20 28 74 32 2e 63 20 49 53   If the (t2.c IS
6f00: 20 4e 55 4c 4c 29 20 63 6f 6e 73 74 72 61 69 6e   NULL) constrain
6f10: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 75 73  t is .    ** pus
6f20: 68 65 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  hed down to the 
6f30: 63 75 72 73 6f 72 2c 20 74 68 69 73 20 72 6f 77  cursor, this row
6f40: 20 69 73 20 66 69 6c 74 65 72 65 64 20 6f 75 74   is filtered out
6f50: 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a  , causing.    **
6f60: 20 53 51 4c 69 74 65 20 74 6f 20 73 79 6e 74 68   SQLite to synth
6f70: 65 73 69 7a 65 20 61 20 72 6f 77 20 6f 66 20 4e  esize a row of N
6f80: 55 4c 4c 20 76 61 6c 75 65 73 2e 20 57 68 69 63  ULL values. Whic
6f90: 68 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 65  h does match the
6fa0: 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
6fb0: 61 75 73 65 2c 20 61 6e 64 20 73 6f 20 74 68 65  ause, and so the
6fc0: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61   query returns a
6fd0: 20 72 6f 77 2e 20 57 68 69 63 68 20 69 73 20 69   row. Which is i
6fe0: 6e 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 2a 2a  ncorrect..    **
6ff0: 0a 20 20 20 20 2a 2a 20 46 6f 72 20 74 68 65 20  .    ** For the 
7000: 73 61 6d 65 20 72 65 61 73 6f 6e 2c 20 57 48 45  same reason, WHE
7010: 52 45 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  RE terms such as
7020: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
7030: 20 20 57 48 45 52 45 20 31 20 3d 20 28 74 32 2e    WHERE 1 = (t2.
7040: 63 20 49 53 20 4e 55 4c 4c 29 0a 20 20 20 20 2a  c IS NULL).    *
7050: 2a 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 73  *.    ** are als
7060: 6f 20 65 78 63 6c 75 64 65 64 2e 20 53 65 65 20  o excluded. See 
7070: 63 6f 64 65 43 75 72 73 6f 72 48 69 6e 74 49 73  codeCursorHintIs
7080: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 66 6f 72  OrFunction() for
7090: 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 2a 2f   details..    */
70a0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
70b0: 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
70c0: 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
70d0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
70e0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
70f0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
7100: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7110: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 0a 20 20  EP_FromJoin) .  
7120: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69       || pExpr->i
7130: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
7140: 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
7150: 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
7160: 20 20 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65     sWalker.eCode
7170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 57   = 0;.        sW
7180: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
7190: 61 63 6b 20 3d 20 63 6f 64 65 43 75 72 73 6f 72  ack = codeCursor
71a0: 48 69 6e 74 49 73 4f 72 46 75 6e 63 74 69 6f 6e  HintIsOrFunction
71b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
71c0: 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
71d0: 65 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  er, pTerm->pExpr
71e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
71f0: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63  Walker.eCode ) c
7200: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
7210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7220: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7230: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
7240: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
7250: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7260: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   }..    /* All t
7270: 65 72 6d 73 20 69 6e 20 70 57 4c 6f 6f 70 2d 3e  erms in pWLoop->
7280: 61 4c 54 65 72 6d 5b 5d 20 65 78 63 65 70 74 20  aLTerm[] except 
7290: 70 45 6e 64 52 61 6e 67 65 20 61 72 65 20 75 73  pEndRange are us
72a0: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
72b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
72c0: 6f 72 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  or.  These terms
72d0: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
72e0: 61 73 20 68 69 6e 74 73 20 66 6f 72 20 61 20 70  as hints for a p
72f0: 75 72 65 20 72 61 6e 67 65 0a 20 20 20 20 2a 2a  ure range.    **
7300: 20 73 63 61 6e 20 28 74 68 61 74 20 68 61 73 20   scan (that has 
7310: 6e 6f 20 3d 3d 20 74 65 72 6d 73 29 20 73 6f 20  no == terms) so 
7320: 6f 6d 69 74 20 74 68 65 6d 2e 20 2a 2f 0a 20 20  omit them. */.  
7330: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
7340: 74 72 65 65 2e 6e 45 71 3d 3d 30 20 26 26 20 70  tree.nEq==0 && p
7350: 54 65 72 6d 21 3d 70 45 6e 64 52 61 6e 67 65 20  Term!=pEndRange 
7360: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
7370: 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  ; j<pLoop->nLTer
7380: 6d 20 26 26 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  m && pLoop->aLTe
7390: 72 6d 5b 6a 5d 21 3d 70 54 65 72 6d 3b 20 6a 2b  rm[j]!=pTerm; j+
73a0: 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 6a  +){}.      if( j
73b0: 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  <pLoop->nLTerm )
73c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
73d0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 73 75 62 71  ..    /* No subq
73e0: 75 65 72 69 65 73 20 6f 72 20 6e 6f 6e 2d 64 65  ueries or non-de
73f0: 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63  terministic func
7400: 74 69 6f 6e 73 20 61 6c 6c 6f 77 65 64 20 2a 2f  tions allowed */
7410: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7420: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
7430: 75 65 72 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  uery(pTerm->pExp
7440: 72 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  r) ) continue;..
7450: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
7460: 64 65 78 20 73 63 61 6e 2c 20 6d 61 6b 65 20 73  dex scan, make s
7470: 75 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 63  ure referenced c
7480: 6f 6c 75 6d 6e 73 20 61 72 65 20 61 63 74 75 61  olumns are actua
7490: 6c 6c 79 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  lly in.    ** th
74a0: 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  e index. */.    
74b0: 69 66 28 20 73 48 69 6e 74 2e 70 49 64 78 21 3d  if( sHint.pIdx!=
74c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 57 61 6c 6b  0 ){.      sWalk
74d0: 65 72 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  er.eCode = 0;.  
74e0: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
74f0: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
7500: 43 75 72 73 6f 72 48 69 6e 74 43 68 65 63 6b 45  CursorHintCheckE
7510: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
7520: 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
7530: 6b 65 72 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  ker, pTerm->pExp
7540: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 57  r);.      if( sW
7550: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 29 20 63 6f  alker.eCode ) co
7560: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
7570: 20 20 20 2f 2a 20 49 66 20 77 65 20 73 75 72 76     /* If we surv
7580: 69 76 65 20 61 6c 6c 20 70 72 69 6f 72 20 74 65  ive all prior te
7590: 73 74 73 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  sts, that means 
75a0: 74 68 69 73 20 74 65 72 6d 20 69 73 20 77 6f 72  this term is wor
75b0: 74 68 20 68 69 6e 74 69 6e 67 20 2a 2f 0a 20 20  th hinting */.  
75c0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
75d0: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 45 78  3ExprAnd(db, pEx
75e0: 70 72 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  pr, sqlite3ExprD
75f0: 75 70 28 64 62 2c 20 70 54 65 72 6d 2d 3e 70 45  up(db, pTerm->pE
7600: 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20  xpr, 0));.  }.  
7610: 69 66 28 20 70 45 78 70 72 21 3d 30 20 29 7b 0a  if( pExpr!=0 ){.
7620: 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70      sWalker.xExp
7630: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 64 65  rCallback = code
7640: 43 75 72 73 6f 72 48 69 6e 74 46 69 78 45 78 70  CursorHintFixExp
7650: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  r;.    sqlite3Wa
7660: 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
7670: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c   pExpr);.    sql
7680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7690: 2c 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 2c  , OP_CursorHint,
76a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
76b0: 20 20 20 20 20 20 20 20 28 73 48 69 6e 74 2e 70          (sHint.p
76c0: 49 64 78 20 3f 20 73 48 69 6e 74 2e 69 49 64 78  Idx ? sHint.iIdx
76d0: 43 75 72 20 3a 20 73 48 69 6e 74 2e 69 54 61 62  Cur : sHint.iTab
76e0: 43 75 72 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Cur), 0, 0,.    
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70    (const char*)p
7710: 45 78 70 72 2c 20 50 34 5f 45 58 50 52 29 3b 0a  Expr, P4_EXPR);.
7720: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
7730: 66 69 6e 65 20 63 6f 64 65 43 75 72 73 6f 72 48  fine codeCursorH
7740: 69 6e 74 28 41 2c 42 2c 43 2c 44 29 20 20 2f 2a  int(A,B,C,D)  /*
7750: 20 4e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   No-op */.#endif
7760: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
7770: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 20 2a  E_CURSOR_HINTS *
7780: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20  /../*.** Cursor 
7790: 69 43 75 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  iCur is open on 
77a0: 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  an intkey b-tree
77b0: 20 28 61 20 74 61 62 6c 65 29 2e 20 52 65 67 69   (a table). Regi
77c0: 73 74 65 72 20 69 52 6f 77 69 64 20 63 6f 6e 74  ster iRowid cont
77d0: 61 69 6e 73 0a 2a 2a 20 61 20 72 6f 77 69 64 20  ains.** a rowid 
77e0: 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
77f0: 66 72 6f 6d 20 63 75 72 73 6f 72 20 69 49 64 78  from cursor iIdx
7800: 43 75 72 2c 20 6f 70 65 6e 20 6f 6e 20 69 6e 64  Cur, open on ind
7810: 65 78 20 70 49 64 78 2e 20 54 68 69 73 0a 2a 2a  ex pIdx. This.**
7820: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
7830: 74 65 73 20 63 6f 64 65 20 74 6f 20 64 6f 20 61  tes code to do a
7840: 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
7850: 66 20 63 75 72 73 6f 72 20 69 43 75 72 20 74 6f  f cursor iCur to
7860: 20 74 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20 73   the .** rowid s
7870: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
7880: 72 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  r iRowid..**.** 
7890: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
78a0: 73 20 6a 75 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s just:.**.**   
78b0: 4f 50 5f 53 65 65 6b 20 24 69 43 75 72 20 24 69  OP_Seek $iCur $i
78c0: 52 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  Rowid.**.** Howe
78d0: 76 65 72 2c 20 69 66 20 74 68 65 20 73 63 61 6e  ver, if the scan
78e0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
78f0: 20 63 6f 64 65 64 20 69 73 20 61 20 62 72 61 6e   coded is a bran
7900: 63 68 20 6f 66 20 61 6e 20 4f 52 2d 6c 6f 6f 70  ch of an OR-loop
7910: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 74 61 74   and.** the stat
7920: 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
7930: 62 65 69 6e 67 20 63 6f 64 65 64 20 69 73 20 61  being coded is a
7940: 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 50 33   SELECT, then P3
7950: 20 6f 66 20 74 68 65 20 4f 50 5f 53 65 65 6b 0a   of the OP_Seek.
7960: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 69 49 64  ** is set to iId
7970: 78 43 75 72 20 61 6e 64 20 50 34 20 69 73 20 73  xCur and P4 is s
7980: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
7990: 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
79a0: 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ers.** containin
79b0: 67 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  g one entry for 
79c0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
79d0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
79e0: 69 43 75 72 20 69 73 20 6f 70 65 6e 20 0a 2a 2a  iCur is open .**
79f0: 20 6f 6e 2e 20 46 6f 72 20 65 61 63 68 20 74 61   on. For each ta
7a00: 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 74  ble column, if t
7a10: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  he column is the
7a20: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
7a30: 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 2c 20 74  the .** index, t
7a40: 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
7a50: 6e 64 69 6e 67 20 61 72 72 61 79 20 65 6e 74 72  nding array entr
7a60: 79 20 69 73 20 73 65 74 20 74 6f 20 28 69 2b 31  y is set to (i+1
7a70: 29 2e 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ). If the column
7a80: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  .** does not app
7a90: 65 61 72 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ear in the index
7aa0: 20 61 74 20 61 6c 6c 2c 20 74 68 65 20 61 72 72   at all, the arr
7ab0: 61 79 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  ay entry is set 
7ac0: 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
7ad0: 76 6f 69 64 20 63 6f 64 65 44 65 66 65 72 72 65  void codeDeferre
7ae0: 64 53 65 65 6b 28 0a 20 20 57 68 65 72 65 49 6e  dSeek(.  WhereIn
7af0: 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
7b10: 65 20 63 6c 61 75 73 65 20 63 6f 6e 74 65 78 74  e clause context
7b20: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
7b30: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
7b40: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
7b50: 63 61 6e 20 69 73 20 75 73 69 6e 67 20 2a 2f 0a  can is using */.
7b60: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
7b90: 49 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  IPK b-tree */.  
7ba0: 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 2f 2a 20 49 6e 64 65 78 20 63 75 72 73 6f 72 20  /* Index cursor 
7bd0: 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
7be0: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
7bf0: 70 50 61 72 73 65 3b 20 2f 2a 20 50 61 72 73 65  pParse; /* Parse
7c00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64   context */.  Vd
7c10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7c20: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 2f 2a  pVdbe;        /*
7c30: 20 56 64 62 65 20 74 6f 20 67 65 6e 65 72 61 74   Vdbe to generat
7c40: 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 2a 2f  e code within */
7c50: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  ..  assert( iIdx
7c60: 43 75 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Cur>0 );.  asser
7c70: 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
7c80: 6e 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  n[pIdx->nColumn-
7c90: 31 5d 3d 3d 2d 31 20 29 3b 0a 20 20 0a 20 20 73  1]==-1 );.  .  s
7ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7cb0: 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 49 64  (v, OP_Seek, iId
7cc0: 78 43 75 72 2c 20 30 2c 20 69 43 75 72 29 3b 0a  xCur, 0, iCur);.
7cd0: 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
7ce0: 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
7cf0: 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 0a  E_OR_SUBCLAUSE).
7d00: 20 20 20 26 26 20 44 62 4d 61 73 6b 41 6c 6c 5a     && DbMaskAllZ
7d10: 65 72 6f 28 73 71 6c 69 74 65 33 50 61 72 73 65  ero(sqlite3Parse
7d20: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
7d30: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 0a 20 20 29  ->writeMask).  )
7d40: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7d50: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
7d60: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
7d70: 20 69 6e 74 20 2a 61 69 20 3d 20 28 69 6e 74 2a   int *ai = (int*
7d80: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
7d90: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
7da0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 70 54   sizeof(int)*(pT
7db0: 61 62 2d 3e 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20  ab->nCol+1));.  
7dc0: 20 20 69 66 28 20 61 69 20 29 7b 0a 20 20 20 20    if( ai ){.    
7dd0: 20 20 61 69 5b 30 5d 20 3d 20 70 54 61 62 2d 3e    ai[0] = pTab->
7de0: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCol;.      for(
7df0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
7e00: 6c 75 6d 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  lumn-1; i++){.  
7e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
7e20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  dx->aiColumn[i]<
7e30: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
7e40: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
7e50: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29  aiColumn[i]>=0 )
7e60: 20 61 69 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75   ai[pIdx->aiColu
7e70: 6d 6e 5b 69 5d 2b 31 5d 20 3d 20 69 2b 31 3b 0a  mn[i]+1] = i+1;.
7e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7e90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7ea0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
7eb0: 61 69 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  ai, P4_INTARRAY)
7ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7ed0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7ee0: 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  de for the start
7ef0: 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74   of the iLevel-t
7f00: 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48  h loop in the WH
7f10: 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d  ERE clause.** im
7f20: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73  plementation des
7f30: 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f  cribed by pWInfo
7f40: 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c  ..*/.Bitmask sql
7f50: 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65  ite3WhereCodeOne
7f60: 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
7f70: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
7f80: 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
7f90: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
7fa0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
7fb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
7fc0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
7fd0: 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
7fe0: 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
7ff0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
8000: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
8010: 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
8020: 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
8030: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
8040: 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
8050: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8060: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8070: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
8080: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
8090: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
80a0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
80b0: 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
80c0: 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
80d0: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
80e0: 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
80f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
8100: 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
8110: 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
8120: 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
8130: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
8140: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
8150: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
8160: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
8170: 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
8180: 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
8190: 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
81a0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
81b0: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
81c0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
81d0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
81e0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
81f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
8200: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
8210: 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
8220: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
8230: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
8240: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
8250: 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
8260: 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
8270: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
82a0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
82b0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
82d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
82e0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
8310: 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
8320: 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
8330: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8340: 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
8350: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
8360: 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
8370: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
8380: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
8390: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
83a0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
83b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
83c0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
83f0: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
8400: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
8410: 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
8420: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
8430: 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
8440: 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
8450: 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
8460: 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
8470: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
8480: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
8490: 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
84a0: 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
84b0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
84c0: 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
84d0: 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
84e0: 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
84f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8500: 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
8510: 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
8520: 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
8530: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
8540: 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
8550: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
8560: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
8570: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
8580: 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c  Cursor;.  pLevel
8590: 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ->notReady = not
85a0: 52 65 61 64 79 20 26 20 7e 73 71 6c 69 74 65 33  Ready & ~sqlite3
85b0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
85c0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
85d0: 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20  iCur);.  bRev = 
85e0: 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b  (pWInfo->revMask
85f0: 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f  >>iLevel)&1;.  o
8600: 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f  mitTable = (pLoo
8610: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
8620: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
8630: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
8640: 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
8650: 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
8660: 42 43 4c 41 55 53 45 29 3d 3d 30 3b 0a 20 20 56  BCLAUSE)==0;.  V
8670: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
8680: 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
8690: 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c  E-loop%d: %s",iL
86a0: 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70  evel,pTabItem->p
86b0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
86c0: 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
86d0: 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
86e0: 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
86f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
8700: 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
8710: 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
8720: 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
8730: 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
8740: 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
8750: 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
8760: 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
8770: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
8780: 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
8790: 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
87a0: 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
87b0: 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
87c0: 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
87d0: 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
87e0: 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
87f0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
8800: 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
8810: 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
8820: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
8830: 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
8840: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
8850: 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
8860: 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
8870: 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
8880: 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
8890: 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
88a0: 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
88b0: 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
88c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
88d0: 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
88e0: 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
88f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8900: 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
8910: 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
8920: 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
8930: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
8940: 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
8950: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
8960: 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
8970: 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
8980: 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
8990: 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
89a0: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
89b0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
89c0: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
89d0: 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
89e0: 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
89f0: 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
8a00: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
8a10: 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
8a20: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
8a30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8a40: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
8a50: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
8a60: 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
8a70: 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
8a80: 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
8a90: 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
8aa0: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
8ab0: 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
8ac0: 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
8ad0: 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
8ae0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
8af0: 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69   pTabItem->fg.vi
8b00: 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
8b10: 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
8b20: 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
8b30: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
8b40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8b50: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
8b60: 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54   regYield, 0, pT
8b70: 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
8b80: 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Sub);.    pLevel
8b90: 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
8ba0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8bb0: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c  Yield, regYield,
8bc0: 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56   addrBrk);.    V
8bd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8be0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
8bf0: 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
8c00: 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
8c10: 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
8c20: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
8c30: 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
8c40: 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
8c50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8c60: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
8c70: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
8c80: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
8c90: 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
8ca0: 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
8cb0: 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
8cc0: 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
8cd0: 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
8ce0: 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
8cf0: 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
8d00: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
8d10: 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
8d20: 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
8d30: 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
8d40: 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
8d50: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
8d60: 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
8d70: 4c 54 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 69  LTerm;.    int i
8d80: 49 6e 3b 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65  In;    /* Counte
8d90: 72 20 66 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  r for IN constra
8da0: 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  ints */..    sql
8db0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
8dc0: 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
8dd0: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
8de0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
8df0: 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
8e00: 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75  ;.    addrNotFou
8e10: 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
8e20: 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  rBrk;.    for(j=
8e30: 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
8e40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
8e50: 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
8e60: 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72  +j+2;.      pTer
8e70: 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
8e80: 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
8e90: 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20  NEVER(pTerm==0) 
8ea0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8eb0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
8ec0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
8ed0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71  {.        codeEq
8ee0: 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
8ef0: 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
8f00: 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67  , j, bRev, iTarg
8f10: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  et);.        add
8f20: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
8f30: 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
8f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
8f60: 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
8f70: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
8f80: 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
8f90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8fa0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8fb0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f   OP_Integer, pLo
8fc0: 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
8fd0: 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
8fe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8ff0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
9000: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67  Constraint, iReg
9010: 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
9020: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9030: 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
9040: 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
9050: 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eg,.            
9060: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
9070: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a  >u.vtab.idxStr,.
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
90a0: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50  tab.needFree ? P
90b0: 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
90c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64 62 65  TATIC);.    Vdbe
90d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
90e0: 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
90f0: 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
9100: 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
9110: 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
9120: 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  op = pWInfo->eOn
9130: 65 50 61 73 73 20 3f 20 4f 50 5f 4e 6f 6f 70 20  ePass ? OP_Noop 
9140: 3a 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  : OP_VNext;.    
9150: 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
9160: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9170: 64 64 72 28 76 29 3b 0a 20 20 20 20 69 49 6e 20  ddr(v);.    iIn 
9180: 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
9190: 49 6e 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 43  In;.    for(j=nC
91a0: 6f 6e 73 74 72 61 69 6e 74 2d 31 3b 20 6a 3e 3d  onstraint-1; j>=
91b0: 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
91c0: 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
91d0: 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
91e0: 66 28 20 6a 3c 31 36 20 26 26 20 28 70 4c 6f 6f  f( j<16 && (pLoo
91f0: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
9200: 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20  sk>>j)&1 ){.    
9210: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
9220: 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
9230: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9240: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
9250: 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
9260: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
9270: 43 6f 6d 70 61 72 65 3b 20 20 2f 2a 20 54 68 65  Compare;  /* The
9280: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
9290: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
92a0: 45 78 70 72 20 2a 70 52 69 67 68 74 3b 20 20 20  Expr *pRight;   
92b0: 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20 63   /* RHS of the c
92c0: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 20  omparison */.   
92d0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
92e0: 3b 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20  ;     /* Opcode 
92f0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 61  to access the va
9300: 6c 75 65 20 6f 66 20 74 68 65 20 49 4e 20 63 6f  lue of the IN co
9310: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20  nstraint */..   
9320: 20 20 20 20 20 2f 2a 20 52 65 6c 6f 61 64 20 74       /* Reload t
9330: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  he constraint va
9340: 6c 75 65 20 69 6e 74 6f 20 72 65 67 5b 69 52 65  lue into reg[iRe
9350: 67 2b 6a 2b 32 5d 2e 20 20 54 68 65 20 73 61 6d  g+j+2].  The sam
9360: 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
9370: 2a 2a 20 77 61 73 20 6c 6f 61 64 65 64 20 69 6e  ** was loaded in
9380: 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67 69  to the same regi
9390: 73 74 65 72 20 70 72 69 6f 72 20 74 6f 20 74 68  ster prior to th
93a0: 65 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 62 75  e OP_VFilter, bu
93b0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
93c0: 20 78 46 69 6c 74 65 72 20 69 6d 70 6c 65 6d 65   xFilter impleme
93d0: 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 20 68 61  ntation might ha
93e0: 76 65 20 63 68 61 6e 67 65 64 20 74 68 65 20 64  ve changed the d
93f0: 61 74 61 74 79 70 65 20 6f 72 0a 20 20 20 20 20  atatype or.     
9400: 20 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 6f     ** encoding o
9410: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  f the value in t
9420: 68 65 20 72 65 67 69 73 74 65 72 2c 20 73 6f 20  he register, so 
9430: 69 74 20 2a 6d 75 73 74 2a 20 62 65 20 72 65 6c  it *must* be rel
9440: 6f 61 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  oaded. */.      
9450: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
9460: 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 21 3d  ->u.in.aInLoop!=
9470: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9480: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
9490: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
94a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
94b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 3e      assert( iIn>
94c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
94d0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
94e0: 47 65 74 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d  GetOp(v, pLevel-
94f0: 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 2d 2d  >u.in.aInLoop[--
9500: 69 49 6e 5d 2e 61 64 64 72 49 6e 54 6f 70 29 3b  iIn].addrInTop);
9510: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9520: 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
9530: 4f 50 5f 43 6f 6c 75 6d 6e 20 7c 7c 20 70 4f 70  OP_Column || pOp
9540: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
9550: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  id );.          
9560: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
9570: 6f 64 65 21 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 7c  ode!=OP_Column |
9580: 7c 20 70 4f 70 2d 3e 70 33 3d 3d 69 52 65 67 2b  | pOp->p3==iReg+
9590: 6a 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  j+2 );.         
95a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
95b0: 63 6f 64 65 21 3d 4f 50 5f 52 6f 77 69 64 20 7c  code!=OP_Rowid |
95c0: 7c 20 70 4f 70 2d 3e 70 32 3d 3d 69 52 65 67 2b  | pOp->p2==iReg+
95d0: 6a 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  j+2 );.         
95e0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
95f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
9600: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
9610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9620: 76 2c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 2c 20  v, pOp->opcode, 
9630: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
9640: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  , pOp->p3);.    
9650: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
9660: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9670: 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  that will contin
9680: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ue to the next r
9690: 6f 77 20 69 66 20 0a 20 20 20 20 20 20 20 20 2a  ow if .        *
96a0: 2a 20 74 68 65 20 49 4e 20 63 6f 6e 73 74 72 61  * the IN constra
96b0: 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
96c0: 66 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  fied */.        
96d0: 70 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  pCompare = sqlit
96e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
96f0: 54 4b 5f 45 51 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_EQ, 0, 0, 0);
9700: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9710: 20 70 43 6f 6d 70 61 72 65 21 3d 30 20 7c 7c 20   pCompare!=0 || 
9720: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9730: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9740: 70 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20  pCompare ){.    
9750: 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d 3e        pCompare->
9760: 70 4c 65 66 74 20 3d 20 70 54 65 72 6d 2d 3e 70  pLeft = pTerm->p
9770: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
9780: 20 20 20 20 20 20 20 70 43 6f 6d 70 61 72 65 2d         pCompare-
9790: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
97a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
97b0: 62 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  b, TK_REGISTER, 
97c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
97d0: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
97e0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
97f0: 69 54 61 62 6c 65 20 3d 20 69 52 65 67 2b 6a 2b  iTable = iReg+j+
9800: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  2;.            s
9810: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
9820: 65 28 70 50 61 72 73 65 2c 20 70 43 6f 6d 70 61  e(pParse, pCompa
9830: 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  re, pLevel->addr
9840: 43 6f 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cont, 0);.      
9850: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9860: 70 43 6f 6d 70 61 72 65 2d 3e 70 4c 65 66 74 20  pCompare->pLeft 
9870: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
9880: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9890: 28 64 62 2c 20 70 43 6f 6d 70 61 72 65 29 3b 0a  (db, pCompare);.
98a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
98b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54  }.    }.    /* T
98c0: 68 65 73 65 20 72 65 67 69 73 74 65 72 73 20 6e  hese registers n
98d0: 65 65 64 20 74 6f 20 62 65 20 70 72 65 73 65 72  eed to be preser
98e0: 76 65 64 20 69 6e 20 63 61 73 65 20 74 68 65 72  ved in case ther
98f0: 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
9900: 74 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e  tor.    ** loop.
9910: 20 20 53 6f 20 77 65 20 63 6f 75 6c 64 20 64 65    So we could de
9920: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 67  allocate the reg
9930: 69 73 74 65 72 73 20 68 65 72 65 20 28 61 6e 64  isters here (and
9940: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20   potentially.   
9950: 20 2a 2a 20 72 65 75 73 65 20 74 68 65 6d 20 6c   ** reuse them l
9960: 61 74 65 72 29 20 69 66 20 28 70 4c 6f 6f 70 2d  ater) if (pLoop-
9970: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
9980: 5f 49 4e 5f 41 42 4c 45 29 3d 3d 30 2e 20 20 42  _IN_ABLE)==0.  B
9990: 75 74 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20  ut it seems.    
99a0: 2a 2a 20 73 69 6d 70 6c 65 72 20 61 6e 64 20 73  ** simpler and s
99b0: 61 66 65 72 20 74 6f 20 73 69 6d 70 6c 79 20 6e  afer to simply n
99c0: 6f 74 20 72 65 75 73 65 20 74 68 65 20 72 65 67  ot reuse the reg
99d0: 69 73 74 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  isters..    **. 
99e0: 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 33     **    sqlite3
99f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
9a00: 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
9a10: 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
9a20: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
9a30: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
9a40: 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  arse);.  }else.#
9a50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9a60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9a70: 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f  E */..  if( (pLo
9a80: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
9a90: 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26  ERE_IPK)!=0.   &
9aa0: 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
9ab0: 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
9ac0: 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
9ad0: 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20  N_EQ))!=0.  ){. 
9ae0: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
9af0: 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
9b00: 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
9b10: 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
9b20: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
9b30: 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
9b40: 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
9b50: 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
9b60: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
9b70: 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
9b80: 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
9b90: 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
9ba0: 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
9bb0: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
9bc0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
9bd0: 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
9be0: 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 70  .nEq==1 );.    p
9bf0: 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
9c00: 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
9c10: 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
9c30: 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
9c40: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
9c50: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
9c60: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
9c70: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9c80: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 69  VIRTUAL );.    i
9c90: 52 65 6c 65 61 73 65 52 65 67 20 3d 20 2b 2b 70  ReleaseReg = ++p
9ca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9cb0: 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
9cc0: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
9cd0: 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
9ce0: 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52  vel, 0, bRev, iR
9cf0: 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
9d00: 69 66 28 20 69 52 6f 77 69 64 52 65 67 21 3d 69  if( iRowidReg!=i
9d10: 52 65 6c 65 61 73 65 52 65 67 20 29 20 73 71 6c  ReleaseReg ) sql
9d20: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9d30: 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
9d40: 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
9d50: 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
9d60: 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
9d70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9d80: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69   OP_SeekRowid, i
9d90: 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
9da0: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
9db0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9dc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
9dd0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
9de0: 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
9df0: 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
9e00: 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
9e10: 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
9e20: 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
9e30: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
9e40: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
9e50: 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
9e60: 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
9e70: 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
9e80: 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
9e90: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
9ea0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
9eb0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
9ec0: 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
9ed0: 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
9ee0: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
9ef0: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
9f00: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
9f10: 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
9f20: 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
9f30: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
9f40: 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
9f50: 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
9f60: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
9f70: 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
9f80: 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
9f90: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
9fa0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
9fb0: 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
9fc0: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
9fd0: 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
9fe0: 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
9ff0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
a000: 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
a010: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
a020: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
a030: 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
a040: 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
a050: 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
a060: 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
a070: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
a080: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
a090: 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
a0a0: 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
a0b0: 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
a0c0: 20 20 7d 0a 20 20 20 20 63 6f 64 65 43 75 72 73    }.    codeCurs
a0d0: 6f 72 48 69 6e 74 28 70 54 61 62 49 74 65 6d 2c  orHint(pTabItem,
a0e0: 20 70 57 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c   pWInfo, pLevel,
a0f0: 20 70 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20   pEnd);.    if( 
a100: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
a110: 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
a120: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
a130: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
a140: 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
a150: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
a160: 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
a170: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
a180: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
a190: 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
a1a0: 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
a1b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
a1c0: 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
a1d0: 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
a1e0: 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
a1f0: 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
a200: 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
a210: 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
a220: 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
a230: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
a240: 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
a250: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
a260: 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
a270: 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
a280: 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
a290: 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
a2a0: 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
a2b0: 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
a2c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
a2d0: 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
a2e0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
a2f0: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
a300: 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
a310: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
a320: 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
a330: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
a340: 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
a350: 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
a360: 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
a370: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a380: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
a390: 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
a3a0: 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
a3b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
a3c0: 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
a3d0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
a3e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a3f0: 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
a400: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
a410: 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
a420: 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
a430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
a440: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
a450: 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
a460: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
a470: 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
a480: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
a490: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
a4a0: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
a4b0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
a4c0: 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
a4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a4e0: 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
a4f0: 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
a500: 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
a510: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
a520: 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
a530: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a540: 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
a550: 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
a560: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a570: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
a580: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a590: 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
a5a0: 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
a5b0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a5c0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
a5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a5e0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
a5f0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
a600: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
a610: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
a620: 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
a630: 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
a640: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
a650: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
a660: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a670: 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
a680: 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
a690: 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
a6a0: 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
a6b0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
a6c0: 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
a6d0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a6e0: 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
a6f0: 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
a700: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
a710: 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
a720: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
a730: 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
a740: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
a750: 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
a760: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
a770: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a780: 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
a790: 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
a7a0: 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
a7b0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
a7c0: 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
a7d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
a7e0: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
a7f0: 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
a800: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
a810: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a820: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
a830: 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
a840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
a850: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
a860: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
a870: 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
a880: 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
a890: 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
a8a0: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
a8b0: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
a8c0: 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
a8d0: 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
a8e0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
a8f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
a900: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
a910: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
a920: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
a930: 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
a940: 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
a950: 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
a960: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
a970: 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
a980: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
a990: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
a9a0: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
a9b0: 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
a9c0: 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
a9d0: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
a9e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a9f0: 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
aa00: 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
aa10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
aa20: 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
aa30: 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
aa40: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
aa50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
aa60: 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
aa70: 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
aa80: 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
aa90: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
aaa0: 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
aab0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
aac0: 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
aad0: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
aae0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
aaf0: 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
ab00: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ab10: 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
ab20: 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
ab30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ab40: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
ab50: 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
ab60: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
ab70: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
ab80: 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
ab90: 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
aba0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
abb0: 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
abc0: 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
abd0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
abe0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
abf0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
ac00: 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
ac10: 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
ac20: 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
ac30: 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
ac40: 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
ac50: 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
ac60: 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
ac70: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
ac80: 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
ac90: 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
aca0: 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
acb0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
acc0: 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
acd0: 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
ace0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
acf0: 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
ad00: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
ad10: 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
ad20: 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
ad30: 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
ad40: 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
ad50: 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
ad60: 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
ad70: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
ad80: 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
ad90: 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
ada0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
adb0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
adc0: 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
add0: 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
ade0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
adf0: 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
ae00: 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
ae10: 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
ae20: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
ae30: 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
ae40: 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
ae50: 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
ae60: 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
ae70: 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
ae80: 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
ae90: 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
aea0: 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
aeb0: 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
aec0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
aed0: 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
aee0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
aef0: 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
af00: 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
af10: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
af20: 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
af30: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
af40: 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
af50: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
af60: 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
af70: 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
af80: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
af90: 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
afa0: 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
afb0: 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
afc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
afd0: 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
afe0: 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
aff0: 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
b000: 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
b010: 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
b020: 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
b030: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
b040: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
b050: 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
b060: 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
b070: 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
b080: 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
b090: 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
b0a0: 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
b0b0: 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
b0c0: 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
b0d0: 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
b0e0: 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
b0f0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
b100: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
b110: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
b120: 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
b130: 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
b140: 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
b150: 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
b160: 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
b170: 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
b180: 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
b190: 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
b1a0: 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
b1b0: 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
b1c0: 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
b1d0: 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
b1e0: 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
b1f0: 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
b200: 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
b210: 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
b220: 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
b230: 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
b240: 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
b250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
b260: 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
b270: 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
b280: 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
b290: 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
b2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
b2b0: 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
b2c0: 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
b2d0: 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
b2e0: 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
b2f0: 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
b300: 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
b310: 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
b320: 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
b330: 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
b340: 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
b350: 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
b360: 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
b370: 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
b380: 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
b390: 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
b3a0: 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
b3b0: 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
b3c0: 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
b3d0: 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
b3e0: 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
b3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
b400: 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
b410: 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
b420: 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
b430: 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
b440: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
b450: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b460: 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
b470: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
b480: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
b490: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
b4a0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
b4b0: 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
b4c0: 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
b4d0: 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
b4e0: 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
b4f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
b500: 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
b510: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
b520: 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
b530: 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
b540: 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
b550: 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
b560: 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
b570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b580: 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
b590: 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
b5a0: 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
b5b0: 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
b5c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b5d0: 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
b5e0: 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
b5f0: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
b600: 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
b610: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
b620: 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
b630: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
b640: 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
b650: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b660: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
b670: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
b680: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
b690: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b6a0: 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
b6b0: 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
b6c0: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
b6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b6e0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
b6f0: 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
b700: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
b710: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
b730: 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
b740: 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
b750: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
b760: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
b770: 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
b780: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
b790: 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
b7a0: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
b7b0: 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
b7c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
b7d0: 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
b7e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b7f0: 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
b800: 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
b810: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
b820: 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
b830: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
b840: 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
b850: 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
b860: 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
b870: 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
b880: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
b890: 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
b8a0: 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
b8b0: 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
b8c0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
b8d0: 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
b8e0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
b8f0: 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
b900: 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a  pLoop->nSkip );.
b910: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
b920: 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
b930: 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
b940: 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
b950: 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
b960: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
b970: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
b980: 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
b990: 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
b9a0: 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
b9b0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
b9c0: 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
b9d0: 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
b9e0: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
b9f0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
ba00: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
ba10: 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
ba20: 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
ba30: 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
ba40: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
ba50: 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
ba60: 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
ba70: 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
ba80: 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
ba90: 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
baa0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
bab0: 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
bac0: 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
bad0: 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
bae0: 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
baf0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20  >pOrderBy==0.   
bb00: 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
bb10: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
bb20: 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
bb30: 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
bb40: 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
bb50: 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  Y_MIN)==0 );.   
bb60: 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
bb70: 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
bb80: 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
bb90: 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
bba0: 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20  OBSat>0.     && 
bbb0: 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e  (pIdx->nKeyCol>n
bbc0: 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
bbd0: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
bbe0: 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
bbf0: 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
bc00: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
bc10: 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
bc20: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
bc30: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
bc40: 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
bc50: 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
bc60: 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
bc70: 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
bc80: 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
bc90: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
bca0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
bcb0: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
bcc0: 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
bcd0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
bce0: 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
bcf0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  g = 1;.      /* 
bd00: 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  Like optimizatio
bd10: 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
bd20: 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75 72  nts always occur
bd30: 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20   in pairs */.   
bd40: 20 20 20 61 73 73 65 72 74 28 20 28 70 52 61 6e     assert( (pRan
bd50: 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
bd60: 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29   & TERM_LIKEOPT)
bd70: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
bd80: 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77 73        (pLoop->ws
bd90: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
bda0: 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a 20  P_LIMIT)!=0 );. 
bdb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
bdc0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
bdd0: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
bde0: 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
bdf0: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
be00: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
be10: 74 72 61 52 65 67 20 3d 20 31 3b 0a 23 69 66 6e  traReg = 1;.#ifn
be20: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
be30: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
be40: 42 53 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  BS.      if( (pR
be50: 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
be60: 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29   & TERM_LIKEOPT)
be70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
be80: 73 73 65 72 74 28 20 70 52 61 6e 67 65 53 74 61  ssert( pRangeSta
be90: 72 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  rt!=0 );        
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 4c 49 4b 45 20 6f 70 74 20 63 6f 6e 73 74 72 61  LIKE opt constra
bec0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
bed0: 61 73 73 65 72 74 28 20 70 52 61 6e 67 65 53 74  assert( pRangeSt
bee0: 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
bef0: 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 20 20  ERM_LIKEOPT );  
bf00: 20 2f 2a 20 6f 63 63 75 72 20 69 6e 20 70 61 69   /* occur in pai
bf10: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  rs */.        pL
bf20: 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
bf30: 74 72 20 3d 20 28 75 33 32 29 2b 2b 70 50 61 72  tr = (u32)++pPar
bf40: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
bf50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
bf70: 72 2c 20 31 2c 20 28 69 6e 74 29 70 4c 65 76 65  r, 1, (int)pLeve
bf80: 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 29  l->iLikeRepCntr)
bf90: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
bfa0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4b 45 20  mment((v, "LIKE 
bfb0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 22 29 29 3b  loop counter"));
bfc0: 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
bfd0: 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 3d 20 73  >addrLikeRep = s
bfe0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
bff0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
c000: 20 20 2f 2a 20 69 4c 69 6b 65 52 65 70 43 6e 74    /* iLikeRepCnt
c010: 72 20 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65  r actually store
c020: 73 20 32 78 20 74 68 65 20 63 6f 75 6e 74 65 72  s 2x the counter
c030: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
c040: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
c050: 2a 20 62 6f 74 74 6f 6d 20 62 69 74 20 69 6e 64  * bottom bit ind
c060: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74  icates whether t
c070: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
c080: 69 73 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20  is ASC or DESC. 
c090: 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
c0a0: 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
c0b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c0c0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
c0d0: 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
c0e0: 44 45 53 43 20 29 3b 0a 20 20 20 20 20 20 20 20  DESC );.        
c0f0: 61 73 73 65 72 74 28 20 28 62 52 65 76 20 26 20  assert( (bRev & 
c100: 7e 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ~1)==0 );.      
c110: 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
c120: 65 70 43 6e 74 72 20 3c 3c 3d 31 3b 0a 20 20 20  epCntr <<=1;.   
c130: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69       pLevel->iLi
c140: 6b 65 52 65 70 43 6e 74 72 20 7c 3d 20 62 52 65  keRepCntr |= bRe
c150: 76 20 5e 20 28 70 49 64 78 2d 3e 61 53 6f 72 74  v ^ (pIdx->aSort
c160: 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
c170: 54 45 5f 53 4f 5f 44 45 53 43 29 3b 0a 20 20 20  TE_SO_DESC);.   
c180: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c190: 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
c1a0: 74 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  t==0.       && (
c1b0: 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  j = pIdx->aiColu
c1c0: 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20  mn[nEq])>=0 .   
c1d0: 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 54 61      && pIdx->pTa
c1e0: 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  ble->aCol[j].not
c1f0: 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b  Null==0.      ){
c200: 0a 20 20 20 20 20 20 20 20 62 53 65 65 6b 50 61  .        bSeekPa
c210: 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  stNull = 1;.    
c220: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
c230: 73 65 72 74 28 20 70 52 61 6e 67 65 45 6e 64 3d  sert( pRangeEnd=
c240: 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64  =0 || (pRangeEnd
c250: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
c260: 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20  _VNULL)==0 );.. 
c270: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
c280: 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
c290: 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
c2a0: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
c2b0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
c2c0: 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
c2d0: 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
c2e0: 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
c2f0: 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
c300: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
c310: 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
c320: 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
c330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c340: 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
c350: 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
c360: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
c370: 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
c380: 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
c390: 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
c3a0: 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
c3b0: 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
c3c0: 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
c3d0: 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
c3e0: 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20  .      SWAP(u8, 
c3f0: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62  bSeekPastNull, b
c400: 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20  StopAtNull);.   
c410: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
c420: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
c430: 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
c440: 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
c450: 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
c460: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
c470: 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
c480: 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
c490: 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
c4a0: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
c4b0: 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
c4c0: 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48 69      codeCursorHi
c4d0: 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57 49  nt(pTabItem, pWI
c4e0: 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 70 52 61  nfo, pLevel, pRa
c4f0: 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 72 65 67  ngeEnd);.    reg
c500: 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
c510: 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
c520: 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e  se,pLevel,bRev,n
c530: 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74  ExtraReg,&zStart
c540: 41 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Aff);.    assert
c550: 28 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c  ( zStartAff==0 |
c560: 7c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  | sqlite3Strlen3
c570: 30 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45  0(zStartAff)>=nE
c580: 71 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74  q );.    if( zSt
c590: 61 72 74 41 66 66 20 29 20 63 45 6e 64 41 66 66  artAff ) cEndAff
c5a0: 20 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71   = zStartAff[nEq
c5b0: 5d 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  ];.    addrNxt =
c5c0: 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
c5d0: 3b 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ;..    testcase(
c5e0: 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
c5f0: 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
c600: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
c610: 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
c620: 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
c630: 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
c640: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c650: 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _GE)!=0 );.    t
c660: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
c670: 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
c680: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c690: 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
c6a0: 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
c6b0: 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
c6c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c6d0: 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73  _GE)!=0 );.    s
c6e0: 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
c6f0: 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
c700: 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
c710: 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
c720: 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
c730: 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
c740: 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
c750: 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
c760: 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
c770: 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
c780: 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
c790: 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
c7a0: 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
c7b0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
c7c0: 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
c7d0: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
c7e0: 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
c7f0: 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
c800: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
c810: 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
c820: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
c830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c840: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
c850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
c860: 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65 4f        whereLikeO
c870: 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e  ptimizationStrin
c880: 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65 6c  gFixup(v, pLevel
c890: 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
c8a0: 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
c8b0: 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
c8c0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
c8d0: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
c8e0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
c8f0: 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
c900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c910: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c920: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
c930: 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
c940: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
c950: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
c960: 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
c970: 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
c980: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
c990: 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
c9a0: 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
c9b0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ])==SQLITE_AFF_B
c9c0: 4c 4f 42 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LOB){.          
c9d0: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
c9e0: 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
c9f0: 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
ca00: 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
ca10: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
ca20: 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
ca30: 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
ca40: 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
ca50: 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
ca60: 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
ca70: 5f 41 46 46 5f 42 4c 4f 42 2e 20 20 2a 2f 0a 20  _AFF_BLOB.  */. 
ca80: 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
ca90: 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
caa0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
cab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
cac0: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
cad0: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
cae0: 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
caf0: 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
cb00: 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
cb10: 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
cb20: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
cb30: 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
cb40: 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
cb50: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cb60: 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
cb70: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
cb80: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 62  RTUAL );.      b
cb90: 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30  SeekPastNull = 0
cba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
cbb0: 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29 7b  bSeekPastNull ){
cbc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cbd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
cbe0: 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
cbf0: 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
cc00: 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
cc10: 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
cc20: 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
cc30: 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
cc40: 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
cc50: 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
cc60: 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
cc70: 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74 4e  int - bSeekPastN
cc80: 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  ull, zStartAff);
cc90: 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
cca0: 6e 53 6b 69 70 3e 30 20 26 26 20 6e 43 6f 6e 73  nSkip>0 && nCons
ccb0: 74 72 61 69 6e 74 3d 3d 70 4c 6f 6f 70 2d 3e 6e  traint==pLoop->n
ccc0: 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Skip ){.      /*
ccd0: 20 54 68 65 20 73 6b 69 70 2d 73 63 61 6e 20 6c   The skip-scan l
cce0: 6f 67 69 63 20 69 6e 73 69 64 65 20 74 68 65 20  ogic inside the 
ccf0: 63 61 6c 6c 20 74 6f 20 63 6f 64 65 41 6c 6c 45  call to codeAllE
cd00: 71 75 61 6c 69 74 79 43 6f 6e 73 74 72 61 69 6e  qualityConstrain
cd10: 74 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 61 62  ts().      ** ab
cd20: 6f 76 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ove has already 
cd30: 6c 65 66 74 20 74 68 65 20 63 75 72 73 6f 72 20  left the cursor 
cd40: 73 69 74 74 69 6e 67 20 6f 6e 20 74 68 65 20 63  sitting on the c
cd50: 6f 72 72 65 63 74 20 72 6f 77 2c 0a 20 20 20 20  orrect row,.    
cd60: 20 20 2a 2a 20 73 6f 20 6e 6f 20 66 75 72 74 68    ** so no furth
cd70: 65 72 20 73 65 65 6b 69 6e 67 20 69 73 20 6e 65  er seeking is ne
cd80: 65 64 65 64 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  eded */.    }els
cd90: 65 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 53  e{.      op = aS
cda0: 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
cdb0: 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
cdc0: 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
cdd0: 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Rev];.      asse
cde0: 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
cdf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce00: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
ce10: 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
ce20: 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
ce30: 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 56 64  raint);.      Vd
ce40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ce50: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
ce60: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65  eIf(v, op==OP_Re
ce70: 77 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65  wind);  testcase
ce80: 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
ce90: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
cea0: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
ceb0: 50 5f 4c 61 73 74 29 3b 20 20 20 20 74 65 73 74  P_Last);    test
cec0: 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
ced0: 74 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  t );.      VdbeC
cee0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
cef0: 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74 65  =OP_SeekGT);  te
cf00: 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
cf10: 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 20 20 56  eekGT );.      V
cf20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
cf30: 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b   op==OP_SeekGE);
cf40: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
cf50: 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20  OP_SeekGE );.   
cf60: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
cf70: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
cf80: 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  LE);  testcase( 
cf90: 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b  op==OP_SeekLE );
cfa0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
cfb0: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
cfc0: 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
cfd0: 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
cfe0: 54 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  T );.    }..    
cff0: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
d000: 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
d010: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
d020: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d030: 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
d040: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
d050: 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
d060: 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
d070: 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
d080: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
d090: 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
d0a0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
d0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
d0c0: 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
d0d0: 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
d0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d0f0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d100: 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
d110: 45 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  Eq);.      where
d120: 4c 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  LikeOptimization
d130: 53 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70  StringFixup(v, p
d140: 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
d150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
d160: 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
d170: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
d180: 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
d190: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
d1a0: 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d1c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d1d0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
d1e0: 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
d1f0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
d200: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d210: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
d220: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
d230: 74 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41  ty(pRight, cEndA
d240: 66 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff)!=SQLITE_AFF_
d250: 42 4c 4f 42 0a 20 20 20 20 20 20 20 26 26 20 21  BLOB.       && !
d260: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
d270: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
d280: 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66  (pRight, cEndAff
d290: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
d2a0: 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
d2b0: 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
d2c0: 42 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45  Base+nEq, 1, &cE
d2d0: 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  ndAff);.      }.
d2e0: 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
d2f0: 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
d300: 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
d310: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d320: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
d330: 6c 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e  lse if( bStopAtN
d340: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
d350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d360: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
d370: 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
d380: 20 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20    endEq = 0;.   
d390: 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
d3a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d3b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
d3c0: 74 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f  tartAff);..    /
d3d0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
d3e0: 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
d3f0: 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
d400: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d410: 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
d420: 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
d430: 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
d440: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
d450: 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ange. */.    if(
d460: 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a   nConstraint ){.
d470: 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f        op = aEndO
d480: 70 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71  p[bRev*2 + endEq
d490: 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
d4a0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d4b0: 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
d4c0: 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
d4d0: 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
d4e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
d4f0: 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56  ==OP_IdxGT );  V
d500: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
d510: 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b   op==OP_IdxGT );
d520: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d530: 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
d540: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
d550: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  (v, op==OP_IdxGE
d560: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
d570: 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
d580: 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
d590: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
d5a0: 78 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  xLT );.      tes
d5b0: 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
d5c0: 78 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xLE );  VdbeCove
d5d0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
d5e0: 5f 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a  _IdxLE );.    }.
d5f0: 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
d600: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
d610: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
d620: 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
d630: 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
d640: 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
d650: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
d660: 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
d670: 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  omitTable ){.   
d680: 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20     /* pIdx is a 
d690: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
d6a0: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65   No need to acce
d6b0: 73 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ss the main tabl
d6c0: 65 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  e. */.    }else 
d6d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64  if( HasRowid(pId
d6e0: 78 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  x->pTable) ){.  
d6f0: 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
d700: 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
d710: 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45 29 21  ERE_SEEK_TABLE)!
d720: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52  =0 ){.        iR
d730: 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72  owidReg = ++pPar
d740: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d760: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
d770: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
d780: 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 20  widReg);.       
d790: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
d7a0: 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
d7b0: 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
d7c0: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eg);.        sql
d7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d7e0: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
d7f0: 69 43 75 72 2c 20 30 2c 20 69 52 6f 77 69 64 52  iCur, 0, iRowidR
d800: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  eg);.        Vdb
d810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d830: 20 20 20 63 6f 64 65 44 65 66 65 72 72 65 64 53     codeDeferredS
d840: 65 65 6b 28 70 57 49 6e 66 6f 2c 20 70 49 64 78  eek(pWInfo, pIdx
d850: 2c 20 69 43 75 72 2c 20 69 49 64 78 43 75 72 29  , iCur, iIdxCur)
d860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d870: 6c 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49  lse if( iCur!=iI
d880: 64 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49  dxCur ){.      I
d890: 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
d8a0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
d8b0: 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29  ex(pIdx->pTable)
d8c0: 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  ;.      iRowidRe
d8d0: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
d8e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d8f0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  pPk->nKeyCol);. 
d900: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
d910: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
d920: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
d930: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
d940: 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e  ndex(pIdx, pPk->
d950: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20  aiColumn[j]);.  
d960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d970: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d980: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b  lumn, iIdxCur, k
d990: 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a  , iRowidReg+j);.
d9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d9b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d9c0: 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
d9d0: 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e  d, iCur, addrCon
d9e0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52                iR
da00: 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b  owidReg, pPk->nK
da10: 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
da20: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a  rage(v);.    }..
da30: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
da40: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
da50: 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
da60: 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
da70: 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
da80: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
da90: 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
daa0: 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
dab0: 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
dac0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
dad0: 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
dae0: 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  W ){.      pLeve
daf0: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
db00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
db10: 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  Rev ){.      pLe
db20: 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
db30: 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
db40: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
db50: 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   OP_Next;.    }.
db60: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
db70: 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c   iIdxCur;.    pL
db80: 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f  evel->p3 = (pLoo
db90: 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
dba0: 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20  _UNQ_WANTED)!=0 
dbb0: 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28  ? 1:0;.    if( (
dbc0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
dbd0: 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
dbe0: 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  T)==0 ){.      p
dbf0: 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
dc00: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
dc10: 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
dc20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
dc30: 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
dc40: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
dc50: 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
dc60: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
dc70: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
dc80: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
dc90: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
dca0: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35  ){.    /* Case 5
dcb0: 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73  :  Two or more s
dcc0: 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65  eparately indexe
dcd0: 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
dce0: 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20  d by OR.    **. 
dcf0: 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
dd00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43     **.    **   C
dd10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
dd20: 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20  ,b,c,d);.    ** 
dd30: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
dd40: 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
dd50: 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
dd60: 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i2 ON t1(b);. 
dd70: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
dd80: 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29  NDEX i3 ON t1(c)
dd90: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
dda0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
ddb0: 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20  t1 WHERE a=5 OR 
ddc0: 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44  b=7 OR (c=11 AND
ddd0: 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20   d=13).    **.  
dde0: 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d    ** In the exam
ddf0: 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74  ple, there are t
de00: 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72  hree indexed ter
de10: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
de20: 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74  OR..    ** The t
de30: 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c  op of the loop l
de40: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
de50: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
de60: 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
de70: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
de80: 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
de90: 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
dea0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e    **.    ** Then
deb0: 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  , for each index
dec0: 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c  ed term, the fol
ded0: 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75  lowing. The argu
dee0: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ments to.    ** 
def0: 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73  RowSetTest are s
df00: 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77  uch that the row
df10: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
df20: 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  t row is inserte
df30: 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  d.    ** into th
df40: 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20  e RowSet. If it 
df50: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
df60: 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70  nt, control skip
df70: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73  s the.    ** Gos
df80: 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75  ub opcode and ju
df90: 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20  mps straight to 
dfa0: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
dfb0: 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29  ed by WhereEnd()
dfc0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
dfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
dfe0: 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29  ereBegin(<term>)
dff0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
e000: 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20   RowSetTest     
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49               # I
e020: 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f  nsert rowid into
e030: 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20   rowset.    **  
e040: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20          Gosub   
e050: 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20     2 A.    **   
e060: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
e070: 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20  eEnd().    **.  
e080: 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74    ** Following t
e090: 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74  he above, code t
e0a0: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
e0b0: 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74  loop. Label A, t
e0c0: 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a  he target.    **
e0d0: 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62   of the Gosub ab
e0e0: 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68  ove, jumps to th
e0f0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69  e instruction ri
e100: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f  ght after the Go
e110: 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  to..    **.    *
e120: 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
e130: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
e140: 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
e150: 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
e160: 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
e170: 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20    Goto       B  
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
e190: 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69  The loop is fini
e1a0: 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  shed..    **.   
e1b0: 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f   **       A: <lo
e1c0: 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20  op body>        
e1d0: 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72           # Retur
e1e0: 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72  n data, whatever
e1f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
e200: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
e210: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
e220: 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b       # Jump back
e230: 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20   to the Gosub.  
e240: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
e250: 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20    B: <after the 
e260: 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop>.    **.   
e270: 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30   ** Added 2014-0
e280: 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62  5-26: If the tab
e290: 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  le is a WITHOUT 
e2a0: 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65  ROWID table, the
e2b0: 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20  n.    ** use an 
e2c0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
e2d0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77  instead of a Row
e2e0: 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68  Set to record th
e2f0: 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a  e primary.    **
e300: 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77   keys of the row
e310: 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  s we have alread
e320: 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20  y seen..    **. 
e330: 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
e340: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
e350: 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
e360: 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
e370: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
e380: 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
e390: 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
e3a0: 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
e3b0: 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
e3c0: 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
e3d0: 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3f0: 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
e400: 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
e410: 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
e420: 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
e430: 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
e440: 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
e450: 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
e460: 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
e470: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
e480: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
e490: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
e4a0: 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
e4b0: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
e4c0: 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
e4f0: 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
e500: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
e510: 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
e540: 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
e550: 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
e560: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
e570: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
e580: 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
e590: 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
e5a0: 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e5d0: 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
e5e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
e5f0: 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
e600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
e610: 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
e620: 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
e630: 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e660: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
e670: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20  u16 wctrlFlags; 
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
e6a0: 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
e6b0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41   */.    Expr *pA
e6c0: 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20  ndExpr = 0;     
e6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
e6e0: 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20   ".. AND (...)" 
e6f0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
e700: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
e710: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
e720: 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
e730: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
e740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
e750: 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
e760: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
e770: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
e780: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
e790: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
e7a0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
e7b0: 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
e7c0: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
e7d0: 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
e7e0: 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
e7f0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
e800: 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
e810: 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
e820: 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
e830: 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
e840: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
e850: 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
e860: 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
e870: 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
e880: 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
e890: 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
e8a0: 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
e8b0: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
e8c0: 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
e8d0: 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
e8e0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
e8f0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
e900: 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
e910: 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
e920: 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
e930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e940: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
e950: 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
e960: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
e970: 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
e980: 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
e990: 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
e9a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
e9b0: 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
e9c0: 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
e9d0: 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
e9e0: 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
e9f0: 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
ea20: 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
ea30: 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
ea40: 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
ea50: 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
ea60: 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
ea70: 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
ea80: 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
ea90: 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
eaa0: 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
eab0: 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
eac0: 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
ead0: 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
eae0: 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
eaf0: 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
eb00: 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
eb10: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
eb20: 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
eb30: 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
eb40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
eb50: 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
eb60: 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
eb70: 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
eb80: 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
eb90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
eba0: 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
ebb0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
ebc0: 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
ebd0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
ebe0: 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
ebf0: 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
ec00: 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
ec10: 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
ec20: 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
ec30: 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20 63 72   rowset.  Or, cr
ec40: 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
ec50: 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  l index.    ** c
ec60: 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c 64 69 6e  apable of holdin
ec70: 67 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69  g primary keys i
ec80: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
ec90: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 20  WITHOUT ROWID.. 
eca0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
ecb0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
ecc0: 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
ecd0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
ece0: 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
ecf0: 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
ed00: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
ed10: 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
ed20: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
ed30: 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
ed40: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
ed50: 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
ed60: 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
ed70: 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
ed80: 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
ed90: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
eda0: 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
edb0: 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
edc0: 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
edd0: 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
ede0: 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
edf0: 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
ee00: 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
ee10: 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
ee20: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
ee30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
ee40: 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
ee50: 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
ee60: 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
ee70: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
ee80: 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
ee90: 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
eea0: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
eeb0: 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
eec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
eed0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
eee0: 7b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77  {.        regRow
eef0: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
ef00: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
ef10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ef20: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
ef30: 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20  egRowset);.     
ef40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ef50: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
ef60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
ef70: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
ef80: 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 70     regRowset = p
ef90: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
efa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
efb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
efc0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 72 65  penEphemeral, re
efd0: 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d 3e 6e 4b  gRowset, pPk->nK
efe0: 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  eyCol);.        
eff0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
f000: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
f010: 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPk);.      }.  
f020: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
f030: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f040: 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69     }.    iRetIni
f050: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
f060: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f070: 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72  ger, 0, regRetur
f080: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
f090: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
f0a0: 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66  E clause is z of
f0b0: 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20   the form:  (x1 
f0c0: 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e  OR x2 OR ...) AN
f0d0: 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  D y.    ** Then 
f0e0: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 78  for every term x
f0f0: 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20 74  N, evaluate as t
f100: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
f110: 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a  : xN AND z.    *
f120: 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d  * That way, term
f130: 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65 20  s in y that are 
f140: 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68  factored into th
f150: 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69  e disjunction wi
f160: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63  ll.    ** be pic
f170: 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72 65  ked up by the re
f180: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
f190: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
f1a0: 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20  in() below..    
f1b0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c  **.    ** Actual
f1c0: 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70 72  ly, each subexpr
f1d0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72  ession is conver
f1e0: 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77  ted to "xN AND w
f1f0: 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20  " where w is.   
f200: 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73   ** the "interes
f210: 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a  ting" terms of z
f220: 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64 69   - terms that di
f230: 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
f240: 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e  in the.    ** ON
f250: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
f260: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
f270: 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20   and terms that 
f280: 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20  are usable as . 
f290: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20     ** indices.. 
f2a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
f2b0: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61  s optimization a
f2c0: 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  lso only applies
f2d0: 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20 78   if the (x1 OR x
f2e0: 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20  2 OR ...) term. 
f2f0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e     ** is not con
f300: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e  tained in the ON
f310: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
f320: 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53  T JOIN..    ** S
f330: 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f  ee ticket http:/
f340: 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
f350: 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30  src/info/f236930
f360: 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  4e4.    */.    i
f370: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
f380: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
f390: 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
f3a0: 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
f3b0: 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
f3c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
f3d0: 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
f3e0: 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
f3f0: 20 20 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e        if( &pWC->
f400: 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72  a[iTerm] == pTer
f410: 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  m ) continue;.  
f420: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
f430: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f440: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
f450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f460: 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
f470: 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
f480: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
f490: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
f4a0: 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65  case( pWC->a[iTe
f4b0: 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45  rm].wtFlags & TE
f4c0: 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
f4d0: 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
f4e0: 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
f4f0: 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
f500: 45 52 4d 5f 43 4f 44 45 44 29 29 21 3d 30 20 29  ERM_CODED))!=0 )
f510: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
f520: 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
f530: 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
f540: 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
f550: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
f560: 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
f570: 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
f580: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
f590: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
f5a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
f5b0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
f5c0: 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
f5d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
f5e0: 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20  d(db, pAndExpr, 
f5f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
f600: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
f610: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  pr ){.        pA
f620: 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
f630: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
f640: 5f 41 4e 44 7c 54 4b 46 4c 47 5f 44 4f 4e 54 46  _AND|TKFLG_DONTF
f650: 4f 4c 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  OLD, 0, pAndExpr
f660: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f670: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20    }..    /* Run 
f680: 61 20 73 65 70 61 72 61 74 65 20 57 48 45 52 45  a separate WHERE
f690: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
f6a0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
f6b0: 63 6c 61 75 73 65 2e 20 20 41 66 74 65 72 0a 20  clause.  After. 
f6c0: 20 20 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e     ** eliminatin
f6d0: 67 20 64 75 70 6c 69 63 61 74 65 73 20 66 72 6f  g duplicates fro
f6e0: 6d 20 6f 74 68 65 72 20 57 48 45 52 45 20 63 6c  m other WHERE cl
f6f0: 61 75 73 65 73 2c 20 74 68 65 20 61 63 74 69 6f  auses, the actio
f700: 6e 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a  n for each.    *
f710: 2a 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  * sub-WHERE clau
f720: 73 65 20 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f  se is to to invo
f730: 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  ke the main loop
f740: 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f   body as a subro
f750: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
f760: 20 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 20    wctrlFlags =  
f770: 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
f780: 53 45 20 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  SE | (pWInfo->wc
f790: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
f7a0: 5f 53 45 45 4b 5f 54 41 42 4c 45 29 3b 0a 20 20  _SEEK_TABLE);.  
f7b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
f7c0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
f7d0: 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
f7e0: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
f7f0: 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
f800: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
f810: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
f820: 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
f830: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
f840: 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
f850: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
f860: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
f870: 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
f880: 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
f890: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
f8a0: 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54   *pOrExpr = pOrT
f8b0: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43  erm->pExpr; /* C
f8c0: 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65  urrent OR clause
f8d0: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20   term */.       
f8e0: 20 69 6e 74 20 6a 6d 70 31 20 3d 20 30 3b 20 20   int jmp1 = 0;  
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a   /* Address of j
f910: 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ump operation */
f920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e  .        if( pAn
f930: 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61  dExpr && !ExprHa
f940: 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70  sProperty(pOrExp
f950: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
f960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
f970: 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
f980: 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
f990: 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
f9a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
f9b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f9c0: 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
f9d0: 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
f9e0: 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
f9f0: 2f 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  /.        WHERET
fa00: 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 53  RACE(0xffff, ("S
fa10: 75 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c  ubplan for OR-cl
fa20: 61 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ause:\n"));.    
fa30: 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
fa40: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
fa50: 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
fa60: 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
fa70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67         wctrlFlag
faa0: 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  s, iCovCur);.   
fab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
fac0: 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
fad0: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
fae0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
faf0: 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
fb00: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
fb10: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
fb20: 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
fb30: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
fb40: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
fb50: 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
fb70: 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
fb80: 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
fb90: 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
fba0: 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
fbb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
fbc0: 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61  lite3WhereAddSca
fbd0: 6e 53 74 61 74 75 73 28 76 2c 20 70 4f 72 54 61  nStatus(v, pOrTa
fbe0: 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
fbf0: 5b 30 5d 2c 20 61 64 64 72 45 78 70 6c 61 69 6e  [0], addrExplain
fc00: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
fc10: 20 54 68 69 73 20 69 73 20 74 68 65 20 73 75 62   This is the sub
fc20: 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f  -WHERE clause bo
fc30: 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20  dy.  First skip 
fc40: 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  over.          *
fc50: 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  * duplicate rows
fc60: 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d   from prior sub-
fc70: 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61  WHERE clauses, a
fc80: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20  nd record the.  
fc90: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
fca0: 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
fcb0: 29 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  ) for the curren
fcc0: 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68  t row so that th
fcd0: 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
fce0: 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   ** row will be 
fcf0: 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73 65  skipped in subse
fd00: 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20  quent sub-WHERE 
fd10: 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
fd20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
fd30: 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
fd40: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
fd50: 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
fd60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
fd70: 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
fd80: 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
fd90: 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
fda0: 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
fdb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73           if( Has
fdc0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d               r =
fde0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fdf0: 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
fe00: 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  , pTab, -1, iCur
fe10: 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a  , regRowid, 0);.
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d                jm
fe30: 70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p1 = sqlite3Vdbe
fe40: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
fe50: 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
fe60: 6f 77 73 65 74 2c 20 30 2c 0a 20 20 20 20 20 20  owset, 0,.      
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 20 20 72 2c 69 53 65 74 29 3b 0a 20 20       r,iSet);.  
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
feb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fec0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
fee0: 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
fef0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
ff00: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
ff10: 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6b 20 3d         int nPk =
ff20: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20   pPk->nKeyCol;. 
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
ff40: 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20   iPk;..         
ff50: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
ff60: 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61 72 72 61   PK into an arra
ff70: 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69 73 74  y of temp regist
ff80: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ers. */.        
ff90: 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
ffa0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
ffb0: 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  arse, nPk);.    
ffc0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
ffd0: 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b 20 69 50  k=0; iPk<nPk; iP
ffe0: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
fff0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10000 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
10010 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk];.           
10020 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10030 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  CodeGetColumnToR
10040 65 67 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  eg(pParse, pTab,
10050 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69   iCol, iCur, r+i
10060 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
10070 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
10080 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
10090 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
100a0 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
100b0 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f 2c  this key. If so,
100c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
100d0 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61 6c  * the row has al
100e0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c 75  ready been inclu
100f0 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ded in the resul
10100 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20 20  t set and.      
10110 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62          ** can b
10120 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a 75  e ignored (by ju
10130 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20 47  mping past the G
10140 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74 68  osub below). Oth
10150 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
10160 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20        ** insert 
10170 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
10180 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64 20   temp table and 
10190 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72 6f  proceed with pro
101a0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20 20  cessing.        
101b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
101c0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
101d0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  **.             
101e0 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66 20   ** Use some of 
101f0 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69 7a  the same optimiz
10200 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f 77  ations as OP_Row
10210 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65 74  SetTest: If iSet
10220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
10230 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75 6d  * is zero, assum
10240 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 63  e that the key c
10250 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  annot already be
10260 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
10270 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
10280 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e 64   temp table. And
10290 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c 20   if iSet is -1, 
102a0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 72  assume that ther
102b0 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20 20  e is no .       
102c0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
102d0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  o insert the key
102e0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
102f0 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  able, as it will
10300 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20 20   never .        
10310 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73 74        ** be test
10320 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20 20  ed for.  */ .   
10330 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
10340 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
10350 20 20 20 20 20 20 20 6a 6d 70 31 20 3d 20 73 71         jmp1 = sq
10360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
10370 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
10380 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
10390 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
103a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
103b0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
103c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
103d0 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d        if( iSet>=
103e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
103f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10400 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10410 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c  eRecord, r, nPk,
10420 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10430 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10450 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72   OP_IdxInsert, r
10460 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77  egRowset, regRow
10470 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
10480 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74          if( iSet
10490 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
104a0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
104b0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
104c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
104d0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
104e0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 61  /* Release the a
104f0 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67  rray of temp reg
10500 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  isters */.      
10510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10520 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
10530 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b  pParse, r, nPk);
10540 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
10550 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
10560 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
10570 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
10580 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69  dy as a subrouti
10590 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
105a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
105b0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
105c0 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
105d0 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
105e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73   /* Jump here (s
105f0 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e  kipping the main
10600 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f   loop body subro
10610 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20  utine) if the.  
10620 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
10630 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77  nt sub-WHERE row
10640 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
10650 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57  from prior sub-W
10660 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20  HEREs. */.      
10670 20 20 20 20 69 66 28 20 6a 6d 70 31 20 29 20 73      if( jmp1 ) s
10680 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10690 72 65 28 76 2c 20 6a 6d 70 31 29 3b 0a 0a 20 20  re(v, jmp1);..  
106a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
106b0 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
106c0 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
106d0 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
106e0 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
106f0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
10700 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
10710 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
10720 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
10730 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
10740 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
10750 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
10760 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
10770 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
10780 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
10790 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
107a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
107b0 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
107c0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
107d0 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
107e0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
107f0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
10800 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
10810 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
10820 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
10830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
10840 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
10850 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
10860 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
10870 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
10880 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
10890 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
108a0 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
108b0 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
108c0 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
108d0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
108e0 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
108f0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
10900 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
10910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
10920 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
10930 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10940 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
10950 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
10960 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
10970 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
10980 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
10990 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
109a0 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
109b0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
109c0 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
109d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
109e0 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
109f0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
10a00 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
10a10 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
10a20 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
10a30 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
10a40 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
10a50 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
10a60 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
10a70 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
10a80 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
10a90 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
10aa0 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
10ab0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10ac0 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
10ad0 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
10ae0 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
10af0 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f   assert( (pSubLo
10b00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
10b10 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d  ERE_AUTO_INDEX)=
10b20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
10b30 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  if( (pSubLoop->w
10b40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
10b50 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
10b60 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20        && (ii==0 
10b70 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  || pSubLoop->u.b
10b80 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f  tree.pIndex==pCo
10b90 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  v).           &&
10ba0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
10bb0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
10bc0 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d  yIndex(pSubLoop-
10bd0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
10be0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
10bf0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
10c00 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  t( pSubWInfo->a[
10c10 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76  0].iIdxCur==iCov
10c20 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Cur );.         
10c30 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f     pCov = pSubLo
10c40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
10c50 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ex;.          }e
10c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
10c70 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
10c80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
10c90 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
10ca0 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
10cb0 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
10cc0 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
10cd0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
10ce0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
10cf0 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10d10 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
10d20 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
10d30 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
10d40 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
10d50 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
10d60 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
10d70 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
10d80 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
10d90 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
10da0 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
10db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10dc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
10dd0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
10de0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10df0 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
10e00 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
10e10 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
10e20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10e30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10e40 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
10e50 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
10e60 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
10e70 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
10e80 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
10e90 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
10ea0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
10eb0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
10ec0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
10ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
10ee0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
10ef0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36   {.    /* Case 6
10f00 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
10f10 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
10f20 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
10f30 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
10f40 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
10f50 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
10f60 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
10f70 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
10f80 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
10f90 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
10fa0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
10fb0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
10fc0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
10fd0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
10fe0 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
10ff0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  ;.    if( pTabIt
11000 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
11010 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ve ){.      /* T
11020 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52  ables marked isR
11030 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e  ecursive have on
11040 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ly a single row 
11050 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
11060 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65  n.      ** a pse
11070 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20  udo-cursor.  No 
11080 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f  need to Rewind o
11090 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72 73  r Next such curs
110a0 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ors. */.      pL
110b0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
110c0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  op;.    }else{. 
110d0 20 20 20 20 20 63 6f 64 65 43 75 72 73 6f 72 48       codeCursorH
110e0 69 6e 74 28 70 54 61 62 49 74 65 6d 2c 20 70 57  int(pTabItem, pW
110f0 49 6e 66 6f 2c 20 70 4c 65 76 65 6c 2c 20 30 29  Info, pLevel, 0)
11100 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
11110 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
11120 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
11130 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
11140 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
11150 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
11160 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
11170 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
11180 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
11190 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
111a0 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
111b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
111c0 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70  Rev!=0);.      p
111d0 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
111e0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
111f0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
11200 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
11210 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
11220 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70  T_SCANSTATUS.  p
11230 4c 65 76 65 6c 2d 3e 61 64 64 72 56 69 73 69 74  Level->addrVisit
11240 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11250 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 65  rrentAddr(v);.#e
11260 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ndif..  /* Inser
11270 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
11280 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
11290 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
112a0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
112b0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
112c0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
112d0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
112e0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
112f0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
11300 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
11310 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
11320 3b 0a 20 20 20 20 69 6e 74 20 73 6b 69 70 4c 69  ;.    int skipLi
11330 6b 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  keAddr = 0;.    
11340 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
11350 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
11360 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74  VIRTUAL );.    t
11370 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
11380 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
11390 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
113a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
113b0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
113c0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
113d0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
113e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
113f0 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65   & pLevel->notRe
11400 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
11410 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
11420 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
11430 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
11440 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
11450 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
11460 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
11470 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
11480 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
11490 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
114a0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
114b0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
114c0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
114d0 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
114e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
114f0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
11500 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
11510 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
11520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
11530 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
11540 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
11550 49 4b 45 43 4f 4e 44 20 29 7b 0a 20 20 20 20 20  IKECOND ){.     
11560 20 2f 2a 20 49 66 20 74 68 65 20 54 45 52 4d 5f   /* If the TERM_
11570 4c 49 4b 45 43 4f 4e 44 20 66 6c 61 67 20 69 73  LIKECOND flag is
11580 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61 6e 73   set, that means
11590 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65 20   that the range 
115a0 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20  search.      ** 
115b0 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
115c0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
115d0 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
115e0 72 20 69 73 20 74 72 75 65 2c 20 73 6f 20 77 65  r is true, so we
115f0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 73 6b  .      ** can sk
11600 69 70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  ip the call to t
11610 68 65 20 6c 69 6b 65 28 41 2c 42 29 20 66 75 6e  he like(A,B) fun
11620 63 74 69 6f 6e 2e 20 20 42 75 74 20 74 68 69 73  ction.  But this
11630 20 6f 6e 6c 79 20 77 6f 72 6b 73 0a 20 20 20 20   only works.    
11640 20 20 2a 2a 20 66 6f 72 20 73 74 72 69 6e 67 73    ** for strings
11650 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 73 6b 69  .  So do not ski
11660 70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68  p the call to th
11670 65 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  e function on th
11680 65 20 70 61 73 73 0a 20 20 20 20 20 20 2a 2a 20  e pass.      ** 
11690 74 68 61 74 20 63 6f 6d 70 61 72 65 73 20 42 4c  that compares BL
116a0 4f 42 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  OBs. */.#ifdef S
116b0 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
116c0 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20  T_MATCH_BLOBS.  
116d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65      continue;.#e
116e0 6c 73 65 0a 20 20 20 20 20 20 75 33 32 20 78 20  lse.      u32 x 
116f0 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  = pLevel->iLikeR
11700 65 70 43 6e 74 72 3b 0a 20 20 20 20 20 20 61 73  epCntr;.      as
11710 73 65 72 74 28 20 78 3e 30 20 29 3b 0a 20 20 20  sert( x>0 );.   
11720 20 20 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20     skipLikeAddr 
11730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11740 4f 70 31 28 76 2c 20 28 78 26 31 29 3f 20 4f 50  Op1(v, (x&1)? OP
11750 5f 49 66 4e 6f 74 20 3a 20 4f 50 5f 49 66 2c 20  _IfNot : OP_If, 
11760 28 69 6e 74 29 28 78 3e 3e 31 29 29 3b 0a 20 20  (int)(x>>1));.  
11770 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11780 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  (v);.#endif.    
11790 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
117a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
117b0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
117c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
117d0 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69 70 4c  );.    if( skipL
117e0 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74 65  ikeAddr ) sqlite
117f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11800 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a   skipLikeAddr);.
11810 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
11820 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
11830 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
11840 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
11850 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
11860 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
11870 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
11880 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
11890 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
118a0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
118b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
118c0 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
118d0 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
118e0 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
118f0 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
11900 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
11910 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
11920 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
11930 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
11940 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
11950 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
11960 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
11970 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
11980 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
11990 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
119a0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
119b0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
119c0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
119d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
119e0 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
119f0 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
11a00 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
11a10 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
11a20 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
11a30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
11a40 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
11a50 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
11a60 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _IS))==0 ) conti
11a70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
11a80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
11a90 20 57 4f 5f 45 51 55 49 56 29 3d 3d 30 20 29 20   WO_EQUIV)==0 ) 
11aa0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
11ab0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
11ac0 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
11ad0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
11ae0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
11af0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11b00 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
11b10 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
11b20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
11b30 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
11b40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11b50 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
11b60 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  ght & pLevel->no
11b70 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
11b80 20 20 70 41 6c 74 20 3d 20 73 71 6c 69 74 65 33    pAlt = sqlite3
11b90 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
11ba0 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
11bb0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
11bc0 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45              WO_E
11be0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 2c 20 30  Q|WO_IN|WO_IS, 0
11bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d  );.    if( pAlt=
11c00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11c10 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46     if( pAlt->wtF
11c20 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44  lags & (TERM_COD
11c30 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
11c40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
11c50 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  lt->eOperator & 
11c60 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73  WO_EQ );.    tes
11c70 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70  tcase( pAlt->eOp
11c80 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
11c90 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
11ca0 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
11cb0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56  & WO_IN );.    V
11cc0 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
11cd0 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e  ((v, "begin tran
11ce0 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
11cf0 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74 20  t"));.    pEAlt 
11d00 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
11d10 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11d20 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20 20  f(*pEAlt));.    
11d30 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20 20  if( pEAlt ){.   
11d40 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c     *pEAlt = *pAl
11d50 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
11d60 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pEAlt->pLeft = p
11d70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  E->pLeft;.      
11d80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11d90 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c 74  se(pParse, pEAlt
11da0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
11db0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
11dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 61        sqlite3Sta
11dd0 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c 74  ckFree(db, pEAlt
11de0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11df0 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
11e00 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
11e10 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
11e20 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
11e30 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c  t that.  ** at l
11e40 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
11e50 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
11e60 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
11e70 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
11e80 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
11e90 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
11ea0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69    pLevel->addrFi
11eb0 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
11ec0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
11ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11ee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11ef0 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
11f00 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
11f10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11f20 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
11f30 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73  IN hit"));.    s
11f40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
11f50 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
11f60 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
11f70 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e  >a, j=0; j<pWC->
11f80 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
11f90 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74  m++){.      test
11fa0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
11fb0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
11fc0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UAL );.      tes
11fd0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
11fe0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
11ff0 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
12000 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
12010 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
12020 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
12030 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
12040 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
12050 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ll & pLevel->not
12060 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
12070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
12080 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
12090 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
120a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
120b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
120c0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
120d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
120e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
120f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
12100 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
12110 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
12120 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
12130 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
12140 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
12150 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  rn pLevel->notRe
12160 61 64 79 3b 0a 7d 0a                             ady;.}.