From: dan Date: Fri, 24 Feb 2023 19:58:56 +0000 (+0000) Subject: Fix a problem with the sqlite3sessions_fullchangeset() and sqlite3changebatch_add... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=56151f65266835d68c9497ae7e2d554320195f34;p=thirdparty%2Fsqlite.git Fix a problem with the sqlite3sessions_fullchangeset() and sqlite3changebatch_add() APIs on this branch. FossilOrigin-Name: a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328 --- diff --git a/ext/session/changebatch1.test b/ext/session/changebatch1.test index 2fbe368947..a4c0d3bd9b 100644 --- a/ext/session/changebatch1.test +++ b/ext/session/changebatch1.test @@ -151,7 +151,6 @@ foreach {tn testfunction} { INSERT INTO x2 VALUES(X'abcd', X'1234', X'7890'); INSERT INTO x2 VALUES(X'0000', X'0000', X'0000'); } - breakpoint $testfunction $tn.2.6 { UPDATE x2 SET c = X'1234' WHERE a=X'abcd'; INSERT INTO x2 VALUES(X'1234', X'abcd', X'7890'); @@ -217,6 +216,8 @@ do_test 4.1 { list [catch { cb add $c1 } msg] $msg } {1 SQLITE_RANGE} +cb delete + finish_test diff --git a/ext/session/sqlite3changebatch.c b/ext/session/sqlite3changebatch.c index 926a7d7785..b3fcd731ee 100644 --- a/ext/session/sqlite3changebatch.c +++ b/ext/session/sqlite3changebatch.c @@ -397,7 +397,7 @@ int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){ int rc; /* Return code */ int bConf = 0; /* Conflict was detected */ - rc = sqlite3changeset_start(&pIter, nBuf, pBuf); + rc = sqlite3changeset_start_v2(&pIter, nBuf, pBuf,SQLITE_CHANGESETSTART_FULL); if( rc==SQLITE_OK ){ int rc2; for(rc2 = sqlite3changeset_next(pIter); diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 4e0ad827eb..e576186a94 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -98,6 +98,7 @@ struct SessionInput { struct sqlite3_changeset_iter { SessionInput in; /* Input buffer or stream */ SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */ + int bChangebatch; /* True for changebatch_add() */ int bPatchset; /* True if this is a patchset */ int bInvert; /* True to invert changeset */ int bSkipEmpty; /* Skip noop UPDATE changes */ @@ -2883,8 +2884,13 @@ int sqlite3changeset_start_v2( void *pChangeset, /* Pointer to buffer containing changeset */ int flags ){ + int rc; + sqlite3_changeset_iter *pIter = 0; int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); - return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, bInvert, 0); + rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset, bInvert, 0); + if( pIter && (flags & SQLITE_CHANGESETSTART_FULL) ) pIter->bChangebatch = 1; + *pp = pIter; + return rc; } /* @@ -3357,8 +3363,12 @@ static int sessionChangesetNextOne( ** ** Such records are technically corrupt, but the rebaser was at one ** point generating them. Under most circumstances this is benign, but - ** can cause spurious SQLITE_RANGE errors when applying the changeset. */ - if( p->bPatchset==0 && p->op==SQLITE_UPDATE){ + ** can cause spurious SQLITE_RANGE errors when applying the changeset. + ** + ** Update for bedrock branch: Do not do this for changebatch_add() on + ** this branch, as changesets generated by sqlite3sessions_fullchangeset() + ** also have this property. */ + if( p->bChangebatch==0 && p->bPatchset==0 && p->op==SQLITE_UPDATE){ for(i=0; inCol; i++){ if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){ sqlite3ValueFree(p->apValue[i]); diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index 0090f67d76..e1e4e36281 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -581,12 +581,16 @@ int sqlite3changeset_start_v2( ** The following flags may passed via the 4th parameter to ** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: ** -**
SQLITE_CHANGESETAPPLY_INVERT
+**
SQLITE_CHANGESETSTART_INVERT
** Invert the changeset while iterating through it. This is equivalent to ** inverting a changeset using sqlite3changeset_invert() before applying it. ** It is an error to specify this flag with a patchset. +** +**
SQLITE_CHANGESETSTART_FULL
+** Do not trim extra fields added to fullchangeset changesets. */ #define SQLITE_CHANGESETSTART_INVERT 0x0002 +#define SQLITE_CHANGESETSTART_FULL 0x0004 /* diff --git a/ext/session/test_session.c b/ext/session/test_session.c index f8706fb1c3..63023d5a95 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -305,14 +305,15 @@ static int SQLITE_TCLAPI test_session_cmd( }else{ if( iSub==7 ){ rc = sqlite3session_patchset(pSession, &o.n, &o.p); + assert_changeset_is_ok(o.n, o.p); }else if( iSub==9 ){ rc = sqlite3session_fullchangeset(pSession, &o.n, &o.p); }else{ rc = sqlite3session_changeset(pSession, &o.n, &o.p); + assert_changeset_is_ok(o.n, o.p); } } if( rc==SQLITE_OK ){ - assert_changeset_is_ok(o.n, o.p); Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(o.p, o.n)); } sqlite3_free(o.p); diff --git a/manifest b/manifest index 62cbe51255..cdf5934300 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sbedrock\sbranch\sto\sversion\s3.41.0 -D 2023-02-21T21:22:24.906 +C Fix\sa\sproblem\swith\sthe\ssqlite3sessions_fullchangeset()\sand\ssqlite3changebatch_add()\sAPIs\son\sthis\sbranch. +D 2023-02-24T19:58:56.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -431,7 +431,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d +F ext/session/changebatch1.test 51694900ccbdf144c2e403f99358b7a3f137354e2ba8d1033ef88a53f1a494f2 F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa @@ -466,11 +466,11 @@ F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2 F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3changebatch.c d5553b79e012ee2cb06c0a96bdf9dfe19e66354390ea0036cc46c4953142d517 +F ext/session/sqlite3changebatch.c d488b42d8fd49fb013a1e9c4535232680dabeb28ae8f9421b65ea0ccc3b430f7 F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24 -F ext/session/sqlite3session.c 7084f9fb1c075cd0724d62d71affe5889ee514d60a02f8548e74e74f8e285df4 -F ext/session/sqlite3session.h 01807bb8c8f531c23052032e9d531eec49af79b7394f8213cf5a49784325b6a8 -F ext/session/test_session.c 0597d013e68abccb4aa808549139f985130a19732c2b827609a05100d8cbfeaf +F ext/session/sqlite3session.c caa800fc9665e2e1bc15861ae285e47277c0950292fc5efa982503ce46b73929 +F ext/session/sqlite3session.h 55221fa46444a39b99a845d4e0e23ad192e152a88ba6e45b084b5bc9be5bdef8 +F ext/session/test_session.c 40fbe5761b910dbf81d7b34197ef7b8956a2095cdd35b3e42e9c63778a67dec5 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb @@ -2081,8 +2081,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 73e9f8d0bf78bbbaa3435330e485126bb09f008f35c1d0f366efd5e511f8f4a9 7bb1f6dca2d2e0c0c70f1d2d0c7130c182fc45e48138c57a3fbe92ee1f68da96 -R d031eada0322fc82071af9d5c997f8be -U drh -Z 5aa61c87f2d7430205d3b620d31ec49a +P dc1d85707b130aae2f07b6b1961e0acd42d7a302b3518670f3dbfa96c179386d +R 1b0ad48979e97c455633409f6f0e3549 +U dan +Z 0fc1f6413ec534a029873988710cdbc0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6a667e81b0..670798fba3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc1d85707b130aae2f07b6b1961e0acd42d7a302b3518670f3dbfa96c179386d \ No newline at end of file +a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328 \ No newline at end of file