3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
11 # Test cases for SQLITE_DBCONFIG_RESET_DATABASE
14 set testdir [file dirname $argv0]
15 source $testdir/tester.tcl
16 set testprefix resetdb
20 ifcapable !vtab||!compound {
25 # In the "inmemory_journal" permutation, each new connection executes
26 # "PRAGMA journal_mode = memory". This fails with SQLITE_BUSY if attempted
27 # on a wal mode database with existing connections. For this and a few
28 # other reasons, this test is not run as part of "inmemory_journal".
30 # Permutation "journaltest" does not support wal mode.
32 if {[permutation]=="inmemory_journal"
33 || [permutation]=="journaltest"
39 # Create a sample database
41 PRAGMA auto_vacuum = 0;
42 PRAGMA page_size=4096;
44 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
45 INSERT INTO t1(a,b) SELECT x, randomblob(300) FROM c;
46 CREATE INDEX t1a ON t1(a);
47 CREATE INDEX t1b ON t1(b);
48 SELECT sum(a), sum(length(b)) FROM t1;
49 PRAGMA integrity_check;
52 } {210 6000 ok delete 8}
54 # Verify that the same content is seen from a separate database connection
58 SELECT sum(a), sum(length(b)) FROM t1;
59 PRAGMA integrity_check;
63 } {210 6000 ok delete 8}
66 # Thoroughly corrupt the database file by overwriting the first
67 # page with randomness.
69 UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1;
72 } {1 {unsupported file format}}
77 } {1 {unsupported file format}}
80 # Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE
81 sqlite3_db_config db RESET_DB 1
83 sqlite3_db_config db RESET_DB 0
85 # Verify that the reset took, even on the separate database connection
92 } {0 {1 4096 ok delete}}
94 # Delete the old connections and database and start over again
95 # with a different page size and in WAL mode.
101 do_execsql_test 300 {
102 PRAGMA auto_vacuum = 0;
103 PRAGMA page_size=8192;
104 PRAGMA journal_mode=WAL;
105 CREATE TABLE t1(a,b);
106 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
107 INSERT INTO t1(a,b) SELECT x, randomblob(1300) FROM c;
108 CREATE INDEX t1a ON t1(a);
109 CREATE INDEX t1b ON t1(b);
110 SELECT sum(a), sum(length(b)) FROM t1;
111 PRAGMA integrity_check;
115 } {wal 210 26000 ok wal 8192 12}
119 SELECT sum(a), sum(length(b)) FROM t1;
120 PRAGMA integrity_check;
125 } {210 26000 ok wal 8192 12}
127 # Corrupt the database again
128 do_catchsql_test 320 {
129 UPDATE sqlite_dbpage SET data=randomblob(8192) WHERE pgno=1;
131 } {1 {file is not a database}}
137 } {1 {file is not a database}}
139 db2 cache flush ;# Required by permutation "prepare".
141 # Reset the database yet again. Verify that the page size and
142 # journal mode are preserved.
145 sqlite3_db_config db RESET_DB 1
147 sqlite3_db_config db RESET_DB 0
154 } {0 {1 8192 wal ok}}