CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
savepoint4.test170 linesDownload Raw Back to test
1# 2008 December 152#3# The author disclaims copyright to this source code.  In place of4# 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.tcl16 17ifcapable !crashtest {18  finish_test19  return20}21 22proc signature {} {23  return [db eval {SELECT count(*), md5sum(x) FROM t1}]24}25 26set ITERATIONS 25                   ;# Number of iterations for savepoint4-127set ITERATIONS2 13                  ;# Number of iterations for savepoint4-228expr 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 ::sig53 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      signature73    } $::sig74 75    set crashed [lindex $ret 0]76    integrity_check savepoint4-1.$ii.1.$iDelay.integrity77  }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-journal111 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 256139        );140        RELEASE one;141      }]142 143      set crashed [lindex $ret 0]144      if {$crashed} {145        signature146      } else {147        set ::sig148      }149    } $::sig150 151    integrity_check savepoint4-2.$ii.1.$iDelay.integrity152 153    if {$crashed == 0 && $file == "test.db-journal"} {154      set crashed 1155      set iDelay 0156      set file test.db157      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_test170