PageRenderTime 45ms CodeModel.GetById 28ms app.highlight 1ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/src/sqlite/test/savepoint4.test

#
Unknown | 169 lines | 145 code | 24 blank | 0 comment | 0 complexity | 4716fd47e0c243ee1966debc1182363a MD5 | raw file
Possible License(s): BSD-3-Clause
  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