/trunk/test/savepoint4.test |
@@ -0,0 +1,169 @@ |
# 2008 December 15 |
# |
# 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. |
# |
#*********************************************************************** |
# |
# $Id: savepoint4.test,v 1.7 2009/06/09 15:25:33 danielk1977 Exp $ |
|
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
|
ifcapable !crashtest { |
finish_test |
return |
} |
|
proc signature {} { |
return [db eval {SELECT count(*), md5sum(x) FROM t1}] |
} |
|
set ITERATIONS 25 ;# Number of iterations for savepoint4-1 |
set ITERATIONS2 13 ;# Number of iterations for savepoint4-2 |
expr srand(0) |
|
do_test savepoint4-1 { |
execsql { |
PRAGMA cache_size=10; |
BEGIN; |
CREATE TABLE t1(x TEXT); |
INSERT INTO t1 VALUES(randstr(10,400)); |
INSERT INTO t1 VALUES(randstr(10,400)); |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
COMMIT; |
SELECT count(*) FROM t1; |
} |
} {1024} |
|
|
unset -nocomplain ::sig |
|
for {set ii 1} {$ii<=$ITERATIONS} {incr ii} { |
set ::sig [signature] |
|
for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { |
|
do_test savepoint4-1.$ii.1.$iDelay { |
set ret [crashsql -delay $iDelay -file test.db-journal { |
PRAGMA cache_size = 20; |
SAVEPOINT one; |
DELETE FROM t1 WHERE random()%2==0; |
SAVEPOINT two; |
INSERT INTO t1 SELECT randstr(10,10)||x FROM t1; |
ROLLBACK TO two; |
UPDATE t1 SET x = randstr(10, 400) WHERE random()%10; |
RELEASE two; |
ROLLBACK TO one; |
RELEASE one; |
}] |
signature |
} $::sig |
|
set crashed [lindex $ret 0] |
integrity_check savepoint4-1.$ii.1.$iDelay.integrity |
} |
|
do_test savepoint4-1.$ii.2 { |
execsql { |
DELETE FROM t1 WHERE random()%10==0; |
INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; |
} |
} {} |
} |
|
do_test savepoint4-2 { |
execsql { |
PRAGMA cache_size=10; |
DROP TABLE IF EXISTS t1; |
BEGIN; |
CREATE TABLE t1(x TEXT); |
CREATE INDEX i1 ON t1(x); |
INSERT INTO t1 VALUES(randstr(10,400)); |
INSERT INTO t1 VALUES(randstr(10,400)); |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
INSERT INTO t1 SELECT randstr(10,400) FROM t1; |
COMMIT; |
SELECT count(*) FROM t1; |
} |
} {256} |
|
for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} { |
set ::sig [signature] |
set file test.db-journal |
|
for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { |
|
do_test savepoint4-2.$ii.1.$iDelay { |
|
set ret [crashsql -delay $iDelay -file $file { |
SAVEPOINT one; |
INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; |
ROLLBACK TO one; |
INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; |
SAVEPOINT two; |
DELETE FROM t1 WHERE (random()%10)==0; |
SAVEPOINT three; |
DELETE FROM t1 WHERE (random()%10)==0; |
SAVEPOINT four; |
DELETE FROM t1 WHERE (random()%10)==0; |
RELEASE two; |
|
SAVEPOINT three; |
UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0; |
SAVEPOINT four; |
UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0; |
ROLLBACK TO three; |
UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0; |
RELEASE three; |
|
DELETE FROM t1 WHERE rowid > ( |
SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256 |
); |
RELEASE one; |
}] |
|
set crashed [lindex $ret 0] |
if {$crashed} { |
signature |
} else { |
set ::sig |
} |
} $::sig |
|
integrity_check savepoint4-2.$ii.1.$iDelay.integrity |
|
if {$crashed == 0 && $file == "test.db-journal"} { |
set crashed 1 |
set iDelay 0 |
set file test.db |
set ::sig [signature] |
} |
} |
|
do_test savepoint4-2.$ii.2 { |
execsql { |
DELETE FROM t1 WHERE random()%10==0; |
INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; |
} |
} {} |
} |
|
finish_test |