1 # 2010 June 16 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. Specifically, 12 # it tests that ticket [fc62af4523] has been resolved. 13 # 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 source $testdir/lock_common.tcl 18 source $testdir/malloc_common.tcl 19 20 do_test tkt-fc62af4523.1 { 21 execsql { 22 PRAGMA cache_size = 10; 23 PRAGMA journal_mode = persist; 24 CREATE TABLE t1(a UNIQUE, b UNIQUE); 25 INSERT INTO t1 SELECT randomblob(200), randomblob(300); 26 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 2 27 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 4 28 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 8 29 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 16 30 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 32 31 INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 64 32 } 33 execsql { 34 PRAGMA integrity_check; 35 SELECT count(*) FROM t1; 36 } 37 } {ok 64} 38 39 # Launch an external process. Have it write (but not commit) a large 40 # transaction to the database. 41 # 42 set ::chan [launch_testfixture] 43 proc buddy {code} { testfixture $::chan $code } 44 do_test tkt-fc62af4523.2 { 45 testfixture $::chan { 46 sqlite3 db test.db 47 db eval { 48 PRAGMA cache_size = 10; 49 BEGIN; 50 UPDATE t1 SET b = randomblob(400); 51 UPDATE t1 SET a = randomblob(201); 52 } 53 } 54 file exists test.db-journal 55 } {1} 56 57 # Now do "PRAGMA journal_mode = DELETE" in this process. At one point 58 # this was causing SQLite to delete the journal file from the file-system, 59 # even though the external process is currently using it. 60 # 61 do_test tkt-fc62af4523.3 { execsql { PRAGMA journal_mode = DELETE } } {delete} 62 do_test tkt-fc62af4523.4 { file exists test.db-journal } {1} 63 64 # Cause the external process to crash. Since it has already written 65 # uncommitted data into the database file, the next reader will have 66 # to do a hot-journal rollback to recover the database. 67 # 68 # Or, if this test is run in a version with the bug present, the journal 69 # file has already been deleted. In this case we are left with a corrupt 70 # database file and no hot-journal to fix it with. 71 # 72 do_test tkt-fc62af4523.5 { 73 testfixture $::chan sqlite_abort 74 } {ERROR: Child process hung up} 75 after 200 76 do_test tkt-fc62af4523.6 { 77 execsql { 78 PRAGMA integrity_check; 79 SELECT count(*) FROM t1; 80 } 81 } {ok 64} 82 83 catch { close $::chan } 84 finish_test 85