blob: 3e154482bc9d82b1314fab568315219775cdfcf4 [file] [log] [blame]
dan6e09d692010-07-27 18:34:15 +00001# 2010 July 28
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
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.
9#
10#***********************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15
dan6e09d692010-07-27 18:34:15 +000016file_control_chunksize_test db main [expr 1024*1024]
17
18do_test fallocate-1.1 {
19 execsql {
20 PRAGMA page_size = 1024;
21 PRAGMA auto_vacuum = 1;
22 CREATE TABLE t1(a, b);
23 }
24 file size test.db
25} [expr 1*1024*1024]
26
27do_test fallocate-1.2 {
28 execsql { INSERT INTO t1 VALUES(1, zeroblob(1024*900)) }
29 file size test.db
30} [expr 1*1024*1024]
31
32do_test fallocate-1.3 {
33 execsql { INSERT INTO t1 VALUES(2, zeroblob(1024*900)) }
34 file size test.db
35} [expr 2*1024*1024]
36
37do_test fallocate-1.4 {
38 execsql { DELETE FROM t1 WHERE a = 1 }
39 file size test.db
40} [expr 1*1024*1024]
41
42do_test fallocate-1.5 {
43 execsql { DELETE FROM t1 WHERE a = 2 }
44 file size test.db
45} [expr 1*1024*1024]
46
47do_test fallocate-1.6 {
48 execsql { PRAGMA freelist_count }
49} {0}
50
dan502019c2010-07-28 14:26:17 +000051# Start a write-transaction and read the "database file size" field from
52# the journal file. This field should be set to the number of pages in
53# the database file based on the size of the file on disk, not the actual
54# logical size of the database within the file.
55#
56# We need to check this to verify that if in the unlikely event a rollback
57# causes a database file to grow, the database grows to its previous size
58# on disk, not to the minimum size required to hold the database image.
59#
60do_test fallocate-1.7 {
61 execsql { BEGIN; INSERT INTO t1 VALUES(1, 2); }
dan4da30f82017-07-22 16:58:47 +000062 if {[permutation] != "inmemory_journal"
63 && [permutation] != "atomic-batch-write"
dan69aedc82018-01-13 13:07:49 +000064 && [atomic_batch_write test.db]==0
dan4da30f82017-07-22 16:58:47 +000065 } {
dan4f7b8d62010-08-06 14:37:13 +000066 hexio_get_int [hexio_read test.db-journal 16 4]
67 } else {
68 set {} 1024
69 }
dan502019c2010-07-28 14:26:17 +000070} {1024}
71do_test fallocate-1.8 { execsql { COMMIT } } {}
72
drh7c04c692019-01-21 14:49:14 +000073do_test fallocate-1.8 {
danb8852ae2019-01-19 15:27:09 +000074 set nPg [db one {PRAGMA page_count}]
75 set nFile [expr [file size test.db] / 1024]
76 list [expr $nPg<100] [expr $nFile>100]
77} {1 1}
78
drh7c04c692019-01-21 14:49:14 +000079do_execsql_test fallocate-1.9 {
danb8852ae2019-01-19 15:27:09 +000080 PRAGMA max_page_count = 100;
drh7c04c692019-01-21 14:49:14 +000081} {100}
dan502019c2010-07-28 14:26:17 +000082
83#-------------------------------------------------------------------------
84# The following tests - fallocate-2.* - test that things work in WAL
85# mode as well.
86#
dan4f7b8d62010-08-06 14:37:13 +000087set skipwaltests [expr {
88 [permutation]=="journaltest" || [permutation]=="inmemory_journal"
89}]
dandc110612010-08-06 09:43:03 +000090ifcapable !wal { set skipwaltests 1 }
91
92if {!$skipwaltests} {
dan4f7b8d62010-08-06 14:37:13 +000093 db close
mistachkinfda06be2011-08-02 00:57:34 +000094 forcedelete test.db
dan4f7b8d62010-08-06 14:37:13 +000095 sqlite3 db test.db
96 file_control_chunksize_test db main [expr 32*1024]
97
98 do_test fallocate-2.1 {
99 execsql {
100 PRAGMA page_size = 1024;
101 PRAGMA journal_mode = WAL;
102 CREATE TABLE t1(a, b);
103 }
104 file size test.db
105 } [expr 32*1024]
106
107 do_test fallocate-2.2 {
108 execsql { INSERT INTO t1 VALUES(1, zeroblob(35*1024)) }
109 execsql { PRAGMA wal_checkpoint }
110 file size test.db
111 } [expr 64*1024]
112
113 do_test fallocate-2.3 {
114 execsql { DELETE FROM t1 }
115 execsql { VACUUM }
116 file size test.db
117 } [expr 64*1024]
118
119 do_test fallocate-2.4 {
120 execsql { PRAGMA wal_checkpoint }
121 file size test.db
122 } [expr 32*1024]
123
124 do_test fallocate-2.5 {
125 execsql {
126 INSERT INTO t1 VALUES(2, randomblob(35*1024));
127 PRAGMA wal_checkpoint;
128 INSERT INTO t1 VALUES(3, randomblob(128));
129 DELETE FROM t1 WHERE a = 2;
130 VACUUM;
131 }
132 file size test.db
133 } [expr 64*1024]
134
135 do_test fallocate-2.6 {
136 sqlite3 db2 test.db
137 execsql { BEGIN ; SELECT count(a) FROM t1 } db2
138 execsql {
139 INSERT INTO t1 VALUES(4, randomblob(128));
140 PRAGMA wal_checkpoint;
141 }
142 file size test.db
143 } [expr 64*1024]
144
145 do_test fallocate-2.7 {
146 execsql { SELECT count(b) FROM t1 } db2
147 } {1}
148
149 do_test fallocate-2.8 {
150 execsql { COMMIT } db2
151 execsql { PRAGMA wal_checkpoint }
152 file size test.db
153 } [expr 32*1024]
dandc110612010-08-06 09:43:03 +0000154}
155
dan502019c2010-07-28 14:26:17 +0000156
dan6e09d692010-07-27 18:34:15 +0000157finish_test