summaryrefslogtreecommitdiff
path: root/test/fallocate.test
blob: f523c2cc4a834f36189656c370f82086f0007906 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# 2010 July 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.
#
#***********************************************************************
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl

file_control_chunksize_test db main [expr 1024*1024]

do_test fallocate-1.1 {
  execsql {
    PRAGMA page_size = 1024;
    PRAGMA auto_vacuum = 1;
    CREATE TABLE t1(a, b);
  }
  file size test.db
} [expr 1*1024*1024]

do_test fallocate-1.2 {
  execsql { INSERT INTO t1 VALUES(1, zeroblob(1024*900)) }
  file size test.db
} [expr 1*1024*1024]

do_test fallocate-1.3 {
  execsql { INSERT INTO t1 VALUES(2, zeroblob(1024*900)) }
  file size test.db
} [expr 2*1024*1024]

do_test fallocate-1.4 {
  execsql { DELETE FROM t1 WHERE a = 1 }
  file size test.db
} [expr 1*1024*1024]

do_test fallocate-1.5 {
  execsql { DELETE FROM t1 WHERE a = 2 }
  file size test.db
} [expr 1*1024*1024]

do_test fallocate-1.6 {
  execsql { PRAGMA freelist_count }
} {0}

# Start a write-transaction and read the "database file size" field from
# the journal file. This field should be set to the number of pages in
# the database file based on the size of the file on disk, not the actual
# logical size of the database within the file.
#
# We need to check this to verify that if in the unlikely event a rollback
# causes a database file to grow, the database grows to its previous size
# on disk, not to the minimum size required to hold the database image.
#
do_test fallocate-1.7 {
  execsql { BEGIN; INSERT INTO t1 VALUES(1, 2); }
  if {[permutation] != "inmemory_journal"} {
    hexio_get_int [hexio_read test.db-journal 16 4]
  } else {
    set {} 1024
  }
} {1024}
do_test fallocate-1.8 { execsql { COMMIT } } {}


#-------------------------------------------------------------------------
# The following tests - fallocate-2.* - test that things work in WAL
# mode as well.
#
set skipwaltests [expr {
  [permutation]=="journaltest" || [permutation]=="inmemory_journal"
}]
ifcapable !wal { set skipwaltests 1 }

if {!$skipwaltests} {
  db close
  forcedelete test.db
  sqlite3 db test.db
  file_control_chunksize_test db main [expr 32*1024]
  
  do_test fallocate-2.1 {
    execsql {
      PRAGMA page_size = 1024;
      PRAGMA journal_mode = WAL;
      CREATE TABLE t1(a, b);
    }
    file size test.db
  } [expr 32*1024]
  
  do_test fallocate-2.2 {
    execsql { INSERT INTO t1 VALUES(1, zeroblob(35*1024)) }
    execsql { PRAGMA wal_checkpoint }
    file size test.db
  } [expr 64*1024]
  
  do_test fallocate-2.3 {
    execsql { DELETE FROM t1 }
    execsql { VACUUM }
    file size test.db
  } [expr 64*1024]
  
  do_test fallocate-2.4 {
    execsql { PRAGMA wal_checkpoint }
    file size test.db
  } [expr 32*1024]
  
  do_test fallocate-2.5 {
    execsql { 
      INSERT INTO t1 VALUES(2, randomblob(35*1024));
      PRAGMA wal_checkpoint;
      INSERT INTO t1 VALUES(3, randomblob(128));
      DELETE FROM t1 WHERE a = 2;
      VACUUM;
    }
    file size test.db
  } [expr 64*1024]
  
  do_test fallocate-2.6 {
    sqlite3 db2 test.db
    execsql { BEGIN ; SELECT count(a) FROM t1 } db2
    execsql {  
      INSERT INTO t1 VALUES(4, randomblob(128));
      PRAGMA wal_checkpoint;
    }
    file size test.db
  } [expr 64*1024]
  
  do_test fallocate-2.7 {
    execsql { SELECT count(b) FROM t1 } db2
  } {1}
  
  do_test fallocate-2.8 {
    execsql { COMMIT } db2
    execsql { PRAGMA wal_checkpoint }
    file size test.db
  } [expr 32*1024]
}


finish_test