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 14set testdir [file dirname $argv0] 15source $testdir/tester.tcl 16set testprefix mjournal 17 18if {[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# 27do_execsql_test 1.0 { 28 CREATE TABLE t1(a, b); 29} 30 31do_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 45do_execsql_test 1.2 { 46 SELECT * FROM t1; 47} 48 49do_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 61do_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# 68do_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 83do_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# 91db close 92testvfs tvfs 93tvfs filter xOpen 94tvfs script open_cb 95set ::open "" 96proc open_cb {method file arglist} { 97 lappend ::open $file 98} 99 100proc 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# 114proc 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 122forcedelete test.db 123forcedelete test.db2 124forcedelete test.db3 125sqlite3 db test.db -vfs tvfs 126 127do_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. 139do_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. 147do_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. 155do_hasmj_test 2.3 { 156 BEGIN; 157 INSERT INTO t1 VALUES(1); 158 INSERT INTO t4 VALUES(1); 159 COMMIT; 160} {0} 161 162finish_test 163