wasCSharpSQLite – Blame information for rev 7
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | # 2009 March 24 |
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 | # |
||
12 | |||
13 | set testdir [file dirname $argv0] |
||
14 | source $testdir/tester.tcl |
||
15 | |||
16 | ifcapable {!pager_pragmas} { |
||
17 | finish_test |
||
18 | return |
||
19 | } |
||
20 | |||
21 | #------------------------------------------------------------------------- |
||
22 | # The tests in this file check that the following two bugs (both now fixed) |
||
23 | # do not reappear. |
||
24 | # |
||
25 | # jrnlmode2-1.*: Demonstrate bug #3745: |
||
26 | # |
||
27 | # In persistent journal mode, if: |
||
28 | # |
||
29 | # * There is a persistent journal in the file-system, AND |
||
30 | # * there exists a connection with a shared lock on the db file, |
||
31 | # |
||
32 | # then a second connection cannot open a read-transaction on the database. |
||
33 | # The reason is because while determining that the persistent-journal is |
||
34 | # not a hot-journal, SQLite currently grabs an exclusive lock on the |
||
35 | # database file. If this fails because another connection has a shared |
||
36 | # lock, then SQLITE_BUSY is returned to the user. |
||
37 | # |
||
38 | # jrnlmode2-2.*: Demonstrate bug #3751: |
||
39 | # |
||
40 | # If a connection is opened in SQLITE_OPEN_READONLY mode, the underlying |
||
41 | # unix file descriptor on the database file is opened in O_RDONLY mode. |
||
42 | # |
||
43 | # When SQLite queries the database file for the schema in order to compile |
||
44 | # the SELECT statement, it sees the empty journal in the file system, it |
||
45 | # attempts to obtain an exclusive lock on the database file (this is a |
||
46 | # bug). The attempt to obtain an exclusive (write) lock on a read-only file |
||
47 | # fails at the OS level. Under unix, fcntl() reports an EBADF - "Bad file |
||
48 | # descriptor" - error. |
||
49 | # |
||
50 | |||
51 | do_test jrnlmode2-1.1 { |
||
52 | execsql { |
||
53 | PRAGMA journal_mode = persist; |
||
54 | CREATE TABLE t1(a, b); |
||
55 | INSERT INTO t1 VALUES(1, 2); |
||
56 | } |
||
57 | } {persist} |
||
58 | |||
59 | do_test jrnlmode2-1.2 { |
||
60 | file exists test.db-journal |
||
61 | } {1} |
||
62 | |||
63 | do_test jrnlmode2-1.3 { |
||
64 | sqlite3 db2 test.db |
||
65 | execsql { SELECT * FROM t1 } db2 |
||
66 | } {1 2} |
||
67 | |||
68 | do_test jrnlmode2-1.4 { |
||
69 | execsql { |
||
70 | INSERT INTO t1 VALUES(3, 4); |
||
71 | } |
||
72 | execsql { |
||
73 | BEGIN; |
||
74 | SELECT * FROM t1; |
||
75 | } |
||
76 | execsql { PRAGMA lock_status } |
||
77 | } {main shared temp closed} |
||
78 | |||
79 | do_test jrnlmode2-1.5 { |
||
80 | file exists test.db-journal |
||
81 | } {1} |
||
82 | |||
83 | do_test jrnlmode2-1.6 { |
||
84 | catchsql { SELECT * FROM t1 } db2 |
||
85 | } {0 {1 2 3 4}} |
||
86 | |||
87 | do_test jrnlmode2-1.7 { |
||
88 | execsql { COMMIT } |
||
89 | catchsql { SELECT * FROM t1 } db2 |
||
90 | } {0 {1 2 3 4}} |
||
91 | |||
92 | |||
93 | |||
94 | do_test jrnlmode2-2.1 { |
||
95 | db2 close |
||
96 | execsql { PRAGMA journal_mode = truncate } |
||
97 | execsql { INSERT INTO t1 VALUES(5, 6) } |
||
98 | } {} |
||
99 | |||
100 | do_test jrnlmode2-2.2 { |
||
101 | file exists test.db-journal |
||
102 | } {1} |
||
103 | |||
104 | do_test jrnlmode2-2.3 { |
||
105 | file size test.db-journal |
||
106 | } {0} |
||
107 | |||
108 | do_test jrnlmode2-2.4 { |
||
109 | sqlite3 db2 test.db -readonly 1 |
||
110 | catchsql { SELECT * FROM t1 } db2 |
||
111 | } {0 {1 2 3 4 5 6}} |
||
112 | |||
113 | do_test jrnlmode2-2.5 { |
||
114 | db close |
||
115 | file delete test.db-journal |
||
116 | } {} |
||
117 | do_test jrnlmode2-2.6 { |
||
118 | sqlite3 db2 test.db -readonly 1 |
||
119 | catchsql { SELECT * FROM t1 } db2 |
||
120 | } {0 {1 2 3 4 5 6}} |
||
121 | |||
122 | catch { db2 close } |
||
123 | finish_test |