Small performance optimization in sqlite3VdbeRecordCompareWithSkip() for
[sqlite.git] / test / resetdb.test
blob38428ba1fe5ba55a0b60efe69c58a79e118485c6
1 # 2018-04-28
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
18 do_not_use_codec
20 ifcapable !vtab||!compound {
21   finish_test
22   return
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"
34 } {
35   finish_test
36   return
39 # Create a sample database
40 do_execsql_test 100 {
41   PRAGMA auto_vacuum = 0;
42   PRAGMA page_size=4096;
43   CREATE TABLE t1(a,b);
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;
50   PRAGMA journal_mode;
51   PRAGMA page_count;
52 } {210 6000 ok delete 8}
54 # Verify that the same content is seen from a separate database connection
55 sqlite3 db2 test.db
56 do_test 110 {
57   execsql {
58     SELECT sum(a), sum(length(b)) FROM t1;
59     PRAGMA integrity_check;
60     PRAGMA journal_mode;
61     PRAGMA page_count;
62   } db2
63 } {210 6000 ok delete 8}
65 do_test 200 {
66   # Thoroughly corrupt the database file by overwriting the first
67   # page with randomness.
68   catchsql {
69     UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1;
70     PRAGMA quick_check;
71   }
72 } {1 {unsupported file format}}
73 do_test 201 {
74   catchsql {
75     PRAGMA quick_check;
76   } db2
77 } {1 {unsupported file format}}
79 do_test 210 {
80   # Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE
81   sqlite3_db_config db RESET_DB 1
82   db eval VACUUM
83   sqlite3_db_config db RESET_DB 0
85   # Verify that the reset took, even on the separate database connection
86   catchsql {
87      PRAGMA page_count;
88      PRAGMA page_size;
89      PRAGMA quick_check;
90      PRAGMA journal_mode;
91   } db2
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.
97 db close
98 db2 close
99 forcedelete test.db
100 sqlite3 db test.db
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;
112   PRAGMA journal_mode;
113   PRAGMA page_size;
114   PRAGMA page_count;
115 } {wal 210 26000 ok wal 8192 12}
116 sqlite3 db2 test.db
117 do_test 310 {
118   execsql {
119     SELECT sum(a), sum(length(b)) FROM t1;
120     PRAGMA integrity_check;
121     PRAGMA journal_mode;
122     PRAGMA page_size;
123     PRAGMA page_count;
124   } db2
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;
130   PRAGMA quick_check
131 } {1 {file is not a database}}
133 do_test 330 {
134   catchsql {
135     PRAGMA quick_check
136   } db2
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.
144 do_test 400 {
145   sqlite3_db_config db RESET_DB 1
146   db eval VACUUM
147   sqlite3_db_config db RESET_DB 0
148   catchsql {
149      PRAGMA page_count;
150      PRAGMA page_size;
151      PRAGMA journal_mode;
152      PRAGMA quick_check;
153   } db2
154 } {0 {1 8192 wal ok}}
155 db2 close
158 finish_test