]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Modify FifoRead and FifoWrite to work exclusively with memory cells. (CVS 4676)
authordanielk1977 <danielk1977@noemail.net>
Fri, 4 Jan 2008 13:57:26 +0000 (13:57 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Fri, 4 Jan 2008 13:57:26 +0000 (13:57 +0000)
FossilOrigin-Name: 2c913908a47e7ace7d964067e3566d232ee2d494

manifest
manifest.uuid
src/delete.c
src/update.c
src/vdbe.c

index 0756bd2efd49f6b9b7c25b50c9b78a2e960569a0..ebf39717b17ebcf722c224be581bba36fcdeebb7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -90,7 +90,7 @@ F src/build.c b7874b45716fa56e6fd1291ffb0b97a55e470728
 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
@@ -164,11 +164,11 @@ F src/test_tclvar.c b2d1115e4d489179d3f029e765211b2ad527ba59
 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
@@ -603,7 +603,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 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
index 24b4471c4939e02751435ec66d3c8510efdafdbe..af77656b1b4672e55a59f4f2f4fe55948dbf6b41 100644 (file)
@@ -1 +1 @@
-173f281334d340290e1978abea5d1ea804141910
\ No newline at end of file
+2c913908a47e7ace7d964067e3566d232ee2d494
\ No newline at end of file
index 88a6ef58a857cd472fc3ed80f1065addcf7c5902..3306880a4c5141ba012e3c33f4ca7d4fcfe1b54c 100644 (file)
@@ -12,7 +12,7 @@
 ** 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"
 
@@ -232,18 +232,20 @@ void sqlite3DeleteFrom(
   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);
   }
 
@@ -299,7 +301,7 @@ void sqlite3DeleteFrom(
   ** 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
     */
@@ -308,8 +310,8 @@ void sqlite3DeleteFrom(
 
     /* 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);
     }
index 3b0f1fd492627dfbc852d7598903b776763809d6..35dce058bd84c34aa3b66dfec6d8513c41cc81c1 100644 (file)
@@ -12,7 +12,7 @@
 ** 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"
 
@@ -106,6 +106,7 @@ void sqlite3Update(
   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 */
@@ -343,8 +344,9 @@ void sqlite3Update(
 
   /* 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.
   */
@@ -384,7 +386,6 @@ void sqlite3Update(
         assert( pParse->nTab>iCur+i+1 );
       }
     }
-
   }
   
   /* Jump back to this point if a trigger encounters an IGNORE constraint. */
@@ -393,14 +394,13 @@ void sqlite3Update(
   }
 
   /* 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
     */
@@ -445,10 +445,6 @@ void sqlite3Update(
 
     sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginBeforeTrigger);
     sqlite3VdbeJumpHere(v, iEndBeforeTrigger);
-
-    if( !isView ){
-      sqlite3VdbeAddOp2(v, OP_MemLoad, mem1, 0);
-    }
   }
 
   if( !isView && !IsVirtual(pTab) ){
@@ -459,8 +455,8 @@ void sqlite3Update(
     ** 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
index 9c258f04d51cf0ee9a506ffefc2452744307ddf1..0b042454a0a082a12af73e3ab8a7abce4a675c2f 100644 (file)
@@ -43,7 +43,7 @@
 ** 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>
@@ -4523,18 +4523,17 @@ case OP_IntegrityCk: {
 }
 #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;
 }
 
@@ -4553,12 +4552,8 @@ case OP_FifoRead: {
   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;