]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with the sqlite3sessions_fullchangeset() and sqlite3changebatch_add...
authordan <Dan Kennedy>
Fri, 24 Feb 2023 19:58:56 +0000 (19:58 +0000)
committerdan <Dan Kennedy>
Fri, 24 Feb 2023 19:58:56 +0000 (19:58 +0000)
FossilOrigin-Name: a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328

ext/session/changebatch1.test
ext/session/sqlite3changebatch.c
ext/session/sqlite3session.c
ext/session/sqlite3session.h
ext/session/test_session.c
manifest
manifest.uuid

index 2fbe368947444d5ffbc1d7c6c11a083e2203b189..a4c0d3bd9bc847d80faf32fc2de252f5bd627db2 100644 (file)
@@ -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
index 926a7d7785b98c90e64ededc4c47b6bd58cc7678..b3fcd731ee9e72b341debc0dce1eba36ce4df51a 100644 (file)
@@ -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);
index 4e0ad827eb220bf6aacdc7099dd03a13b0e274ac..e576186a94d3cde17de0e9eb622bc3b1da4e963c 100644 (file)
@@ -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; i<p->nCol; i++){
         if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){
           sqlite3ValueFree(p->apValue[i]);
index 0090f67d76b01993cf5f5e9f226e1ca835542ce2..e1e4e36281ba3220fa89fbd31bde232660aa073f 100644 (file)
@@ -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]:
 **
-** <dt>SQLITE_CHANGESETAPPLY_INVERT <dd>
+** <dt>SQLITE_CHANGESETSTART_INVERT <dd>
 **   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.
+**
+** <dt>SQLITE_CHANGESETSTART_FULL <dd>
+**   Do not trim extra fields added to fullchangeset changesets.
 */
 #define SQLITE_CHANGESETSTART_INVERT        0x0002
+#define SQLITE_CHANGESETSTART_FULL          0x0004
 
 
 /*
index f8706fb1c33235f42be775de5cf5f393b19a257e..63023d5a95fa17ca2382bbc99556af74e821c16d 100644 (file)
@@ -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);
index 62cbe512555e2882288a70f32ecb91e451d3b1fe..cdf59343001d80e4f2f19aab9063919c78e6c406 100644 (file)
--- 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.
index 6a667e81b05d2bf7e3ef94239cd5a0bbf8a3c2b6..670798fba318fa12ffaa0d7ef8a89862cb91bb3a 100644 (file)
@@ -1 +1 @@
-dc1d85707b130aae2f07b6b1961e0acd42d7a302b3518670f3dbfa96c179386d
\ No newline at end of file
+a95a4bce8892eba3ab6e76a49975a52efeedebfd9af22bb31af30301b1d92328
\ No newline at end of file