1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Fix a problem with the sqlite3sessions_fullchangeset() and sqlite3changebatch_add() APIs on this branch.

FossilOrigin-Name: a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328
This commit is contained in:
dan
2023-02-24 19:58:56 +00:00
parent 7fc1cb22d1
commit 56151f6526
7 changed files with 35 additions and 19 deletions

View File

@@ -151,7 +151,6 @@ foreach {tn testfunction} {
INSERT INTO x2 VALUES(X'abcd', X'1234', X'7890'); INSERT INTO x2 VALUES(X'abcd', X'1234', X'7890');
INSERT INTO x2 VALUES(X'0000', X'0000', X'0000'); INSERT INTO x2 VALUES(X'0000', X'0000', X'0000');
} }
breakpoint
$testfunction $tn.2.6 { $testfunction $tn.2.6 {
UPDATE x2 SET c = X'1234' WHERE a=X'abcd'; UPDATE x2 SET c = X'1234' WHERE a=X'abcd';
INSERT INTO x2 VALUES(X'1234', X'abcd', X'7890'); 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 list [catch { cb add $c1 } msg] $msg
} {1 SQLITE_RANGE} } {1 SQLITE_RANGE}
cb delete
finish_test finish_test

View File

@@ -397,7 +397,7 @@ int sqlite3changebatch_add(sqlite3_changebatch *p, void *pBuf, int nBuf){
int rc; /* Return code */ int rc; /* Return code */
int bConf = 0; /* Conflict was detected */ 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 ){ if( rc==SQLITE_OK ){
int rc2; int rc2;
for(rc2 = sqlite3changeset_next(pIter); for(rc2 = sqlite3changeset_next(pIter);

View File

@@ -98,6 +98,7 @@ struct SessionInput {
struct sqlite3_changeset_iter { struct sqlite3_changeset_iter {
SessionInput in; /* Input buffer or stream */ SessionInput in; /* Input buffer or stream */
SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */ SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */
int bChangebatch; /* True for changebatch_add() */
int bPatchset; /* True if this is a patchset */ int bPatchset; /* True if this is a patchset */
int bInvert; /* True to invert changeset */ int bInvert; /* True to invert changeset */
int bSkipEmpty; /* Skip noop UPDATE changes */ int bSkipEmpty; /* Skip noop UPDATE changes */
@@ -2883,8 +2884,13 @@ int sqlite3changeset_start_v2(
void *pChangeset, /* Pointer to buffer containing changeset */ void *pChangeset, /* Pointer to buffer containing changeset */
int flags int flags
){ ){
int rc;
sqlite3_changeset_iter *pIter = 0;
int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); 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 ** Such records are technically corrupt, but the rebaser was at one
** point generating them. Under most circumstances this is benign, but ** point generating them. Under most circumstances this is benign, but
** can cause spurious SQLITE_RANGE errors when applying the changeset. */ ** can cause spurious SQLITE_RANGE errors when applying the changeset.
if( p->bPatchset==0 && p->op==SQLITE_UPDATE){ **
** 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; i<p->nCol; i++){ for(i=0; i<p->nCol; i++){
if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){ if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){
sqlite3ValueFree(p->apValue[i]); sqlite3ValueFree(p->apValue[i]);

View File

@@ -581,12 +581,16 @@ int sqlite3changeset_start_v2(
** The following flags may passed via the 4th parameter to ** The following flags may passed via the 4th parameter to
** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: ** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]:
** **
** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd> ** <dt>SQLITE_CHANGESETSTART_INVERT <dd>
** Invert the changeset while iterating through it. This is equivalent to ** Invert the changeset while iterating through it. This is equivalent to
** inverting a changeset using sqlite3changeset_invert() before applying it. ** inverting a changeset using sqlite3changeset_invert() before applying it.
** It is an error to specify this flag with a patchset. ** It is an error to specify this flag with a patchset.
**
** <dt>SQLITE_CHANGESETSTART_FULL <dd>
** Do not trim extra fields added to fullchangeset changesets.
*/ */
#define SQLITE_CHANGESETSTART_INVERT 0x0002 #define SQLITE_CHANGESETSTART_INVERT 0x0002
#define SQLITE_CHANGESETSTART_FULL 0x0004
/* /*

View File

@@ -305,14 +305,15 @@ static int SQLITE_TCLAPI test_session_cmd(
}else{ }else{
if( iSub==7 ){ if( iSub==7 ){
rc = sqlite3session_patchset(pSession, &o.n, &o.p); rc = sqlite3session_patchset(pSession, &o.n, &o.p);
assert_changeset_is_ok(o.n, o.p);
}else if( iSub==9 ){ }else if( iSub==9 ){
rc = sqlite3session_fullchangeset(pSession, &o.n, &o.p); rc = sqlite3session_fullchangeset(pSession, &o.n, &o.p);
}else{ }else{
rc = sqlite3session_changeset(pSession, &o.n, &o.p); rc = sqlite3session_changeset(pSession, &o.n, &o.p);
assert_changeset_is_ok(o.n, o.p);
} }
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
assert_changeset_is_ok(o.n, o.p);
Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(o.p, o.n)); Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(o.p, o.n));
} }
sqlite3_free(o.p); sqlite3_free(o.p);

View File

@@ -1,5 +1,5 @@
C Update\sthe\sbedrock\sbranch\sto\sversion\s3.41.0 C Fix\sa\sproblem\swith\sthe\ssqlite3sessions_fullchangeset()\sand\ssqlite3changebatch_add()\sAPIs\son\sthis\sbranch.
D 2023-02-21T21:22:24.906 D 2023-02-24T19:58:56.018
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -431,7 +431,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 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/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d
F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5
F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa 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/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8
F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5
F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc 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/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24
F ext/session/sqlite3session.c 7084f9fb1c075cd0724d62d71affe5889ee514d60a02f8548e74e74f8e285df4 F ext/session/sqlite3session.c caa800fc9665e2e1bc15861ae285e47277c0950292fc5efa982503ce46b73929
F ext/session/sqlite3session.h 01807bb8c8f531c23052032e9d531eec49af79b7394f8213cf5a49784325b6a8 F ext/session/sqlite3session.h 55221fa46444a39b99a845d4e0e23ad192e152a88ba6e45b084b5bc9be5bdef8
F ext/session/test_session.c 0597d013e68abccb4aa808549139f985130a19732c2b827609a05100d8cbfeaf F ext/session/test_session.c 40fbe5761b910dbf81d7b34197ef7b8956a2095cdd35b3e42e9c63778a67dec5
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb 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.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 73e9f8d0bf78bbbaa3435330e485126bb09f008f35c1d0f366efd5e511f8f4a9 7bb1f6dca2d2e0c0c70f1d2d0c7130c182fc45e48138c57a3fbe92ee1f68da96 P dc1d85707b130aae2f07b6b1961e0acd42d7a302b3518670f3dbfa96c179386d
R d031eada0322fc82071af9d5c997f8be R 1b0ad48979e97c455633409f6f0e3549
U drh U dan
Z 5aa61c87f2d7430205d3b620d31ec49a Z 0fc1f6413ec534a029873988710cdbc0
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
dc1d85707b130aae2f07b6b1961e0acd42d7a302b3518670f3dbfa96c179386d a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328