1# 2008 December 15 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# $Id: savepoint4.test,v 1.3 2008/12/20 08:39:57 danielk1977 Exp $ 13 14set testdir [file dirname $argv0] 15source $testdir/tester.tcl 16 17 18proc signature {} { 19 return [db eval {SELECT count(*), md5sum(x) FROM t1}] 20} 21 22set ITERATIONS 25 23expr srand(0) 24 25do_test savepoint4-1 { 26 execsql { 27 PRAGMA cache_size=10; 28 BEGIN; 29 CREATE TABLE t1(x TEXT); 30 INSERT INTO t1 VALUES(randstr(10,400)); 31 INSERT INTO t1 VALUES(randstr(10,400)); 32 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 33 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 34 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 35 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 36 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 37 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 38 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 39 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 40 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 41 COMMIT; 42 SELECT count(*) FROM t1; 43 } 44} {1024} 45 46 47unset -nocomplain ::sig 48 49for {set ii 1} {$ii<=$ITERATIONS} {incr ii} { 50 set ::sig [signature] 51 52 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { 53 54 do_test savepoint4-1.$ii.1.$iDelay { 55 set ret [crashsql -delay $iDelay -file test.db-journal { 56 PRAGMA cache_size = 20; 57 SAVEPOINT one; 58 DELETE FROM t1 WHERE random()%2==0; 59 SAVEPOINT two; 60 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1; 61 ROLLBACK TO two; 62 UPDATE t1 SET x = randstr(10, 400) WHERE random()%10; 63 RELEASE two; 64 ROLLBACK TO one; 65 RELEASE one; 66 }] 67 signature 68 } $::sig 69 70 set crashed [lindex $ret 0] 71 integrity_check savepoint4-1.$ii.1.$iDelay.integrity 72 } 73 74 do_test savepoint4-1.$ii.2 { 75 execsql { 76 DELETE FROM t1 WHERE random()%10==0; 77 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; 78 } 79 } {} 80} 81 82do_test savepoint4-2 { 83 execsql { 84 PRAGMA cache_size=10; 85 DROP TABLE IF EXISTS t1; 86 BEGIN; 87 CREATE TABLE t1(x TEXT); 88 CREATE INDEX i1 ON t1(x); 89 INSERT INTO t1 VALUES(randstr(10,400)); 90 INSERT INTO t1 VALUES(randstr(10,400)); 91 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 92 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 93 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 94 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 95 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 96 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 97 INSERT INTO t1 SELECT randstr(10,400) FROM t1; 98 COMMIT; 99 SELECT count(*) FROM t1; 100 } 101} {256} 102 103for {set ii 1} {$ii<=$ITERATIONS} {incr ii} { 104 set ::sig [signature] 105 set file test.db-journal 106 107 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} { 108 109 do_test savepoint4-2.$ii.1.$iDelay { 110 111 set ret [crashsql -delay $iDelay -file $file { 112 SAVEPOINT one; 113 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; 114 ROLLBACK TO one; 115 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50; 116 SAVEPOINT two; 117 DELETE FROM t1 WHERE (random()%10)==0; 118 SAVEPOINT three; 119 DELETE FROM t1 WHERE (random()%10)==0; 120 SAVEPOINT four; 121 DELETE FROM t1 WHERE (random()%10)==0; 122 RELEASE two; 123 124 SAVEPOINT three; 125 UPDATE t1 SET x = x||x WHERE (rowid%12)==0; 126 SAVEPOINT four; 127 UPDATE t1 SET x = x||x WHERE (rowid%14)==0; 128 ROLLBACK TO three; 129 UPDATE t1 SET x = x||x WHERE (rowid%13)==0; 130 RELEASE three; 131 132 DELETE FROM t1 WHERE rowid > (SELECT rowid FROM t1 LIMIT 1 OFFSET 256); 133 RELEASE one; 134 }] 135 136 set crashed [lindex $ret 0] 137 if {$crashed} { 138 signature 139 } else { 140 set ::sig 141 } 142 } $::sig 143 144 integrity_check savepoint4-2.$ii.1.$iDelay.integrity 145 146 if {$crashed == 0 && $file == "test.db-journal"} { 147 set crashed 1 148 set iDelay 0 149 set file test.db 150 set ::sig [signature] 151 } 152 } 153 154 do_test savepoint4-2.$ii.2 { 155 execsql { 156 DELETE FROM t1 WHERE random()%10==0; 157 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0; 158 } 159 } {} 160} 161 162finish_test 163 164