170 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 2008 December 15
 | |
| #
 | |
| # The author disclaims copyright to this source code.  In place of
 | |
| # a legal notice, here is a blessing:
 | |
| #
 | |
| #    May you do good and not evil.
 | |
| #    May you find forgiveness for yourself and forgive others.
 | |
| #    May you share freely, never taking more than you give.
 | |
| #
 | |
| #***********************************************************************
 | |
| #
 | |
| # $Id: savepoint4.test,v 1.7 2009/06/09 15:25:33 danielk1977 Exp $
 | |
| 
 | |
| set testdir [file dirname $argv0]
 | |
| source $testdir/tester.tcl
 | |
| 
 | |
| ifcapable !crashtest {
 | |
|   finish_test
 | |
|   return
 | |
| }
 | |
| 
 | |
| proc signature {} {
 | |
|   return [db eval {SELECT count(*), md5sum(x) FROM t1}]
 | |
| }
 | |
| 
 | |
| set ITERATIONS 25                   ;# Number of iterations for savepoint4-1
 | |
| set ITERATIONS2 13                  ;# Number of iterations for savepoint4-2
 | |
| expr srand(0)
 | |
| 
 | |
| do_test savepoint4-1 {
 | |
|   execsql {
 | |
|     PRAGMA cache_size=10;
 | |
|     BEGIN;
 | |
|     CREATE TABLE t1(x TEXT);
 | |
|     INSERT INTO t1 VALUES(randstr(10,400));
 | |
|     INSERT INTO t1 VALUES(randstr(10,400));
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     COMMIT;
 | |
|     SELECT count(*) FROM t1;
 | |
|   }
 | |
| } {1024}
 | |
| 
 | |
| 
 | |
| unset -nocomplain ::sig
 | |
| 
 | |
| for {set ii 1} {$ii<=$ITERATIONS} {incr ii} {
 | |
|   set ::sig [signature]
 | |
| 
 | |
|   for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
 | |
| 
 | |
|     do_test savepoint4-1.$ii.1.$iDelay {
 | |
|       set ret [crashsql -delay $iDelay -file test.db-journal {
 | |
|         PRAGMA cache_size = 20;
 | |
|         SAVEPOINT one;
 | |
|           DELETE FROM t1 WHERE random()%2==0;
 | |
|           SAVEPOINT two;
 | |
|             INSERT INTO t1 SELECT randstr(10,10)||x FROM t1;
 | |
|            ROLLBACK TO two;
 | |
|             UPDATE t1 SET x = randstr(10, 400) WHERE random()%10;
 | |
|           RELEASE two;
 | |
|         ROLLBACK TO one;
 | |
|         RELEASE one;
 | |
|       }]
 | |
|       signature
 | |
|     } $::sig
 | |
| 
 | |
|     set crashed [lindex $ret 0]
 | |
|     integrity_check savepoint4-1.$ii.1.$iDelay.integrity
 | |
|   }
 | |
| 
 | |
|   do_test savepoint4-1.$ii.2 {
 | |
|     execsql {
 | |
|       DELETE FROM t1 WHERE random()%10==0;
 | |
|       INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
 | |
|     }
 | |
|   } {}
 | |
| }
 | |
| 
 | |
| do_test savepoint4-2 {
 | |
|   execsql {
 | |
|     PRAGMA cache_size=10;
 | |
|     DROP TABLE IF EXISTS t1;
 | |
|     BEGIN;
 | |
|     CREATE TABLE t1(x TEXT);
 | |
|     CREATE INDEX i1 ON t1(x);
 | |
|     INSERT INTO t1 VALUES(randstr(10,400));
 | |
|     INSERT INTO t1 VALUES(randstr(10,400));
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     INSERT INTO t1 SELECT randstr(10,400) FROM t1;
 | |
|     COMMIT;
 | |
|     SELECT count(*) FROM t1;
 | |
|   }
 | |
| } {256}
 | |
| 
 | |
| for {set ii 1} {$ii<=$ITERATIONS2} {incr ii} {
 | |
|   set ::sig [signature]
 | |
|   set file test.db-journal
 | |
| 
 | |
|   for {set iDelay 1 ; set crashed 1} {$crashed} {incr iDelay} {
 | |
| 
 | |
|     do_test savepoint4-2.$ii.1.$iDelay {
 | |
| 
 | |
|       set ret [crashsql -delay $iDelay -file $file {
 | |
|         SAVEPOINT one;
 | |
|           INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
 | |
|          ROLLBACK TO one;
 | |
|           INSERT INTO t1 SELECT * FROM t1 WHERE rowid<50;
 | |
|           SAVEPOINT two;
 | |
|             DELETE FROM t1 WHERE (random()%10)==0;
 | |
|             SAVEPOINT three;
 | |
|               DELETE FROM t1 WHERE (random()%10)==0;
 | |
|               SAVEPOINT four;
 | |
|                 DELETE FROM t1 WHERE (random()%10)==0;
 | |
|           RELEASE two;
 | |
| 
 | |
|           SAVEPOINT three;
 | |
|             UPDATE t1 SET x = substr(x||x, 12, 100000) WHERE (rowid%12)==0;
 | |
|             SAVEPOINT four;
 | |
|               UPDATE t1 SET x = substr(x||x, 14, 100000) WHERE (rowid%14)==0;
 | |
|            ROLLBACK TO three;
 | |
|             UPDATE t1 SET x = substr(x||x, 13, 100000) WHERE (rowid%13)==0;
 | |
|           RELEASE three;
 | |
| 
 | |
|         DELETE FROM t1 WHERE rowid > (
 | |
|           SELECT rowid FROM t1 ORDER BY rowid ASC LIMIT 1 OFFSET 256
 | |
|         );
 | |
|         RELEASE one;
 | |
|       }]
 | |
| 
 | |
|       set crashed [lindex $ret 0]
 | |
|       if {$crashed} {
 | |
|         signature
 | |
|       } else {
 | |
|         set ::sig
 | |
|       }
 | |
|     } $::sig
 | |
| 
 | |
|     integrity_check savepoint4-2.$ii.1.$iDelay.integrity
 | |
| 
 | |
|     if {$crashed == 0 && $file == "test.db-journal"} {
 | |
|       set crashed 1
 | |
|       set iDelay 0
 | |
|       set file test.db
 | |
|       set ::sig [signature]
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   do_test savepoint4-2.$ii.2 {
 | |
|     execsql {
 | |
|       DELETE FROM t1 WHERE random()%10==0;
 | |
|       INSERT INTO t1 SELECT randstr(10,10)||x FROM t1 WHERE random()%9==0;
 | |
|     }
 | |
|   } {}
 | |
| }
 | |
| 
 | |
| finish_test
 | 
