summaryrefslogtreecommitdiffstats
path: root/third_party/sqlite/src/test/backup.test
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/sqlite/src/test/backup.test')
-rw-r--r--third_party/sqlite/src/test/backup.test67
1 files changed, 66 insertions, 1 deletions
diff --git a/third_party/sqlite/src/test/backup.test b/third_party/sqlite/src/test/backup.test
index ae15595..0e2c26f 100644
--- a/third_party/sqlite/src/test/backup.test
+++ b/third_party/sqlite/src/test/backup.test
@@ -16,6 +16,8 @@
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+do_not_use_codec
+
#---------------------------------------------------------------------
# Test organization:
#
@@ -38,6 +40,8 @@ source $testdir/tester.tcl
#
# backup-9.*: Test that passing a negative argument to backup_step() is
# interpreted as "copy the whole file".
+#
+# backup-10.*: Test writing the source database mid backup.
#
proc data_checksum {db file} { $db one "SELECT md5sum(a, b) FROM ${file}.t1" }
@@ -173,7 +177,7 @@ foreach nPagePerStep {1 200} {
# page size is the same as the source page size (in this case 1024 bytes).
#
set isMemDest [expr {
- $zDestFile eq ":memory:" || $file_dest eq "temp" && $TEMP_STORE==3
+ $zDestFile eq ":memory:" || $file_dest eq "temp" && $TEMP_STORE>=2
}]
if { $isMemDest==0 || $pgsz_dest == 1024 } {
@@ -487,6 +491,7 @@ db2 close
# 3) Backing up memory-to-file.
#
set iTest 0
+file delete -force bak.db-wal
foreach {writer file} {db test.db db3 test.db db :memory:} {
incr iTest
catch { file delete bak.db }
@@ -904,4 +909,64 @@ ifcapable memorymanage {
db3 close
}
+
+#-----------------------------------------------------------------------
+# Test that if the database is written to via the same database handle being
+# used as the source by a backup operation:
+#
+# 10.1.*: If the db is in-memory, the backup is restarted.
+# 10.2.*: If the db is a file, the backup is not restarted.
+#
+db close
+file delete -force test.db test.db-journal
+foreach {tn file rc} {
+ 1 test.db SQLITE_DONE
+ 2 :memory: SQLITE_OK
+} {
+ do_test backup-10.$tn.1 {
+ sqlite3 db $file
+ execsql {
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB);
+ BEGIN;
+ INSERT INTO t1 VALUES(NULL, randomblob(200));
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1;
+ COMMIT;
+ SELECT count(*) FROM t1;
+ }
+ } {256}
+
+ do_test backup-10.$tn.2 {
+ set pgs [execsql {pragma page_count}]
+ expr {$pgs > 50 && $pgs < 75}
+ } {1}
+
+ do_test backup-10.$tn.3 {
+ file delete -force bak.db bak.db-journal
+ sqlite3 db2 bak.db
+ sqlite3_backup B db2 main db main
+ B step 50
+ } {SQLITE_OK}
+
+ do_test backup-10.$tn.4 {
+ execsql { UPDATE t1 SET b = randomblob(200) WHERE a IN (1, 250) }
+ } {}
+
+ do_test backup-10.$tn.5 {
+ B step 50
+ } $rc
+
+ do_test backup-10.$tn.6 {
+ B finish
+ } {SQLITE_OK}
+
+ db2 close
+}
+
finish_test