From: drh
Date: Mon, 19 Feb 2001 23:23:38 +0000 (+0000)
Subject: Repairs to the previous fix (CVS 186)
X-Git-Tag: version-3.6.10~5878
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=573bd2754f9e77610664e6ccc9f1d17ac17a0a50;p=thirdparty%2Fsqlite.git
Repairs to the previous fix (CVS 186)
FossilOrigin-Name: 4fb52b4824cbc6d5fa23449bfb998ec9985f1336
---
diff --git a/VERSION b/VERSION
index b112f91322..c787b213b0 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.21
+1.0.22
diff --git a/manifest b/manifest
index 3f5c6d54d3..9b36be8c93 100644
--- a/manifest
+++ b/manifest
@@ -1,9 +1,9 @@
-C Version\s1.0.21\s(CVS\s482)
-D 2001-02-19T18:30:00
+C Repairs\sto\sthe\sprevious\sfix\s(CVS\s186)
+D 2001-02-19T23:23:38
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
F Makefile.in 7efa81e2985b45ba73db27d55b70cc927f5abfd7
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
-F VERSION 4686794d487da05ffcbf92801fd0754f6dfa0c39
+F VERSION 938ab9b6f1cfff5e424d42ea4a7602a8f30d3e71
F configure 3dc1edb9dcf60215e31ff72b447935ab62211442 x
F configure.in d892ca33db7e88a055519ce2f36dcb11020e8fff
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
@@ -29,7 +29,7 @@ F src/main.c 5afe29c425b875acede20f609485866eb5b276f6
F src/parse.y 25ee4d8efccc4b247c32fe4ab194e3dd8fd5a4ee
F src/printf.c af0dc65c293427272e1949c7807b1d88f10004fd
F src/random.c b36c3f57dc80c8f354e6bfbf39cf1e1de021d54a
-F src/select.c 0cadab95c8011ddbffe804de94f12f3c0e317863
+F src/select.c faac634ef0c717bc82ca112a4531a257886f2c7a
F src/shell.c 441e20913cde0bb71281f4027623c623530241cd
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
F src/sqlite.h.in 7c1a53f020418d89d13ed2fe9c477ff54540755d
@@ -40,9 +40,9 @@ F src/test.file 55ca6286e3e4f4fba5d0448333fa99fc5a404a73
F src/tokenize.c c7ad428f38e56342eb2025320480b5ae9ece1b90
F src/update.c 9692fbac8e95fdbc5318d39db576aa6c57b9c8ab
F src/util.c 0298100e6427a4b644f767ede12276fa7170fbb6
-F src/vdbe.c 6e613f25b0fe1c81b097f46a8fe68c68c39a6abf
-F src/vdbe.h d94224ad39c8e9de83dda8d8f960059eb71c0780
-F src/where.c e0865f52398662b541bea29ded6aa9687d9f3645
+F src/vdbe.c e8254ae39d2f42a3f85b168b67a493ae206f4bf4
+F src/vdbe.h 031b7dd7d6f94c51dc37cdf26efe43d1619bb672
+F src/where.c 478fde7c930969ca428de2d80b137959d25ee2fb
F test/all.test 15cac2f6b2d4c55bf896212aff3cc9d6597b0490
F test/copy.test b77a1214bd7756f2849d5c4fa6e715c0ff0c34eb
F test/dbbe.test 27deeebf2a01da97cabaab8dc7f34ca3b51a0123
@@ -80,7 +80,7 @@ F www/arch.fig 4f246003b7da23bd63b8b0af0618afb4ee3055c8
F www/arch.png 8dae0766d42ed3de9ed013c1341a5792bcf633e6
F www/arch.tcl a40380c1fe0080c43e6cc5c20ed70731511b06be
F www/c_interface.tcl 11be2d5826eb7d6efd629751d3b483c1ed78ba14
-F www/changes.tcl 50b0890caa8e2b9622237aef27bdf92c90255b35
+F www/changes.tcl 57b964f3c1cbbeed1f99d1c20e1fddee46b68ce4
F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
F www/fileformat.tcl cfb7fba80b7275555281ba2f256c00734bcdd1c9
@@ -91,7 +91,7 @@ F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
F www/sqlite.tcl cb0d23d8f061a80543928755ec7775da6e4f362f
F www/tclsqlite.tcl 06f81c401f79a04f2c5ebfb97e7c176225c0aef2
F www/vdbe.tcl 0c8aaa529dd216ccbf7daaabd80985e413d5f9ad
-P 99aae9aaa9f53d1be6600f8598f66594692aae39
-R 59db407686a1360be2fb4d74bb42df04
+P 7a1147ff52df5f78b1a2e3502c1b78e4d3906968
+R 70cec44ce52f33287dc653dc6f09ba6e
U drh
-Z 7f2f78067b526c415a8e7024c34c1b61
+Z 1c0690829dbb25a5c020dbc3ea86b416
diff --git a/manifest.uuid b/manifest.uuid
index 08d0f39502..e90cfdc867 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-7a1147ff52df5f78b1a2e3502c1b78e4d3906968
\ No newline at end of file
+4fb52b4824cbc6d5fa23449bfb998ec9985f1336
\ No newline at end of file
diff --git a/src/select.c b/src/select.c
index 1dca4fdb39..2588514c77 100644
--- a/src/select.c
+++ b/src/select.c
@@ -24,7 +24,7 @@
** This file contains C code routines that are called by the parser
** to handle SELECT statements.
**
-** $Id: select.c,v 1.28 2001/01/15 22:51:11 drh Exp $
+** $Id: select.c,v 1.29 2001/02/19 23:23:38 drh Exp $
*/
#include "sqliteInt.h"
@@ -578,7 +578,7 @@ static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){
}
iBreak = sqliteVdbeMakeLabel(v);
iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak, 0, 0);
- sqliteVdbeAddOp(v, OP_Key, tab1, 0, 0, 0);
+ sqliteVdbeAddOp(v, OP_FullKey, tab1, 0, 0, 0);
sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont, 0, 0);
rc = selectInnerLoop(pParse, 0, tab1, p->pEList->nExpr,
p->pOrderBy, -1, eDest, iParm,
diff --git a/src/vdbe.c b/src/vdbe.c
index 31364bc5d8..324730f701 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -41,7 +41,7 @@
** But other routines are also provided to help in building up
** a program instruction by instruction.
**
-** $Id: vdbe.c,v 1.51 2001/01/15 22:51:12 drh Exp $
+** $Id: vdbe.c,v 1.52 2001/02/19 23:23:39 drh Exp $
*/
#include "sqliteInt.h"
#include
@@ -67,6 +67,8 @@ typedef struct VdbeOp Op;
struct Cursor {
DbbeCursor *pCursor; /* The cursor structure of the backend */
int index; /* The next index to extract */
+ int lastKey; /* Last key from a Next or NextIdx operation */
+ int keyIsValid; /* True if lastKey is valid */
int keyAsData; /* The OP_Field command works on key instead of data */
};
typedef struct Cursor Cursor;
@@ -789,26 +791,26 @@ static char *zOpName[] = { 0,
"OpenIdx", "OpenTbl", "Close", "Fetch",
"Fcnt", "New", "Put", "Distinct",
"Found", "NotFound", "Delete", "Field",
- "KeyAsData", "Key", "Rewind", "Next",
- "Destroy", "Reorganize", "ResetIdx", "NextIdx",
- "PutIdx", "DeleteIdx", "MemLoad", "MemStore",
- "ListOpen", "ListWrite", "ListRewind", "ListRead",
- "ListClose", "SortOpen", "SortPut", "SortMakeRec",
- "SortMakeKey", "Sort", "SortNext", "SortKey",
- "SortCallback", "SortClose", "FileOpen", "FileRead",
- "FileField", "FileClose", "AggReset", "AggFocus",
- "AggIncr", "AggNext", "AggSet", "AggGet",
- "SetInsert", "SetFound", "SetNotFound", "SetClear",
- "MakeRecord", "MakeKey", "Goto", "If",
- "Halt", "ColumnCount", "ColumnName", "Callback",
- "Integer", "String", "Null", "Pop",
- "Dup", "Pull", "Add", "AddImm",
- "Subtract", "Multiply", "Divide", "Min",
- "Max", "Like", "Glob", "Eq",
- "Ne", "Lt", "Le", "Gt",
- "Ge", "IsNull", "NotNull", "Negative",
- "And", "Or", "Not", "Concat",
- "Noop", "Strlen", "Substr",
+ "KeyAsData", "Key", "FullKey", "Rewind",
+ "Next", "Destroy", "Reorganize", "ResetIdx",
+ "NextIdx", "PutIdx", "DeleteIdx", "MemLoad",
+ "MemStore", "ListOpen", "ListWrite", "ListRewind",
+ "ListRead", "ListClose", "SortOpen", "SortPut",
+ "SortMakeRec", "SortMakeKey", "Sort", "SortNext",
+ "SortKey", "SortCallback", "SortClose", "FileOpen",
+ "FileRead", "FileField", "FileClose", "AggReset",
+ "AggFocus", "AggIncr", "AggNext", "AggSet",
+ "AggGet", "SetInsert", "SetFound", "SetNotFound",
+ "SetClear", "MakeRecord", "MakeKey", "Goto",
+ "If", "Halt", "ColumnCount", "ColumnName",
+ "Callback", "Integer", "String", "Null",
+ "Pop", "Dup", "Pull", "Add",
+ "AddImm", "Subtract", "Multiply", "Divide",
+ "Min", "Max", "Like", "Glob",
+ "Eq", "Ne", "Lt", "Le",
+ "Gt", "Ge", "IsNull", "NotNull",
+ "Negative", "And", "Or", "Not",
+ "Concat", "Noop", "Strlen", "Substr",
};
/*
@@ -1895,10 +1897,13 @@ int sqliteVdbeExec(
if( aStack[tos].flags & STK_Int ){
pBex->Fetch(p->aCsr[i].pCursor, sizeof(int),
(char*)&aStack[tos].i);
+ p->aCsr[i].lastKey = aStack[tos].i;
+ p->aCsr[i].keyIsValid = 1;
}else{
if( Stringify(p, tos) ) goto no_mem;
pBex->Fetch(p->aCsr[i].pCursor, aStack[tos].n,
zStack[tos]);
+ p->aCsr[i].keyIsValid = 0;
}
p->nFetch++;
}
@@ -2149,15 +2154,36 @@ int sqliteVdbeExec(
VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
if( VERIFY( i>=0 && inCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
- char *z = pBex->ReadKey(pCrsr, 0);
- if( p->aCsr[i].keyAsData ){
- zStack[tos] = z;
- aStack[tos].flags = STK_Str;
- aStack[tos].n = pBex->KeyLength(pCrsr);
+ int v;
+ if( p->aCsr[i].keyIsValid ){
+ v = p->aCsr[i].lastKey;
}else{
- memcpy(&aStack[tos].i, z, sizeof(int));
- aStack[tos].flags = STK_Int;
+ memcpy(&v, pBex->ReadKey(pCrsr,0), sizeof(int));
}
+ aStack[tos].i = v;
+ aStack[tos].flags = STK_Int;
+ }
+ break;
+ }
+
+ /* Opcode: FullKey P1 * *
+ **
+ ** Push a string onto the stack which is the full text key associated
+ ** with the last Next operation on file P1. Compare this with the
+ ** Key operator which pushs an integer key.
+ */
+ case OP_FullKey: {
+ int i = pOp->p1;
+ int tos = ++p->tos;
+ DbbeCursor *pCrsr;
+
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
+ VERIFY( if( !p->aCsr[i].keyAsData ) goto bad_instruction; )
+ if( VERIFY( i>=0 && inCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ char *z = pBex->ReadKey(pCrsr, 0);
+ zStack[tos] = z;
+ aStack[tos].flags = STK_Str;
+ aStack[tos].n = pBex->KeyLength(pCrsr);
}
break;
}
@@ -2189,6 +2215,7 @@ int sqliteVdbeExec(
p->nFetch++;
}
}
+ p->aCsr[i].keyIsValid = 0;
break;
}
@@ -2241,9 +2268,11 @@ int sqliteVdbeExec(
}else{
k = nIdx;
}
+ p->aCsr[i].keyIsValid = 0;
for(j=p->aCsr[i].index; jaCsr[i].lastKey = aIdx[j];
+ p->aCsr[i].keyIsValid = 1;
aStack[tos].flags = STK_Int;
break;
}
diff --git a/src/vdbe.h b/src/vdbe.h
index fe2cccb3f2..fef342f9f8 100644
--- a/src/vdbe.h
+++ b/src/vdbe.h
@@ -27,7 +27,7 @@
** or VDBE. The VDBE implements an abstract machine that runs a
** simple program to access and modify the underlying database.
**
-** $Id: vdbe.h,v 1.15 2001/01/15 22:51:12 drh Exp $
+** $Id: vdbe.h,v 1.16 2001/02/19 23:23:39 drh Exp $
*/
#ifndef _SQLITE_VDBE_H_
#define _SQLITE_VDBE_H_
@@ -85,99 +85,100 @@ typedef struct VdbeOp VdbeOp;
#define OP_Field 12
#define OP_KeyAsData 13
#define OP_Key 14
-#define OP_Rewind 15
-#define OP_Next 16
-
-#define OP_Destroy 17
-#define OP_Reorganize 18
-
-#define OP_ResetIdx 19
-#define OP_NextIdx 20
-#define OP_PutIdx 21
-#define OP_DeleteIdx 22
-
-#define OP_MemLoad 23
-#define OP_MemStore 24
-
-#define OP_ListOpen 25
-#define OP_ListWrite 26
-#define OP_ListRewind 27
-#define OP_ListRead 28
-#define OP_ListClose 29
-
-#define OP_SortOpen 30
-#define OP_SortPut 31
-#define OP_SortMakeRec 32
-#define OP_SortMakeKey 33
-#define OP_Sort 34
-#define OP_SortNext 35
-#define OP_SortKey 36
-#define OP_SortCallback 37
-#define OP_SortClose 38
-
-#define OP_FileOpen 39
-#define OP_FileRead 40
-#define OP_FileField 41
-#define OP_FileClose 42
-
-#define OP_AggReset 43
-#define OP_AggFocus 44
-#define OP_AggIncr 45
-#define OP_AggNext 46
-#define OP_AggSet 47
-#define OP_AggGet 48
-
-#define OP_SetInsert 49
-#define OP_SetFound 50
-#define OP_SetNotFound 51
-#define OP_SetClear 52
-
-#define OP_MakeRecord 53
-#define OP_MakeKey 54
-
-#define OP_Goto 55
-#define OP_If 56
-#define OP_Halt 57
-
-#define OP_ColumnCount 58
-#define OP_ColumnName 59
-#define OP_Callback 60
-
-#define OP_Integer 61
-#define OP_String 62
-#define OP_Null 63
-#define OP_Pop 64
-#define OP_Dup 65
-#define OP_Pull 66
-
-#define OP_Add 67
-#define OP_AddImm 68
-#define OP_Subtract 69
-#define OP_Multiply 70
-#define OP_Divide 71
-#define OP_Min 72
-#define OP_Max 73
-#define OP_Like 74
-#define OP_Glob 75
-#define OP_Eq 76
-#define OP_Ne 77
-#define OP_Lt 78
-#define OP_Le 79
-#define OP_Gt 80
-#define OP_Ge 81
-#define OP_IsNull 82
-#define OP_NotNull 83
-#define OP_Negative 84
-#define OP_And 85
-#define OP_Or 86
-#define OP_Not 87
-#define OP_Concat 88
-#define OP_Noop 89
-
-#define OP_Strlen 90
-#define OP_Substr 91
-
-#define OP_MAX 91
+#define OP_FullKey 15
+#define OP_Rewind 16
+#define OP_Next 17
+
+#define OP_Destroy 18
+#define OP_Reorganize 19
+
+#define OP_ResetIdx 20
+#define OP_NextIdx 21
+#define OP_PutIdx 22
+#define OP_DeleteIdx 23
+
+#define OP_MemLoad 24
+#define OP_MemStore 25
+
+#define OP_ListOpen 26
+#define OP_ListWrite 27
+#define OP_ListRewind 28
+#define OP_ListRead 29
+#define OP_ListClose 30
+
+#define OP_SortOpen 31
+#define OP_SortPut 32
+#define OP_SortMakeRec 33
+#define OP_SortMakeKey 34
+#define OP_Sort 35
+#define OP_SortNext 36
+#define OP_SortKey 37
+#define OP_SortCallback 38
+#define OP_SortClose 39
+
+#define OP_FileOpen 40
+#define OP_FileRead 41
+#define OP_FileField 42
+#define OP_FileClose 43
+
+#define OP_AggReset 44
+#define OP_AggFocus 45
+#define OP_AggIncr 46
+#define OP_AggNext 47
+#define OP_AggSet 48
+#define OP_AggGet 49
+
+#define OP_SetInsert 50
+#define OP_SetFound 51
+#define OP_SetNotFound 52
+#define OP_SetClear 53
+
+#define OP_MakeRecord 54
+#define OP_MakeKey 55
+
+#define OP_Goto 56
+#define OP_If 57
+#define OP_Halt 58
+
+#define OP_ColumnCount 59
+#define OP_ColumnName 60
+#define OP_Callback 61
+
+#define OP_Integer 62
+#define OP_String 63
+#define OP_Null 64
+#define OP_Pop 65
+#define OP_Dup 66
+#define OP_Pull 67
+
+#define OP_Add 68
+#define OP_AddImm 69
+#define OP_Subtract 70
+#define OP_Multiply 71
+#define OP_Divide 72
+#define OP_Min 73
+#define OP_Max 74
+#define OP_Like 75
+#define OP_Glob 76
+#define OP_Eq 77
+#define OP_Ne 78
+#define OP_Lt 79
+#define OP_Le 80
+#define OP_Gt 81
+#define OP_Ge 82
+#define OP_IsNull 83
+#define OP_NotNull 84
+#define OP_Negative 85
+#define OP_And 86
+#define OP_Or 87
+#define OP_Not 88
+#define OP_Concat 89
+#define OP_Noop 90
+
+#define OP_Strlen 91
+#define OP_Substr 92
+
+#define OP_MAX 92
/*
** Prototypes for the VDBE interface. See comments on the implementation
diff --git a/src/where.c b/src/where.c
index 5e8240ae99..aeeb3e904c 100644
--- a/src/where.c
+++ b/src/where.c
@@ -25,7 +25,7 @@
** the WHERE clause of SQL statements. Also found here are subroutines
** to generate VDBE code to evaluate expressions.
**
-** $Id: where.c,v 1.11 2001/02/19 18:24:22 drh Exp $
+** $Id: where.c,v 1.12 2001/02/19 23:23:39 drh Exp $
*/
#include "sqliteInt.h"
@@ -338,11 +338,7 @@ WhereInfo *sqliteWhereBegin(
if( (aExpr[j].prereqRight & loopMask)!=aExpr[j].prereqRight ) continue;
if( (aExpr[j].prereqLeft & loopMask)!=aExpr[j].prereqLeft ) continue;
if( haveKey ){
- if( pushKey && i==pTabList->nId-1 ){
- sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
- }else{
- haveKey = 0;
- }
+ haveKey = 0;
sqliteVdbeAddOp(v, OP_Fetch, base+idx, 0, 0, 0);
}
sqliteExprIfFalse(pParse, aExpr[j].p, cont);
diff --git a/www/changes.tcl b/www/changes.tcl
index 0af9749d33..c208eed05a 100644
--- a/www/changes.tcl
+++ b/www/changes.tcl
@@ -17,6 +17,11 @@ proc chng {date desc} {
puts "
"
}
+chng {2001 Feb 19 (1.0.22)} {
+The previous fix was not quite right. This one seems to work better.
+
+}
+
chng {2001 Feb 19 (1.0.21)} {
The UPDATE statement was not working when the WHERE clause contained
some terms that could be satisfied using indices and other terms that