]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Modifications to ensure the nExtraDelete-related assert() statement does not fail.
authordan <dan@noemail.net>
Thu, 28 Jan 2016 17:06:17 +0000 (17:06 +0000)
committerdan <dan@noemail.net>
Thu, 28 Jan 2016 17:06:17 +0000 (17:06 +0000)
FossilOrigin-Name: f43ff8f82d6c1239e6f9a32e7716421c1180ac74

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

index 9790c25453fbbeaa4439f86acecdb269edcb83d1..dc719b86cec2d2d1da8c34bf86d7e6c0c0a58db7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\sthe\sname\sof\sthe\sBTREE_IDXDELETE\sflag\sto\sBTREE_AUXDELETE,\sto\sbetter\nreflect\sits\spurpose.
-D 2016-01-27T16:26:25.226
+C Modifications\sto\sensure\sthe\snExtraDelete-related\sassert()\sstatement\sdoes\snot\sfail.
+D 2016-01-28T17:06:17.501
 F Makefile.in 027c1603f255390c43a426671055a31c0a65fdb4
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 6fca5455aaecbd14479f33f091aa19df2d3d2969
@@ -412,7 +412,7 @@ F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3
 F src/utf.c 32d7f82aa921322f3e1c956f4b58f019ebd2c6b3
 F src/util.c 72d40df0a52d3f30b462a15f0e094fcbade6dc82
 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
-F src/vdbe.c c367615fecb5fae8a39113ee2b6ecbab94e4bcd3
+F src/vdbe.c 66c429896ce44ebcbe199f1c7a592c12095158f0
 F src/vdbe.h 7a733ea8aac1b77305a67698e784fa3484ee3337
 F src/vdbeInt.h 40c728712a2975855a2ac6aac44bf02dfd4a4c30
 F src/vdbeapi.c ffae8f5af4570fbd548504e815e9fb7227f0822e
@@ -642,7 +642,7 @@ F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48
 F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13
 F test/fkey8.test 8f08203458321e6c19a263829de4cfc936274ab0
 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749
-F test/fordelete.test f794392f1768584609fa439f7528484dc04d3a03
+F test/fordelete.test 57ed9b953eeace09dd2eac3251b40bf9d6990aec
 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
 F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c
 F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7
@@ -1422,7 +1422,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P bbd25cf179df5bda1fe729928d6746248f06e46f
-R 21474325914b9893f106ce3a1694990c
-U drh
-Z 6ce2f1bf15f4f84bace517d6cc10a5ac
+P 1d3bf6bebdda9f96734bc139601e9b05344ea0b4
+R 8c4c31e27c8a082a17d0a49af9f3ce1b
+U dan
+Z 9dc5d2517a8a4fb456754e0a3cfe77cf
index d16254398c5d4c79a53c7cc3bc207d2d5e7e1f97..b83d35e77293d6ad7f744a5283091842d500c030 100644 (file)
@@ -1 +1 @@
-1d3bf6bebdda9f96734bc139601e9b05344ea0b4
\ No newline at end of file
+f43ff8f82d6c1239e6f9a32e7716421c1180ac74
\ No newline at end of file
index f6a7946e6f4f57b35e3dd250495ea2d03146fedc..c2e70ea8b29c96f9758461ba063d11c1bfecd3d5 100644 (file)
@@ -4405,14 +4405,16 @@ case OP_Delete: {
   assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE );
 
 #ifdef SQLITE_DEBUG
-  if( pC->isEphemeral==0
-   && (pOp->p5 & OPFLAG_AUXDELETE)==0
-   && (pC->wrFlag & OPFLAG_FORDELETE)==0
-  ){
-    nExtraDelete++;
-  }
-  if( pOp->p2 & OPFLAG_NCHANGE ){
-    nExtraDelete--;
+  if( p->pFrame==0 ){
+    if( pC->isEphemeral==0
+        && (pOp->p5 & OPFLAG_AUXDELETE)==0
+        && (pC->wrFlag & OPFLAG_FORDELETE)==0
+      ){
+      nExtraDelete++;
+    }
+    if( pOp->p2 & OPFLAG_NCHANGE ){
+      nExtraDelete--;
+    }
   }
 #endif
 
@@ -4960,21 +4962,9 @@ case OP_IdxDelete: {
   r.nField = (u16)pOp->p3;
   r.default_rc = 0;
   r.aMem = &aMem[pOp->p2];
-#ifdef SQLITE_DEBUG
-  {
-    int i;
-    for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) );
-    if( pC->isEphemeral==0
-     && (pOp->p5 & OPFLAG_AUXDELETE)==0
-     && (pC->wrFlag & OPFLAG_FORDELETE)==0
-    ){
-      nExtraDelete++;
-    }
-  }
-#endif
   rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res);
   if( rc==SQLITE_OK && res==0 ){
-    rc = sqlite3BtreeDelete(pCrsr, 0);
+    rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE);
   }
   assert( pC->deferredMoveto==0 );
   pC->cacheStatus = CACHE_STALE;
index 7a49b5cbfd7a1314daeee5870f2664d731bdafb3..bc38a4c5e31974569b311d7142268a9088af198a 100644 (file)
@@ -158,5 +158,53 @@ do_test 3.2 {
   }
 } {6 {} {} {}}
 
+
+#-------------------------------------------------------------------------
+#
+reset_db 
+do_execsql_test 4.0 {
+  CREATE TABLE log(x);
+  CREATE TABLE p1(one PRIMARY KEY, two);
+
+  CREATE TRIGGER tr_bd BEFORE DELETE ON p1 BEGIN
+    INSERT INTO log VALUES('delete');
+  END;
+  INSERT INTO p1 VALUES('a', 'A'), ('b', 'B'), ('c', 'C');
+  DELETE FROM p1 WHERE one = 'a';
+}
+
+reset_db
+do_execsql_test 4.1 {
+  BEGIN TRANSACTION;
+  CREATE TABLE tbl(a PRIMARY KEY, b, c);
+  CREATE TABLE log(a, b, c);
+  INSERT INTO "tbl" VALUES(1,2,3);
+  CREATE TRIGGER the_trigger BEFORE DELETE ON tbl BEGIN 
+    INSERT INTO log VALUES(1, 2,3);
+  END;
+  COMMIT;
+  DELETE FROM tbl WHERE a=1;
+}
+
+reset_db
+do_execsql_test 5.1 {
+  PRAGMA foreign_keys = 1;
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+  CREATE TABLE t2(
+      c INTEGER PRIMARY KEY,
+      d INTEGER DEFAULT 1 REFERENCES t1 ON DELETE SET DEFAULT
+  );
+} {}
+do_execsql_test 5.2 {
+  INSERT INTO t1 VALUES(1, 'one');
+  INSERT INTO t1 VALUES(2, 'two');
+  INSERT INTO t2 VALUES(1, 2);
+  SELECT * FROM t2;
+} {1 2}
+do_execsql_test 5.3 {
+  DELETE FROM t1 WHERE a = 2;
+} {}
+
+
 finish_test