]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests to restore coverage of fts5_storage.c.
authordan <Dan Kennedy>
Fri, 16 Aug 2024 17:54:00 +0000 (17:54 +0000)
committerdan <Dan Kennedy>
Fri, 16 Aug 2024 17:54:00 +0000 (17:54 +0000)
FossilOrigin-Name: 38841881a08f4d75c2dfcbc1b2b45e311d7dda1287780f8ba1c8388f7adc1629

ext/fts5/fts5_storage.c
ext/fts5/test/fts5corrupt.test
ext/fts5/test/fts5faultI.test
ext/fts5/test/fts5locale.test
manifest
manifest.uuid

index 76f57499dfa89eedc8b0759a81960d958eaa5059..03af105a754ac4ec41af2b3eea74948c91baefd9 100644 (file)
@@ -526,7 +526,7 @@ static int fts5StorageDeleteFromIndex(
             pText, nText, (void*)&ctx, fts5StorageInsertCallback
         );
         p->aTotalSize[iCol-1] -= (i64)ctx.szCol;
-        if( p->aTotalSize[iCol-1]<0 && rc==SQLITE_OK ){
+        if( rc==SQLITE_OK && p->aTotalSize[iCol-1]<0 ){
           rc = FTS5_CORRUPT;
         }
         if( bReset ) sqlite3Fts5ClearLocale(pConfig);
@@ -618,12 +618,12 @@ static int fts5StorageInsertDocsize(
         rc = sqlite3Fts5IndexGetOrigin(p->pIndex, &iOrigin);
         sqlite3_bind_int64(pReplace, 3, iOrigin);
       }
-      if( rc==SQLITE_OK ){
-        sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC);
-        sqlite3_step(pReplace);
-        rc = sqlite3_reset(pReplace);
-        sqlite3_bind_null(pReplace, 2);
-      }
+    }
+    if( rc==SQLITE_OK ){
+      sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC);
+      sqlite3_step(pReplace);
+      rc = sqlite3_reset(pReplace);
+      sqlite3_bind_null(pReplace, 2);
     }
   }
   return rc;
