]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid an infinite loop in fts3/4 incremental-merge in the case where the lowest level...
authordan <dan@noemail.net>
Thu, 17 Oct 2019 15:41:36 +0000 (15:41 +0000)
committerdan <dan@noemail.net>
Thu, 17 Oct 2019 15:41:36 +0000 (15:41 +0000)
FossilOrigin-Name: 35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc

ext/fts3/fts3_write.c
manifest
manifest.uuid
test/fts4merge.test

index e4b91a82ab28f7b6733377671f70d7488cf49e29..5246566e06631ab3ac6a59e1ee28b99de77de3e8 100644 (file)
@@ -4950,8 +4950,15 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
     }
     if( SQLITE_OK==rc && pCsr->nSegment==nSeg
      && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter))
-     && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pCsr))
     ){
+      int bEmpty = 0;
+      rc = sqlite3Fts3SegReaderStep(p, pCsr);
+      if( rc==SQLITE_OK ){
+        bEmpty = 1;
+      }else if( rc!=SQLITE_ROW ){
+        sqlite3Fts3SegReaderFinish(pCsr);
+        break;
+      }
       if( bUseHint && iIdx>0 ){
         const char *zKey = pCsr->zTerm;
         int nKey = pCsr->nTerm;
@@ -4962,11 +4969,13 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
 
       if( rc==SQLITE_OK && pWriter->nLeafEst ){
         fts3LogMerge(nSeg, iAbsLevel);
-        do {
-          rc = fts3IncrmergeAppend(p, pWriter, pCsr);
-          if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr);
-          if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK;
-        }while( rc==SQLITE_ROW );
+        if( bEmpty==0 ){
+          do {
+            rc = fts3IncrmergeAppend(p, pWriter, pCsr);
+            if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr);
+            if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK;
+          }while( rc==SQLITE_ROW );
+        }
 
         /* Update or delete the input segments */
         if( rc==SQLITE_OK ){
index 984f37cafc682fe31829782bf73364d2bbf71051..be0eda8fcc97beff5cbf93dea132aaf075a4b31e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhancements\sto\sSQL\squery\snormalization\sfor\sUPDATE\sstatements.
-D 2019-10-16T17:46:22.273
+C Avoid\san\sinfinite\sloop\sin\sfts3/4\sincremental-merge\sin\sthe\scase\swhere\sthe\slowest\slevel\sin\sthe\sdatabase\scontains\ssegments\sbut\sno\sdata\s(because\sthere\sis\sa\sdelete-marker\sfor\seach\svalid\sentry).\sFix\sfor\s[bf1aab89].
+D 2019-10-17T15:41:36.813
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3
 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004
 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d
 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f
-F ext/fts3/fts3_write.c 5e35b790778039aaa1267e0ad557c2518274fff9d97ea09301ecb6371dbc6118
+F ext/fts3/fts3_write.c aef93982656ef63851470a86c8f145d54dd4ebd9341f7493aefe45ddff0ce600
 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9
 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100
 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73
@@ -981,7 +981,7 @@ F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269
 F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d
 F test/fts4langid.test 2168ba330af34f8a1c8832de0aab4c4b6fa195a16419c9c0c8aad59ceb6ff714
 F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7
-F test/fts4merge.test 1096e30b58ad616bd502141bfe5bfe4c3a518df89e958d41a5ed1ce322369b9c
+F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2
 F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891
 F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0
 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
@@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b
-R e1eefe483bc6d1fcca7df84837a3f1f8
-U mistachkin
-Z 9a870c611a385fdc7dbdc0a96b27ae55
+P bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134
+R c0ee123c55e0634eada3c2d56906af99
+U dan
+Z 5c41036d47f05063f5938d5d5c2f4f4a
index 3dc24692bbf3a55c42ba780e467548e039837cfc..076e023d3b2f2844184414ce31de00e96eb8c060 100644 (file)
@@ -1 +1 @@
-bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134
\ No newline at end of file
+35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc
\ No newline at end of file
index 48661afd71a772b90eb2a0914b0ad4c2b8c1473c..3cd693209d909a6983f52b282903d2d875f0dcb6 100644 (file)
@@ -326,7 +326,22 @@ foreach mod {fts3 fts4} {
     execsql { INSERT INTO t1(t1) VALUES('merge=200,10') }
     expr { ([db total_changes] - $x)>1 }
   } {0}
+}
+
+#-------------------------------------------------------------------------
+# Test cases 8.* - ticket [bf1aab89].
+#
+set testprefix fts4merge
+reset_db
+do_execsql_test 8.0 {
+  CREATE VIRTUAL TABLE t1 USING fts4(a, order=DESC);
+  INSERT INTO t1(a) VALUES (0);
+  INSERT INTO t1(a) VALUES (0);
+  UPDATE t1 SET a = NULL;
+} 
 
+do_execsql_test 8.1 {
+  INSERT INTO t1(t1) VALUES('merge=1,4');
 }
 
 finish_test