Modifications to ensure the nExtraDelete-related assert() statement does not fail.

FossilOrigin-Name: f43ff8f82d6c1239e6f9a32e7716421c1180ac74
This commit is contained in:
dan
2016-01-28 17:06:17 +00:00
parent def19e3b48
commit e61bbf4417
4 changed files with 68 additions and 30 deletions
+8 -8
View File
@@ -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
+1 -1
View File
@@ -1 +1 @@
1d3bf6bebdda9f96734bc139601e9b05344ea0b4
f43ff8f82d6c1239e6f9a32e7716421c1180ac74
+11 -21
View 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;
+48
View 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