]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an assert() in fts5 that could fail if an xSavepoint() call on another vtab fails.
authordan <dan@noemail.net>
Thu, 26 Dec 2019 14:36:31 +0000 (14:36 +0000)
committerdan <dan@noemail.net>
Thu, 26 Dec 2019 14:36:31 +0000 (14:36 +0000)
FossilOrigin-Name: a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d

ext/fts5/fts5_main.c
ext/fts5/test/fts5savepoint.test [new file with mode: 0644]
manifest
manifest.uuid

index 0980c5b4d15802c79951cfd3f23c94ab8f8fbf58..347bf7f23ea8dbd80ecd07254b20cd65e1d21e0e 100644 (file)
@@ -289,7 +289,10 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){
     case FTS5_ROLLBACKTO:
       assert( p->ts.eState==1 );
       assert( iSavepoint>=-1 );
-      assert( iSavepoint<=p->ts.iSavepoint );
+      /* The following assert() can fail if another vtab strikes an error
+      ** within an xSavepoint() call then SQLite calls xRollbackTo() - without
+      ** having called xSavepoint() on this vtab.  */
+      /* assert( iSavepoint<=p->ts.iSavepoint ); */
       p->ts.iSavepoint = iSavepoint;
       break;
   }
diff --git a/ext/fts5/test/fts5savepoint.test b/ext/fts5/test/fts5savepoint.test
new file mode 100644 (file)
index 0000000..e431f9f
--- /dev/null
@@ -0,0 +1,85 @@
+# 2019 Dec 26
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+source [file join [file dirname [info script]] fts5_common.tcl]
+set testprefix fts5savepoint
+
+# If SQLITE_ENABLE_FTS5 is defined, omit this file.
+ifcapable !fts5 {
+  finish_test
+  return
+}
+
+do_execsql_test 1.0 {
+  CREATE VIRTUAL TABLE ft USING fts5(c);
+  BEGIN;
+    SAVEPOINT one;
+      INSERT INTO ft VALUES('a');
+      SAVEPOINT two;
+        INSERT INTO ft VALUES('b');
+      RELEASE two;
+      SAVEPOINT four;
+        INSERT INTO ft VALUES('c');
+      RELEASE four;
+      SAVEPOINT three;
+        INSERT INTO ft VALUES('d');
+      ROLLBACK TO three;
+  COMMIT;
+  SELECT * FROM ft
+} {a b c}
+
+reset_db
+do_catchsql_test 2.0 {
+  CREATE VIRTUAL TABLE ft1 USING fts5(c);
+  CREATE VIRTUAL TABLE ft2 USING fts5(c);
+  DROP TABLE ft2_idx;
+  BEGIN;
+      INSERT INTO ft2 VALUES('a');
+      INSERT INTO ft1 VALUES('a');
+      SAVEPOINT two;
+        INSERT INTO ft1 VALUES('b');
+  COMMIT;
+} {1 {SQL logic error}}
+
+reset_db
+ifcapable fts3 {
+  do_execsql_test 3.0 {
+    CREATE VIRTUAL TABLE vt0 USING fts5(c0);
+    CREATE VIRTUAL TABLE vt1 USING fts4(c0);
+    INSERT INTO vt1(c0) VALUES(0);
+  }
+
+  do_execsql_test 3.1 {
+    BEGIN;
+      UPDATE vt1 SET c0 = 0;
+      INSERT INTO vt1(c0) VALUES (0), (0);
+      UPDATE vt0 SET c0 = 0;
+      INSERT INTO vt1(c0) VALUES (0);
+      UPDATE vt1 SET c0 = 0;
+      INSERT INTO vt1(vt1) VALUES('automerge=1');
+      UPDATE vt1 SET c0 = 0;
+  }
+
+  do_catchsql_test 3.2 {
+    DROP TABLE vt1;
+  } {1 {SQL logic error}}
+
+  do_execsql_test 3.3 {
+    SAVEPOINT x;
+      INSERT INTO vt0 VALUES('x');
+    COMMIT;
+    INSERT INTO vt0(vt0) VALUES('integrity-check');
+  }
+}
+
+finish_test
+
index ff363e591b629e29a437ff54e2062522962802cb..a88718c5715c9832435ed0667e9efbd1c7545279 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Makefile.in\sfix\sso\sthat\sit\sworks\son\ssystems\sthat\srequire\sa\s.EXE\ssuffix\non\sexecutables.
-D 2019-12-26T01:10:17.023
+C Fix\san\sassert()\sin\sfts5\sthat\scould\sfail\sif\san\sxSavepoint()\scall\son\sanother\svtab\sfails.
+D 2019-12-26T14:36:31.110
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e
 F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e
 F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75
 F ext/fts5/fts5_index.c e3573c88ce8238f7a5892c777a9ddf646c1355012780337d783fb2dfc3dca650
-F ext/fts5/fts5_main.c 9db1f173d299466aeff89bd949fb1eb0a181265726fb56f11e07ea292dcc9a73
+F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e
 F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528
 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95
 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
@@ -205,6 +205,7 @@ F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee
 F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7
 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415
 F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6
+F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f
 F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b
 F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0
 F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f
@@ -1852,7 +1853,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 f8d5586a8ceca985dcb2d63d0fbad9e271e9e1664720ee698d4947acd5dcc543
-R 6af373fa92486883d456e9ecb1d65e03
-U drh
-Z 626f0d7b9b28ef5ff11b6bda2814f398
+P f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3
+R 32c990e2bff4427bef4caf63e3ed3a03
+U dan
+Z cc9534888248d78f29ac267262b69129
index 5e0932a5a227ba2e3b264f59cd4565456756b0d8..7562806aefec25637952500769a6ec1737906bb4 100644 (file)
@@ -1 +1 @@
-f482a4cdfa768941e22c399de8ec29a55e729529eeae86d3832077ad1bef22f3
\ No newline at end of file
+a5d7f5d24a239f729de0b8aa5becf5af35ba87160565ee0713c335b8d1bbf12d
\ No newline at end of file