Skip to content

Commit f70b88c

Browse files
committed
Ensure the counts of "deferred FK violations" and "deferred immediate FK violations" are kept separate when "PRAGMA defer_foreign_keys" is used.
1 parent b4930c7 commit f70b88c

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

src/pragma.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -1153,7 +1153,10 @@ void sqlite3Pragma(
11531153
}
11541154
}else{
11551155
db->flags &= ~mask;
1156-
if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0;
1156+
if( mask==SQLITE_DeferFKs ){
1157+
db->nDeferredImmCons = 0;
1158+
db->nDeferredCons = 0;
1159+
}
11571160
if( (mask & SQLITE_WriteSchema)!=0
11581161
&& sqlite3_stricmp(zRight, "reset")==0
11591162
){

src/vdbe.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -7483,12 +7483,14 @@ case OP_Param: { /* out2 */
74837483
** statement counter is incremented (immediate foreign key constraints).
74847484
*/
74857485
case OP_FkCounter: {
7486-
if( db->flags & SQLITE_DeferFKs ){
7487-
db->nDeferredImmCons += pOp->p2;
7488-
}else if( pOp->p1 ){
7486+
if( pOp->p1 ){
74897487
db->nDeferredCons += pOp->p2;
74907488
}else{
7491-
p->nFkConstraint += pOp->p2;
7489+
if( db->flags & SQLITE_DeferFKs ){
7490+
db->nDeferredImmCons += pOp->p2;
7491+
}else{
7492+
p->nFkConstraint += pOp->p2;
7493+
}
74927494
}
74937495
break;
74947496
}

test/fkey6.test

+30
Original file line numberDiff line numberDiff line change
@@ -267,5 +267,35 @@ do_execsql_test 5.1 {
267267
COMMIT;
268268
}
269269

270+
#-------------------------------------------------------------------------
271+
#
272+
reset_db
273+
274+
do_execsql_test 6.1 {
275+
PRAGMA writable_schema = 1;
276+
INSERT INTO sqlite_schema
277+
VALUES('table', 't1', 't1', 2, 'CREATE TABLE t1(x INTEGER PRIMARY KEY)');
278+
}
279+
db close
280+
sqlite3 db test.db
281+
do_execsql_test 6.1 {
282+
PRAGMA foreign_keys = 1;
283+
PRAGMA writable_schema = 1;
284+
}
285+
do_execsql_test 6.2 {
286+
CREATE TABLE t2(
287+
y INTEGER PRIMARY KEY,
288+
z INTEGER REFERENCES t1(x) DEFERRABLE INITIALLY DEFERRED
289+
);
290+
}
291+
do_execsql_test 6.3 {
292+
BEGIN;
293+
INSERT INTO t2 VALUES(1,0),(2,1);
294+
CREATE VIRTUAL TABLE t3 USING fts5(a, b, content='', tokendata=1);
295+
INSERT INTO t3 VALUES(3,3);
296+
PRAGMA defer_foreign_keys=ON;
297+
DELETE FROM t2;
298+
COMMIT;
299+
}
270300

271301
finish_test

0 commit comments

Comments
 (0)