@@ -887,28 +887,28 @@ int sqlite3Fts5StorageContentInsert(
     rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0);
     for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){
       sqlite3_value *pVal = apVal[i];
-      if( sqlite3_value_nochange(pVal) && p->pSavedRow ){
+      if( sqlite3_value_nochange(pVal) ){
         /* This is an UPDATE statement, and column (i-2) was not modified.
         ** Retrieve the value from Fts5Storage.pSavedRow instead. */
+        assert( p->pSavedRow );
         pVal = sqlite3_column_value(p->pSavedRow, i-1);
       }else if( sqlite3_value_subtype(pVal)==FTS5_LOCALE_SUBTYPE ){
         assert( pConfig->bLocale );
-        if( i>1 ){
-          if( pConfig->abUnindexed[i-2] ){
-            /* At attempt to insert an fts5_locale() value into an UNINDEXED
-            ** column. Strip the locale away and just bind the text.  */
-            const char *pText = 0;
-            int nText = 0;
-            rc = sqlite3Fts5ExtractText(pConfig, pVal, 0, 0, &pText, &nText);
-            sqlite3_bind_text(pInsert, i, pText, nText, SQLITE_TRANSIENT);
-          }else{
-            const u8 *pBlob = (const u8*)sqlite3_value_blob(pVal);
-            int nBlob = sqlite3_value_bytes(pVal);
-            assert( nBlob>4 );
-            sqlite3_bind_blob(pInsert, i, pBlob+4, nBlob-4, SQLITE_TRANSIENT);
-          }
-          continue;
+        assert( i>1 );
+        if( pConfig->abUnindexed[i-2] ){
+          /* At attempt to insert an fts5_locale() value into an UNINDEXED
+          ** column. Strip the locale away and just bind the text.  */
+          const char *pText = 0;
+          int nText = 0;
+          rc = sqlite3Fts5ExtractText(pConfig, pVal, 0, 0, &pText, &nText);
+          sqlite3_bind_text(pInsert, i, pText, nText, SQLITE_TRANSIENT);
+        }else{
+          const u8 *pBlob = (const u8*)sqlite3_value_blob(pVal);
+          int nBlob = sqlite3_value_bytes(pVal);
+          assert( nBlob>4 );
+          sqlite3_bind_blob(pInsert, i, pBlob+4, nBlob-4, SQLITE_TRANSIENT);
         }
+        continue;
       }
 
       rc = sqlite3_bind_value(pInsert, i, pVal);
index ae07383b230b3ae74fd67473d306ce03c7c5c807..0abd8b86de09264c4e62d569abe8c6a389b38dc3 100644 (file)
@@ -101,4 +101,25 @@ do_catchsql_test 3.1 {
   SELECT * FROM t3 WHERE t3 MATCH 'o';
 } {1 {fts5: missing row 3 from content table 'main'.'t3_content'}}
 
+#--------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 4.0 {
+  CREATE VIRTUAL TABLE t2 USING fts5(x);
+  INSERT INTO t2 VALUES('one two three');
+  INSERT INTO t2 VALUES('four five six');
+  INSERT INTO t2 VALUES('seven eight nine');
+  INSERT INTO t2 VALUES('ten eleven twelve');
+}
+do_execsql_test 4.1 {
+  SELECT hex(block) FROM t2_data WHERE id=1;
+} {040C}
+do_execsql_test 4.2 {
+  UPDATE t2_data SET block = X'0402' WHERE id=1
+}
+breakpoint
+do_catchsql_test 4.3 {
+  DELETE FROM t2 WHERE rowid=3
+} {1 {database disk image is malformed}}
+
 finish_test
index ab641b65148b56967c98c292d9d725589acdb6ff..d35cdc3800e16d255bb7eb198e903884c071262f 100644 (file)
@@ -22,8 +22,6 @@ ifcapable !fts5 {
 
 set ::testprefix fts5faultI
 
-if 0 {
-
 do_execsql_test 1.0 {
   PRAGMA encoding = utf16;
   CREATE VIRTUAL TABLE t1 USING fts5(x, locale=1);
@@ -168,13 +166,13 @@ do_faultsim_test 7 -faults oom* -prep {
   }
 } -test {
 }
-}
+
 #-------------------------------------------------------------------------
 reset_db
 fts5_tclnum_register db
 fts5_aux_test_functions db
 
-do_execsql_test 2.0 {
+do_execsql_test 8.0 {
   CREATE VIRTUAL TABLE ft USING fts5(
       x, tokenize = "tclnum query", detail=columns
   );
@@ -201,6 +199,28 @@ do_faultsim_test 8.2 -faults oom* -prep {
   faultsim_test_result {0 1} {1 {SQL logic error}} {1 SQLITE_NOMEM}
 }
 
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 9.0 {
+  CREATE VIRTUAL TABLE ft USING fts5(x);
+  INSERT INTO ft VALUES('one two three i ii iii');
+  INSERT INTO ft VALUES('four five six iv v vi');
+  INSERT INTO ft VALUES('eight nine ten viii ix x');
+} {}
+
+faultsim_save_and_close
+
+do_faultsim_test 9 -faults oom* -prep {
+  faultsim_restore_and_reopen
+} -body {
+  execsql {
+    UPDATE ft SET rowid=4 WHERE rowid=1
+  }
+} -test {
+  faultsim_test_result {0 {}}
+}
+
 
 finish_test
 
index f647317c3b9c10676bbfa4b067bbdeba9e680660..d64df18491af6352c75178021fbb14e00bac7efb 100644 (file)
@@ -145,6 +145,13 @@ do_execsql_test 2.17 {
   INSERT INTO b1(b1) VALUES('integrity-check');
 }
 
+do_execsql_test 2.18 {
+  INSERT INTO b1(rowid, x, y) VALUES(
+      test_setsubtype(45, 76), 'abc def', 'def abc'
+  );
+  INSERT INTO b1(b1) VALUES('integrity-check');
+}
+
 #-------------------------------------------------------------------------
 # Test the 'delete' command with contentless tables.
 #
@@ -459,6 +466,10 @@ foreach_detail_mode $::testprefix {
     CREATE VIRTUAL TABLE ft USING fts5(x, 
         content=x1, content_rowid=ii, locale=1, detail=%DETAIL%, columnsize=0
     );
+
+    CREATE VIRTUAL TABLE ft2 USING fts5(
+        x, locale=1, detail=%DETAIL%, columnsize=0
+    );
   }
   
   foreach {tn v} {
@@ -500,6 +511,37 @@ foreach_detail_mode $::testprefix {
     do_catchsql_test 10.2.$tn.8 {
       SELECT * FROM ft('hello')
     } {1 {SQL logic error}}
+
+    do_catchsql_test 10.2.$tn.9 {
+      PRAGMA integrity_check;
+    } {0 ok}
+
+    do_execsql_test 10.2.$tn.10 {
+      DELETE FROM x1;
+      INSERT INTO x1(ii, x) VALUES(1, 'hello world');
+    }
+
+    do_catchsql_test 10.2.$tn.11 "
+      INSERT INTO ft(ft, rowid, x) VALUES('delete', 1, test_setsubtype($v,76) )
+    " {1 {SQL logic error}}
+
+    do_catchsql_test 10.2.$tn.12 "
+      INSERT INTO ft(rowid, x) VALUES(2, test_setsubtype($v,76) )
+    " {1 {SQL logic error}}
+
+    do_execsql_test 10.2.$tn.13 {
+      INSERT INTO ft2(rowid, x) VALUES(1, 'hello world');
+    }
+    do_execsql_test 10.2.$tn.14 "UPDATE ft2_content SET c0=$v"
+
+    do_catchsql_test 10.2.$tn.15 {
+      PRAGMA integrity_check;
+    } {1 {SQL logic error}}
+
+    do_execsql_test 10.2.$tn.16 {
+      DELETE FROM ft2_content;
+      INSERT INTO ft2(ft2) VALUES('rebuild');
+    }
   }
 
 }
index 5847c8b75ffc707b1596c95e714dd47a22e8208c..1c1eedf45288a67cf5638ead2ea9e367e66732d7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stests\sto\srestore\scoverage\sof\sfts5_main.c.
-D 2024-08-16T16:20:43.666
+C Add\stests\sto\srestore\scoverage\sof\sfts5_storage.c.
+D 2024-08-16T17:54:00.409
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -101,7 +101,7 @@ F ext/fts5/fts5_expr.c 3a24c6ab5b7545312a5ec03085ae705ede820a08f9a63f1d72829ed4a
 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1
 F ext/fts5/fts5_index.c eb9a0dda3bc6ef969a6be8d2746af56856e67251810ddba08622b45be8477abe
 F ext/fts5/fts5_main.c 23029229021240dc21a69eb749305316103d183375413e2090c064b74b03b7f8
-F ext/fts5/fts5_storage.c 5bf88213ff5911625c142ac332ddba10dcd0869e757f91f2a3d27f27ba595992
+F ext/fts5/fts5_storage.c acece8abf1b4b2012bdad93aa2d2cf6fc0d1da919763479c7055f699c2cde96c
 F ext/fts5/fts5_tcl.c 1dcf08028141c40a32634bdcf2d5601622ce4edc48f82ac4ce0cbe0a92a6961d
 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
 F ext/fts5/fts5_test_tok.c 3cb0a9b508b30d17ef025ccddd26ae3dc8ddffbe76c057616e59a9aa85d36f3b
@@ -146,7 +146,7 @@ F ext/fts5/test/fts5contentless2.test 70ffe6c611d8f278240da56734df8a77948f04e273
 F ext/fts5/test/fts5contentless3.test 75eaae5ad6b284ee447788943974d323228f27cc35a1681da997135cff95bc6a
 F ext/fts5/test/fts5contentless4.test ec34dc69ef474ca9997dae6d91e072906e0e9a5a4b05ea89964c863833b6eff8
 F ext/fts5/test/fts5contentless5.test 40cdcb4fe751672450829c5a96bd32c25fc2f6076279dd2ce5c58ac9a390132a
-F ext/fts5/test/fts5corrupt.test a9bda1ded5112ebf1ee85c5381bd1fe8974952e2523cede4d5072804d2011503
+F ext/fts5/test/fts5corrupt.test 6485f721b88ba355ca5d701e7ee87a4efa3ea578d8e6adb26f51ef956c8328bd
 F ext/fts5/test/fts5corrupt2.test 335911e3f68b9625d850325f9e29a128db3f4276a8c9d4e32134580da8f924c4
 F ext/fts5/test/fts5corrupt3.test b5f35d72af85b1d5a092b3d5e437f7944d142dd0b0c87b928fd0436a0aec6987
 F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733
@@ -177,7 +177,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 eb0910ec0fa57b4e06241c58252124155e689770b4dd2d8f4f3fc74185be934e
+F ext/fts5/test/fts5faultI.test e57fa07b771565fcb7aa2b2c349a5104812b4edd86d09ca531afd9b247cf36dd
 F ext/fts5/test/fts5first.test bfd685b96905bf541d99d8644e0a7219d1d833455a08ab64e344071a613b6ba9
 F ext/fts5/test/fts5full.test 97d263c1072f4a560929cca31e70f65d2ae232610e17e6affcf7e979df59547b
 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e
@@ -187,7 +187,7 @@ F ext/fts5/test/fts5interrupt.test 20d04204d3e341b104c0c24a41596b6393a3a81eba104
 F ext/fts5/test/fts5lastrowid.test f36298a1fb9f988bde060a274a7ce638faa9c38a31400f8d2d27ea9373e0c4a1
 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad
 F ext/fts5/test/fts5limits.test 8ab67cf5d311c124b6ceb0062d0297767176df4572d955fce79fa43004dff01c
-F ext/fts5/test/fts5locale.test 5ad9f1b66db4d698c67284f3495007be94f8c6ed183688e64defed72a169b6c0
+F ext/fts5/test/fts5locale.test 79cbd3000ae269de50826f6061c81f7c9fdb21dd9954c0b7f9485263482c539d
 F ext/fts5/test/fts5matchinfo.test 877520582feb86bbfd95ab780099bcba4526f18ac75ee34979144cf86ba3a5a3
 F ext/fts5/test/fts5merge.test 2654df0bcdb2d117c2d38b6aeb0168061be01c643f9e9194b36c43a2970e8082
 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2
@@ -2208,8 +2208,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P fb257540d32ced4a5fe0759d3ad9c1b36fd2b7d64d93cb0a0ecdb48355a68b7a
-R 067a05b128f4dcdbb34743e9c0788abc
+P 681edd08ab7024ddcd6447a64d8aad581b47b039481b697d91d26e6c6660f373
+R 39ee8d76619b01513c02abf781a1c1d5
 U dan
-Z 1b380833fd7dd34e177f4e045cee1c46
+Z 17e6bca1c1b4a8da8fc2bb9198c32b95
 # Remove this line to create a well-formed Fossil manifest.
index e93e9346cb468524dd217cfbc39090703d927db3..9ad6542d4f204ee1c012b3e674d20ccc08f1ffd5 100644 (file)
@@ -1 +1 @@
-681edd08ab7024ddcd6447a64d8aad581b47b039481b697d91d26e6c6660f373
+38841881a08f4d75c2dfcbc1b2b45e311d7dda1287780f8ba1c8388f7adc1629