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