xref: /sqlite-3.40.0/test/savepoint4.test (revision b46d0045)
1488af099Sdanielk1977# 2008 December 15
2488af099Sdanielk1977#
3488af099Sdanielk1977# The author disclaims copyright to this source code.  In place of
4488af099Sdanielk1977# a legal notice, here is a blessing:
5488af099Sdanielk1977#
6488af099Sdanielk1977#    May you do good and not evil.
7488af099Sdanielk1977#    May you find forgiveness for yourself and forgive others.
8488af099Sdanielk1977#    May you share freely, never taking more than you give.
9488af099Sdanielk1977#
10488af099Sdanielk1977#***********************************************************************
11488af099Sdanielk1977#
12*b46d0045Sdanielk1977# $Id: savepoint4.test,v 1.7 2009/06/09 15:25:33 danielk1977 Exp $
13488af099Sdanielk1977
14488af099Sdanielk1977set testdir [file dirname $argv0]
15488af099Sdanielk1977source $testdir/tester.tcl
16488af099Sdanielk1977
17b1a82dbeSshaneifcapable !crashtest {
18b1a82dbeSshane  finish_test
19b1a82dbeSshane  return
20b1a82dbeSshane}
21488af099Sdanielk1977
22488af099Sdanielk1977proc signature {} {
2347e23024Sdanielk1977  return [db eval {SELECT count(*), md5sum(x) FROM t1}]
24488af099Sdanielk1977}
25488af099Sdanielk1977
26b8f12c12Sdanielk1977set ITERATIONS 25                   ;# Number of iterations for savepoint4-1
27b8f12c12Sdanielk1977set ITERATIONS2 13                  ;# Number of iterations for savepoint4-2
28488af099Sdanielk1977expr srand(0)
29488af099Sdanielk1977
30488af099Sdanielk1977do_test savepoint4-1 {
31488af099Sdanielk1977  execsql {
32488af099Sdanielk1977    PRAGMA cache_size=10;
33488af099Sdanielk1977    BEGIN;
3447e23024Sdanielk1977    CREATE TABLE t1(x TEXT);
3547e23024Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,400));
3647e23024Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,400));
3747e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
3847e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
3947e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4047e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4147e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4247e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4347e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4447e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
4547e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
46488af099Sdanielk1977    COMMIT;
4747e23024Sdanielk1977    SELECT count(*) FROM t1;
48488af099Sdanielk1977  }
49488af099Sdanielk1977} {1024}
50488af099Sdanielk1977
51488af099Sdanielk1977
52488af099Sdanielk1977unset -nocomplain ::sig
53488af099Sdanielk1977
5447e23024Sdanielk1977for {set ii 1} {$ii<=$ITERATIONS} {incr ii} {
55488af099Sdanielk1977  set ::sig [signature]
56488af099Sdanielk1977
5747e23024Sdanielk1977  for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
5847e23024Sdanielk1977
5947e23024Sdanielk1977    do_test savepoint4-1.$ii.1.$iDelay {
60488af099Sdanielk1977      set ret [crashsql -delay $iDelay -file test.db-journal {
61488af099Sdanielk1977        PRAGMA cache_size = 20;
62488af099Sdanielk1977        SAVEPOINT one;
6347e23024Sdanielk1977          DELETE FROM t1 WHERE random()%2==0;
64488af099Sdanielk1977          SAVEPOINT two;
6547e23024Sdanielk1977            INSERT INTO t1 SELECT randstr(10,10)||x FROM t1;
66488af099Sdanielk1977           ROLLBACK TO two;
6747e23024Sdanielk1977            UPDATE t1 SET x = randstr(10, 400) WHERE random()%10;
68488af099Sdanielk1977          RELEASE two;
69488af099Sdanielk1977        ROLLBACK TO one;
7047e23024Sdanielk1977        RELEASE one;
71488af099Sdanielk1977      }]
72488af099Sdanielk1977      signature
73488af099Sdanielk1977    } $::sig
7447e23024Sdanielk1977
75488af099Sdanielk1977    set crashed [lindex $ret 0]
7647e23024Sdanielk1977    integrity_check savepoint4-1.$ii.1.$iDelay.integrity
77488af099Sdanielk1977  }
78488af099Sdanielk1977
7947e23024Sdanielk1977  do_test savepoint4-1.$ii.2 {
80488af099Sdanielk1977    execsql {
8147e23024Sdanielk1977      DELETE FROM t1 WHERE random()%10==0;
8247e23024Sdanielk1977      INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
8347e23024Sdanielk1977    }
8447e23024Sdanielk1977  } {}
8547e23024Sdanielk1977}
8647e23024Sdanielk1977
8747e23024Sdanielk1977do_test savepoint4-2 {
8847e23024Sdanielk1977  execsql {
8947e23024Sdanielk1977    PRAGMA cache_size=10;
9047e23024Sdanielk1977    DROP TABLE IF EXISTS t1;
9147e23024Sdanielk1977    BEGIN;
9247e23024Sdanielk1977    CREATE TABLE t1(x TEXT);
9347e23024Sdanielk1977    CREATE INDEX i1 ON t1(x);
9447e23024Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,400));
9547e23024Sdanielk1977    INSERT INTO t1 VALUES(randstr(10,400));
9647e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
9747e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
9847e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
9947e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
10047e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
10147e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
10247e23024Sdanielk1977    INSERT INTO t1 SELECT randstr(10,400) FROM t1;
10347e23024Sdanielk1977    COMMIT;
10447e23024Sdanielk1977    SELECT count(*) FROM t1;
10547e23024Sdanielk1977  }
10647e23024Sdanielk1977} {256}
10747e23024Sdanielk1977
108b8f12c12Sdanielk1977for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} {
10947e23024Sdanielk1977  set ::sig [signature]
11047e23024Sdanielk1977  set file test.db-journal
11147e23024Sdanielk1977
11247e23024Sdanielk1977  for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
11347e23024Sdanielk1977
11447e23024Sdanielk1977    do_test savepoint4-2.$ii.1.$iDelay {
11547e23024Sdanielk1977
11647e23024Sdanielk1977      set ret [crashsql -delay $iDelay -file $file {
11747e23024Sdanielk1977        SAVEPOINT one;
11847e23024Sdanielk1977          INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
11947e23024Sdanielk1977         ROLLBACK TO one;
12047e23024Sdanielk1977          INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
12147e23024Sdanielk1977          SAVEPOINT two;
12247e23024Sdanielk1977            DELETE FROM t1 WHERE (random()%10)==0;
12347e23024Sdanielk1977            SAVEPOINT three;
12447e23024Sdanielk1977              DELETE FROM t1 WHERE (random()%10)==0;
12547e23024Sdanielk1977              SAVEPOINT four;
12647e23024Sdanielk1977                DELETE FROM t1 WHERE (random()%10)==0;
12747e23024Sdanielk1977          RELEASE two;
12847e23024Sdanielk1977
12947e23024Sdanielk1977          SAVEPOINT three;
130*b46d0045Sdanielk1977            UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0;
13147e23024Sdanielk1977            SAVEPOINT four;
132*b46d0045Sdanielk1977              UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0;
13347e23024Sdanielk1977           ROLLBACK TO three;
134*b46d0045Sdanielk1977            UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0;
13547e23024Sdanielk1977          RELEASE three;
13647e23024Sdanielk1977
137*b46d0045Sdanielk1977        DELETE FROM t1 WHERE rowid > (
138*b46d0045Sdanielk1977          SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256
139*b46d0045Sdanielk1977        );
14047e23024Sdanielk1977        RELEASE one;
14147e23024Sdanielk1977      }]
14247e23024Sdanielk1977
14347e23024Sdanielk1977      set crashed [lindex $ret 0]
14447e23024Sdanielk1977      if {$crashed} {
14547e23024Sdanielk1977        signature
14647e23024Sdanielk1977      } else {
14747e23024Sdanielk1977        set ::sig
14847e23024Sdanielk1977      }
14947e23024Sdanielk1977    } $::sig
15047e23024Sdanielk1977
15147e23024Sdanielk1977    integrity_check savepoint4-2.$ii.1.$iDelay.integrity
15247e23024Sdanielk1977
15347e23024Sdanielk1977    if {$crashed == 0 && $file == "test.db-journal"} {
15447e23024Sdanielk1977      set crashed 1
15547e23024Sdanielk1977      set iDelay 0
15647e23024Sdanielk1977      set file test.db
15747e23024Sdanielk1977      set ::sig [signature]
15847e23024Sdanielk1977    }
15947e23024Sdanielk1977  }
16047e23024Sdanielk1977
16147e23024Sdanielk1977  do_test savepoint4-2.$ii.2 {
16247e23024Sdanielk1977    execsql {
16347e23024Sdanielk1977      DELETE FROM t1 WHERE random()%10==0;
16447e23024Sdanielk1977      INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
165488af099Sdanielk1977    }
166488af099Sdanielk1977  } {}
167488af099Sdanielk1977}
168488af099Sdanielk1977
169488af099Sdanielk1977finish_test
170