From: dan Date: Wed, 13 May 2026 20:37:30 +0000 (+0000) Subject: Fix the sqlite3changegroup_change_finish() API so that it correctly handles NULL... X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=cf632ddb7eb75c0bffc174b5ba0ab7e5ed17212e;p=thirdparty%2Fsqlite.git Fix the sqlite3changegroup_change_finish() API so that it correctly handles NULL being passed for the pzErr parameter. FossilOrigin-Name: f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617 --- diff --git a/ext/session/sessionchange2.test b/ext/session/sessionchange2.test index 64208d223c..fbcd093484 100644 --- a/ext/session/sessionchange2.test +++ b/ext/session/sessionchange2.test @@ -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 { diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 7eff800218..63aeb58fcf 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -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; iicd.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; } diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 1b09714225..73a6bd226a 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -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) diff --git a/manifest b/manifest index c1afc7c94a..b7e7b61d1b 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 8a005ec6eb..b76ea3ae2f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ddc07110dacef98c14b852dcdc4f11d1c0f4061008bf3a61e2df707b0dc6c6b +f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617