blob: bef82b2eda65c4f8b39bece01ae13d779bbc0d2a [file] [log] [blame]
drhf12b3f62011-12-21 14:42:29 +00001# 2011 December 21
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# This file implements tests of the SQLITE_IOCAP_ZERO_DAMAGE property
13# and the SQLITE_FCNTL_ZERO_DAMAGE file-control for manipulating it.
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18set testprefix wal5
19
20# ZERO_DAMAGE defaults to true
21#
22do_test zerodamage-1.0 {
23 file_control_zero_damage db -1
24} {0 1}
25
26# Check the ability to turn zero-damage on and off.
27#
28do_test zerodamage-1.1 {
29 file_control_zero_damage db 0
30 file_control_zero_damage db -1
31} {0 0}
32do_test zerodamage-1.2 {
33 file_control_zero_damage db 1
34 file_control_zero_damage db -1
35} {0 1}
36
37# Run a transaction with zero-damage on, a small page size and a much larger
38# sectorsize. Verify that the maximum journal size is small - that the
39# rollback journal is not being padded.
40#
41do_test zerodamage-2.0 {
42 db close
43 testvfs tv -default 1
44 tv sectorsize 8192
45 sqlite3 db file:test.db?zero_damage=1 -uri 1
46 unset -nocomplain ::max_journal_size
47 set ::max_journal_size 0
48 proc xDeleteCallback {method file args} {
49 set sz [file size $file]
50 if {$sz>$::max_journal_size} {set ::max_journal_size $sz}
51 }
52 tv filter xDelete
53 tv script xDeleteCallback
54 register_wholenumber_module db
55 db eval {
56 PRAGMA page_size=1024;
57 PRAGMA journal_mode=DELETE;
58 PRAGMA cache_size=5;
59 CREATE VIRTUAL TABLE nums USING wholenumber;
60 CREATE TABLE t1(x, y);
61 INSERT INTO t1 SELECT value, randomblob(100) FROM nums
62 WHERE value BETWEEN 1 AND 400;
63 }
64 set ::max_journal_size 0
65 db eval {
66 UPDATE t1 SET y=randomblob(50) WHERE x=123;
67 }
68 concat [file_control_zero_damage db -1] [set ::max_journal_size]
69} {0 1 2576}
70
71# Repeat the previous step with zero-damage turned off. This time the
72# maximum rollback journal size should be much larger.
73#
74do_test zerodamage-2.1 {
75 set ::max_journal_size 0
76 db close
77 sqlite3 db file:test.db?zero_damage=0 -uri 1
78 db eval {
79 UPDATE t1 SET y=randomblob(50) WHERE x=124;
80 }
81 concat [file_control_zero_damage db -1] [set ::max_journal_size]
82} {0 0 24704}
83
84# Run a WAL-mode transaction with ZERO_DAMAGE on to verify that the
85# WAL file does not get too big.
86#
87do_test zerodamage-3.0 {
88 db eval {
89 PRAGMA journal_mode=WAL;
90 }
91 db close
92 sqlite3 db file:test.db?zero_damage=1 -uri 1
93 db eval {
94 UPDATE t1 SET y=randomblob(50) WHERE x=124;
95 }
96 file size test.db-wal
97} {1080}
98
99# Repeat the previous with ZERO_DAMAGE off. Verify that the WAL file
100# is padded.
101#
102do_test zerodamage-3.1 {
103 db close
104 sqlite3 db file:test.db?zero_damage=0 -uri 1
105 db eval {
106 UPDATE t1 SET y=randomblob(50) WHERE x=124;
107 }
108 file size test.db-wal
109} {8416}