]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix cases where a row is inserted into a contentless_delete=1 fts5 table and then...
authordan <Dan Kennedy>
Mon, 17 Jul 2023 18:40:39 +0000 (18:40 +0000)
committerdan <Dan Kennedy>
Mon, 17 Jul 2023 18:40:39 +0000 (18:40 +0000)
FossilOrigin-Name: d928856a226fb7f001e55ff7e8eb58a656b982f1efa811de46c382b8b7cd778c

ext/fts5/fts5_storage.c
ext/fts5/test/fts5contentless.test
manifest
manifest.uuid

index f28e4d7dd27eae66509a80044e01c00c8948f930..c2f0ca9e44fc139114bae1fa600d97da7b70983a 100644 (file)
@@ -411,7 +411,7 @@ static int fts5StorageDeleteFromIndex(
 ){
   Fts5Config *pConfig = p->pConfig;
   sqlite3_stmt *pSeek = 0;        /* SELECT to read row iDel from %_data */
-  int rc;                         /* Return code */
+  int rc = SQLITE_OK;             /* Return code */
   int rc2;                        /* sqlite3_reset() return code */
   int iCol;
   Fts5InsertCtx ctx;
@@ -427,7 +427,6 @@ static int fts5StorageDeleteFromIndex(
 
   ctx.pStorage = p;
   ctx.iCol = -1;
-  rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel);
   for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){
     if( pConfig->abUnindexed[iCol-1]==0 ){
       const char *zText;
@@ -582,6 +581,10 @@ int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel, sqlite3_value **apVal){
   rc = fts5StorageLoadTotals(p, 1);
 
   /* Delete the index records */
+  if( rc==SQLITE_OK ){
+    rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel);
+  }
+
   if( rc==SQLITE_OK ){
     if( p->pConfig->bContentlessDelete ){
       rc = fts5StorageContentlessDelete(p, iDel);
index 181ccb177e19b69cc45e0006c71d24470e7d4acb..41a78e9c8fb48541fc0579f97fca69ae907984f3 100644 (file)
@@ -248,17 +248,24 @@ do_execsql_test 7.3 { SELECT rowid FROM ft('one'); } {}
 do_execsql_test 7.4 { SELECT rowid FROM ft('two'); } $lRowid
 
 #-------------------------------------------------------------------------
-reset_db
-
 reset_db
 do_execsql_test 8.0 {
   CREATE VIRTUAL TABLE ft USING fts5(x, content='', contentless_delete=1);
   INSERT INTO ft VALUES('hello world');
+  INSERT INTO ft VALUES('one two three');
 }
 
 do_catchsql_test 8.1 {
   INSERT INTO ft(ft, rowid, x) VALUES('delete', 1, 'hello world');
 } {1 {'delete' may not be used with a contentless_delete=1 table}}
 
+do_execsql_test 8.2 {
+  BEGIN;
+    INSERT INTO ft(rowid, x) VALUES(3, 'four four four');
+    DELETE FROM ft WHERE rowid=3;
+  COMMIT;
+  SELECT rowid FROM ft('four');
+} {}
+
 finish_test
 
index 2bd8a2d3d4265e34c487a74239ca3a0891532af7..a45f1f64f34c4fd7329d712bc00ea4abb24ab2a9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\sallow\sthe\s'delete'\scommand\sto\sbe\sused\son\scontentless_delete=1\sfts5\stables.
-D 2023-07-17T17:59:58.252
+C Fix\scases\swhere\sa\srow\sis\sinserted\sinto\sa\scontentless_delete=1\sfts5\stable\sand\sthen\sdeleted\swithin\sthe\ssame\stransaction.
+D 2023-07-17T18:40:39.967
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -94,7 +94,7 @@ F ext/fts5/fts5_expr.c 2473c13542f463cae4b938c498d6193c90d38ea1a2a4f9849c0479736
 F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982
 F ext/fts5/fts5_index.c 8e5fd1f1eb9489f1ba2eff2d3667ffd78a8d936c1180d284ccc6c37f25953a8f
 F ext/fts5/fts5_main.c ede405f0f11db562653b988d043a531daa66093b46c1b35b8fcddb54819cba84
-F ext/fts5/fts5_storage.c ee69d6c8195d2bf584ac8c5433e5c685812f39b48c7464f8aa76d9ed8b489119
+F ext/fts5/fts5_storage.c 7d22c8ea1d484134bd715f55b370ae9b5a830b627986344c4ffa532c3e89186b
 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
 F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950cfff397e25ff
@@ -132,7 +132,7 @@ F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825
 F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d
 F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4
 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283
-F ext/fts5/test/fts5contentless.test 063249b7d0e92dc7ea54b4a179c466828927d720ee054031cbf6e06009c972bf
+F ext/fts5/test/fts5contentless.test 9a42a86822670792ba632f5c57459addeb774d93b29d5e6ddae08faa64c2b6d9
 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe
 F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f
 F ext/fts5/test/fts5corrupt3.test 7da9895dafa404efd20728f66ff4b94399788bdc042c36fe2689801bba2ccd78
@@ -2044,8 +2044,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 c4fb2f2ea0afe638fd7cffd89fbdb0a91589577c6f8299c7bbc17ac121be518b
-R 461e0bbee60dbc3aadc58386c3f130fe
+P cc694b83408ccb5d42204cb624145c76e95329cbe1d1fe8815c70a7a00af231a
+R e5c49e6a91d60244d934bac112d65223
 U dan
-Z 81dd61cf0a290b6d176bc4273c289b56
+Z 153b54340cf10dbebadd96c0477be869
 # Remove this line to create a well-formed Fossil manifest.
index 7ecfbd954a5f252b2df9e7bc2de40cb7adafbf9c..6b9ee4a956a6da0617241591308db80c6ab61c8b 100644 (file)
@@ -1 +1 @@
-cc694b83408ccb5d42204cb624145c76e95329cbe1d1fe8815c70a7a00af231a
\ No newline at end of file
+d928856a226fb7f001e55ff7e8eb58a656b982f1efa811de46c382b8b7cd778c
\ No newline at end of file