xref: /sqlite-3.40.0/test/savepoint4.test (revision ecfef985)
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