Annotation of embedaddon/sqlite3/test/savepoint4.test, revision 1.1.1.1
1.1 misho 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.7 2009/06/09 15:25:33 danielk1977 Exp $
13:
14: set testdir [file dirname $argv0]
15: source $testdir/tester.tcl
16:
17: ifcapable !crashtest {
18: finish_test
19: return
20: }
21:
22: proc signature {} {
23: return [db eval {SELECT count(*), md5sum(x) FROM t1}]
24: }
25:
26: set ITERATIONS 25 ;# Number of iterations for savepoint4-1
27: set ITERATIONS2 13 ;# Number of iterations for savepoint4-2
28: expr srand(0)
29:
30: do_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:
52: unset -nocomplain ::sig
53:
54: for {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: signature
73: } $::sig
74:
75: set crashed [lindex $ret 0]
76: integrity_check savepoint4-1.$ii.1.$iDelay.integrity
77: }
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:
87: do_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:
108: for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} {
109: set ::sig [signature]
110: set file test.db-journal
111:
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 256
139: );
140: RELEASE one;
141: }]
142:
143: set crashed [lindex $ret 0]
144: if {$crashed} {
145: signature
146: } else {
147: set ::sig
148: }
149: } $::sig
150:
151: integrity_check savepoint4-2.$ii.1.$iDelay.integrity
152:
153: if {$crashed == 0 && $file == "test.db-journal"} {
154: set crashed 1
155: set iDelay 0
156: set file test.db
157: 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:
169: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>