gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/savepoint4.test (about)

     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