• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
15set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17source $testdir/lock_common.tcl
18source $testdir/malloc_common.tcl
19
20do_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#
42set ::chan [launch_testfixture]
43proc buddy {code} { testfixture $::chan $code }
44do_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#
61do_test tkt-fc62af4523.3 { execsql { PRAGMA journal_mode = DELETE } } {delete}
62do_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#
72do_test tkt-fc62af4523.5 {
73  testfixture $::chan sqlite_abort
74} {ERROR: Child process hung up}
75after 200
76do_test tkt-fc62af4523.6 {
77  execsql {
78    PRAGMA integrity_check;
79    SELECT count(*) FROM t1;
80  }
81} {ok 64}
82
83catch { close $::chan }
84finish_test
85