OLD | NEW |
| (Empty) |
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 | |
OLD | NEW |