139 lines
3.4 KiB
Plaintext
139 lines
3.4 KiB
Plaintext
|
# 2018-04-28
|
||
|
#
|
||
|
# 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.
|
||
|
#
|
||
|
#***********************************************************************
|
||
|
# Test cases for SQLITE_DBCONFIG_RESET_DATABASE
|
||
|
#
|
||
|
|
||
|
set testdir [file dirname $argv0]
|
||
|
source $testdir/tester.tcl
|
||
|
set testprefix resetdb
|
||
|
|
||
|
ifcapable !vtab||!compound {
|
||
|
finish_test
|
||
|
return
|
||
|
}
|
||
|
|
||
|
# Create a sample database
|
||
|
do_execsql_test 100 {
|
||
|
PRAGMA page_size=4096;
|
||
|
CREATE TABLE t1(a,b);
|
||
|
WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
|
||
|
INSERT INTO t1(a,b) SELECT x, randomblob(300) FROM c;
|
||
|
CREATE INDEX t1a ON t1(a);
|
||
|
CREATE INDEX t1b ON t1(b);
|
||
|
SELECT sum(a), sum(length(b)) FROM t1;
|
||
|
PRAGMA integrity_check;
|
||
|
PRAGMA journal_mode;
|
||
|
PRAGMA page_count;
|
||
|
} {210 6000 ok delete 8}
|
||
|
|
||
|
# Verify that the same content is seen from a separate database connection
|
||
|
sqlite3 db2 test.db
|
||
|
do_test 110 {
|
||
|
execsql {
|
||
|
SELECT sum(a), sum(length(b)) FROM t1;
|
||
|
PRAGMA integrity_check;
|
||
|
PRAGMA journal_mode;
|
||
|
PRAGMA page_count;
|
||
|
} db2
|
||
|
} {210 6000 ok delete 8}
|
||
|
|
||
|
do_test 200 {
|
||
|
# Thoroughly corrupt the database file by overwriting the first
|
||
|
# page with randomness.
|
||
|
catchsql {
|
||
|
UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1;
|
||
|
PRAGMA quick_check;
|
||
|
}
|
||
|
} {1 {unsupported file format}}
|
||
|
do_test 201 {
|
||
|
catchsql {
|
||
|
PRAGMA quick_check;
|
||
|
} db2
|
||
|
} {1 {unsupported file format}}
|
||
|
|
||
|
do_test 210 {
|
||
|
# Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE
|
||
|
sqlite3_db_config db RESET_DB 1
|
||
|
db eval VACUUM
|
||
|
sqlite3_db_config db RESET_DB 0
|
||
|
|
||
|
# Verify that the reset took, even on the separate database connection
|
||
|
catchsql {
|
||
|
PRAGMA page_count;
|
||
|
PRAGMA page_size;
|
||
|
PRAGMA quick_check;
|
||
|
PRAGMA journal_mode;
|
||
|
} db2
|
||
|
} {0 {1 4096 ok delete}}
|
||
|
|
||
|
# Delete the old connections and database and start over again
|
||
|
# with a different page size and in WAL mode.
|
||
|
#
|
||
|
db close
|
||
|
db2 close
|
||
|
forcedelete test.db
|
||
|
sqlite3 db test.db
|
||
|
do_execsql_test 300 {
|
||
|
PRAGMA page_size=8192;
|
||
|
PRAGMA journal_mode=WAL;
|
||
|
CREATE TABLE t1(a,b);
|
||
|
WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
|
||
|
INSERT INTO t1(a,b) SELECT x, randomblob(1300) FROM c;
|
||
|
CREATE INDEX t1a ON t1(a);
|
||
|
CREATE INDEX t1b ON t1(b);
|
||
|
SELECT sum(a), sum(length(b)) FROM t1;
|
||
|
PRAGMA integrity_check;
|
||
|
PRAGMA journal_mode;
|
||
|
PRAGMA page_size;
|
||
|
PRAGMA page_count;
|
||
|
} {wal 210 26000 ok wal 8192 12}
|
||
|
sqlite3 db2 test.db
|
||
|
do_test 310 {
|
||
|
execsql {
|
||
|
SELECT sum(a), sum(length(b)) FROM t1;
|
||
|
PRAGMA integrity_check;
|
||
|
PRAGMA journal_mode;
|
||
|
PRAGMA page_size;
|
||
|
PRAGMA page_count;
|
||
|
} db2
|
||
|
} {210 26000 ok wal 8192 12}
|
||
|
|
||
|
# Corrupt the database again
|
||
|
do_catchsql_test 320 {
|
||
|
UPDATE sqlite_dbpage SET data=randomblob(8192) WHERE pgno=1;
|
||
|
PRAGMA quick_check
|
||
|
} {1 {file is not a database}}
|
||
|
|
||
|
do_test 330 {
|
||
|
catchsql {
|
||
|
PRAGMA quick_check
|
||
|
} db2
|
||
|
} {1 {file is not a database}}
|
||
|
|
||
|
# Reset the database yet again. Verify that the page size and
|
||
|
# journal mode are preserved.
|
||
|
#
|
||
|
do_test 400 {
|
||
|
sqlite3_db_config db RESET_DB 1
|
||
|
db eval VACUUM
|
||
|
sqlite3_db_config db RESET_DB 0
|
||
|
catchsql {
|
||
|
PRAGMA page_count;
|
||
|
PRAGMA page_size;
|
||
|
PRAGMA journal_mode;
|
||
|
PRAGMA quick_check;
|
||
|
} db2
|
||
|
} {0 {1 8192 wal ok}}
|
||
|
db2 close
|
||
|
|
||
|
|
||
|
finish_test
|