diff options
Diffstat (limited to 'third_party/sqlite/src/test/backup.test')
-rw-r--r-- | third_party/sqlite/src/test/backup.test | 67 |
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 |