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 "

    $desc

" } +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