github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/mjournal.test (about)

     1  # 2017 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 implements regression tests for SQLite library.
    12  #
    13  
    14  set testdir [file dirname $argv0]
    15  source $testdir/tester.tcl
    16  set testprefix mjournal
    17  
    18  if {[permutation]=="inmemory_journal"} {
    19    finish_test
    20    return
    21  }
    22  
    23  # Test that nothing bad happens if a journal file contains a pointer to
    24  # a master journal file that does not have a "-" in the name. At one point
    25  # this was causing a segfault on unix.
    26  #
    27  do_execsql_test 1.0 {
    28    CREATE TABLE t1(a, b);
    29  }
    30  
    31  do_test 1.1 {
    32    forcedelete test.db2journal test.db-journal
    33  
    34    close [open test.db-journal w]
    35    
    36    hexio_write test.db-journal 0 746573742e6462326a6f75726e616c00
    37    hexio_write test.db-journal 16 00000010
    38    hexio_write test.db-journal 20 000005e1
    39    hexio_write test.db-journal 24 d9d505f920a163d7
    40  
    41    close [open test.db2journal w]
    42    hexio_write test.db2journal 0 abcd
    43  } {2}
    44  
    45  do_execsql_test 1.2 {
    46    SELECT * FROM t1;
    47  }
    48  
    49  do_test 1.3 {
    50    forcedelete test0db2journal test.db-journal
    51    close [open test.db-journal w]
    52    hexio_write test.db-journal 0 74657374306462326a6f75726e616c00
    53    hexio_write test.db-journal 16 00000010
    54    hexio_write test.db-journal 20 000005e3
    55    hexio_write test.db-journal 24 d9d505f920a163d7
    56  
    57    close [open test0db2journal w]
    58    hexio_write test0db2journal 0 abcd
    59  } {2}
    60  
    61  do_execsql_test 1.4 {
    62    SELECT * FROM t1;
    63  }
    64  
    65  # And now test that nothing bad happens if a master journal contains a
    66  # pointer to a journal file that does not have a "-" in the name. 
    67  #
    68  do_test 1.5 {
    69    forcedelete test.db2-master test.db-journal test1
    70    close [open test.db-journal w]
    71    hexio_write test.db-journal 0 746573742e6462322d6d617374657200
    72    hexio_write test.db-journal 16 00000010
    73    hexio_write test.db-journal 20 0000059f
    74    hexio_write test.db-journal 24 d9d505f920a163d7
    75  
    76    close [open test.db2-master w]
    77    hexio_write test.db2-master 0 746573743100
    78  
    79    close [open test1 w]
    80    hexio_write test1 0 abcd
    81  } {2}
    82  
    83  do_execsql_test 1.6 {
    84    SELECT * FROM t1;
    85  }
    86  
    87  #-------------------------------------------------------------------------
    88  # Check that master journals are not created if the transaction involves
    89  # multiple temp files.
    90  #
    91  db close
    92  testvfs tvfs
    93  tvfs filter xOpen
    94  tvfs script open_cb
    95  set ::open ""
    96  proc open_cb {method file arglist} {
    97    lappend ::open $file
    98  }
    99  
   100  proc contains_mj {} {
   101    foreach f $::open {
   102      set t [file tail $f]
   103      if {[string match *mj* $t]} { return 1 }
   104    }
   105    return 0
   106  }
   107  
   108  # Like [do_execsql_test], except that a boolean indicating whether or
   109  # not a master journal file was opened ([file tail] contains "mj") or
   110  # not. Example:
   111  #
   112  #   do_hasmj_test 1.0 { SELECT 'a', 'b' } {0 a b}
   113  #
   114  proc do_hasmj_test {tn sql expected} {
   115    set ::open [list]
   116    uplevel [list do_test $tn [subst -nocommands {
   117      set res [execsql "$sql"]
   118      concat [contains_mj] [set res]
   119    }] [list {*}$expected]]
   120  }
   121  
   122  forcedelete test.db
   123  forcedelete test.db2
   124  forcedelete test.db3
   125  sqlite3 db test.db -vfs tvfs
   126  
   127  do_execsql_test 2.0 {
   128    ATTACH 'test.db2' AS dbfile;
   129    ATTACH ''         AS dbtemp;
   130    ATTACH ':memory:'  AS dbmem;
   131  
   132    CREATE TABLE t1(x);
   133    CREATE TABLE dbfile.t2(x);
   134    CREATE TABLE dbtemp.t3(x);
   135    CREATE TABLE dbmem.t4(x);
   136  }
   137  
   138  # Two real files.
   139  do_hasmj_test 2.1 {
   140    BEGIN;
   141      INSERT INTO t1 VALUES(1);
   142      INSERT INTO t2 VALUES(1);
   143    COMMIT;
   144  } {1}
   145  
   146  # One real, one temp file.
   147  do_hasmj_test 2.2 {
   148    BEGIN;
   149      INSERT INTO t1 VALUES(1);
   150      INSERT INTO t3 VALUES(1);
   151    COMMIT;
   152  } {0}
   153  
   154  # One file, one :memory: db.
   155  do_hasmj_test 2.3 {
   156    BEGIN;
   157      INSERT INTO t1 VALUES(1);
   158      INSERT INTO t4 VALUES(1);
   159    COMMIT;
   160  } {0}
   161  
   162  finish_test