1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-23 11:22:09 +03:00

Ensure the counts of "deferred FK violations" and "deferred immediate FK violations" are kept separate when "PRAGMA defer_foreign_keys" is used.

FossilOrigin-Name: c5190b0fd9bd76653fb7bb08e931699e42c88cef8a00352360d091948cda93a2
This commit is contained in:
dan
2025-02-13 14:47:25 +00:00
parent 25367c1eb0
commit 5087eacb18
5 changed files with 49 additions and 14 deletions

View File

@ -1,5 +1,5 @@
C Fix\sa\sfew\s32-bit\soverflow\sproblems\sin\sshowdb.c.
D 2025-02-12T20:19:57.718
C Ensure\sthe\scounts\sof\s"deferred\sFK\sviolations"\sand\s"deferred\simmediate\sFK\sviolations"\sare\skept\sseparate\swhen\s"PRAGMA\sdefer_foreign_keys"\sis\sused.
D 2025-02-13T14:47:25.229
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@ -772,7 +772,7 @@ F src/parse.y f84673f1454e2bcf517623d4346e67fb2d73e57826ea103681ad5848238f6029
F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319
F src/pragma.c ce1182217aa540e034c6da2f17515e3706bf52c837e8222361be9ccd7a9d495a
F src/pragma.c c7ada272232e1182c4536d9637fa7b955a10bc1bd8d5a87d4dc9309dab827791
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
@ -847,7 +847,7 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989
F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40
F src/vdbe.c b98d86de7f0e6c02fb14e0e1ae8feab6aa84669d389771a848e23f59eb70dcad
F src/vdbe.c 063763e08f1ad00890b7377fc663dbccec85a47630f5d2bbb13f3fdf77e06f78
F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89
F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091
F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86
@ -1153,7 +1153,7 @@ F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb30
F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49
F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
F test/fkey5.test 6727452e163a427147e84e739da18713da553d79f9783559b04fdcd36d5c7421
F test/fkey6.test ebd11efb00b9c70b57f4c6b6184445145c96e320329bd90a175036570c5b25ca
F test/fkey6.test 1e0874ba15f8ed1e14a1d0a40fc8fb90a9912f4c82ea220a43137d4d9eff4d69
F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031
F test/fkey8.test 51deda7f1a1448bca95875e4a6e1a3a75b4bd7215e924e845bd60de60e4d84bf
F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749
@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 6df859cd18ded3ca64a184e45709503dd9b6a3f65e7611d3352f0bad288400f4
R ccf520bbb9a2866ca6aec9263e29fec3
P 9377766647eeaa575d646cf5f66c3163ef7074930aa5c3b11073e6b1e90ce799
R 83e471c75257ae61568ff2a0fb629999
U dan
Z 06705c2bc45432ef657decbbc71b836f
Z e4f9c0246de36460838c8b5d3a4c9bbe
# Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
9377766647eeaa575d646cf5f66c3163ef7074930aa5c3b11073e6b1e90ce799
c5190b0fd9bd76653fb7bb08e931699e42c88cef8a00352360d091948cda93a2

View File

@ -1153,7 +1153,10 @@ void sqlite3Pragma(
}
}else{
db->flags &= ~mask;
if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0;
if( mask==SQLITE_DeferFKs ){
db->nDeferredImmCons = 0;
db->nDeferredCons = 0;
}
if( (mask & SQLITE_WriteSchema)!=0
&& sqlite3_stricmp(zRight, "reset")==0
){

View File

@ -7483,12 +7483,14 @@ case OP_Param: { /* out2 */
** statement counter is incremented (immediate foreign key constraints).
*/
case OP_FkCounter: {
if( db->flags & SQLITE_DeferFKs ){
db->nDeferredImmCons += pOp->p2;
}else if( pOp->p1 ){
if( pOp->p1 ){
db->nDeferredCons += pOp->p2;
}else{
p->nFkConstraint += pOp->p2;
if( db->flags & SQLITE_DeferFKs ){
db->nDeferredImmCons += pOp->p2;
}else{
p->nFkConstraint += pOp->p2;
}
}
break;
}

View File

@ -267,5 +267,35 @@ do_execsql_test 5.1 {
COMMIT;
}
#-------------------------------------------------------------------------
#
reset_db
do_execsql_test 6.1 {
PRAGMA writable_schema = 1;
INSERT INTO sqlite_schema
VALUES('table', 't1', 't1', 2, 'CREATE TABLE t1(x INTEGER PRIMARY KEY)');
}
db close
sqlite3 db test.db
do_execsql_test 6.1 {
PRAGMA foreign_keys = 1;
PRAGMA writable_schema = 1;
}
do_execsql_test 6.2 {
CREATE TABLE t2(
y INTEGER PRIMARY KEY,
z INTEGER REFERENCES t1(x) DEFERRABLE INITIALLY DEFERRED
);
}
do_execsql_test 6.3 {
BEGIN;
INSERT INTO t2 VALUES(1,0),(2,1);
CREATE VIRTUAL TABLE t3 USING fts5(a, b, content='', tokendata=1);
INSERT INTO t3 VALUES(3,3);
PRAGMA defer_foreign_keys=ON;
DELETE FROM t2;
COMMIT;
}
finish_test