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

     1  # 2016 April 11
     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  # This file contains tests for fault-injection when SQLite is used with
    13  # a temp file database.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  source $testdir/malloc_common.tcl
    19  set testprefix tempfault
    20  
    21  # sqlite3_memdebug_vfs_oom_test 0
    22  
    23  do_faultsim_test 1 -faults * -prep {
    24    sqlite3 db ""
    25    db eval {
    26      PRAGMA page_size = 1024;
    27      CREATE TABLE t1(a, b);
    28      INSERT INTO t1 VALUES(1, 2);
    29      INSERT INTO t1 VALUES(3, 4);
    30    }
    31  } -body {
    32    execsql { INSERT INTO t1 VALUES(5, 6) }
    33  } -test {
    34    faultsim_test_result {0 {}}
    35    set rc [catch { execsql { SELECT * FROM t1 } } msg]
    36    if {$rc==0 && $msg != "1 2 3 4 5 6" && $msg != "1 2 3 4"} {
    37      error "data mismatch 1: $msg"
    38    }
    39    if {$testrc==0 && $msg != "1 2 3 4 5 6"} {
    40      error "data mismatch 2: $msg"
    41    }
    42    faultsim_integrity_check
    43  }
    44  
    45  do_faultsim_test 2 -faults * -prep {
    46    sqlite3 db ""
    47    db eval {
    48      PRAGMA page_size = 1024;
    49      PRAGMA cache_size = 10;
    50      CREATE TABLE t1(a, b);
    51      CREATE INDEX i1 ON t1(b, a);
    52      WITH x(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100)
    53      INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
    54    }
    55  } -body {
    56    execsql { UPDATE t1 SET a = randomblob(99) }
    57  } -test {
    58    faultsim_test_result {0 {}}
    59    faultsim_integrity_check db
    60  }
    61  
    62  catch { db close }
    63  do_faultsim_test 2.1 -faults * -prep {
    64    if {[info commands db]==""} {
    65      sqlite3 db ""
    66      execsql {
    67        PRAGMA page_size = 1024;
    68        PRAGMA cache_size = 10;
    69        CREATE TABLE t1(a, b);
    70        CREATE INDEX i1 ON t1(b, a);
    71        WITH x(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<100)
    72            INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
    73      }
    74    } 
    75  } -body {
    76    execsql { UPDATE t1 SET a = randomblob(99) }
    77  } -test {
    78    faultsim_test_result {0 {}}
    79    faultsim_integrity_check db
    80  }
    81  
    82  do_faultsim_test 3 -faults * -prep {
    83    sqlite3 db ""
    84    db eval {
    85      PRAGMA page_size = 1024;
    86      PRAGMA cache_size = 10;
    87      CREATE TABLE t1(a, b);
    88      CREATE INDEX i1 ON t1(b, a);
    89      WITH x(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<50)
    90      INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
    91    }
    92  } -body {
    93    execsql { 
    94      BEGIN;
    95        UPDATE t1 SET a = randomblob(99);
    96        SAVEPOINT abc;
    97          UPDATE t1 SET a = randomblob(98) WHERE (rowid%10)==0;
    98        ROLLBACK TO abc;
    99          UPDATE t1 SET a = randomblob(97) WHERE (rowid%5)==0;
   100        ROLLBACK TO abc;
   101      COMMIT;
   102    }
   103  } -test {
   104    faultsim_test_result {0 {}}
   105    faultsim_integrity_check db
   106  }
   107  
   108  do_faultsim_test 4 -faults * -prep {
   109    sqlite3 db ""
   110    db eval {
   111      PRAGMA page_size = 1024;
   112      PRAGMA cache_size = 10;
   113      CREATE TABLE t1(a, b);
   114      CREATE INDEX i1 ON t1(b, a);
   115      WITH x(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<50)
   116      INSERT INTO t1 SELECT randomblob(100), randomblob(100) FROM x;
   117    }
   118  } -body {
   119    execsql { 
   120      BEGIN;
   121        UPDATE t1 SET a = randomblob(99);
   122        SAVEPOINT abc;
   123          UPDATE t1 SET a = randomblob(98) WHERE (rowid%10)==0;
   124        ROLLBACK TO abc;
   125          UPDATE t1 SET a = randomblob(97) WHERE (rowid%5)==0;
   126        ROLLBACK TO abc;
   127      COMMIT;
   128    }
   129  } -test {
   130    faultsim_test_result {0 {}}
   131  }
   132  
   133  sqlite3_memdebug_vfs_oom_test 1
   134  finish_test