]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Repairs to the previous fix (CVS 186)
authordrh <drh@noemail.net>
Mon, 19 Feb 2001 23:23:38 +0000 (23:23 +0000)
committerdrh <drh@noemail.net>
Mon, 19 Feb 2001 23:23:38 +0000 (23:23 +0000)
FossilOrigin-Name: 4fb52b4824cbc6d5fa23449bfb998ec9985f1336

VERSION
manifest
manifest.uuid
src/select.c
src/vdbe.c
src/vdbe.h
src/where.c
www/changes.tcl

diff --git a/VERSION b/VERSION
index b112f913226b4f9a5d7eb5ded2394fd1479d2717..c787b213b07e6ea6995771aeb51869bfed9f89f7 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.21
+1.0.22
index 3f5c6d54d30f2912553b1adbf0068a5959f50b71..9b36be8c938d47f4361cd27ba5fd4ba1ed700c28 100644 (file)
--- 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
index 08d0f3950216d91a8bfb8c59231fe30807955018..e90cfdc867f93598b6d18f0a8b34544be884786f 100644 (file)
@@ -1 +1 @@
-7a1147ff52df5f78b1a2e3502c1b78e4d3906968
\ No newline at end of file
+4fb52b4824cbc6d5fa23449bfb998ec9985f1336
\ No newline at end of file
index 1dca4fdb391724b35966a11a030f1dc30deee405..2588514c7772180a100155144e7fd74f83865a5d 100644 (file)
@@ -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, 
index 31364bc5d8e702a6b9dae055c2018d500f0b2bd4..324730f701c61dc0519814f512811834ed0b1b3e 100644 (file)
@@ -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 <unistd.h>
@@ -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 && i<p->nCursor && ) (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 && i<p->nCursor && ) (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; j<k; j++){
             if( aIdx[j]!=0 ){
-              aStack[tos].i = aIdx[j];
+              aStack[tos].i = p->aCsr[i].lastKey = aIdx[j];
+              p->aCsr[i].keyIsValid = 1;
               aStack[tos].flags = STK_Int;
               break;
             }
index fe2cccb3f2331d55ea17a4e05003ca3e5d30d803..fef342f9f8ea39c8816f96ddfdf029320a0263fc 100644 (file)
@@ -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
index 5e8240ae993a128952093cb0a0c1b69daaf29920..aeeb3e904c6daadd4a49779ad7e8d25faf51cb6c 100644 (file)
@@ -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);
index 0af9749d33fcf4a2dac080eedb054b48591f2e2b..c208eed05ac6babbe0b0756938a01b5633c2c27a 100644 (file)
@@ -17,6 +17,11 @@ proc chng {date desc} {
   puts "<DD><P><UL>$desc</UL></P></DD>"
 }
 
+chng {2001 Feb 19 (1.0.22)} {
+<li>The previous fix was not quite right.  This one seems to work better.
+    </li>
+}
+
 chng {2001 Feb 19 (1.0.21)} {
 <li>The UPDATE statement was not working when the WHERE clause contained
     some terms that could be satisfied using indices and other terms that