2013-02-25 16:06:55 +04:00
|
|
|
# 2013 Feb 25
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
#***********************************************************************
|
|
|
|
# This file implements regression tests for the SQLite library, focusing
|
|
|
|
# on the incremental vacuum feature.
|
|
|
|
#
|
|
|
|
# The tests in this file were added at the same time as optimizations
|
|
|
|
# were made to:
|
|
|
|
#
|
|
|
|
# * Truncate the database after a rollback mode commit, and
|
|
|
|
#
|
|
|
|
# * Avoid moving pages to locations from which they may need to be moved
|
|
|
|
# a second time if an incremental-vacuum proccess is allowed to vacuum
|
|
|
|
# the entire database.
|
|
|
|
#
|
|
|
|
|
|
|
|
set testdir [file dirname $argv0]
|
|
|
|
source $testdir/tester.tcl
|
|
|
|
set testprefix incrvacuum3
|
|
|
|
|
|
|
|
# If this build of the library does not support auto-vacuum, omit this
|
|
|
|
# whole file.
|
|
|
|
ifcapable {!autovacuum || !pragma} {
|
|
|
|
finish_test
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
proc check_on_disk {} {
|
|
|
|
|
2013-02-26 10:14:27 +04:00
|
|
|
# Copy the wal and journal files for database "test.db" to "test2.db".
|
2013-02-25 16:06:55 +04:00
|
|
|
forcedelete test2.db test2.db-journal test2.db-wal
|
|
|
|
if {[file exists test.db-journal]} {
|
|
|
|
forcecopy test.db-journal test2.db-journal
|
|
|
|
}
|
|
|
|
if {[file exists test.db-wal]} {
|
|
|
|
forcecopy test.db-wal test2.db-wal
|
|
|
|
}
|
|
|
|
|
2013-02-26 10:14:27 +04:00
|
|
|
# Now copy the database file itself. Do this using open/read/puts
|
|
|
|
# instead of the [file copy] command in order to avoid attempting
|
|
|
|
# to read the 512 bytes begining at offset $sqlite_pending_byte.
|
|
|
|
#
|
|
|
|
set sz [file size test.db]
|
|
|
|
set fd [open test.db]
|
|
|
|
set fd2 [open test2.db w]
|
|
|
|
fconfigure $fd -encoding binary -translation binary
|
|
|
|
fconfigure $fd2 -encoding binary -translation binary
|
|
|
|
if {$sz>$::sqlite_pending_byte} {
|
|
|
|
puts -nonewline $fd2 [read $fd $::sqlite_pending_byte]
|
|
|
|
seek $fd [expr $::sqlite_pending_byte+512]
|
|
|
|
seek $fd2 [expr $::sqlite_pending_byte+512]
|
|
|
|
}
|
|
|
|
puts -nonewline $fd2 [read $fd]
|
|
|
|
close $fd2
|
2013-02-26 22:54:18 +04:00
|
|
|
close $fd
|
2013-02-26 10:14:27 +04:00
|
|
|
|
2013-02-25 16:06:55 +04:00
|
|
|
# Open "test2.db" and check it is Ok.
|
|
|
|
sqlite3 dbcheck test2.db
|
|
|
|
set ret [dbcheck eval { PRAGMA integrity_check }]
|
|
|
|
dbcheck close
|
|
|
|
set ret
|
|
|
|
}
|
|
|
|
|
|
|
|
# Run these tests once in rollback journal mode, and once in wal mode.
|
|
|
|
#
|
|
|
|
foreach {T jrnl_mode} {
|
|
|
|
1 delete
|
|
|
|
2 wal
|
|
|
|
} {
|
|
|
|
catch { db close }
|
|
|
|
forcedelete test.db test.db-journal test.db-wal
|
|
|
|
sqlite3 db test.db
|
|
|
|
db eval {
|
|
|
|
PRAGMA cache_size = 5;
|
|
|
|
PRAGMA page_size = 1024;
|
|
|
|
PRAGMA auto_vacuum = 2;
|
|
|
|
}
|
|
|
|
db eval "PRAGMA journal_mode = $jrnl_mode"
|
|
|
|
|
|
|
|
foreach {tn sql} {
|
|
|
|
1 {
|
|
|
|
CREATE TABLE t1(x UNIQUE);
|
|
|
|
INSERT INTO t1 VALUES(randomblob(400));
|
|
|
|
INSERT INTO t1 VALUES(randomblob(400));
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 4
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 8
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 16
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 32
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 64
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 128
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 256
|
|
|
|
}
|
|
|
|
|
|
|
|
2 {
|
|
|
|
DELETE FROM t1 WHERE rowid%8;
|
|
|
|
}
|
|
|
|
|
|
|
|
3 {
|
|
|
|
BEGIN;
|
|
|
|
PRAGMA incremental_vacuum = 100;
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 64
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 128
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 256
|
|
|
|
ROLLBACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
4 {
|
|
|
|
BEGIN;
|
|
|
|
SAVEPOINT one;
|
|
|
|
PRAGMA incremental_vacuum = 100;
|
|
|
|
SAVEPOINT two;
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 64
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 128
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 256
|
|
|
|
}
|
|
|
|
|
|
|
|
5 { ROLLBACK to two }
|
|
|
|
|
|
|
|
6 { ROLLBACK to one }
|
|
|
|
|
|
|
|
7 {
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 64
|
|
|
|
PRAGMA incremental_vacuum = 1000;
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 128
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 256
|
|
|
|
ROLLBACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
8 {
|
|
|
|
BEGIN;
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 64
|
|
|
|
PRAGMA incremental_vacuum = 1000;
|
|
|
|
INSERT INTO t1 SELECT randomblob(400) FROM t1; -- 128
|
|
|
|
COMMIT;
|
|
|
|
}
|
|
|
|
} {
|
|
|
|
do_execsql_test $T.1.$tn.1 $sql
|
|
|
|
do_execsql_test $T.1.$tn.2 {PRAGMA integrity_check} ok
|
|
|
|
do_test $T.1.$tn.3 { check_on_disk } ok
|
|
|
|
}
|
|
|
|
|
|
|
|
do_execsql_test $T.1.x.1 { PRAGMA freelist_count } 0
|
|
|
|
do_execsql_test $T.1.x.2 { SELECT count(*) FROM t1 } 128
|
|
|
|
}
|
|
|
|
|
|
|
|
finish_test
|