• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16
17ifcapable !crashtest {
18  finish_test
19  return
20}
21
22proc signature {} {
23  return [db eval {SELECT count(*), md5sum(x) FROM t1}]
24}
25
26set ITERATIONS 25                   ;# Number of iterations for savepoint4-1
27set ITERATIONS2 13                  ;# Number of iterations for savepoint4-2
28expr 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 ::sig
53
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      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
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-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
169finish_test
170