Skip to content
This repository
Fetching contributors…

Cannot retrieve contributors at this time

file 145 lines (123 sloc) 3.683 kb
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
Something went wrong with that request. Please try again.