1488af099Sdanielk1977# 2008 December 15 2488af099Sdanielk1977# 3488af099Sdanielk1977# The author disclaims copyright to this source code. In place of 4488af099Sdanielk1977# a legal notice, here is a blessing: 5488af099Sdanielk1977# 6488af099Sdanielk1977# May you do good and not evil. 7488af099Sdanielk1977# May you find forgiveness for yourself and forgive others. 8488af099Sdanielk1977# May you share freely, never taking more than you give. 9488af099Sdanielk1977# 10488af099Sdanielk1977#*********************************************************************** 11488af099Sdanielk1977# 12*b46d0045Sdanielk1977# $Id: savepoint4.test,v 1.7 2009/06/09 15:25:33 danielk1977 Exp $ 13488af099Sdanielk1977 14488af099Sdanielk1977set testdir [file dirname $argv0] 15488af099Sdanielk1977source $testdir/tester.tcl 16488af099Sdanielk1977 17b1a82dbeSshaneifcapable !crashtest { 18b1a82dbeSshane finish_test 19b1a82dbeSshane return 20b1a82dbeSshane} 21488af099Sdanielk1977 22488af099Sdanielk1977proc signature {} { 2347e23024Sdanielk1977 return [db eval {SELECT count(*), md5sum(x) FROM t1}] 24488af099Sdanielk1977} 25488af099Sdanielk1977 26b8f12c12Sdanielk1977set ITERATIONS 25 ;# Number of iterations for savepoint4-1 27b8f12c12Sdanielk1977set ITERATIONS2 13 ;# Number of iterations for savepoint4-2 28488af099Sdanielk1977expr srand(0) 29488af099Sdanielk1977 30488af099Sdanielk1977do_test savepoint4-1 { 31488af099Sdanielk1977 execsql { 32488af099Sdanielk1977 PRAGMA cache_size=10; 33488af099Sdanielk1977 BEGIN; 3447e23024Sdanielk1977 CREATE TABLE t1(x TEXT); 3547e23024Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,400)); 3647e23024Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,400)); 3747e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 3847e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 3947e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4047e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4147e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4247e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4347e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4447e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 4547e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 46488af099Sdanielk1977 COMMIT; 4747e23024Sdanielk1977 SELECT count(*) FROM t1; 48488af099Sdanielk1977 } 49488af099Sdanielk1977} {1024} 50488af099Sdanielk1977 51488af099Sdanielk1977 52488af099Sdanielk1977unset -nocomplain ::sig 53488af099Sdanielk1977 5447e23024Sdanielk1977for {set ii 1} {$ii<=$ITERATIONS} {incr ii} { 55488af099Sdanielk1977 set ::sig [signature] 56488af099Sdanielk1977 5747e23024Sdanielk1977 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { 5847e23024Sdanielk1977 5947e23024Sdanielk1977 do_test savepoint4-1.$ii.1.$iDelay { 60488af099Sdanielk1977 set ret [crashsql -delay $iDelay -file test.db-journal { 61488af099Sdanielk1977 PRAGMA cache_size = 20; 62488af099Sdanielk1977 SAVEPOINT one; 6347e23024Sdanielk1977 DELETE FROM t1 WHERE random()%2==0; 64488af099Sdanielk1977 SAVEPOINT two; 6547e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1; 66488af099Sdanielk1977 ROLLBACK TO two; 6747e23024Sdanielk1977 UPDATE t1 SET x = randstr(10, 400) WHERE random()%10; 68488af099Sdanielk1977 RELEASE two; 69488af099Sdanielk1977 ROLLBACK TO one; 7047e23024Sdanielk1977 RELEASE one; 71488af099Sdanielk1977 }] 72488af099Sdanielk1977 signature 73488af099Sdanielk1977 } $::sig 7447e23024Sdanielk1977 75488af099Sdanielk1977 set crashed [lindex $ret 0] 7647e23024Sdanielk1977 integrity_check savepoint4-1.$ii.1.$iDelay.integrity 77488af099Sdanielk1977 } 78488af099Sdanielk1977 7947e23024Sdanielk1977 do_test savepoint4-1.$ii.2 { 80488af099Sdanielk1977 execsql { 8147e23024Sdanielk1977 DELETE FROM t1 WHERE random()%10==0; 8247e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; 8347e23024Sdanielk1977 } 8447e23024Sdanielk1977 } {} 8547e23024Sdanielk1977} 8647e23024Sdanielk1977 8747e23024Sdanielk1977do_test savepoint4-2 { 8847e23024Sdanielk1977 execsql { 8947e23024Sdanielk1977 PRAGMA cache_size=10; 9047e23024Sdanielk1977 DROP TABLE IF EXISTS t1; 9147e23024Sdanielk1977 BEGIN; 9247e23024Sdanielk1977 CREATE TABLE t1(x TEXT); 9347e23024Sdanielk1977 CREATE INDEX i1 ON t1(x); 9447e23024Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,400)); 9547e23024Sdanielk1977 INSERT INTO t1 VALUES(randstr(10,400)); 9647e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 9747e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 9847e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 9947e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 10047e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 10147e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 10247e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 10347e23024Sdanielk1977 COMMIT; 10447e23024Sdanielk1977 SELECT count(*) FROM t1; 10547e23024Sdanielk1977 } 10647e23024Sdanielk1977} {256} 10747e23024Sdanielk1977 108b8f12c12Sdanielk1977for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} { 10947e23024Sdanielk1977 set ::sig [signature] 11047e23024Sdanielk1977 set file test.db-journal 11147e23024Sdanielk1977 11247e23024Sdanielk1977 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { 11347e23024Sdanielk1977 11447e23024Sdanielk1977 do_test savepoint4-2.$ii.1.$iDelay { 11547e23024Sdanielk1977 11647e23024Sdanielk1977 set ret [crashsql -delay $iDelay -file $file { 11747e23024Sdanielk1977 SAVEPOINT one; 11847e23024Sdanielk1977 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; 11947e23024Sdanielk1977 ROLLBACK TO one; 12047e23024Sdanielk1977 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; 12147e23024Sdanielk1977 SAVEPOINT two; 12247e23024Sdanielk1977 DELETE FROM t1 WHERE (random()%10)==0; 12347e23024Sdanielk1977 SAVEPOINT three; 12447e23024Sdanielk1977 DELETE FROM t1 WHERE (random()%10)==0; 12547e23024Sdanielk1977 SAVEPOINT four; 12647e23024Sdanielk1977 DELETE FROM t1 WHERE (random()%10)==0; 12747e23024Sdanielk1977 RELEASE two; 12847e23024Sdanielk1977 12947e23024Sdanielk1977 SAVEPOINT three; 130*b46d0045Sdanielk1977 UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0; 13147e23024Sdanielk1977 SAVEPOINT four; 132*b46d0045Sdanielk1977 UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0; 13347e23024Sdanielk1977 ROLLBACK TO three; 134*b46d0045Sdanielk1977 UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0; 13547e23024Sdanielk1977 RELEASE three; 13647e23024Sdanielk1977 137*b46d0045Sdanielk1977 DELETE FROM t1 WHERE rowid > ( 138*b46d0045Sdanielk1977 SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256 139*b46d0045Sdanielk1977 ); 14047e23024Sdanielk1977 RELEASE one; 14147e23024Sdanielk1977 }] 14247e23024Sdanielk1977 14347e23024Sdanielk1977 set crashed [lindex $ret 0] 14447e23024Sdanielk1977 if {$crashed} { 14547e23024Sdanielk1977 signature 14647e23024Sdanielk1977 } else { 14747e23024Sdanielk1977 set ::sig 14847e23024Sdanielk1977 } 14947e23024Sdanielk1977 } $::sig 15047e23024Sdanielk1977 15147e23024Sdanielk1977 integrity_check savepoint4-2.$ii.1.$iDelay.integrity 15247e23024Sdanielk1977 15347e23024Sdanielk1977 if {$crashed == 0 && $file == "test.db-journal"} { 15447e23024Sdanielk1977 set crashed 1 15547e23024Sdanielk1977 set iDelay 0 15647e23024Sdanielk1977 set file test.db 15747e23024Sdanielk1977 set ::sig [signature] 15847e23024Sdanielk1977 } 15947e23024Sdanielk1977 } 16047e23024Sdanielk1977 16147e23024Sdanielk1977 do_test savepoint4-2.$ii.2 { 16247e23024Sdanielk1977 execsql { 16347e23024Sdanielk1977 DELETE FROM t1 WHERE random()%10==0; 16447e23024Sdanielk1977 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; 165488af099Sdanielk1977 } 166488af099Sdanielk1977 } {} 167488af099Sdanielk1977} 168488af099Sdanielk1977 169488af099Sdanielk1977finish_test 170