]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems with error handling when applying changesets with update loops.
authordan <Dan Kennedy>
Tue, 19 May 2026 18:28:03 +0000 (18:28 +0000)
committerdan <Dan Kennedy>
Tue, 19 May 2026 18:28:03 +0000 (18:28 +0000)
FossilOrigin-Name: f797925df05f1a53392dba416aa72067716bb6e38ebc679d313f8a98f89c5913

ext/session/sessionconflict2.test
ext/session/sessionfault3.test
ext/session/sqlite3session.c
manifest
manifest.uuid

index f0301428d15440b28269c8cd776711983a40d970..012277aa5cb2c08ea694d9322457684983ef588f 100755 (executable)
@@ -234,6 +234,24 @@ do_conflict_test 4.3.1 {
   {UPDATE t1 CONSTRAINT {i 10 {} {} {} {} i 9} {{} {} {} {} {} {} i 11}}
 }
 
+do_conflict_test 4.3.2 {
+  swap t1 a c 1 2
+  swap t1 a c 3 4
+  db eval { UPDATE t1 SET c=11 WHERE a=10; }
+  swap t1 a d 5 6
+  swap t1 a d 4 5
+} {
+  {UPDATE t1 CONSTRAINT {i 10 {} {} i 10 {} {}} {{} {} {} {} i 11 {} {}}}
+}
+
+do_conflict_test 4.3.3 {
+  swap t1 a c 1 2
+  swap t1 a c 2 3
+  swap t1 a c 3 4
+  swap t1 a c 4 1
+} {
+}
+
 db2 close
 finish_test
 
index f2bcb894172864762d3421ed9b031c2cf282d126..3e7dc6167eef7cc3b4bdbe1f14d0b905ce966238 100644 (file)
@@ -94,4 +94,45 @@ do_faultsim_test 2 -faults oom-t* -prep {
   catch { S delete }
 }
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 3.0 {
+  CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
+  INSERT INTO t1 VALUES(1, 'one');
+  INSERT INTO t1 VALUES(2, 'two');
+  INSERT INTO t1 VALUES(3, 'three');
+  INSERT INTO t1 VALUES(4, 'four');
+  INSERT INTO t1 VALUES(5, 'five');
+}
+faultsim_save_and_close
+faultsim_restore_and_reopen
+
+set C [changeset_from_sql {
+  UPDATE t1 SET b=NULL WHERE a IN (1, 3, 5);
+  UPDATE t1 SET b='three' WHERE a=1;
+  UPDATE t1 SET b='five' WHERE a=3;
+  UPDATE t1 SET b='one' WHERE a=5;
+}]
+
+do_execsql_test 3.1 {
+  SELECT * FROM t1
+} {
+  1 three 2 two 3 five 4 four 5 one
+}
+
+proc xConflict {args} {
+  lappend ::conflict_list $args
+  return "OMIT"
+}
+
+do_faultsim_test 3 -faults oom* -prep {
+  faultsim_restore_and_reopen
+  db eval {SELECT * FROM sqlite_schema}
+} -body {
+  sqlite3changeset_apply_v2 db $::C xConflict
+  set {} {}
+} -test {
+  faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
+}
+
 finish_test
index 87cc274d97263e9adfc6a432c27e7b8ebaba2ab8..2542d1e30c156376e932edaec3f4ee459383c891 100644 (file)
@@ -5206,7 +5206,12 @@ static int sessionRetryIterInit(
     pRet->abPK = pApply->abPK;
     sessionBufferGrow(&pRet->tblhdr, nByte, &rc);
     pRet->apValue = (sqlite3_value**)pRet->tblhdr.aBuf;
-    if( rc==SQLITE_OK ) memset(pRet->apValue, 0, nByte);
+    if( rc==SQLITE_OK ){
+      memset(pRet->apValue, 0, nByte);
+    }else{
+      sqlite3changeset_finalize(pRet);
+      pRet = 0;
+    }
   }
 
   *ppIter = pRet;
