]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not record the inserted rowid on when doing an INSERT within a trigger.
authordrh <drh@noemail.net>
Tue, 15 Apr 2003 14:01:43 +0000 (14:01 +0000)
committerdrh <drh@noemail.net>
Tue, 15 Apr 2003 14:01:43 +0000 (14:01 +0000)
Ticket #290. (CVS 906)

FossilOrigin-Name: 96a717661a3b7108fe0cacb588d81fd8e91eb640

manifest
manifest.uuid
src/vdbe.c
test/rowid.test

index c4dde5e15041e1b10a50e9a9fde5e04ed3624b67..fbf2fde1ae972b80b2eb66f4cb23e3ffbf41a80d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\slemon\sto\suse\s<stdarg.h>\sinstead\sof\s<varargs.h>\sbecause\sGCC\sno\slonger\nsupports\svarargs.h.\s\sTickets\s#288\sand\s#280.\s\sIronically,\slemon\soriginally\nused\svarargs.h\sbecause\sstdarg.h\swas\snot\ssupported\sby\sthe\scompiler\sI\swas\nusing\sin\s1989\s(which\swas\sgcc\sif\sI\srecall\scorrectly.)\s(CVS\s905)
-D 2003-04-15T01:49:49
+C Do\snot\srecord\sthe\sinserted\srowid\son\swhen\sdoing\san\sINSERT\swithin\sa\strigger.\nTicket\s#290.\s(CVS\s906)
+D 2003-04-15T14:01:43
 F Makefile.in df3a4db41a7450468b5fe934d9dd8f723b631249
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -58,7 +58,7 @@ F src/trigger.c bd5a5b234b47f28f9f21a46243dcaf1c5b2383a3
 F src/update.c b368369f1fbe6d7f56a53e5ffad3b75dae9e3e1a
 F src/util.c 8953c612a036e30f24c1c1f5a1498176173daa37
 F src/vacuum.c ac65e9578506a0cdf70ece2668e5b22f4895477c
-F src/vdbe.c cf9ef07b1fce5a340d8926a493f9313208f1773f
+F src/vdbe.c 0fa25d177b02523dbdcb48395053ed5cc21829ee
 F src/vdbe.h 985c24f312d10f9ef8f9a8b8ea62fcdf68e82f21
 F src/where.c e5733f7d5e9cc4ed3590dc3401f779e7b7bb8127
 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
@@ -101,7 +101,7 @@ F test/pragma.test d45d130f532bfe86ebd5ba74862d88b36ded8998
 F test/printf.test a29b8afa24edb4411adfe473b12ac32c84098fce
 F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095
 F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d
-F test/rowid.test 4c55943300cddf73dd0f88d40a268cab14c83274
+F test/rowid.test 82bd07c959eb56ce14feb85cac591750af714ddf
 F test/select1.test 0d708cec567104653ec9aa49fecf3444a2e7d150
 F test/select2.test aceea74fd895b9d007512f72499db589735bd8e4
 F test/select3.test 445a1a3dde4e2fd32541b311f55da5e2f8079d76
@@ -161,7 +161,7 @@ F www/speed.tcl cb4c10a722614aea76d2c51f32ee43400d5951be
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P e76787f877c456abdc8bc88bfefc50eaeed68744
-R 2082ff273f79da67ec128510ffa08236
+P 7902e4778ec86e25ad949ae7a6d55b63ac0e85f3
+R dd4a1ed15ab6eb4c2551ae58dad32820
 U drh
-Z 21cc95134a25d7c9da7271d70e2e3747
+Z 207b6a42d8bab1444378577acd311c3c
index f4a03070cecaa8f2051c01453ac89a7b4ba75dd8..32850c1cc0bda12069894f246bc2a669a1db5b01 100644 (file)
@@ -1 +1 @@
-7902e4778ec86e25ad949ae7a6d55b63ac0e85f3
\ No newline at end of file
+96a717661a3b7108fe0cacb588d81fd8e91eb640
\ No newline at end of file
index c160dacd5fe2fc3d8799732337458e1c7e1d0e50..0b8b2137e10d8e7a282ef58ce56710667d27504d 100644 (file)
@@ -36,7 +36,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.213 2003/04/15 01:19:49 drh Exp $
+** $Id: vdbe.c,v 1.214 2003/04/15 14:01:43 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -3916,7 +3916,8 @@ case OP_NewRecno: {
 ** be an integer.  The stack is popped twice by this instruction.
 **
 ** If P2==1 then the row change count is incremented.  If P2==0 the
-** row change count is unmodified.
+** row change count is unmodified.  The rowid is stored for subsequent
+** return by the sqlite_last_insert_rowid() function if P2 is 1.
 */
 /* Opcode: PutStrKey P1 * *
 **
@@ -3945,8 +3946,10 @@ case OP_PutStrKey: {
       nKey = sizeof(int);
       iKey = intToKey(aStack[nos].i);
       zKey = (char*)&iKey;
-      db->lastRowid = aStack[nos].i;
-      if( pOp->p2 ) db->nChange++;
+      if( pOp->p2 ){
+        db->nChange++;
+        db->lastRowid = aStack[nos].i;
+      }
       if( pC->nextRowidValid && aStack[nos].i>=pC->nextRowid ){
         pC->nextRowidValid = 0;
       }
index 35b820e49df9af6fc5b7853fdab2d8439128b670..1c4c49c1e25879c8e83a1b48f3c031af6f66a36d 100644 (file)
@@ -12,7 +12,7 @@
 # focus of this file is testing the magic ROWID column that is
 # found on all tables.
 #
-# $Id: rowid.test,v 1.8 2002/02/19 22:42:06 drh Exp $
+# $Id: rowid.test,v 1.9 2003/04/15 14:01:44 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -353,4 +353,57 @@ do_test rowid-7.8 {
   }
 } {2 66 3 111}
 
+# Make sure AFTER triggers that do INSERTs do not change the last_insert_rowid.
+# Ticket #290
+#
+do_test rowid-8.1 {
+  execsql {
+    CREATE TABLE t3(a integer primary key);
+    CREATE TABLE t4(x);
+    INSERT INTO t4 VALUES(1);
+    CREATE TRIGGER r3 AFTER INSERT on t3 FOR EACH ROW BEGIN
+      INSERT INTO t4 VALUES(NEW.a+10);
+    END;
+    SELECT * FROM t3;
+  }
+} {}
+do_test rowid-8.2 {
+  execsql {
+    SELECT rowid, * FROM t4;
+  }
+} {1 1}
+do_test rowid-8.3 {
+  execsql {
+    INSERT INTO t3 VALUES(123);
+    SELECT last_insert_rowid();
+  }
+} {123}
+do_test rowid-8.4 {
+  execsql {
+    SELECT * FROM t3;
+  }
+} {123}
+do_test rowid-8.5 {
+  execsql {
+    SELECT rowid, * FROM t4;
+  }
+} {1 1 2 133}
+do_test rowid-8.6 {
+  execsql {
+    INSERT INTO t3 VALUES(NULL);
+    SELECT last_insert_rowid();
+  }
+} {124}
+do_test rowid-8.7 {
+  execsql {
+    SELECT * FROM t3;
+  }
+} {123 124}
+do_test rowid-8.8 {
+  execsql {
+    SELECT rowid, * FROM t4;
+  }
+} {1 1 2 133 3 {}}
+
+
 finish_test