AryaWu/sqlite
0
1# 2008 December 152#3# The author disclaims copyright to this source code. In place of4# 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.7 2009/06/09 15:25:33 danielk1977 Exp $13 14set testdir [file dirname $argv0]15source $testdir/tester.tcl16 17ifcapable !crashtest {18 finish_test19 return20}21 22proc signature {} {23 return [db eval {SELECT count(*), md5sum(x) FROM t1}]24}25 26set ITERATIONS 25 ;# Number of iterations for savepoint4-127set ITERATIONS2 13 ;# Number of iterations for savepoint4-228expr srand(0)29 30do_test savepoint4-1 {31 execsql {32 PRAGMA cache_size=10;33 BEGIN;34 CREATE TABLE t1(x TEXT);35 INSERT INTO t1 VALUES(randstr(10,400));36 INSERT INTO t1 VALUES(randstr(10,400));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 INSERT INTO t1 SELECT randstr(10,400) FROM t1;42 INSERT INTO t1 SELECT randstr(10,400) FROM t1;43 INSERT INTO t1 SELECT randstr(10,400) FROM t1;44 INSERT INTO t1 SELECT randstr(10,400) FROM t1;45 INSERT INTO t1 SELECT randstr(10,400) FROM t1;46 COMMIT;47 SELECT count(*) FROM t1;48 }49} {1024}50 51 52unset -nocomplain ::sig53 54for {set ii 1} {$ii<=$ITERATIONS} {incr ii} {55 set ::sig [signature]56 57 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {58 59 do_test savepoint4-1.$ii.1.$iDelay {60 set ret [crashsql -delay $iDelay -file test.db-journal {61 PRAGMA cache_size = 20;62 SAVEPOINT one;63 DELETE FROM t1 WHERE random()%2==0;64 SAVEPOINT two;65 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1;66 ROLLBACK TO two;67 UPDATE t1 SET x = randstr(10, 400) WHERE random()%10;68 RELEASE two;69 ROLLBACK TO one;70 RELEASE one;71 }]72 signature73 } $::sig74 75 set crashed [lindex $ret 0]76 integrity_check savepoint4-1.$ii.1.$iDelay.integrity77 }78 79 do_test savepoint4-1.$ii.2 {80 execsql {81 DELETE FROM t1 WHERE random()%10==0;82 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;83 }84 } {}85}86 87do_test savepoint4-2 {88 execsql {89 PRAGMA cache_size=10;90 DROP TABLE IF EXISTS t1;91 BEGIN;92 CREATE TABLE t1(x TEXT);93 CREATE INDEX i1 ON t1(x);94 INSERT INTO t1 VALUES(randstr(10,400));95 INSERT INTO t1 VALUES(randstr(10,400));96 INSERT INTO t1 SELECT randstr(10,400) FROM t1;97 INSERT INTO t1 SELECT randstr(10,400) FROM t1;98 INSERT INTO t1 SELECT randstr(10,400) FROM t1;99 INSERT INTO t1 SELECT randstr(10,400) FROM t1;100 INSERT INTO t1 SELECT randstr(10,400) FROM t1;101 INSERT INTO t1 SELECT randstr(10,400) FROM t1;102 INSERT INTO t1 SELECT randstr(10,400) FROM t1;103 COMMIT;104 SELECT count(*) FROM t1;105 }106} {256}107 108for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} {109 set ::sig [signature]110 set file test.db-journal111 112 for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {113 114 do_test savepoint4-2.$ii.1.$iDelay {115 116 set ret [crashsql -delay $iDelay -file $file {117 SAVEPOINT one;118 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;119 ROLLBACK TO one;120 INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;121 SAVEPOINT two;122 DELETE FROM t1 WHERE (random()%10)==0;123 SAVEPOINT three;124 DELETE FROM t1 WHERE (random()%10)==0;125 SAVEPOINT four;126 DELETE FROM t1 WHERE (random()%10)==0;127 RELEASE two;128 129 SAVEPOINT three;130 UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0;131 SAVEPOINT four;132 UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0;133 ROLLBACK TO three;134 UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0;135 RELEASE three;136 137 DELETE FROM t1 WHERE rowid > (138 SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256139 );140 RELEASE one;141 }]142 143 set crashed [lindex $ret 0]144 if {$crashed} {145 signature146 } else {147 set ::sig148 }149 } $::sig150 151 integrity_check savepoint4-2.$ii.1.$iDelay.integrity152 153 if {$crashed == 0 && $file == "test.db-journal"} {154 set crashed 1155 set iDelay 0156 set file test.db157 set ::sig [signature]158 }159 }160 161 do_test savepoint4-2.$ii.2 {162 execsql {163 DELETE FROM t1 WHERE random()%10==0;164 INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;165 }166 } {}167}168 169finish_test170 