@@ -5374,7 +5379,9 @@ static int sessionUpdateToDeleteInsert(
     );
   }
   if( rc==SQLITE_OK && sqlite3_step(pSelect)!=SQLITE_ROW ){
-    rc = SQLITE_ERROR;
+    sessionFinalizeStmt(pSelect, &rc);
+    if( rc==SQLITE_OK ) rc = SQLITE_ERROR;
+    pSelect = 0;
   }
 
   if( rc==SQLITE_OK ){
@@ -5529,6 +5536,8 @@ static int sessionRetryConstraints(
       if( rc==SQLITE_OK ){
         rc = sqlite3_exec(db, "RELEASE update_op", 0, 0, 0);
       }
+    }else{
+      sqlite3_finalize(pInsert);
     }
 
     sqlite3_free(cons.aBuf);
index c01e686ccf08cef6902587fffb3f35af208d596b..57deb36458ef8fbc7edc171c66a3427a029a655f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\strunk\schanges\sinto\sthis\sbranch.
-D 2026-05-19T17:15:05.160
+C Fix\sproblems\swith\serror\shandling\swhen\sapplying\schangesets\swith\supdate\sloops.
+D 2026-05-19T18:28:03.681
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -559,11 +559,11 @@ F ext/session/sessionblob.test 87faf667870b72f08e91969abd9f52a383ab7b514506ee194
 F ext/session/sessionchange.test 6618cb1c1338a4b6df173b6ac42d09623fb71269962abf23ebb7617fe9f45a50
 F ext/session/sessionchange2.test 8f59185216882adc8b34bb5ba63887459acf3df58493bcffa12e4d05ab6a6b85
 F ext/session/sessionconflict.test 19e4a53795c4c930bfec49e809311e09b2a9e202d9446e56d7a8b139046a0c07 x
-F ext/session/sessionconflict2.test 79e4922450355f5ee3929d53a5d4158d0ed5cec284399eb8f5cb756176fa601b x
+F ext/session/sessionconflict2.test 795768e963c96078b7939f397824e26aede6e5563a0e42f7b11c12795f313f3a x
 F ext/session/sessiondiff.test e89f7aedcdd89e5ebac3a455224eb553a171e9586fc3e1e6a7b3388d2648ba8d
 F ext/session/sessionfault.test c2b43d01213b389a3f518e90775fca2120812ba51e50444c4066962263e45c11
 F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576dc79ed344c46fbf41c
-F ext/session/sessionfault3.test 9397819ec25b0960c5bc03c78613f9cb5cacc970f83e817aec1775c2a839a787
+F ext/session/sessionfault3.test aea5331fa6dbe5ca4e19826605e624c0e1767545411479f27c5ef82b41046925
 F ext/session/sessioninvert.test 9018f6a7387ac745084b6374c5e1aa14d648b372e6e1181cfab3df632b662d26 x
 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
 F ext/session/sessionnoact.test 4c7ae5c7d351cb5323bca62b6b095592ad24bd90a6713c178b62ab0063d23e19
@@ -574,7 +574,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 740d9110e72b86fa807ce39e0f6caf161a7b20b3cecc5d07b342c4e428fafac6
+F ext/session/sqlite3session.c ed5a9930c6d4caefaab46c7725dcaf71dec315c39f5cae95326894e4a604cb4e
 F ext/session/sqlite3session.h 063e7bf7be2fff874456f452a224b5b3013b25682d108933b0351c93a1279b9c
 F ext/session/test_session.c 3773e750b5c751956fdbef41a998cc1ba02d59c3dede74e75866e3446a900e69
 F ext/wasm/GNUmakefile 65feef4ec48e62249f90278c4c08a3fe3c69e2461ff560b61c03cd73606e0949
@@ -2206,8 +2206,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 1f71b530c9e8ddce5b25ed0971447cd925f9194afc7a2f929429318a5fcb5a72 4d8c3a2919dc942a0a044ec7582a688e0f93e91f4a465bb94390fbe3ad1b50b4
-R 51bc5e2ac281a99f16d90b52f95bc1e8
+P e480e126fc1550948bd1a3635f0e3a862353dcd8b0f1921ab6e66d699110b477
+R 555931a9156d91c5622ca72d0db559c6
 U dan
-Z 7f1594d88d6b54223b3b8783d29a568d
+Z 92799d9d997d3240b13f6af3f8d382c0
 # Remove this line to create a well-formed Fossil manifest.
index a4eee70fa9881a027a99f5db2c09a6ae061b00a4..d8afc5129017258735bd3684cc107303bf54b6ab 100644 (file)
@@ -1 +1 @@
-e480e126fc1550948bd1a3635f0e3a862353dcd8b0f1921ab6e66d699110b477
+f797925df05f1a53392dba416aa72067716bb6e38ebc679d313f8a98f89c5913