From: drh <> Date: Mon, 14 Mar 2022 23:50:38 +0000 (+0000) Subject: Calling sqlite3_value_dup() on a pointer value results in an ordinary X-Git-Tag: version-3.39.0~303 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=836652952f7d2bdefe67c8ec730d986826eb9ca9;p=thirdparty%2Fsqlite.git Calling sqlite3_value_dup() on a pointer value results in an ordinary NULL. [forum:/forumpost/ae8592cc73|Forum post ae8592cc73]. Test cases in TH3. FossilOrigin-Name: fff1243b594c190d15f14b7ca4e60d23519cd15134f275991c685966fcc24145 --- diff --git a/manifest b/manifest index 4ef61a7bdb..ef45129a67 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sstatement\sin\sthe\scovering\sindex\soptimization\sfor\sthe\scorner\ncase\sof\sdealing\swith\san\ssqlite_offset()\sSQL\sfunction\scall. -D 2022-03-14T22:58:04.421 +C Calling\ssqlite3_value_dup()\son\sa\spointer\svalue\sresults\sin\san\sordinary\nNULL.\s\s[forum:/forumpost/ae8592cc73|Forum\spost\sae8592cc73].\s\sTest\scases\nin\sTH3. +D 2022-03-14T23:50:38.525 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F src/resolve.c ea935b87d6fb36c78b70cdc7b28561dc8f33f2ef37048389549c7b5ef9b0ba5e F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4890a3cfee0bc60ff231c3a44db37968859ab0be156983dbcc0c096109832cdd F src/shell.c.in 69d1e59da4881f096ab47fbd3e6d99794f3e4a43f41fd9e4d2e845c9b8d20fd5 -F src/sqlite.h.in b93deee892f1bc4030e5c8712df9e21d786a1bf8e921ab8dc987eaf1e44c676f +F src/sqlite.h.in 5845213799feca09cd69d18ff841a85fe0df31021f46aaa1797e703e80dc1d70 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h a95cb9ed106e3d39e2118e4dcc15a14faec3fa50d0093425083d340d9dfd96e6 F src/sqliteInt.h 2ce7d868630ccd70ffd4b15d46b59ccf7daf89198993b62ed6e4a165d3511280 @@ -627,7 +627,7 @@ F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 F src/vdbe.c b1830c6daf744473a732257652b6431ac18032f508a3e30ff3a1466fe5978559 F src/vdbe.h a1d0e3b934e835e73edd146f2e7c4eadb711b5c9875c18159a57483fd78e550e F src/vdbeInt.h 8dd91427155a38ec06e9ecbde07e33f21bc02e101625191e7613f883e379a363 -F src/vdbeapi.c 1c80efbe51118bbecc7279023e75d18edcfa4b3dc441287e1718ee70ad594f58 +F src/vdbeapi.c bc3812dff7c9e6497c87ae86962818a51f66f8d7a873e7ec02a22aa115b84799 F src/vdbeaux.c 33c61dc3dbe920f262371ad2ba3e10277d27d8e35ee86075e2aef74113eae251 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c 57fceb4ed6aac960e9517c963dc0668189e8b7c8e6216d257030a2f5e9a583df @@ -1944,8 +1944,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 387ab17b8a0a4b87903aab52abc7da79098b882aff2ab687a554d5794e9d183e -R e5ff5d7df3817a5b139cd165c41f1bb2 +P 3950b7d006add571579158c751247a9435801e53eafd84b43dd3046e01da8ee6 +R 11f87de954262d4e3fb38fcc559280a1 U drh -Z bda3d12cdd079bd3275d1232b7b49db5 +Z 30a1d3694c96fe3b7193b4f79a3605d9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 174918fc01..33d14d16e8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3950b7d006add571579158c751247a9435801e53eafd84b43dd3046e01da8ee6 \ No newline at end of file +fff1243b594c190d15f14b7ca4e60d23519cd15134f275991c685966fcc24145 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 6062f79c22..9f77e01c69 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5593,7 +5593,8 @@ unsigned int sqlite3_value_subtype(sqlite3_value*); ** object D and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a -** memory allocation fails. +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. ** ** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object ** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 83f7b0fd65..af1e94487c 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -345,6 +345,9 @@ sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ sqlite3ValueFree(pNew); pNew = 0; } + }else if( pNew->flags & MEM_Null ){ + /* Do not duplicate pointer values */ + pNew->flags &= ~(MEM_Term|MEM_Subtype); } return pNew; }