PageRenderTime 27ms CodeModel.GetById 25ms app.highlight 1ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/src/sqlite/test/fallocate.test

#
Unknown | 146 lines | 123 code | 23 blank | 0 comment | 0 complexity | f4a782a8a8f9fa9704160ced2aa76c2f MD5 | raw file
Possible License(s): BSD-3-Clause
  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    hexio_get_int [hexio_read test.db-journal 16 4]
 64  } else {
 65    set {} 1024
 66  }
 67} {1024}
 68do_test fallocate-1.8 { execsql { COMMIT } } {}
 69
 70
 71#-------------------------------------------------------------------------
 72# The following tests - fallocate-2.* - test that things work in WAL
 73# mode as well.
 74#
 75set skipwaltests [expr {
 76  [permutation]=="journaltest" || [permutation]=="inmemory_journal"
 77}]
 78ifcapable !wal { set skipwaltests 1 }
 79
 80if {!$skipwaltests} {
 81  db close
 82  file delete -force test.db
 83  sqlite3 db test.db
 84  file_control_chunksize_test db main [expr 32*1024]
 85  
 86  do_test fallocate-2.1 {
 87    execsql {
 88      PRAGMA page_size = 1024;
 89      PRAGMA journal_mode = WAL;
 90      CREATE TABLE t1(a, b);
 91    }
 92    file size test.db
 93  } [expr 32*1024]
 94  
 95  do_test fallocate-2.2 {
 96    execsql { INSERT INTO t1 VALUES(1, zeroblob(35*1024)) }
 97    execsql { PRAGMA wal_checkpoint }
 98    file size test.db
 99  } [expr 64*1024]
100  
101  do_test fallocate-2.3 {
102    execsql { DELETE FROM t1 }
103    execsql { VACUUM }
104    file size test.db
105  } [expr 64*1024]
106  
107  do_test fallocate-2.4 {
108    execsql { PRAGMA wal_checkpoint }
109    file size test.db
110  } [expr 32*1024]
111  
112  do_test fallocate-2.5 {
113    execsql { 
114      INSERT INTO t1 VALUES(2, randomblob(35*1024));
115      PRAGMA wal_checkpoint;
116      INSERT INTO t1 VALUES(3, randomblob(128));
117      DELETE FROM t1 WHERE a = 2;
118      VACUUM;
119    }
120    file size test.db
121  } [expr 64*1024]
122  
123  do_test fallocate-2.6 {
124    sqlite3 db2 test.db
125    execsql { BEGIN ; SELECT count(a) FROM t1 } db2
126    execsql {  
127      INSERT INTO t1 VALUES(4, randomblob(128));
128      PRAGMA wal_checkpoint;
129    }
130    file size test.db
131  } [expr 64*1024]
132  
133  do_test fallocate-2.7 {
134    execsql { SELECT count(b) FROM t1 } db2
135  } {1}
136  
137  do_test fallocate-2.8 {
138    execsql { COMMIT } db2
139    execsql { PRAGMA wal_checkpoint }
140    file size test.db
141  } [expr 32*1024]
142}
143
144
145finish_test
146