]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with using "<db>-vacuum" (the default) as the state database
authordan <dan@noemail.net>
Mon, 10 Dec 2018 08:41:32 +0000 (08:41 +0000)
committerdan <dan@noemail.net>
Mon, 10 Dec 2018 08:41:32 +0000 (08:41 +0000)
when resuming an RBU vacuum.

FossilOrigin-Name: c878d741733a897d47a1a0b57b454bc9095ce302b48cc01089336d5d20e2a24c

ext/rbu/rbu_common.tcl
ext/rbu/rbuvacuum2.test
ext/rbu/sqlite3rbu.c
ext/rbu/sqlite3rbu.h
ext/rbu/test_rbu.c
manifest
manifest.uuid

index 2b263b7660d5a3a9f1e2392f63018f1cbf058700..b5e63aafe55fea208acb470fed3be3ff83b0fbbd 100644 (file)
@@ -86,12 +86,13 @@ proc step_rbu_legacy {target rbu} {
   set rc
 }
 
-proc do_rbu_vacuum_test {tn step} {
-  forcedelete state.db
-  uplevel [list do_test $tn.1 {
-    if {$step==0} { sqlite3rbu_vacuum rbu test.db state.db }
+proc do_rbu_vacuum_test {tn step {statedb state.db}} {
+  forcedelete $statedb
+  if {$statedb=="" && $step==1} breakpoint
+  uplevel [list do_test $tn.1 [string map [list %state% $statedb] {
+    if {$step==0} { sqlite3rbu_vacuum rbu test.db {%state%}}
     while 1 {
-      if {$step==1} { sqlite3rbu_vacuum rbu test.db state.db }
+      if {$step==1} { sqlite3rbu_vacuum rbu test.db {%state%}}
       set state [rbu state]
       check_prestep_state test.db $state
       set rc [rbu step]
@@ -100,7 +101,7 @@ proc do_rbu_vacuum_test {tn step} {
       if {$step==1} { rbu close }
     }
     rbu close
-  } {SQLITE_DONE}]
+  }] {SQLITE_DONE}]
 
   uplevel [list do_execsql_test $tn.2 {
     PRAGMA integrity_check
index 4713580c704a1e3c8208fabc388b2daac0b10ef3..6d6dfde9b9a823f94dce11512d4c78e120669f0c 100644 (file)
 
 source [file join [file dirname [info script]] rbu_common.tcl]
 
-foreach step {0 1} {
-  set ::testprefix rbuvacuum2-$step
+foreach {step} {0 1} {
+foreach {ttt state} {
+  s state.db t test.db-vacuum n {}
+} {
+  set ::testprefix rbuvacuum2-$step$ttt
   
   #-------------------------------------------------------------------------
   # Test that a database that contains fts3 tables can be vacuumed.
@@ -29,7 +32,7 @@ foreach step {0 1} {
       INSERT INTO t1 VALUES('fix this issue', 'at some point');
     }
   
-    do_rbu_vacuum_test 1.2 $step
+    do_rbu_vacuum_test 1.2 $step $state
   
     do_execsql_test 1.3 {
       SELECT * FROM t1;
@@ -46,7 +49,7 @@ foreach step {0 1} {
       INSERT INTO t1 VALUES('a b c', 'x y z');
     }
 
-    do_rbu_vacuum_test 1.6 $step
+    do_rbu_vacuum_test 1.6 $step $state
     do_execsql_test 1.7 {
       INSERT INTO t1(t1) VALUES('integrity-check');
       SELECT * FROM t1;
@@ -67,7 +70,7 @@ foreach step {0 1} {
       INSERT INTO t1 VALUES('fix this issue', 'at some point');
     }
   
-    do_rbu_vacuum_test 2.2 $step
+    do_rbu_vacuum_test 2.2 $step $state
   
     do_execsql_test 2.3 {
       SELECT * FROM t1;
@@ -84,7 +87,7 @@ foreach step {0 1} {
       INSERT INTO t1 VALUES('a b c', 'x y z');
     }
 
-    do_rbu_vacuum_test 2.6 $step
+    do_rbu_vacuum_test 2.6 $step $state
     do_execsql_test 2.7 {
       INSERT INTO t1(t1) VALUES('integrity-check');
       SELECT * FROM t1;
@@ -107,7 +110,7 @@ foreach step {0 1} {
       INSERT INTO rt VALUES(3, 55, 65);
     }
   
-    do_rbu_vacuum_test 3.2 $step
+    do_rbu_vacuum_test 3.2 $step $state
   
     do_execsql_test 3.3 {
       SELECT * FROM rt;
@@ -120,7 +123,7 @@ foreach step {0 1} {
       SELECT rowid FROM rt WHERE x2>59 AND x1 < 59
     } {2 3}
 
-    do_rbu_vacuum_test 3.5 $step
+    do_rbu_vacuum_test 3.5 $step $state
 
     do_execsql_test 3.6.1 {
       SELECT rowid FROM rt WHERE x2>51 AND x1 < 51
@@ -147,7 +150,7 @@ foreach step {0 1} {
     trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END}
     }
 
-    do_rbu_vacuum_test 4.3 $step
+    do_rbu_vacuum_test 4.3 $step $state
     do_execsql_test 4.4 {
       SELECT * FROM sqlite_master;
     } {
@@ -157,6 +160,7 @@ foreach step {0 1} {
     }
   }
 }
+}
   
 #-------------------------------------------------------------------------
 # Test that passing a NULL value as the second argument to 
@@ -231,4 +235,9 @@ do_test 6.3 {
   execsql { PRAGMA integrity_check }
 } {ok}
 
+do_test 6.4 {
+  sqlite3rbu_vacuum rbu test.db test.db-vactmp
+  list [catch { rbu close } msg] $msg
+} {1 SQLITE_MISUSE}
+
 finish_test
index cd2f96c51bf7925ef0b040caa4c926c76b18516f..7683c3464b20ff227bc3aea28d1f7f03d47dfc30 100644 (file)
@@ -2477,7 +2477,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){
         if( *zExtra=='\0' ) zExtra = 0;
       }
 
-      zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", 
+      zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", 
           sqlite3_db_filename(p->dbRbu, "main"),
           (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra)
       );
@@ -3743,6 +3743,12 @@ sqlite3rbu *sqlite3rbu_vacuum(
   const char *zState
 ){
   if( zTarget==0 ){ return rbuMisuseError(); }
+  if( zState ){
+    int n = strlen(zState);
+    if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){
+      return rbuMisuseError();
+    }
+  }
   /* TODO: Check that both arguments are non-NULL */
   return openRbuHandle(0, zTarget, zState);
 }
index 1acbcca4695b04a687b7dbf427cc1ae95a799678..69d89500a02be2df3bbcafdf0695460c13e2dd05 100644 (file)
@@ -333,7 +333,11 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open(
 ** name of the state database is "<database>-vacuum", where <database>
 ** is the name of the target database file. In this case, on UNIX, if the
 ** state database is not already present in the file-system, it is created
-** with the same permissions as the target db is made.
+** with the same permissions as the target db is made. 
+**
+** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the 
+** state database ends with "-vactmp". This name is reserved for internal 
+** use.
 **
 ** This function does not delete the state database after an RBU vacuum
 ** is completed, even if it created it. However, if the call to
index e0b4d77af0a2bff7f57fe92232b8a91d5cb9febb..6d04bfe8ccfa99651ad293877df2da625d490fab 100644 (file)
@@ -273,6 +273,7 @@ static int SQLITE_TCLAPI test_sqlite3rbu_vacuum(
   zCmd = Tcl_GetString(objv[1]);
   zTarget = Tcl_GetString(objv[2]);
   if( objc==4 ) zStateDb = Tcl_GetString(objv[3]);
+  if( zStateDb && zStateDb[0]=='\0' ) zStateDb = 0;
 
   pRbu = sqlite3rbu_vacuum(zTarget, zStateDb);
   Tcl_CreateObjCommand(interp, zCmd, test_sqlite3rbu_cmd, (ClientData)pRbu, 0);
index 544f8a6898626450fc7b6967b4cb75d4ea93eb83..a24f9cc5e0659040edcc35c19cbf5f35b9e7d30b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssupport\sfor\sthe\sVACUUM\sINTO\scommand.
-D 2018-12-10T01:48:29.276
+C Fix\sa\sproblem\swith\susing\s"<db>-vacuum"\s(the\sdefault)\sas\sthe\sstate\sdatabase\nwhen\sresuming\san\sRBU\svacuum.
+D 2018-12-10T08:41:32.074
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c
@@ -330,7 +330,7 @@ F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74
 F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3
 F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc
 F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b
-F ext/rbu/rbu_common.tcl acfb7fbbaf8d46a9f6f6a5ec795616c84d705e1565d918afe43f0ff53ea0efa5
+F ext/rbu/rbu_common.tcl 4b3d033b3e3844292ae3a1aefc0e524e64b0db5a0e4310657919e4504ac3073f
 F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197
 F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4
 F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41
@@ -348,10 +348,10 @@ F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d
 F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8
 F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce00af9147a341
 F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534
-F ext/rbu/rbuvacuum2.test 0a7669bbabdaeed915f02f59f33fe20e13d4932ba2086fe00a82064d9424c80b
-F ext/rbu/sqlite3rbu.c 71f8c09948d09ec9c5a8dbe7127e8ef61ef0853e698b2650be2485ac7b9c75c8
-F ext/rbu/sqlite3rbu.h b42bcd4d8357268c6c39ab2a60b29c091e89328fa8cc49c8fac5ab8d007e79b2
-F ext/rbu/test_rbu.c baa23eb28457580673d2175e5f0c29ced0cd320ee819b13ad362398c53b96e90
+F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b
+F ext/rbu/sqlite3rbu.c f722ed4177c9fb73f2f6f116240687ac7603735fa95ea63bff71827929d4c192
+F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812
+F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a
 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
 F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd
 F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3
@@ -1783,8 +1783,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 b7bf3c9832bde26b359f4d58ebcf7788c500586d311387d022192ed65a126252 9748d7995bc1dd632d66d2d326048d50e29c6f5e6993d5a6294d14421d2cb72f
-R f78f1915a996819be59599569cf251be
-T +closed 9748d7995bc1dd632d66d2d326048d50e29c6f5e6993d5a6294d14421d2cb72f
-U drh
-Z ee3d9a1eeb178b5acf328ec54a590f24
+P 77f150b8b46761f4f62f9d8926c10a95a70589a4525393fc16b321bd98c083a7
+R 958323adeafdf09cbb584115dfab1b22
+U dan
+Z 3e8a12745bc34fa21f3c5c886b9f537f
index fb0635c7f29ba2eb1c708ff2ed101408cdf6327c..afb7891c77cfefca5b5965e2584b912479ae2a93 100644 (file)
@@ -1 +1 @@
-77f150b8b46761f4f62f9d8926c10a95a70589a4525393fc16b321bd98c083a7
\ No newline at end of file
+c878d741733a897d47a1a0b57b454bc9095ce302b48cc01089336d5d20e2a24c
\ No newline at end of file