xref: /sqlite-3.40.0/test/waloverwrite.test (revision a23bc8a3)
1d6f7c979Sdan# 2010 May 5
2d6f7c979Sdan#
3d6f7c979Sdan# The author disclaims copyright to this source code.  In place of
4d6f7c979Sdan# a legal notice, here is a blessing:
5d6f7c979Sdan#
6d6f7c979Sdan#    May you do good and not evil.
7d6f7c979Sdan#    May you find forgiveness for yourself and forgive others.
8d6f7c979Sdan#    May you share freely, never taking more than you give.
9d6f7c979Sdan#
10d6f7c979Sdan#***********************************************************************
11d6f7c979Sdan# This file implements regression tests for SQLite library.  The
12d6f7c979Sdan# focus of this file is testing the operation of the library in
13d6f7c979Sdan# "PRAGMA journal_mode=WAL" mode.
14d6f7c979Sdan#
15d6f7c979Sdan
16d6f7c979Sdanset testdir [file dirname $argv0]
17d6f7c979Sdansource $testdir/tester.tcl
18d6f7c979Sdansource $testdir/wal_common.tcl
19d6f7c979Sdanset testprefix waloverwrite
20d6f7c979Sdan
21d6f7c979Sdanifcapable !wal {finish_test ; return }
22d6f7c979Sdan
23d6f7c979Sdan# Simple test:
24d6f7c979Sdan#
25c3bd870fSdan# Test cases *.1 - *.6:
26d6f7c979Sdan#
27c3bd870fSdan#   + Create a database of blobs roughly 50 pages in size.
28d6f7c979Sdan#
29c3bd870fSdan#   + Set the db cache size to something much smaller than this (5 pages)
30c3bd870fSdan#
31c3bd870fSdan#   + Within a transaction, loop through the set of blobs 5 times. Update
32d6f7c979Sdan#      each blob as it is visited.
33d6f7c979Sdan#
34c3bd870fSdan#   + Test that the wal file is roughly 50 pages in size - even though many
35d6f7c979Sdan#      database pages have been written to it multiple times.
36d6f7c979Sdan#
37c3bd870fSdan#   + Take a copy of the database and wal file. Test that recovery can
38d6f7c979Sdan#     be run on it.
39d6f7c979Sdan#
40c3bd870fSdan# Test cases *.7 - *.9:
41c3bd870fSdan#
42c3bd870fSdan#   + Same thing, but before committing the statement transaction open
43c3bd870fSdan#     a SAVEPOINT, update the blobs another 5 times, then roll it back.
44c3bd870fSdan#
45c3bd870fSdan#   + Check that if recovery is run on the resulting wal file, the rolled
46c3bd870fSdan#     back changes from within the SAVEPOINT are not present in the db.
47c3bd870fSdan#
48d6f7c979Sdan# The above is run twice - once where the wal file is empty at the start of
49d6f7c979Sdan# step 3 (tn==1) and once where it already contains a transaction (tn==2).
50d6f7c979Sdan#
51d6f7c979Sdanforeach {tn xtra} {
52d6f7c979Sdan  1 {}
53d6f7c979Sdan  2 { UPDATE t1 SET y = randomblob(799) WHERE x=4 }
54d6f7c979Sdan} {
55d6f7c979Sdan  reset_db
56d6f7c979Sdan  do_execsql_test 1.$tn.0 {
57d6f7c979Sdan    CREATE TABLE t1(x, y);
58c3bd870fSdan    CREATE TABLE t2(x, y);
59d6f7c979Sdan    CREATE INDEX i1y ON t1(y);
60d6f7c979Sdan
61d6f7c979Sdan    WITH cnt(i) AS (
62d6f7c979Sdan      SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<20
63d6f7c979Sdan    )
64d6f7c979Sdan    INSERT INTO t1 SELECT i, randomblob(800) FROM cnt;
65d6f7c979Sdan  } {}
66d6f7c979Sdan
67d6f7c979Sdan  do_test 1.$tn.1 {
68d6f7c979Sdan    set nPg [db one { PRAGMA page_count } ]
69d6f7c979Sdan    expr $nPg>40 && $nPg<50
70d6f7c979Sdan  } {1}
71d6f7c979Sdan
72d6f7c979Sdan  do_test 1.$tn.2 {
73d6f7c979Sdan    db close
74d6f7c979Sdan    sqlite3 db test.db
75d6f7c979Sdan
76d6f7c979Sdan    execsql {PRAGMA journal_mode = wal}
77d6f7c979Sdan    execsql {PRAGMA cache_size = 5}
78d6f7c979Sdan    execsql $xtra
79d6f7c979Sdan
80d6f7c979Sdan    db transaction {
81d6f7c979Sdan      for {set i 0} {$i < 5} {incr i} {
82d6f7c979Sdan        foreach x [db eval {SELECT x FROM t1}] {
83d6f7c979Sdan          execsql { UPDATE t1 SET y = randomblob(799) WHERE x=$x }
84d6f7c979Sdan        }
85d6f7c979Sdan      }
86d6f7c979Sdan    }
87d6f7c979Sdan
88d6f7c979Sdan    set nPg [wal_frame_count test.db-wal 1024]
89d6f7c979Sdan    expr $nPg>40 && $nPg<60
90d6f7c979Sdan  } {1}
91d6f7c979Sdan
92d6f7c979Sdan  do_execsql_test 1.$tn.3 { PRAGMA integrity_check } ok
93d6f7c979Sdan
94d6f7c979Sdan  do_test 1.$tn.4 {
95d6f7c979Sdan    forcedelete test.db2 test.db2-wal
96d6f7c979Sdan    forcecopy test.db test.db2
97d6f7c979Sdan    sqlite3 db2 test.db2
98d6f7c979Sdan    execsql { SELECT sum(length(y)) FROM t1 } db2
99d6f7c979Sdan  } [expr 20*800]
100d6f7c979Sdan
101d6f7c979Sdan  do_test 1.$tn.5 {
102d6f7c979Sdan    db2 close
103d6f7c979Sdan    forcecopy test.db test.db2
104d6f7c979Sdan    forcecopy test.db-wal test.db2-wal
105d6f7c979Sdan    sqlite3 db2 test.db2
106d6f7c979Sdan    execsql { SELECT sum(length(y)) FROM t1 } db2
107d6f7c979Sdan  } [expr 20*799]
108d6f7c979Sdan
109d6f7c979Sdan  do_test 1.$tn.6 {
110d6f7c979Sdan    execsql { PRAGMA integrity_check } db2
111d6f7c979Sdan  } ok
112c3bd870fSdan  db2 close
113c3bd870fSdan
114c3bd870fSdan  do_test 1.$tn.7 {
115c3bd870fSdan    execsql { PRAGMA wal_checkpoint }
116c3bd870fSdan    db transaction {
117c3bd870fSdan      for {set i 0} {$i < 1} {incr i} {
118c3bd870fSdan        foreach x [db eval {SELECT x FROM t1}] {
119c3bd870fSdan          execsql { UPDATE t1 SET y = randomblob(798) WHERE x=$x }
120c3bd870fSdan        }
121c3bd870fSdan      }
122c3bd870fSdan
123c3bd870fSdan      execsql {
124c3bd870fSdan        WITH cnt(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<20)
125c3bd870fSdan        INSERT INTO t2 SELECT i, randomblob(800) FROM cnt;
126c3bd870fSdan      }
127c3bd870fSdan
128c3bd870fSdan      execsql {SAVEPOINT abc}
129c3bd870fSdan      for {set i 0} {$i < 5} {incr i} {
130c3bd870fSdan        foreach x [db eval {SELECT x FROM t1}] {
131c3bd870fSdan          execsql { UPDATE t1 SET y = randomblob(797) WHERE x=$x }
132c3bd870fSdan        }
133c3bd870fSdan      }
134c3bd870fSdan      execsql {ROLLBACK TO abc}
135c3bd870fSdan
136c3bd870fSdan    }
137c3bd870fSdan
138c3bd870fSdan    set nPg [wal_frame_count test.db-wal 1024]
139c3bd870fSdan    expr $nPg>55 && $nPg<75
140c3bd870fSdan  } {1}
141c3bd870fSdan
142c3bd870fSdan  do_test 1.$tn.8 {
143c3bd870fSdan    forcedelete test.db2 test.db2-wal
144c3bd870fSdan    forcecopy test.db test.db2
145c3bd870fSdan    sqlite3 db2 test.db2
146c3bd870fSdan    execsql { SELECT sum(length(y)) FROM t1 } db2
147c3bd870fSdan  } [expr 20*799]
148c3bd870fSdan
149c3bd870fSdan  do_test 1.$tn.9 {
150c3bd870fSdan    db2 close
151c3bd870fSdan    forcecopy test.db-wal test.db2-wal
152c3bd870fSdan    sqlite3 db2 test.db2
153c3bd870fSdan    execsql { SELECT sum(length(y)) FROM t1 } db2
154c3bd870fSdan  } [expr 20*798]
155c3bd870fSdan
156*46414c29Smistachkin  do_test 1.$tn.10 {
157c3bd870fSdan    execsql { PRAGMA integrity_check } db2
158c3bd870fSdan  } ok
159c3bd870fSdan  db2 close
160d6f7c979Sdan}
161d6f7c979Sdan
162d6f7c979Sdanfinish_test
163