-C Modify\sthe\scode\sgenerated\sfor\sa\sDELETE\sto\suse\sregisters\sinstead\sof\sthe\svdbe\sstack.\s(CVS\s4675)
-D 2008-01-04T13:24:29
+C Modify\sFifoRead\sand\sFifoWrite\sto\swork\sexclusively\swith\smemory\scells.\s(CVS\s4676)
+D 2008-01-04T13:57:26
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in 30789bf70614bad659351660d76b8e533f3340e9
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
F src/callback.c 77b302b0d41468dcda78c70e706e5b84577f0fa0
F src/complete.c 4cf68fd75d60257524cbe74f87351b9848399131
F src/date.c 49c5a6d2de6c12000905b4d36868b07d3011bbf6
-F src/delete.c 36193a3a10e636d3ee4fe1fdfac57982d5471623
+F src/delete.c 5601acbbad10e0a6190e6d1822a776ad058c661d
F src/experimental.c 1b2d1a6cd62ecc39610e97670332ca073c50792b
F src/expr.c e60ee4f48194469bf7b101fb7a14e56abea3daa4
F src/func.c 996071cf0af9d967e58b69fce1909555059ebc7d
F src/test_thread.c e297dd41db0b249646e69f97d36ec13e56e8b730
F src/tokenize.c a4e04438c11fed2c67ec47fe3edbef9cca2d1b48
F src/trigger.c 713b501b12ea41bf0297a2cf78f7d954c4a25d13
-F src/update.c a68e11e766376bf0fbec93d70c9389c4c502dd55
+F src/update.c eaacf59269bd076adca6fab6f5d16ce53419380b
F src/utf.c ef4b7d83bae533b76c3e1bf635b113fdad86a736
F src/util.c 05f31144bbd3f1a24f4139ae029c42545cb72624
F src/vacuum.c 3f34f278809bf3eb0b62ec46ff779e9c385b28f0
-F src/vdbe.c 55e1a0541f87e2c73fa4c4d73649c3d6cd39b9a3
+F src/vdbe.c c562e01b491b589f6e0f830bec7ab1507d1ac844
F src/vdbe.h bb128757b84280504a1243c450fd13ead248ede5
F src/vdbeInt.h 869d0f550354c1364dde1d3611d770bd1c767505
F src/vdbeapi.c f14174843bf4be2c9afdf2ef48b61e7c3ac62d7c
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 8bb9f970dd71cbf19e45774fc822aa1efebc1724
-R 991771337c0268b312b29969927e9c60
+P 173f281334d340290e1978abea5d1ea804141910
+R 94a66c73f79f80d8b0a98041731b34af
U danielk1977
-Z 58a58785d108e95cb589bb5d4ad7f5cb
+Z fb5d354c01f2e7900c511aa6a77f6954
-173f281334d340290e1978abea5d1ea804141910
\ No newline at end of file
+2c913908a47e7ace7d964067e3566d232ee2d494
\ No newline at end of file
** This file contains C code routines that are called by the parser
** in order to generate code for DELETE FROM statements.
**
-** $Id: delete.c,v 1.145 2008/01/04 13:24:29 danielk1977 Exp $
+** $Id: delete.c,v 1.146 2008/01/04 13:57:26 danielk1977 Exp $
*/
#include "sqliteInt.h"
sqlite3BeginWriteOperation(pParse, triggers_exist, iDb);
if( triggers_exist ){
+ int orconf = ((pParse->trigStack)?pParse->trigStack->orconf:OE_Default);
int iGoto = sqlite3VdbeAddOp0(v, OP_Goto);
addr = sqlite3VdbeMakeLabel(v);
+
iBeginBeforeTrigger = sqlite3VdbeCurrentAddr(v);
(void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_BEFORE, pTab,
- -1, oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default,
- addr, &old_col_mask, 0);
+ -1, oldIdx, orconf, addr, &old_col_mask, 0);
iEndBeforeTrigger = sqlite3VdbeAddOp0(v, OP_Goto);
+
iBeginAfterTrigger = sqlite3VdbeCurrentAddr(v);
(void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_AFTER, pTab, -1,
- oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default,
- addr, &old_col_mask, 0);
+ oldIdx, orconf, addr, &old_col_mask, 0);
iEndAfterTrigger = sqlite3VdbeAddOp0(v, OP_Goto);
+
sqlite3VdbeJumpHere(v, iGoto);
}
** the table and pick which records to delete.
*/
else{
- int iRowid = ++pParse->nMem; /* Used for storing value read from fifo */
+ int iRowid = ++pParse->nMem; /* Used for storing rowid values. */
/* Begin the database scan
*/
/* Remember the rowid of every item to be deleted.
*/
- sqlite3VdbeAddOp1(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur);
- sqlite3VdbeAddOp0(v, OP_FifoWrite);
+ sqlite3VdbeAddOp2(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, iRowid);
+ sqlite3VdbeAddOp1(v, OP_FifoWrite, iRowid);
if( db->flags & SQLITE_CountRows ){
sqlite3VdbeAddOp2(v, OP_MemIncr, 1, memCnt);
}
** This file contains C code routines that are called by the parser
** to handle UPDATE statements.
**
-** $Id: update.c,v 1.155 2008/01/03 23:44:53 drh Exp $
+** $Id: update.c,v 1.156 2008/01/04 13:57:26 danielk1977 Exp $
*/
#include "sqliteInt.h"
int iDb; /* Database containing the table being updated */
int memCnt = 0; /* Memory cell used for counting rows changed */
int mem1; /* Memory address storing the rowid for next row to update */
+ int iRowid; /* Memory address storing rowids */
#ifndef SQLITE_OMIT_TRIGGER
int isView; /* Trying to update a view */
/* Remember the rowid of every item to be updated.
*/
- sqlite3VdbeAddOp2(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, 0);
- sqlite3VdbeAddOp2(v, OP_FifoWrite, 0, 0);
+ iRowid = ++pParse->nMem;
+ sqlite3VdbeAddOp2(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, iRowid);
+ sqlite3VdbeAddOp2(v, OP_FifoWrite, iRowid, 0);
/* End the database scan loop.
*/
assert( pParse->nTab>iCur+i+1 );
}
}
-
}
/* Jump back to this point if a trigger encounters an IGNORE constraint. */
}
/* Top of the update loop */
- addr = sqlite3VdbeAddOp2(v, OP_FifoRead, 0, 0);
+ addr = sqlite3VdbeAddOp2(v, OP_FifoRead, iRowid, 0);
sqlite3VdbeAddOp2(v, OP_StackDepth, -1, 0);
- sqlite3VdbeAddOp2(v, OP_MemStore, mem1, 0);
if( triggers_exist ){
/* Make cursor iCur point to the record that is being updated.
*/
- sqlite3VdbeAddOp2(v, OP_NotExists, iCur, addr);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, iRowid);
/* Generate the OLD table
*/
sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginBeforeTrigger);
sqlite3VdbeJumpHere(v, iEndBeforeTrigger);
-
- if( !isView ){
- sqlite3VdbeAddOp2(v, OP_MemLoad, mem1, 0);
- }
}
if( !isView && !IsVirtual(pTab) ){
** Also, the old data is needed to delete the old index entries.
** So make the cursor point at the old record.
*/
- sqlite3VdbeAddOp2(v, OP_NotExists, iCur, addr);
- sqlite3VdbeAddOp2(v, OP_MemLoad, mem1, 0);
+ sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, iRowid);
+ sqlite3VdbeAddOp2(v, OP_MemLoad, iRowid, 0);
/* If the record number will change, push the record number as it
** will be after the update. (The old record number is currently
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
-** $Id: vdbe.c,v 1.675 2008/01/04 13:24:29 danielk1977 Exp $
+** $Id: vdbe.c,v 1.676 2008/01/04 13:57:26 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
}
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
-/* Opcode: FifoWrite * * *
+/* Opcode: FifoWrite P1 * *
**
-** Write the integer on the top of the stack into the Fifo.
+** Write the integer from memory cell P1 into the Fifo.
*/
case OP_FifoWrite: { /* no-push */
- assert( pTos>=p->aStack );
- sqlite3VdbeMemIntegerify(pTos);
- if( sqlite3VdbeFifoPush(&p->sFifo, pTos->u.i)==SQLITE_NOMEM ){
+ Mem *pReg = &p->aMem[pOp->p1];
+ assert( pOp->p1>0 && pOp->p1<=p->nMem );
+ sqlite3VdbeMemIntegerify(pReg);
+ if( sqlite3VdbeFifoPush(&p->sFifo, pReg->u.i)==SQLITE_NOMEM ){
goto no_mem;
}
- assert( (pTos->flags & MEM_Dyn)==0 );
- pTos--;
break;
}
if( sqlite3VdbeFifoPop(&p->sFifo, &v)==SQLITE_DONE ){
pc = pOp->p2 - 1;
}else{
- Mem *pOut;
- if( pOp->p1 ){
- pOut = &p->aMem[pOp->p1];
- }else{
- pOut = ++pTos;
- }
+ Mem *pOut = &p->aMem[pOp->p1];
+ assert( pOp->p1>0 && pOp->p1<=p->nMem );
sqlite3VdbeMemSetInt64(pOut, v);
}
break;