Home | History | Annotate | Download | only in test
      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
    170