123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- # 2011 December 21
- #
- # 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.
- #
- #***********************************************************************
- #
- # This file implements tests of the SQLITE_IOCAP_POWERSAFE_OVERWRITE property
- # and the SQLITE_FCNTL_POWERSAFE_OVERWRITE file-control for manipulating it.
- #
- # The name of this file comes from the fact that we used to call the
- # POWERSAFE_OVERWRITE property ZERO_DAMAGE.
- #
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- set testprefix zerodamage
- ifcapable !vtab {
- finish_test
- return
- }
- # POWERSAFE_OVERWRITE defaults to true
- #
- do_test zerodamage-1.0 {
- file_control_powersafe_overwrite db -1
- } {0 1}
- # Check the ability to turn zero-damage on and off.
- #
- do_test zerodamage-1.1 {
- file_control_powersafe_overwrite db 0
- file_control_powersafe_overwrite db -1
- } {0 0}
- do_test zerodamage-1.2 {
- file_control_powersafe_overwrite db 1
- file_control_powersafe_overwrite db -1
- } {0 1}
- # Run a transaction with zero-damage on, a small page size and a much larger
- # sectorsize. Verify that the maximum journal size is small - that the
- # rollback journal is not being padded.
- #
- do_test zerodamage-2.0 {
- db close
- testvfs tv -default 1
- tv sectorsize 8192
- sqlite3 db file:test.db?psow=TRUE -uri 1
- unset -nocomplain ::max_journal_size
- set ::max_journal_size 0
- proc xDeleteCallback {method file args} {
- set sz [file size $file]
- if {$sz>$::max_journal_size} {set ::max_journal_size $sz}
- }
- tv filter xDelete
- tv script xDeleteCallback
- load_static_extension db wholenumber
- db eval {
- PRAGMA page_size=1024;
- PRAGMA journal_mode=DELETE;
- PRAGMA cache_size=5;
- CREATE VIRTUAL TABLE nums USING wholenumber;
- CREATE TABLE t1(x, y);
- INSERT INTO t1 SELECT value, randomblob(100) FROM nums
- WHERE value BETWEEN 1 AND 400;
- }
- set ::max_journal_size 0
- db eval {
- UPDATE t1 SET y=randomblob(50) WHERE x=123;
- }
- concat [file_control_powersafe_overwrite db -1] [set ::max_journal_size]
- } {0 1 2576}
- # Repeat the previous step with zero-damage turned off. This time the
- # maximum rollback journal size should be much larger.
- #
- do_test zerodamage-2.1 {
- set ::max_journal_size 0
- db close
- sqlite3 db file:test.db?psow=FALSE -uri 1
- db eval {
- UPDATE t1 SET y=randomblob(50) WHERE x=124;
- }
- concat [file_control_powersafe_overwrite db -1] [set ::max_journal_size]
- } {0 0 24704}
- ifcapable wal {
- # Run a WAL-mode transaction with POWERSAFE_OVERWRITE on to verify that the
- # WAL file does not get too big.
- #
- do_test zerodamage-3.0 {
- db eval {
- PRAGMA journal_mode=WAL;
- }
- db close
- sqlite3 db file:test.db?psow=TRUE -uri 1
- db eval {
- UPDATE t1 SET y=randomblob(50) WHERE x=124;
- }
- file size test.db-wal
- } {1080}
- # Repeat the previous with POWERSAFE_OVERWRITE off. Verify that the WAL file
- # is padded.
- #
- do_test zerodamage-3.1 {
- db close
- sqlite3 db file:test.db?psow=FALSE -uri 1
- db eval {
- UPDATE t1 SET y=randomblob(50) WHERE x=124;
- }
- file size test.db-wal
- } {8416}
- }
- finish_test
|