From: dan Date: Tue, 19 Aug 2025 21:35:23 +0000 (+0000) Subject: Fix a problem causing an SQLITE_CHANGESET_DATA conflict of a DELETE operation to... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=697d29ea49865a3e62b93681b4c57f2d9cff2e5f;p=thirdparty%2Fsqlite.git Fix a problem causing an SQLITE_CHANGESET_DATA conflict of a DELETE operation to be incorrectly ignored if the SQLITE_CHANGESETAPPLY_IGNORENOOP is specified. FossilOrigin-Name: 78b543f85ac6643f3b69bf1250c6362f00e030f93f460ef7d04902682ef64ee9 --- diff --git a/ext/session/sessionnoop2.test b/ext/session/sessionnoop2.test index e406c10ca1..ab8ae74cc3 100644 --- a/ext/session/sessionnoop2.test +++ b/ext/session/sessionnoop2.test @@ -174,6 +174,45 @@ do_test 3.5 { {INSERT sqlite_stat1 CONFLICT {t xyz t sqlite_autoindex_xyz_1 t {100 1 1}} {t xyz t sqlite_autoindex_xyz_1 t {200 1 1}}} }] +#------------------------------------------------------------------------- +set ::conflict_list [list] +proc xConflict {args} { + lappend ::conflict_list $args + return "OMIT" +} + +forcedelete test.db2 +do_execsql_test 4.0 { + CREATE TABLE x1(a, b, c, PRIMARY KEY(a)) WITHOUT ROWID; + INSERT INTO x1 VALUES(1, 'one', 'i'); + INSERT INTO x1 VALUES(2, 'two', 'ii'); + INSERT INTO x1 VALUES(3, 'three', 'iii'); + VACUUM INTO 'test.db2'; +} + +set C [changeset_from_sql { + DELETE FROM x1 WHERE a=2; +}] + +sqlite3 db2 test.db2 +do_execsql_test -db db2 4.1 { + UPDATE x1 SET b='four hundred' WHERE a=2; +} + +do_test 4.2.1 { + set ::conflict_list [list] + sqlite3changeset_apply_v2 db2 $C xConflict + set ::conflict_list +} [list {*}{ + {DELETE x1 DATA {i 2 t two t ii} {i 2 t {four hundred} t ii}} +}] +do_test 4.2.2 { + set ::conflict_list [list] + sqlite3changeset_apply_v2 -ignorenoop db2 $C xConflict + set ::conflict_list +} [list {*}{ + {DELETE x1 DATA {i 2 t two t ii} {i 2 t {four hundred} t ii}} +}] finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index df40fdc1cf..d92480db0f 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -4833,7 +4833,7 @@ static int sessionConflictHandler( void *pCtx, /* First argument for conflict handler */ int *pbReplace /* OUT: Set to true if PK row is found */ ){ - int res = 0; /* Value returned by conflict handler */ + int res = SQLITE_CHANGESET_OMIT;/* Value returned by conflict handler */ int rc; int nCol; int op; @@ -4854,11 +4854,9 @@ static int sessionConflictHandler( if( rc==SQLITE_ROW ){ /* There exists another row with the new.* primary key. */ - if( p->bIgnoreNoop - && sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1) + if( 0==p->bIgnoreNoop + || 0==sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1) ){ - res = SQLITE_CHANGESET_OMIT; - }else{ pIter->pConflict = p->pSelect; res = xConflict(pCtx, eType, pIter); pIter->pConflict = 0; @@ -4872,7 +4870,7 @@ static int sessionConflictHandler( int nBlob = pIter->in.iNext - pIter->in.iCurrent; sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc); return SQLITE_OK; - }else{ + }else if( p->bIgnoreNoop==0 || op!=SQLITE_DELETE ){ /* No other row with the new.* primary key. */ res = xConflict(pCtx, eType+1, pIter); if( res==SQLITE_CHANGESET_REPLACE ) rc = SQLITE_MISUSE; @@ -4970,7 +4968,7 @@ static int sessionApplyOneOp( sqlite3_step(p->pDelete); rc = sqlite3_reset(p->pDelete); - if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 && p->bIgnoreNoop==0 ){ + if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){ rc = sessionConflictHandler( SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry ); diff --git a/manifest b/manifest index 378c1cd091..8a8b55f379 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sdoc\ssentence\sabout\ssqlite3_set_clientdata()'s\sresult\svalue,\sper\srequest\sin\s[forum:bda6c22b6a\s|\sforum\spost\sbda6c22b6a].\sNo\scode\schanges. -D 2025-08-16T10:17:04.239 +C Fix\sa\sproblem\scausing\san\sSQLITE_CHANGESET_DATA\sconflict\sof\sa\sDELETE\soperation\sto\sbe\sincorrectly\signored\sif\sthe\sSQLITE_CHANGESETAPPLY_IGNORENOOP\sis\sspecified. +D 2025-08-19T21:35:23.154 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -567,13 +567,13 @@ F ext/session/sessioninvert.test 9018f6a7387ac745084b6374c5e1aa14d648b372e6e1181 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09 F ext/session/sessionnoact.test 4c7ae5c7d351cb5323bca62b6b095592ad24bd90a6713c178b62ab0063d23e19 F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7 -F ext/session/sessionnoop2.test de4672dce88464396ec9f30ed08c6c01643a69c53ae540fadbbf6d30642d64e8 +F ext/session/sessionnoop2.test e0d70f220495f812ea61420bc6aca83f4bfcbc13635dfbe472b818f4d26fc482 F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2 F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a80600a44396f7363 F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795 F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c 19e14bcca2fbc63a8022ffd708ea6e6986c4003a1e9bbca9b2989fd230362e15 +F ext/session/sqlite3session.c 8c570698b9a81a78f43635aa674c255b2dd8bee580ea5332058cea643c025686 F ext/session/sqlite3session.h b81e8536ce4b83babafd700f4ff67017804b6c1d71df963b30d3972958e7f4a7 F ext/session/test_session.c 8766b5973a6323934cb51248f621c3dc87ad2a98f023c3cc280d79e7d78d36fb F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c @@ -2169,8 +2169,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 309fdd496673bf58984fb16aef3d4cc2ad8c9f6dad7687509f4d708fed5ba41b -R a4e58dd9cd77f1cc28a06225c11258e0 -U stephan -Z 6e7302815560bbb9e5f0e3993c9a29f3 +P c664cee321fc449283ecfc073c45057c078299be33dc0c170b156d81a6698b55 +R d2e2b61077873ad999793e9f0f5fdf47 +U dan +Z 9282b014ea51abf55d96fd4bea24c74c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 05f6643220..eecb70244a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c664cee321fc449283ecfc073c45057c078299be33dc0c170b156d81a6698b55 +78b543f85ac6643f3b69bf1250c6362f00e030f93f460ef7d04902682ef64ee9