123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- # 2010 June 16
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- # This file implements regression tests for SQLite library. Specifically,
- # it tests that ticket [fc62af4523] has been resolved.
- #
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- source $testdir/lock_common.tcl
- source $testdir/malloc_common.tcl
- do_test tkt-fc62af4523.1 {
- execsql {
- PRAGMA cache_size = 10;
- PRAGMA journal_mode = persist;
- CREATE TABLE t1(a UNIQUE, b UNIQUE);
- INSERT INTO t1 SELECT randomblob(200), randomblob(300);
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 2
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 4
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 8
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 16
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 32
- INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 64
- }
- execsql {
- PRAGMA integrity_check;
- SELECT count(*) FROM t1;
- }
- } {ok 64}
- # Launch an external process. Have it write (but not commit) a large
- # transaction to the database.
- #
- set ::chan [launch_testfixture]
- proc buddy {code} { testfixture $::chan $code }
- do_test tkt-fc62af4523.2 {
- testfixture $::chan {
- sqlite3 db test.db
- db eval {
- PRAGMA cache_size = 10;
- BEGIN;
- UPDATE t1 SET b = randomblob(400);
- UPDATE t1 SET a = randomblob(201);
- }
- }
- file exists test.db-journal
- } {1}
- # Now do "PRAGMA journal_mode = DELETE" in this process. At one point
- # this was causing SQLite to delete the journal file from the file-system,
- # even though the external process is currently using it.
- #
- do_test tkt-fc62af4523.3 { execsql { PRAGMA journal_mode = DELETE } } {delete}
- do_test tkt-fc62af4523.4 { file exists test.db-journal } {1}
- # Cause the external process to crash. Since it has already written
- # uncommitted data into the database file, the next reader will have
- # to do a hot-journal rollback to recover the database.
- #
- # Or, if this test is run in a version with the bug present, the journal
- # file has already been deleted. In this case we are left with a corrupt
- # database file and no hot-journal to fix it with.
- #
- do_test tkt-fc62af4523.5 {
- testfixture $::chan sqlite_abort
- } {ERROR: Child process hung up}
- after 200
- do_test tkt-fc62af4523.6 {
- execsql {
- PRAGMA integrity_check;
- SELECT count(*) FROM t1;
- }
- } {ok 64}
- catch { close $::chan }
- finish_test
|