Avoid leaving a transaction open in the session module when a changeset applied in no-savepoint mode fails because an UPDATE hits a constraint. Report [bugs:/info/2026-10-21T02:23:36Z | 2026-10-21T02:23:36Z].

FossilOrigin-Name: 46d3df136172c29cd76ad980fe7d5ae0bda04d10980886b97cc5ae9fceef08cc
This commit is contained in:
dan committed 2026-10-26 19:43:48 +00:00
1 parent 0b97f1b101
commit 5d1ee88809
4 files changed
+45 -19

No files matched your search

+23
View File
@@ -801,6 +801,29 @@ do_test $tn.15.3 {
} {1 data 1 {} {} First 2 data 2 {} {} Second}
db2 close
do_execsql_test $tn.16.4 {
PRAGMA foreign_keys = ON;
CREATE TABLE x2(a INTEGER PRIMARY KEY, b)%WR%;
CREATE TABLE x3(c REFERENCES x2(a) ON DELETE RESTRICT);
}
do_test $tn.16.5 {
execsql BEGIN
set C [changeset_from_sql { INSERT INTO x2 VALUES(1, 'new'); }]
execsql ROLLBACK
execsql {
INSERT INTO x2 VALUES(1, 'old');
INSERT INTO x3 VALUES(1);
}
set CONFLICT_HANDLERS [list REPLACE]
set rc [catch { sqlite3changeset_apply_v2 -nosavepoint db $C xConflict } msg]
list $rc $msg [sqlite3_get_autocommit db]
} {1 SQLITE_CONSTRAINT 1}
do_execsql_test $tn.16.6 {
SELECT * FROM x2;
PRAGMA foreign_keys = OFF;
} {1 old}
}]
}
+13 -10
View File
@@ -5205,19 +5205,22 @@ static int sessionApplyOneWithRetry(
assert( pIter->op==SQLITE_INSERT );
rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0);
if( rc==SQLITE_OK ){
int rc2;
rc = sessionBindRow(pIter,
sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete);
sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1);
}
if( rc==SQLITE_OK ){
sqlite3_step(pApply->pDelete);
rc = sqlite3_reset(pApply->pDelete);
}
if( rc==SQLITE_OK ){
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
}
if( rc==SQLITE_OK ){
rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
if( rc==SQLITE_OK ){
sqlite3_step(pApply->pDelete);
rc = sqlite3_reset(pApply->pDelete);
}
if( rc==SQLITE_OK ){
rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
}
if( rc!=SQLITE_OK ){
sqlite3_exec(db, "ROLLBACK TO replace_op", 0, 0, 0);
}
rc2 = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0);
if( rc==SQLITE_OK ) rc = rc2;
}
}
}
+8 -8
View File
@@ -1,5 +1,5 @@
C Test\scase\stweaks\sto\saccount\sfor\sdifferent\sconfigurations.
D 2026-10-26T15:18:19.362
C Avoid\sleaving\sa\stransaction\sopen\sin\sthe\ssession\smodule\swhen\sa\schangeset\sapplied\sin\sno-savepoint\smode\sfails\sbecause\san\sUPDATE\shits\sa\sconstraint.\sReport\s[bugs:/info/2026-10-21T02:23:36Z\s|\s2026-10-21T02:23:36Z].
D 2026-10-26T19:43:48.872
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -539,7 +539,7 @@ F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1
F ext/session/changeset.c 7cbfc2fff110620b4f55199393fea7f9046eea1c4f89193d3a0cde51ed49a408
F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa
F ext/session/changesetfuzz1.test 15b629004e58d5ffcc852e6842a603775bb64b1ce51254831f3d12b113b616cd
F ext/session/session1.test 5d2502922d38a1579076863827342379a1609ca6bae78c40691a2be1ed1be2aa x
F ext/session/session1.test 373eda3d2e4876f3739e3fcaef1b076de9ce3609e520be012e50c5bdd710862b x
F ext/session/session2.test ee83bb973b9ce17ccce4db931cdcdae65eb40bbb22089b2fe6aa4f6be3b9303f
F ext/session/session3.test 2cc1629cfb880243aec1a7251145e07b78411d851b39b2aa1390704550db8e6a
F ext/session/session4.test ad0ddaaddb9a99dac433d83fc6674aae2af072b8f57e63a6b3f2d76f1a66e98c
@@ -584,7 +584,7 @@ F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a
F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795
F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec
F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
F ext/session/sqlite3session.c 15fad1c213817c55fa274cfe209461172643177f84070356b2caa1c11fa5b685
F ext/session/sqlite3session.c 08fbefd64c5ae9e645633609c640cf83f7ec941aeb6340a3fe18dfb661ca67b3
F ext/session/sqlite3session.h ca7c4422c1514a95056cc8d333217df6b1829d39058126b1de85d10cd62d7a9c
F ext/session/test_session.c b30b1ecbb042d08f42406eb4fcfb2efef9609507e1b6b04b0a1ea4cb0a3cffe3
F ext/vec1/Makefile 791bd52e40d5b65026c63c8778dbdfc6d66083457ee50cf873d6483d98f43437
@@ -2301,8 +2301,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P c2c5f34f0f60d3f8b09976149d633b36754c0f139b41cb30fc27b478dee9fdd5
R 182c0148d5f8db865e7f8dcadf918e16
U drh
Z c462b7c971fb03606d455ab17967db13
P 46476df942c3684665e66f9e2cb7e7fa6a1822d1f059969cca91a6b665c4eea0
R 8a051c469fc9f083529d3388eb26e194
U dan
Z 52e1105325beba920f7f25ab442d6cdc
# Remove this line to create a well-formed Fossil manifest.
+1 -1
View File
@@ -1 +1 @@
46476df942c3684665e66f9e2cb7e7fa6a1822d1f059969cca91a6b665c4eea0
46d3df136172c29cd76ad980fe7d5ae0bda04d10980886b97cc5ae9fceef08cc