]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with running ".recover" on an in-memory database.
authordan <Dan Kennedy>
Thu, 27 Oct 2022 11:12:54 +0000 (11:12 +0000)
committerdan <Dan Kennedy>
Thu, 27 Oct 2022 11:12:54 +0000 (11:12 +0000)
FossilOrigin-Name: 87b4cca2b84845cee603d40fbf16c9635d6dc2d19d2f37ae86abfeff716c9a85

ext/recover/recover1.test
ext/recover/sqlite3recover.c
manifest
manifest.uuid

index ed921b7e91db1f9824bef6d2a410697ab1631685..7c3b0a0eefd5fa0d824f5ef70757ebfaaf0e1e27 100644 (file)
@@ -246,5 +246,28 @@ do_execsql_test 12.1 {
 
 do_recover_test 12 
 
+#-------------------------------------------------------------------------
+reset_db
+sqlite3 db "" 
+do_recover_test 13
+
+do_execsql_test 14.1 {
+  PRAGMA auto_vacuum = 2;
+  PRAGMA user_version = 45;
+  PRAGMA application_id = 22;
+
+  CREATE TABLE u1(u, v);
+  CREATE UNIQUE INDEX i1 ON u1(u, v);
+  INSERT INTO u1 VALUES(1, 2), (3, 4);
+
+  CREATE TABLE u2(u, v);
+  CREATE UNIQUE INDEX i2 ON u1(u, v);
+  INSERT INTO u2 VALUES(hex(randomblob(500)), hex(randomblob(1000)));
+  INSERT INTO u2 VALUES(hex(randomblob(500)), hex(randomblob(1000)));
+  INSERT INTO u2 VALUES(hex(randomblob(500)), hex(randomblob(1000)));
+  INSERT INTO u2 VALUES(hex(randomblob(50000)), hex(randomblob(20000)));
+}
+do_recover_test 14 
+
 finish_test
 
index 30d02f9ca2c6877ba14cc982db9024174d4e649f..db1a9fd4877740f269e129f44ee2ee08399d9a35 100644 (file)
@@ -2446,7 +2446,7 @@ static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
 }
 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
   RECOVER_VFS_WRAPPER (
-      pFd->pMethods->xFileControl(pFd, op, pArg)
+    (pFd->pMethods ?  pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
   );
 }
 static int recoverVfsSectorSize(sqlite3_file *pFd){
@@ -2496,6 +2496,7 @@ static void recoverInstallWrapper(sqlite3_recover *p){
   assert( recover_g.pMethods==0 );
   recoverAssertMutexHeld();
   sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
+  assert( pFd==0 || pFd->pMethods!=&recover_methods );
   if( pFd ){
     recover_g.pMethods = pFd->pMethods;
     recover_g.p = p;
@@ -2510,10 +2511,9 @@ static void recoverInstallWrapper(sqlite3_recover *p){
 */
 static void recoverUninstallWrapper(sqlite3_recover *p){
   recoverAssertMutexHeld();
-  if( recover_g.pMethods ){
-    sqlite3_file *pFd = 0;
-    sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
-    assert( pFd );
+  sqlite3_file *pFd = 0;
+  sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
+  if( pFd ){
     pFd->pMethods = recover_g.pMethods;
     recover_g.pMethods = 0;
     recover_g.p = 0;
index 97724ee2e7f95be76b9b3849d3871e4188a9feee..a8a40591c9bb1d1e24897a6342e8a2ef4cf1b48c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\suse\ssqlite3_mutex_xxx()\sfunctions\sin\ssqlite3recover.c\swhen\sbuilt\swith\sSQLITE_THREADSAFE=0.
-D 2022-10-27T10:51:49.063
+C Fix\sa\sproblem\swith\srunning\s".recover"\son\san\sin-memory\sdatabase.
+D 2022-10-27T11:12:54.318
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -386,7 +386,7 @@ F ext/rbu/sqlite3rbu.c 8737cabdfbee84bb25a7851ecef8b1312be332761238da9be6ddb10c6
 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812
 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a
 F ext/recover/dbdata.c a7b2fc6750139a7bb3455d784063d43f98c28f226b7f84d88270f1c083dc6b72
-F ext/recover/recover1.test 93acc42f95259f8b34050ad75873685a305da76d6cb1727d003f45157a4a6402
+F ext/recover/recover1.test e08dc7a0513eab9de33e7b8e2260b9538bedb57c9bd6fbb278f328d29a102827
 F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c
 F ext/recover/recoverclobber.test 294dcc894124ab4ca3a7b35766630742a3d25810fceac22220beb64f70a33a60
 F ext/recover/recovercorrupt.test 6540aae95e17398dd70b44518367fd56588c44962cb276d2623a0fedba9efe9e
@@ -398,7 +398,7 @@ F ext/recover/recoverpgsz.test 93e970eab05e4e89f8fd6b1bd23f9ec137ea09857e66ba0d4
 F ext/recover/recoverrowid.test 1694a1a5526d825f71279f3d02ab02a1ee4c5265de18858bf54cb8ec54487ac8
 F ext/recover/recoverslowidx.test f356bb9fba7ffd6fc50e045e419464f0129ac6e24decf6e919584f79c3493727
 F ext/recover/recoversql.test f9872ff2114e13ffd8ee31e1de06919f62b9b48bc080191b5bd076d10becb60f
-F ext/recover/sqlite3recover.c 8847c27ce4ad80b327fe8266dd79087839d8ba5aeb10a03c68b199b57da00019
+F ext/recover/sqlite3recover.c 157f5c9dc198feb1f78f4c902e6073430bd48f747953e2330a58493f4fa5bfcf
 F ext/recover/sqlite3recover.h f698ccc94bd4da38761035415ad08c4549a408491ff9fd5f52d34d2214f64e36
 F ext/recover/test_recover.c 61ec931e47abca6b2210f46239cafd9f3060741605e3d3c45a7c7a53f63dd957
 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
@@ -2052,8 +2052,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 ed8d3f25a4d6ac04d9f7918c791d8d2c6f23ce846278ca63f8fbadb7ea27369f
-R 31b949bd8120302ed6e08d715da99043
+P cd0aa27d1732abc61c8a8440118ff629f7dca185d2f515ce1f6090c49d8dc890
+R 0b3eaef812138ac59816127d76cc1fa8
 U dan
-Z 1e435f3e6e7a6ad7e9a041f4354e77c4
+Z 1810ee577f2015d8abedf9ca1b5465fa
 # Remove this line to create a well-formed Fossil manifest.
index 12a1eaf2ee5b118425abd1252a429f4766d0f56d..dc80392c1ae52761f2777b204b12d688692591cd 100644 (file)
@@ -1 +1 @@
-cd0aa27d1732abc61c8a8440118ff629f7dca185d2f515ce1f6090c49d8dc890
\ No newline at end of file
+87b4cca2b84845cee603d40fbf16c9635d6dc2d19d2f37ae86abfeff716c9a85
\ No newline at end of file