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

     1  # 2007 December 19
     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 implements regression tests for SQLite library.  The
    12  # focus of this file is testing for correct handling of I/O errors
    13  # during incremental vacuum with a shared cache.
    14  #
    15  # $Id: ioerr4.test,v 1.2 2008/05/08 01:11:42 drh Exp $
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  # This test requires both shared cache and incremental vacuum.
    21  #
    22  ifcapable {!shared_cache || !autovacuum} {
    23    finish_test
    24    return
    25  }
    26  
    27  # Enable shared cache mode and incremental vacuum.
    28  #
    29  do_test ioerr4-1.1 {
    30    db close
    31    set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
    32  } {0}
    33  do_test ioerr4-1.2 {
    34    forcedelete test.db test.db-journal
    35    sqlite3 db test.db
    36    sqlite3 db2 test.db
    37    db eval {
    38      PRAGMA auto_vacuum=INCREMENTAL;
    39      CREATE TABLE a(i INTEGER, b BLOB);
    40    }
    41    db2 eval {
    42      SELECT name FROM sqlite_master
    43    }
    44  } {a}
    45  do_test ioerr4-1.3 {
    46    db eval {
    47      PRAGMA auto_vacuum;
    48    }
    49  } {2}
    50  
    51  # Insert and delete many records in order to put lots of pages
    52  # on the freelist.
    53  #
    54  do_test ioerr4-1.4 {
    55    db eval {
    56      INSERT INTO a VALUES(1, zeroblob(2000));
    57      INSERT INTO a VALUES(2, zeroblob(2000));
    58      INSERT INTO a SELECT i+2, zeroblob(2000) FROM a;
    59      INSERT INTO a SELECT i+4, zeroblob(2000) FROM a;
    60      INSERT INTO a SELECT i+8, zeroblob(2000) FROM a;
    61      INSERT INTO a SELECT i+16, zeroblob(2000) FROM a;
    62      SELECT count(*) FROM a;
    63    }
    64  } {32}
    65  do_test ioerr4-1.5 {
    66    db eval {
    67      PRAGMA freelist_count
    68    }
    69  } {0}
    70  do_test ioerr4-1.6 {
    71    db eval {
    72      DELETE FROM a;
    73      PRAGMA freelist_count;
    74    }
    75  } {64}
    76  
    77  # Set up for an I/O error on incremental vacuum
    78  # with two connections on shared cache.
    79  #
    80  db close
    81  db2 close
    82  forcecopy test.db test.db-bu
    83  do_ioerr_test ioerr4-2 -tclprep {
    84    catch {db2 close}
    85    db close
    86    forcedelete test.db test.db-journal
    87    forcecopy test.db-bu test.db
    88    sqlite3_enable_shared_cache 1
    89    set ::DB [sqlite3 db test.db; sqlite3_connection_pointer db]
    90    db eval {PRAGMA auto_vacuum=INCREMENTAL}
    91    sqlite3 db2 test.db
    92  } -tclbody {
    93    db eval {PRAGMA incremental_vacuum(5)}
    94  }
    95  
    96  db2 close
    97  forcedelete test.db-bu
    98  sqlite3_enable_shared_cache $::enable_shared_cache
    99  
   100  finish_test