xref: /sqlite-3.40.0/test/fallocate.test (revision 7c04c692)
1# 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
16file_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
51# 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); }
62  if {[permutation] != "inmemory_journal"
63   && [permutation] != "atomic-batch-write"
64   && [atomic_batch_write test.db]==0
65  } {
66    hexio_get_int [hexio_read test.db-journal 16 4]
67  } else {
68    set {} 1024
69  }
70} {1024}
71do_test fallocate-1.8 { execsql { COMMIT } } {}
72
73do_test fallocate-1.8 {
74  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
79do_execsql_test fallocate-1.9 {
80  PRAGMA max_page_count = 100;
81} {100}
82
83#-------------------------------------------------------------------------
84# The following tests - fallocate-2.* - test that things work in WAL
85# mode as well.
86#
87set skipwaltests [expr {
88  [permutation]=="journaltest" || [permutation]=="inmemory_journal"
89}]
90ifcapable !wal { set skipwaltests 1 }
91
92if {!$skipwaltests} {
93  db close
94  forcedelete test.db
95  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]
154}
155
156
157finish_test
158