mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Add tests to pager1.test and pagerfault.test.
FossilOrigin-Name: 58c0b5bfed8c67cc3f2f4a6784d08c14e652c265
This commit is contained in:
@ -54,11 +54,56 @@ do_faultsim_test pagerfault-1 -prep {
|
||||
}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test fault-injection while rolling back a hot-journal file with a
|
||||
# page-size different from the current value stored on page 1 of the
|
||||
# database file.
|
||||
#
|
||||
do_test pagerfault-2-pre1 {
|
||||
testvfs tv -default 1
|
||||
tv filter xSync
|
||||
tv script xSyncCb
|
||||
proc xSyncCb {filename args} {
|
||||
if {[string match *journal filename]==0} faultsim_save
|
||||
}
|
||||
faultsim_delete_and_reopen
|
||||
execsql {
|
||||
PRAGMA page_size = 4096;
|
||||
BEGIN;
|
||||
CREATE TABLE abc(a, b, c);
|
||||
INSERT INTO abc VALUES('o', 't', 't');
|
||||
INSERT INTO abc VALUES('f', 'f', 's');
|
||||
INSERT INTO abc SELECT * FROM abc; -- 4
|
||||
INSERT INTO abc SELECT * FROM abc; -- 8
|
||||
INSERT INTO abc SELECT * FROM abc; -- 16
|
||||
INSERT INTO abc SELECT * FROM abc; -- 32
|
||||
INSERT INTO abc SELECT * FROM abc; -- 64
|
||||
INSERT INTO abc SELECT * FROM abc; -- 128
|
||||
INSERT INTO abc SELECT * FROM abc; -- 256
|
||||
COMMIT;
|
||||
PRAGMA page_size = 1024;
|
||||
VACUUM;
|
||||
}
|
||||
db close
|
||||
tv delete
|
||||
} {}
|
||||
do_faultsim_test pagerfault-2 -prep {
|
||||
faultsim_restore_and_reopen
|
||||
} -body {
|
||||
execsql { SELECT * FROM abc }
|
||||
} -test {
|
||||
set answer [split [string repeat "ottffs" 128] ""]
|
||||
faultsim_test_result [list 0 $answer]
|
||||
faultsim_integrity_check
|
||||
set res [db eval { SELECT * FROM abc }]
|
||||
if {$res != $answer} { error "Database content appears incorrect ($res)" }
|
||||
} -faults oom-transient
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test fault-injection while rolling back hot-journals that were created
|
||||
# as part of a multi-file transaction.
|
||||
#
|
||||
do_test pagerfault-2-pre1 {
|
||||
do_test pagerfault-3-pre1 {
|
||||
testvfs tstvfs -default 1
|
||||
tstvfs filter xDelete
|
||||
tstvfs script xDeleteCallback
|
||||
@ -96,7 +141,7 @@ do_test pagerfault-2-pre1 {
|
||||
db close
|
||||
tstvfs delete
|
||||
} {}
|
||||
do_faultsim_test pagerfault-2 -faults ioerr-persistent -prep {
|
||||
do_faultsim_test pagerfault-3 -faults ioerr-persistent -prep {
|
||||
faultsim_restore_and_reopen
|
||||
} -body {
|
||||
execsql {
|
||||
@ -107,7 +152,6 @@ do_faultsim_test pagerfault-2 -faults ioerr-persistent -prep {
|
||||
} -test {
|
||||
faultsim_test_result {0 {4 4}} {1 {unable to open database: test.db2}}
|
||||
faultsim_integrity_check
|
||||
|
||||
catchsql { ATTACH 'test.db2' AS aux }
|
||||
if {[db one { SELECT count(*) FROM t1 }] != 4
|
||||
|| [db one { SELECT count(*) FROM t2 }] != 4
|
||||
@ -116,4 +160,80 @@ do_faultsim_test pagerfault-2 -faults ioerr-persistent -prep {
|
||||
}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test fault-injection as part of a vanilla, no-transaction, INSERT
|
||||
# statement.
|
||||
#
|
||||
do_faultsim_test pagerfault-4 -prep {
|
||||
faultsim_delete_and_reopen
|
||||
} -body {
|
||||
execsql {
|
||||
CREATE TABLE x(y);
|
||||
INSERT INTO x VALUES('z');
|
||||
SELECT * FROM x;
|
||||
}
|
||||
} -test {
|
||||
faultsim_test_result {0 z}
|
||||
faultsim_integrity_check
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test fault-injection as part of a commit when using journal_mode=PERSIST.
|
||||
#
|
||||
do_test pagerfault-5-pre1 {
|
||||
faultsim_delete_and_reopen
|
||||
db func a_string a_string
|
||||
execsql {
|
||||
CREATE TABLE t1(a UNIQUE, b UNIQUE);
|
||||
INSERT INTO t1 VALUES(a_string(200), a_string(300));
|
||||
INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
|
||||
INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
|
||||
}
|
||||
faultsim_save_and_close
|
||||
} {}
|
||||
do_faultsim_test pagerfault-5.1 -prep {
|
||||
faultsim_restore_and_reopen
|
||||
db func a_string a_string
|
||||
execsql { PRAGMA journal_mode = PERSIST }
|
||||
} -body {
|
||||
execsql { INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1 }
|
||||
} -test {
|
||||
faultsim_test_result {0 {}}
|
||||
faultsim_integrity_check
|
||||
}
|
||||
do_faultsim_test pagerfault-5.2 -prep {
|
||||
faultsim_restore_and_reopen
|
||||
db func a_string a_string
|
||||
execsql {
|
||||
PRAGMA journal_mode = PERSIST;
|
||||
PRAGMA journal_size_limit = 2048;
|
||||
}
|
||||
} -body {
|
||||
execsql { INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1 }
|
||||
} -test {
|
||||
faultsim_test_result {0 {}}
|
||||
faultsim_integrity_check
|
||||
}
|
||||
|
||||
do_faultsim_test pagerfault-5.3 -prep {
|
||||
faultsim_restore_and_reopen
|
||||
db func a_string a_string
|
||||
file delete -force test2.db test2.db-journal test2.db-wal
|
||||
execsql {
|
||||
PRAGMA journal_mode = PERSIST;
|
||||
ATTACH 'test2.db' AS aux;
|
||||
PRAGMA aux.journal_mode = PERSIST;
|
||||
PRAGMA aux.journal_size_limit = 0;
|
||||
}
|
||||
} -body {
|
||||
execsql {
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
|
||||
CREATE TABLE aux.t2 AS SELECT * FROM t1;
|
||||
COMMIT;
|
||||
}
|
||||
} -test {
|
||||
faultsim_test_result {0 {}}
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user