wasCSharpSQLite – Blame information for rev 7
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | # 2005 January 19 |
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 | # $Id: shared2.test,v 1.8 2009/06/05 17:09:12 drh Exp $ |
||
13 | |||
14 | set testdir [file dirname $argv0] |
||
15 | source $testdir/tester.tcl |
||
16 | source $testdir/lock_common.tcl |
||
17 | source $testdir/malloc_common.tcl |
||
18 | db close |
||
19 | |||
20 | ifcapable !shared_cache { |
||
21 | finish_test |
||
22 | return |
||
23 | } |
||
24 | set ::enable_shared_cache [sqlite3_enable_shared_cache 1] |
||
25 | |||
26 | # Test that if we delete all rows from a table any read-uncommitted |
||
27 | # cursors are correctly invalidated. Test on both table and index btrees. |
||
28 | do_test shared2-1.1 { |
||
29 | sqlite3 db1 test.db |
||
30 | sqlite3 db2 test.db |
||
31 | |||
32 | # Set up some data. Table "numbers" has 64 rows after this block |
||
33 | # is executed. |
||
34 | execsql { |
||
35 | BEGIN; |
||
36 | CREATE TABLE numbers(a PRIMARY KEY, b); |
||
37 | INSERT INTO numbers(oid) VALUES(NULL); |
||
38 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
39 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
40 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
41 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
42 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
43 | INSERT INTO numbers(oid) SELECT NULL FROM numbers; |
||
44 | UPDATE numbers set a = oid, b = 'abcdefghijklmnopqrstuvwxyz0123456789'; |
||
45 | COMMIT; |
||
46 | } db1 |
||
47 | } {} |
||
48 | do_test shared2-1.2 { |
||
49 | # Put connection 2 in read-uncommitted mode and start a SELECT on table |
||
50 | # 'numbers'. Half way through the SELECT, use connection 1 to delete the |
||
51 | # contents of this table. |
||
52 | execsql { |
||
53 | pragma read_uncommitted = 1; |
||
54 | } db2 |
||
55 | set count [execsql {SELECT count(*) FROM numbers} db2] |
||
56 | db2 eval {SELECT a FROM numbers ORDER BY oid} { |
||
57 | if {$a==32} { |
||
58 | execsql { |
||
59 | BEGIN; |
||
60 | DELETE FROM numbers; |
||
61 | } db1 |
||
62 | } |
||
63 | } |
||
64 | list $a $count |
||
65 | } {32 64} |
||
66 | do_test shared2-1.3 { |
||
67 | # Same test as 1.2, except scan using the index this time. |
||
68 | execsql { |
||
69 | ROLLBACK; |
||
70 | } db1 |
||
71 | set count [execsql {SELECT count(*) FROM numbers} db2] |
||
72 | db2 eval {SELECT a, b FROM numbers ORDER BY a} { |
||
73 | if {$a==32} { |
||
74 | execsql { |
||
75 | DELETE FROM numbers; |
||
76 | } db1 |
||
77 | } |
||
78 | } |
||
79 | list $a $count |
||
80 | } {32 64} |
||
81 | |||
82 | #--------------------------------------------------------------------------- |
||
83 | # These tests, shared2.2.*, test the outcome when data is added to or |
||
84 | # removed from a table due to a rollback while a read-uncommitted |
||
85 | # cursor is scanning it. |
||
86 | # |
||
87 | do_test shared2-2.1 { |
||
88 | execsql { |
||
89 | INSERT INTO numbers VALUES(1, 'Medium length text field'); |
||
90 | INSERT INTO numbers VALUES(2, 'Medium length text field'); |
||
91 | INSERT INTO numbers VALUES(3, 'Medium length text field'); |
||
92 | INSERT INTO numbers VALUES(4, 'Medium length text field'); |
||
93 | BEGIN; |
||
94 | DELETE FROM numbers WHERE (a%2)=0; |
||
95 | } db1 |
||
96 | set res [list] |
||
97 | db2 eval { |
||
98 | SELECT a FROM numbers ORDER BY a; |
||
99 | } { |
||
100 | lappend res $a |
||
101 | if {$a==3} { |
||
102 | execsql {ROLLBACK} db1 |
||
103 | } |
||
104 | } |
||
105 | set res |
||
106 | } {1 3 4} |
||
107 | do_test shared2-2.2 { |
||
108 | execsql { |
||
109 | BEGIN; |
||
110 | INSERT INTO numbers VALUES(5, 'Medium length text field'); |
||
111 | INSERT INTO numbers VALUES(6, 'Medium length text field'); |
||
112 | } db1 |
||
113 | set res [list] |
||
114 | db2 eval { |
||
115 | SELECT a FROM numbers ORDER BY a; |
||
116 | } { |
||
117 | lappend res $a |
||
118 | if {$a==5} { |
||
119 | execsql {ROLLBACK} db1 |
||
120 | } |
||
121 | } |
||
122 | set res |
||
123 | } {1 2 3 4 5} |
||
124 | |||
125 | db1 close |
||
126 | db2 close |
||
127 | |||
128 | do_test shared2-3.2 { |
||
129 | sqlite3_enable_shared_cache 1 |
||
130 | } {1} |
||
131 | |||
132 | file delete -force test.db |
||
133 | |||
134 | sqlite3 db test.db |
||
135 | do_test shared2-4.1 { |
||
136 | execsql { |
||
137 | CREATE TABLE t0(a, b); |
||
138 | CREATE TABLE t1(a, b DEFAULT 'hello world'); |
||
139 | } |
||
140 | } {} |
||
141 | db close |
||
142 | |||
143 | sqlite3 db test.db |
||
144 | sqlite3 db2 test.db |
||
145 | |||
146 | do_test shared2-4.2 { |
||
147 | execsql { SELECT a, b FROM t0 } db |
||
148 | execsql { INSERT INTO t1(a) VALUES(1) } db2 |
||
149 | } {} |
||
150 | |||
151 | do_test shared2-4.3 { |
||
152 | db2 close |
||
153 | db close |
||
154 | } {} |
||
155 | |||
156 | # At one point, this was causing a crash. |
||
157 | # |
||
158 | do_test shared2-5.1 { |
||
159 | sqlite3 db test.db |
||
160 | sqlite3 db2 test.db |
||
161 | execsql { CREATE TABLE t2(a, b, c) } |
||
162 | |||
163 | # The following statement would crash when attempting to sqlite3_free() |
||
164 | # a pointer allocated from a lookaside buffer. |
||
165 | execsql { CREATE INDEX i1 ON t2(a) } db2 |
||
166 | } {} |
||
167 | |||
168 | db close |
||
169 | db2 close |
||
170 | |||
171 | # The following test verifies that shared-cache mode does not automatically |
||
172 | # turn on exclusive-locking mode for some reason. |
||
173 | do_multiclient_test {tn} { |
||
174 | sql1 { CREATE TABLE t1(a, b) } |
||
175 | sql2 { CREATE TABLE t2(a, b) } |
||
176 | do_test shared2-6.$tn.1 { sql1 { SELECT * FROM t2 } } {} |
||
177 | do_test shared2-6.$tn.2 { sql2 { SELECT * FROM t1 } } {} |
||
178 | } |
||
179 | |||
180 | sqlite3_enable_shared_cache $::enable_shared_cache |
||
181 | finish_test |