]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the sqlite3changegroup_change_finish() API so that it correctly handles NULL...
authordan <Dan Kennedy>
Wed, 13 May 2026 20:37:30 +0000 (20:37 +0000)
committerdan <Dan Kennedy>
Wed, 13 May 2026 20:37:30 +0000 (20:37 +0000)
FossilOrigin-Name: f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617

ext/session/sessionchange2.test
ext/session/sqlite3session.c
ext/session/test_session.c
manifest
manifest.uuid

index 64208d223ca1efba22e8d97a106dcb585d129982..fbcd0934847b875d3530364713058c6a047b14c1 100644 (file)
@@ -184,10 +184,18 @@ foreach {tn script error} {
   sqlite3changegroup grp
   grp schema db main
   eval $script
-  do_test 3.1.$tn {
+  do_test 3.1.$tn.1 {
     list [catch { grp change_finish false } msg] $msg
   } [list 1 $error]
   grp delete
+
+  sqlite3changegroup grp
+  grp schema db main
+  eval $script
+  do_test 3.1.$tn.2 {
+    list [catch { grp change_finishne false } msg] $msg
+  } [list 1 [lindex $error 0]]
+  grp delete
 }
 
 do_test 3.2.1 {
index 7eff8002185993be3cb96c0fccfdc324e4344627..63aeb58fcfab6a06e986e8f4966d9acf39e952b4 100644 (file)
@@ -7105,6 +7105,7 @@ int sqlite3changegroup_change_finish(
   char **pzErr
 ){
   int rc = SQLITE_OK;
+  char *zErr = 0;
   if( pGrp->cd.pTab ){
     SessionBuffer *aBuf = pGrp->cd.aBuf;
     int ii;
@@ -7116,14 +7117,14 @@ int sqlite3changegroup_change_finish(
         for(ii=0; ii<nBuf; ii++){
           if( pGrp->cd.pTab->abPK[ii] ){
             if( aBuf[ii].nBuf<=1 ){
-              *pzErr = sqlite3_mprintf(
+              zErr = sqlite3_mprintf(
                   "invalid change: %s value in PK of old.* record",
                   aBuf[ii].nBuf==1 ? "null" : "undefined"
               );
               rc = SQLITE_ERROR;
               break;
             }else if( aBuf[ii + nBuf].nBuf>0 ){
-              *pzErr = sqlite3_mprintf(
+              zErr = sqlite3_mprintf(
                   "invalid change: defined value in PK of new.* record"
               );
               rc = SQLITE_ERROR;
@@ -7131,7 +7132,7 @@ int sqlite3changegroup_change_finish(
             }
           }else 
           if( pGrp->bPatch==0 && (aBuf[ii].nBuf>0)!=(aBuf[ii+nBuf].nBuf>0) ){
-            *pzErr = sqlite3_mprintf(
+            zErr = sqlite3_mprintf(
                 "invalid change: column %d "
                 "- old.* value is %sdefined but new.* is %sdefined",
                 ii, aBuf[ii].nBuf ? "" : "un", aBuf[ii+nBuf].nBuf ? "" : "un"
@@ -7148,14 +7149,14 @@ int sqlite3changegroup_change_finish(
           if( (pGrp->cd.eOp==SQLITE_INSERT || pGrp->bPatch==0 || isPK)
            && aBuf[ii].nBuf==0
           ){
-            *pzErr = sqlite3_mprintf(
+            zErr = sqlite3_mprintf(
                 "invalid change: column %d is undefined", ii
             );
             rc = SQLITE_ERROR;
             break;
           }
           if( aBuf[ii].nBuf==1 && isPK ){
-            *pzErr = sqlite3_mprintf(
+            zErr = sqlite3_mprintf(
                 "invalid change: null value in PK"
             );
             rc = SQLITE_ERROR;
@@ -7205,6 +7206,11 @@ int sqlite3changegroup_change_finish(
     pGrp->cd.pTab = 0;
   }
 
+  if( pzErr ){
+    *pzErr = zErr;
+  }else{
+    sqlite3_free(zErr);
+  }
   return rc;
 }
 
index 1b09714225e375524b53c481c6be15427ef5a72a..73a6bd226a920942eb8a61d28f0b9fbb8bd5936b 100644 (file)
@@ -1615,10 +1615,11 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
     { "change_text",     3, "[new|old] ICOL VALUE" },    /* 9 */
     { "change_blob",     3, "[new|old] ICOL VALUE" },    /* 10 */
     { "change_finish",   1, "BDISCARD"             },    /* 11 */
+    { "change_finishne", 1, "BDISCARD"             },    /* 12 */
 
-    { "config",          2, "OPTION INTVAL"        },    /* 12 */
-    { "change_text-1",   3, "[new|old] ICOL VALUE" },    /* 13 */
-    { "change_begin_ne", 3, "TYPE TABLE INDIRECT"  },    /* 14 */
+    { "config",          2, "OPTION INTVAL"        },    /* 13 */
+    { "change_text-1",   3, "[new|old] ICOL VALUE" },    /* 14 */
+    { "change_begin_ne", 3, "TYPE TABLE INDIRECT"  },    /* 15 */
     { 0, 0, 0 }
   };
   int rc = TCL_OK;
@@ -1688,7 +1689,7 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     };
 
-    case 14:        /* change_beginne */
+    case 15:        /* change_beginne */
     case 5: {       /* change_begin */
       struct ChangeType {
         const char *zType;
@@ -1815,13 +1816,16 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     }
 
+    case 12:        /* change_finishne */
     case 11: {      /* change_finish */
       int bDiscard = 0;
       if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[2], &bDiscard) ){
         rc = TCL_ERROR;
       }else{
         char *zErr = 0;
-        rc = sqlite3changegroup_change_finish(p->pGrp, bDiscard, &zErr);
+        char **pz = &zErr;
+        if( iSub==12 ) pz = 0;
+        rc = sqlite3changegroup_change_finish(p->pGrp, bDiscard, pz);
         if( rc!=SQLITE_OK ){
           rc = test_session_error(interp, rc, zErr);
         }
@@ -1829,7 +1833,7 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     }
 
-    case 12: {      /* config */
+    case 13: {      /* config */
       struct OptionName {
         const char *zOpt;
         int op;
@@ -1858,7 +1862,7 @@ static int SQLITE_TCLAPI test_changegroup_cmd(
       break;
     }
 
-    case 13: {      /* change_text-1 */
+    case 14: {      /* change_text-1 */
       int bNew = 0;
       int iCol = 0;
       if( TCL_OK!=testGetNewOrOld(interp, objv[2], &bNew)
index c1afc7c94adbf61ee6af2e36f303b5cbb2a7d9ad..b7e7b61d1b156c5b7028b184860b461113ec0efd 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Additional\schanges\sto\sthe\sWindows\sVFS\sto\stry\sto\sget\sthe\ssystem\sto\sa\spoint\nwhere\sit\swill\scompile\sfor\sUWP.
-D 2026-05-13T20:06:08.009
+C Fix\sthe\ssqlite3changegroup_change_finish()\sAPI\sso\sthat\sit\scorrectly\shandles\sNULL\sbeing\spassed\sfor\sthe\spzErr\sparameter.
+D 2026-05-13T20:37:30.527
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -557,7 +557,7 @@ F ext/session/sessionat.test 00c8badb35e43a2f12a716d2734a44d614ff62361979b6b8541
 F ext/session/sessionbig.test 47c381e7acfabeef17d98519a3080d69151723354d220afa2053852182ca7adf
 F ext/session/sessionblob.test 87faf667870b72f08e91969abd9f52a383ab7b514506ee194d64a39d8faff00a
 F ext/session/sessionchange.test 6618cb1c1338a4b6df173b6ac42d09623fb71269962abf23ebb7617fe9f45a50
-F ext/session/sessionchange2.test 6b5b7e3d1cc4ede43817f7fb68e3771aac4aa6500adb21a458b3e5a9fd841f83
+F ext/session/sessionchange2.test 8f59185216882adc8b34bb5ba63887459acf3df58493bcffa12e4d05ab6a6b85
 F ext/session/sessionconflict.test 19e4a53795c4c930bfec49e809311e09b2a9e202d9446e56d7a8b139046a0c07 x
 F ext/session/sessiondiff.test e89f7aedcdd89e5ebac3a455224eb553a171e9586fc3e1e6a7b3388d2648ba8d
 F ext/session/sessionfault.test c2b43d01213b389a3f518e90775fca2120812ba51e50444c4066962263e45c11
@@ -573,9 +573,9 @@ 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 a75ef1e361ad857518d75184366936beb752f3c2522895dc529c368642eab5a6
+F ext/session/sqlite3session.c a23436c2ecaddf0b0301460aa3ff2986f151eb36e7510509521467ce669e9d45
 F ext/session/sqlite3session.h 063e7bf7be2fff874456f452a224b5b3013b25682d108933b0351c93a1279b9c
-F ext/session/test_session.c 2a02a68b522e2f3d4a64b2a4733af54b0f3e500769aeccd5bcbdd440103db069
+F ext/session/test_session.c 21524e86610986c8296ad08e71a1af1804b823b5830ed1189623b15ceb886c7c
 F ext/wasm/GNUmakefile 65feef4ec48e62249f90278c4c08a3fe3c69e2461ff560b61c03cd73606e0949
 F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a
 F ext/wasm/README.md 2e87804e12c98f1d194b7a06162a88441d33bb443efcfe00dc6565a780d2f259
@@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P b167c4c96e6a753952eb4be95d6283b50a9c59f4ecf59d60cf10d8de9cb115d8
-R f066d4eda59be22d296a3e1a1cf73d03
-U drh
-Z 5430e3ed6629c616c0df3c5d9bb8cb87
+P 3ddc07110dacef98c14b852dcdc4f11d1c0f4061008bf3a61e2df707b0dc6c6b
+R 1dab4a7992096fd33a1b7a8bbcb2d58c
+U dan
+Z 369ba48121df91d9d1fcfb40348f03a0
 # Remove this line to create a well-formed Fossil manifest.
index 8a005ec6ebcd8512b465ef309c6855d05bd12e4c..b76ea3ae2f2dc6ef94f7dbcd42aa2ea15ce946fa 100644 (file)
@@ -1 +1 @@
-3ddc07110dacef98c14b852dcdc4f11d1c0f4061008bf3a61e2df707b0dc6c6b
+f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617