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

     1  # 2001 September 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  # This file tests that rollback journals for databases that use a 
    12  # page-size other than the default page-size can be rolled back Ok.
    13  #
    14  # $Id: crash6.test,v 1.2 2008/04/14 15:27:19 drh Exp $
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  
    19  ifcapable !crashtest {
    20    finish_test
    21    return
    22  }
    23  
    24  for {set ii 0} {$ii < 10} {incr ii} {
    25    catch {db close}
    26    forcedelete test.db test.db-journal
    27    crashsql -delay 2 -file test.db {
    28      PRAGMA auto_vacuum=OFF;
    29      PRAGMA page_size=4096;
    30      BEGIN;
    31      CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c;
    32      COMMIT;
    33      BEGIN;
    34      CREATE TABLE def AS SELECT 1 AS d, 2 AS e, 3 AS f;
    35      COMMIT;
    36    }
    37    sqlite3 db test.db
    38    integrity_check crash6-1.$ii
    39  }
    40  
    41  for {set ii 0} {$ii < 10} {incr ii} {
    42    catch {db close}
    43    forcedelete test.db test.db-journal
    44    sqlite3 db test.db
    45    execsql {
    46      PRAGMA auto_vacuum=OFF;
    47      PRAGMA page_size=2048;
    48      BEGIN;
    49      CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c;
    50      COMMIT;
    51    }
    52    db close
    53    crashsql -delay 1 -file test.db {
    54      INSERT INTO abc VALUES(5, 6, 7);
    55    }
    56    sqlite3 db test.db
    57    integrity_check crash6-2.$ii
    58  }
    59  
    60  proc signature {} {
    61    return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}]
    62  }
    63  
    64  # Test case for crashing during database sync with page-size values 
    65  # from 1024 to 8192.
    66  #
    67  for {set ii 0} {$ii < 30} {incr ii} {
    68    db close
    69    forcedelete test.db
    70    sqlite3 db test.db
    71  
    72    set pagesize [expr 1024 << ($ii % 4)]
    73    if {$pagesize>$::SQLITE_MAX_PAGE_SIZE} {
    74      set pagesize $::SQLITE_MAX_PAGE_SIZE
    75    }
    76    do_test crash6-3.$ii.0 {
    77      execsql "pragma page_size = $pagesize"
    78      execsql "pragma page_size"
    79    } $pagesize
    80  
    81    do_test crash6-3.$ii.1 {
    82    
    83      execsql BEGIN
    84      execsql {CREATE TABLE abc(a, b, c)}
    85      for {set n 0} {$n < 1000} {incr n} {
    86        execsql "INSERT INTO abc VALUES($n, [expr 2*$n], [expr 3*$n])"
    87      }
    88      execsql {
    89        INSERT INTO abc SELECT * FROM abc;
    90        INSERT INTO abc SELECT * FROM abc;
    91        INSERT INTO abc SELECT * FROM abc;
    92        INSERT INTO abc SELECT * FROM abc;
    93        INSERT INTO abc SELECT * FROM abc;
    94      }
    95      execsql COMMIT
    96      expr ([file size test.db] / 1024) > 450
    97    } {1}
    98  
    99    set sig [signature]
   100    db close
   101  
   102    do_test crash6-3.$ii.2 {
   103       crashsql -file test.db "
   104         BEGIN;
   105         SELECT random() FROM abc LIMIT $ii;
   106         INSERT INTO abc SELECT randstr(10,10), 0, 0 FROM abc WHERE random()%2==0;
   107         DELETE FROM abc WHERE random()%2!=0;
   108         COMMIT;
   109       "
   110    } {1 {child process exited abnormally}}
   111  
   112    do_test crash6-3.$ii.3 {
   113      sqlite3 db test.db
   114      signature
   115    } $sig
   116  } 
   117  
   118  finish_test