]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with UPDATEs on fts5 tables that contain blob values.
authordan <Dan Kennedy>
Wed, 11 Jun 2025 15:03:53 +0000 (15:03 +0000)
committerdan <Dan Kennedy>
Wed, 11 Jun 2025 15:03:53 +0000 (15:03 +0000)
FossilOrigin-Name: badf3014bd1620fd3d4b8013f641fd820b249649fb93cc75b7b8df9dfd6f32a6

ext/fts5/fts5_storage.c
ext/fts5/test/fts5faultI.test
ext/fts5/test/fts5unicode4.test
manifest
manifest.uuid

index 2b43016beffdce1f5184c0fdce56fc755c21588e..76820e85b37907d90f4662656e0cd5eca722984b 100644 (file)
@@ -539,6 +539,7 @@ static int fts5StorageDeleteFromIndex(
   for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){
     if( pConfig->abUnindexed[iCol-1]==0 ){
       sqlite3_value *pVal = 0;
+      sqlite3_value *pFree = 0;
       const char *pText = 0;
       int nText = 0;
       const char *pLoc = 0;
@@ -555,11 +556,22 @@ static int fts5StorageDeleteFromIndex(
       if( pConfig->bLocale && sqlite3Fts5IsLocaleValue(pConfig, pVal) ){
         rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc);
       }else{
-        pText = (const char*)sqlite3_value_text(pVal);
-        nText = sqlite3_value_bytes(pVal);
-        if( pConfig->bLocale && pSeek ){
-          pLoc = (const char*)sqlite3_column_text(pSeek, iCol + pConfig->nCol);
-          nLoc = sqlite3_column_bytes(pSeek, iCol + pConfig->nCol);
+        if( sqlite3_value_type(pVal)!=SQLITE_TEXT ){
+          /* Make a copy of the value to work with. This is because the call
+          ** to sqlite3_value_text() below forces the type of the value to
+          ** SQLITE_TEXT, and we may need to use it again later. */
+          pFree = pVal = sqlite3_value_dup(pVal);
+          if( pVal==0 ){
+            rc = SQLITE_NOMEM;
+          }
+        }
+        if( rc==SQLITE_OK ){
+          pText = (const char*)sqlite3_value_text(pVal);
+          nText = sqlite3_value_bytes(pVal);
+          if( pConfig->bLocale && pSeek ){
+            pLoc = (const char*)sqlite3_column_text(pSeek, iCol+pConfig->nCol);
+            nLoc = sqlite3_column_bytes(pSeek, iCol + pConfig->nCol);
+          }
         }
       }
 
@@ -575,6 +587,7 @@ static int fts5StorageDeleteFromIndex(
         }
         sqlite3Fts5ClearLocale(pConfig);
       }
+      sqlite3_value_free(pFree);
     }
   }
   if( rc==SQLITE_OK && p->nTotalRow<1 ){
index ab84d37de59905099a9705eb177e8a307acc838a..a2b04af8f57063574a84d6887c4ab684d438bf99 100644 (file)
@@ -325,5 +325,25 @@ ifcapable foreignkey {
   }
 }
 
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 13.0 {
+  CREATE VIRTUAL TABLE t1 USING fts5(a, b);
+  INSERT INTO t1 VALUES('abc def', X'123456');
+}
+faultsim_save_and_close
+
+
+do_faultsim_test 13 -faults oom* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  execsql {
+    UPDATE t1 SET a='def abc'
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
 finish_test
 
index dc225cb5e28f389930fb1b54da5e425e06a61af4..f006d6c0a62aaba1181305babf136951042134f0 100644 (file)
@@ -28,4 +28,34 @@ do_execsql_test 1.1 {
   INSERT INTO sss VALUES('γΎγ‚Šγ‚„');
 }
 
+foreach {tn enc tok} {
+  1   utf-8    ascii
+  2   utf-16   ascii
+  3   utf-8    unicode61
+  4   utf-16   unicode61
+} {
+  reset_db
+
+  do_execsql_test 1.$tn.0 " 
+    PRAGMA encoding = '$enc'; 
+    CREATE VIRTUAL TABLE vt2 USING fts5(c0, c1, tokenize=$tok);
+  "
+
+  do_execsql_test 1.$tn.1 {
+    INSERT INTO vt2(c0, c1) VALUES ('bhal', x'17db');
+  }
+
+  do_execsql_test 1.$tn.2 {
+    UPDATE vt2 SET c0='bhal';
+  }
+
+  do_execsql_test 1.$tn.3 {
+    INSERT INTO vt2(vt2) VALUES('integrity-check')
+  }
+
+  do_execsql_test 1.$tn.4 {
+    SELECT quote(c1) FROM vt2
+  } {X'17DB'}
+}
+
 finish_test
index 7bac7f2b1ff131dcab1c93a571c5bfe0283617b8..f584b901b409feabb253bb64ce0f0e6609e300ed 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\sconcat_ws()\sSQL\sfunction\sso\sthat\sit\sincludes\sempty\sstrings\sin\sthe\nconcatenation.\s\s[forum:/forumpost/52503ac21d|Forum\spost\s52503ac21d].
-D 2025-06-11T00:01:42.165
+C Fix\sa\sproblem\swith\sUPDATEs\son\sfts5\stables\sthat\scontain\sblob\svalues.
+D 2025-06-11T15:03:53.627
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -115,7 +115,7 @@ F ext/fts5/fts5_expr.c be9e5f7f11d87e7bd3680832c93c13050fe351994b5052b0215c2ef40
 F ext/fts5/fts5_hash.c a6266cedd801ab7964fa9e74ebcdda6d30ec6a96107fa24148ec6b7b5b80f6e0
 F ext/fts5/fts5_index.c d171f2a507abccb3d524bf461b01f0d3971a9bf221be622ac7c671a991cb62ee
 F ext/fts5/fts5_main.c 57933c18efe1058d8871199875c7a59744dabc3904f3aefbf9ff4a4e11fc79e2
-F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8
+F ext/fts5/fts5_storage.c 19bc7c4cbe1e6a2dd9849ef7d84b5ca1fcbf194cefc3e386b901e00e08bf05c2
 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329
 F ext/fts5/fts5_test_mi.c 4308d5658cb1f5eee5998dcbaac7d5bdf7a2ef43c8192ca6e0c843f856ccee26
 F ext/fts5/fts5_test_tok.c 3cb0a9b508b30d17ef025ccddd26ae3dc8ddffbe76c057616e59a9aa85d36f3b
@@ -192,7 +192,7 @@ F ext/fts5/test/fts5faultE.test 844586ce71dab4be85bb86880e87b624d089f851654cd22e
 F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1
 F ext/fts5/test/fts5faultG.test 0544411ffcb3e19b42866f757a8a5e0fb8fef3a62c06f61d14deebc571bb7ea9
 F ext/fts5/test/fts5faultH.test 2b2b5b8cb1b3fd7679f488c06e22af44107fbc6137eaf45b3e771dc7b149312d
-F ext/fts5/test/fts5faultI.test 9b33d664bccee4bbde0f275a48b2df3ea2f05d41f6d1d171aa2e844382cba621
+F ext/fts5/test/fts5faultI.test 4e3d5a9d3e3b3f17d5e5087ee069414632667719dcfccafd715bc87c72838c72
 F ext/fts5/test/fts5first.test bfd685b96905bf541d99d8644e0a7219d1d833455a08ab64e344071a613b6ba9
 F ext/fts5/test/fts5full.test 97d263c1072f4a560929cca31e70f65d2ae232610e17e6affcf7e979df59547b
 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
@@ -260,7 +260,7 @@ F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d059264
 F ext/fts5/test/fts5unicode.test 41898f7e476e6515cd4b737c02a442cda5a580a74509788aa9072a2074948e0e
 F ext/fts5/test/fts5unicode2.test 3bbd30152f9f760bf13886e5b1e5ec23ff62f56758ddda5d9c775a6082fb4c7c
 F ext/fts5/test/fts5unicode3.test f4891a3dac3b49c3d7c0fdb29566e9eb0ecff35263370c89f9661b1952b20818
-F ext/fts5/test/fts5unicode4.test 728c8f0caafb05567f524ad313d9f8b780fa45987b8a8df04eff87923c74b4d0
+F ext/fts5/test/fts5unicode4.test 6d70dbe56e5179bb1990cfb22e62fdf2aae9458e443ade856e598ce95832fe9b
 F ext/fts5/test/fts5unindexed.test 168838d2c385e131120bbf5b516d2432a5fabc4caa2259c932e1d49ae209a4ae
 F ext/fts5/test/fts5unindexed2.test 516236eceaac05ace322290a0d3705b4c4ffe4760d8eb9d014d9d27d56dfcc02
 F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc
@@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P f7ab764ed9df6d7a4a96cb0933d291f00174f33fed3d9951785078fe225adcb7
-R 284d5104ae61ddb433b37754a33ae7a1
-U drh
-Z 7ca1aa3fe98dd1bc7265d2670961ae3f
+P 80a78987da484d435a8242c05c48d546d430920df713b24a9d9d9fff7ba1113d
+R 510b491b43028ef63e4d71d106a233de
+U dan
+Z 204a2d57183fa1bb384706745d513233
 # Remove this line to create a well-formed Fossil manifest.
index c1a0adc3b9503e7e0e8f582880094c785c4e7226..836d52918876c0a88127cdb802663f30d3572411 100644 (file)
@@ -1 +1 @@
-80a78987da484d435a8242c05c48d546d430920df713b24a9d9d9fff7ba1113d
+badf3014bd1620fd3d4b8013f641fd820b249649fb93cc75b7b8df9dfd6f32a6