OLD | NEW |
| (Empty) |
1 # 2002 May 10 | |
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. | |
12 # | |
13 # This file implements tests for the SQLITE_MISUSE detection logic. | |
14 # This test file leaks memory and file descriptors. | |
15 # | |
16 # $Id: misuse.test,v 1.11 2006/01/03 00:33:50 drh Exp $ | |
17 | |
18 set testdir [file dirname $argv0] | |
19 source $testdir/tester.tcl | |
20 | |
21 proc catchsql2 {sql} { | |
22 set r [ | |
23 catch { | |
24 set res [list] | |
25 db eval $sql data { | |
26 if { $res==[list] } { | |
27 foreach f $data(*) {lappend res $f} | |
28 } | |
29 foreach f $data(*) {lappend res $data($f)} | |
30 } | |
31 set res | |
32 } msg | |
33 ] | |
34 lappend r $msg | |
35 } | |
36 | |
37 | |
38 # Make sure the test logic works | |
39 # | |
40 do_test misuse-1.1 { | |
41 db close | |
42 catch {forcedelete test2.db} | |
43 catch {forcedelete test2.db-journal} | |
44 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] | |
45 execsql { | |
46 CREATE TABLE t1(a,b); | |
47 INSERT INTO t1 VALUES(1,2); | |
48 } | |
49 catchsql2 { | |
50 SELECT * FROM t1 | |
51 } | |
52 } {0 {a b 1 2}} | |
53 do_test misuse-1.2 { | |
54 catchsql2 { | |
55 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 | |
56 } | |
57 } {1 {no such function: x_coalesce}} | |
58 do_test misuse-1.3 { | |
59 sqlite3_create_function $::DB | |
60 catchsql2 { | |
61 SELECT x_coalesce(NULL,a) AS 'xyz' FROM t1 | |
62 } | |
63 } {0 {xyz 1}} | |
64 | |
65 # Use the x_sqlite_exec() SQL function to simulate the effect of two | |
66 # threads trying to use the same database at the same time. | |
67 # | |
68 # It used to be prohibited to invoke sqlite_exec() from within a function, | |
69 # but that has changed. The following tests used to cause errors but now | |
70 # they do not. | |
71 # | |
72 ifcapable {utf16} { | |
73 do_test misuse-1.4 { | |
74 catchsql2 { | |
75 SELECT x_sqlite_exec('SELECT * FROM t1') AS xyz; | |
76 } | |
77 } {0 {xyz {1 2}}} | |
78 } | |
79 do_test misuse-1.5 { | |
80 catchsql2 {SELECT * FROM t1} | |
81 } {0 {a b 1 2}} | |
82 do_test misuse-1.6 { | |
83 catchsql { | |
84 SELECT * FROM t1 | |
85 } | |
86 } {0 {1 2}} | |
87 | |
88 # Attempt to register a new SQL function while an sqlite_exec() is active. | |
89 # | |
90 do_test misuse-2.1 { | |
91 db close | |
92 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] | |
93 execsql { | |
94 SELECT * FROM t1 | |
95 } | |
96 } {1 2} | |
97 do_test misuse-2.2 { | |
98 catchsql2 {SELECT * FROM t1} | |
99 } {0 {a b 1 2}} | |
100 | |
101 # We used to disallow creating new function from within an exec(). | |
102 # But now this is acceptable. | |
103 do_test misuse-2.3 { | |
104 set v [catch { | |
105 db eval {SELECT * FROM t1} {} { | |
106 sqlite3_create_function $::DB | |
107 } | |
108 } msg] | |
109 lappend v $msg | |
110 } {0 {}} | |
111 do_test misuse-2.4 { | |
112 catchsql2 {SELECT * FROM t1} | |
113 } {0 {a b 1 2}} | |
114 do_test misuse-2.5 { | |
115 catchsql { | |
116 SELECT * FROM t1 | |
117 } | |
118 } {0 {1 2}} | |
119 | |
120 # Attempt to register a new SQL aggregate while an sqlite_exec() is active. | |
121 # | |
122 do_test misuse-3.1 { | |
123 db close | |
124 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] | |
125 execsql { | |
126 SELECT * FROM t1 | |
127 } | |
128 } {1 2} | |
129 do_test misuse-3.2 { | |
130 catchsql2 {SELECT * FROM t1} | |
131 } {0 {a b 1 2}} | |
132 | |
133 # We used to disallow creating new function from within an exec(). | |
134 # But now this is acceptable. | |
135 do_test misuse-3.3 { | |
136 set v [catch { | |
137 db eval {SELECT * FROM t1} {} { | |
138 sqlite3_create_aggregate $::DB | |
139 } | |
140 } msg] | |
141 lappend v $msg | |
142 } {0 {}} | |
143 do_test misuse-3.4 { | |
144 catchsql2 {SELECT * FROM t1} | |
145 } {0 {a b 1 2}} | |
146 do_test misuse-3.5 { | |
147 catchsql { | |
148 SELECT * FROM t1 | |
149 } | |
150 } {0 {1 2}} | |
151 | |
152 # Attempt to close the database from an sqlite_exec callback. | |
153 # | |
154 # Update for v3: The db cannot be closed because there are active | |
155 # VMs. The sqlite3_close call would return SQLITE_BUSY. | |
156 do_test misuse-4.1 { | |
157 db close | |
158 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] | |
159 execsql { | |
160 SELECT * FROM t1 | |
161 } | |
162 } {1 2} | |
163 do_test misuse-4.2 { | |
164 catchsql2 {SELECT * FROM t1} | |
165 } {0 {a b 1 2}} | |
166 do_test misuse-4.3 { | |
167 set v [catch { | |
168 db eval {SELECT * FROM t1} {} { | |
169 set r [sqlite3_close $::DB] | |
170 } | |
171 } msg] | |
172 lappend v $msg $r | |
173 } {0 {} SQLITE_BUSY} | |
174 | |
175 if {[clang_sanitize_address]==0} { | |
176 do_test misuse-4.4 { | |
177 # Flush the TCL statement cache here, otherwise the sqlite3_close() will | |
178 # fail because there are still un-finalized() VDBEs. | |
179 db cache flush | |
180 sqlite3_close $::DB | |
181 catchsql2 {SELECT * FROM t1} | |
182 } {1 {library routine called out of sequence}} | |
183 do_test misuse-4.5 { | |
184 catchsql { | |
185 SELECT * FROM t1 | |
186 } | |
187 } {1 {library routine called out of sequence}} | |
188 | |
189 # Attempt to use a database after it has been closed. | |
190 # | |
191 do_test misuse-5.1 { | |
192 db close | |
193 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] | |
194 execsql { | |
195 SELECT * FROM t1 | |
196 } | |
197 } {1 2} | |
198 do_test misuse-5.2 { | |
199 catchsql2 {SELECT * FROM t1} | |
200 } {0 {a b 1 2}} | |
201 do_test misuse-5.3 { | |
202 db close | |
203 set r [catch { | |
204 sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL | |
205 } msg] | |
206 lappend r $msg | |
207 } {1 {(21) library routine called out of sequence}} | |
208 } | |
209 | |
210 finish_test | |
OLD | NEW |