]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an assertion failure due to interaction between the count_changes pragma and...
authordanielk1977 <danielk1977@noemail.net>
Mon, 10 Jan 2005 02:48:49 +0000 (02:48 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Mon, 10 Jan 2005 02:48:49 +0000 (02:48 +0000)
FossilOrigin-Name: 6c7bec1b3aee0287e30f43c1d6a7b67b1c47e774

manifest
manifest.uuid
src/delete.c
src/insert.c
test/pragma.test

index dd42403d4510b25b248577e92504d1dbc198d36e..9e88b08e2f280fd4a89b0ec18f2b4ebdee41877f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Tcl\sinterface\sdoes\sas\ssqlite3\sor\sas\ssqlite.\s\sA\scompile-time\soption\sallows\r\nduel\slinking.\s\sAlso\sfix\sa\sbug\sin\sthe\spragma\schange\sfrom\searlier\stoday.\s(CVS\s2186)
-D 2005-01-08T18:42:28
+C Fix\san\sassertion\sfailure\sdue\sto\sinteraction\sbetween\sthe\scount_changes\spragma\sand\striggers.\s(CVS\s2187)
+D 2005-01-10T02:48:49
 F Makefile.in ecf441ac5ca1ccfc8748a8a9537706e69893dfa4
 F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
 F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
@@ -34,12 +34,12 @@ F src/btree.h 861e40b759a195ba63819740e484390012cf81ab
 F src/build.c af1296e8a21a406b4f4c4f1e1365e075071219f3
 F src/cursor.c f883813759742068890b1f699335872bfa8fdf41
 F src/date.c 65536e7ea04fdde6e0551264fca15966966e171f
-F src/delete.c 5e5bcf0092b146a399e571d1e704b3b22633d2d0
+F src/delete.c 32277d2834e36c7538c047f14d643751c256c73b
 F src/expr.c d718509e56f58b06bc5f9b46afb295675334d544
 F src/func.c b668e5ad043176049454c95a6a780367a0e8f6bb
 F src/hash.c a97721a55440b7bea31ffe471bb2f6b4123cddd5
 F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
-F src/insert.c 0b9077c6752530e9919a8c84375cfa2c4652260a
+F src/insert.c f6b69e40e8938f63a2368cbcb5087a56098cf632
 F src/legacy.c d58ea507bce885298a2c8c3cbb0f4bff5d47830b
 F src/main.c a05e1e50406d2776272c1470077136f63866bbe2
 F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
@@ -161,7 +161,7 @@ F test/pager.test 394455707a079804e8a4e431d12edce831a065f0
 F test/pager2.test 49c0f57c7da0b060f0486b85fdd074025caa694e
 F test/pager3.test 647f696a9cf7409df00a1e0047c2eb55585a1b85
 F test/pagesize.test 1b826d1608fd86d2303aa895b5586052ad07eba1
-F test/pragma.test 3673c0eb920cf2489410dc58f9875384cf4acdce
+F test/pragma.test c1b4cdb2545131e4adec3250d02544688c6a5c9d
 F test/printf.test 92ba4c510b4fc61120ffa4a01820446ed917ae57
 F test/progress.test 5ddba78cb6011fba36093973cfb3ac473b8fb96a x
 F test/quick.test 91e5b8ae6663dc9e3e754b271f0384f0cae706e6
@@ -263,7 +263,7 @@ F www/tclsqlite.tcl e73f8f8e5f20e8277619433f7970060ab01088fc
 F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
 F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
 F www/whentouse.tcl c3b50d3ac31c54be2a1af9b488a89d22f1e6e746
-P 0a90eaf398aa4a689cd8326cd017951513ca748a
-R c4f4620650d61e94b490965cc36efb0b
-U drh
-Z 49fbfa0204d130bf85624d3aa736264c
+P ad10953799f3aa15fde41cbbd5911a3b56c326ec
+R 1ac4cd5c08a83609a7da947b3ea99143
+U danielk1977
+Z 66f70bfca0a624fd768df4e664b868f3
index 4e3e67c5a24f43d54243a8f54cb048f3d89a9f4f..1a026f125cd7bada1bfd187f32cc85fc4fcf5e64 100644 (file)
@@ -1 +1 @@
-ad10953799f3aa15fde41cbbd5911a3b56c326ec
\ No newline at end of file
+6c7bec1b3aee0287e30f43c1d6a7b67b1c47e774
\ No newline at end of file
index f786bdd78a08b016b877d7d556e668b3f560b036..f29d665d3a647964c3e6b1a064082753c59c98f3 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.94 2004/12/25 01:03:14 drh Exp $
+** $Id: delete.c,v 1.95 2005/01/10 02:48:49 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -329,7 +329,7 @@ void sqlite3DeleteFrom(
   ** generating code because of a call to sqlite3NestedParse(), do not
   ** invoke the callback function.
   */
-  if( db->flags & SQLITE_CountRows && pParse->nested==0 ){
+  if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){
     sqlite3VdbeAddOp(v, OP_Callback, 1, 0);
     sqlite3VdbeSetNumCols(v, 1);
     sqlite3VdbeSetColName(v, 0, "rows deleted", P3_STATIC);
index 04b930cf0d5d55f49eb440722bc0542a3391c09e..ebc51e2e03c7a43d6281166676d6005aa27f7e02 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle INSERT statements in SQLite.
 **
-** $Id: insert.c,v 1.128 2004/12/07 15:41:49 drh Exp $
+** $Id: insert.c,v 1.129 2005/01/10 02:48:49 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -693,7 +693,7 @@ void sqlite3Insert(
   ** generating code because of a call to sqlite3NestedParse(), do not
   ** invoke the callback function.
   */
-  if( db->flags & SQLITE_CountRows && pParse->nested==0 ){
+  if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){
     sqlite3VdbeAddOp(v, OP_MemLoad, iCntMem, 0);
     sqlite3VdbeAddOp(v, OP_Callback, 1, 0);
     sqlite3VdbeSetNumCols(v, 1);
index 6b7396a86a3e79bf907fe16a479edbacea0cfa52..aba53f616f1cd84bd5c5c74ebcbf0474004b2284 100644 (file)
@@ -12,7 +12,7 @@
 #
 # This file implements tests for the PRAGMA command.
 #
-# $Id: pragma.test,v 1.30 2005/01/08 15:44:26 drh Exp $
+# $Id: pragma.test,v 1.31 2005/01/10 02:48:49 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -25,7 +25,11 @@ source $testdir/tester.tcl
 # pragma-4.*: Test cache_size and default_cache_size on attached db.
 # pragma-5.*: Test that pragma synchronous may not be used inside of a
 #             transaction.
+# pragma-6.*: Test schema-query pragmas.
+# pragma-7.*: Miscellaneous tests.
+# pragma-8.*: Test user_version and schema_version pragmas.
 # pragma-9.*: Test temp_store and temp_store_directory.
+# pragma-10.*: Test the count_changes pragma in the presence of triggers.
 #
 
 # Delete the preexisting database to avoid the special setup
@@ -654,4 +658,57 @@ do_test pragma-9.10 {
 } {1 {no such table: temp_store_directory_test}}
 } ;# ifcapable pager_pragmas
 
+ifcapable trigger {
+
+do_test pragma-10.0 {
+  catchsql {
+    DROP TABLE main.t1;
+  }
+  execsql {
+    PRAGMA count_changes = 1;
+
+    CREATE TABLE t1(a PRIMARY KEY);
+    CREATE TABLE t1_mirror(a);
+    CREATE TABLE t1_mirror2(a);
+    CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN 
+      INSERT INTO t1_mirror VALUES(new.a);
+    END;
+    CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN 
+      INSERT INTO t1_mirror2 VALUES(new.a);
+    END;
+    CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN 
+      UPDATE t1_mirror SET a = new.a WHERE a = old.a;
+    END;
+    CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN 
+      UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
+    END;
+    CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN 
+      DELETE FROM t1_mirror WHERE a = old.a;
+    END;
+    CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN 
+      DELETE FROM t1_mirror2 WHERE a = old.a;
+    END;
+  }
+} {}
+
+do_test pragma-10.1 {
+  execsql {
+    INSERT INTO t1 VALUES(randstr(10,10));
+  }
+} {1}
+do_test pragma-10.2 {
+  execsql {
+    UPDATE t1 SET a = randstr(10,10);
+  }
+} {1}
+do_test pragma-10.3 {
+  execsql {
+    DELETE FROM t1;
+  }
+} {1}
+
+} ;# ifcapable trigger
+
 finish_test
+
+