|
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 {file delete -force test2.db} |
|
43 catch {file delete -force 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 do_test misuse-4.4 { |
|
175 # Flush the TCL statement cache here, otherwise the sqlite3_close() will |
|
176 # fail because there are still un-finalized() VDBEs. |
|
177 db cache flush |
|
178 sqlite3_close $::DB |
|
179 catchsql2 {SELECT * FROM t1} |
|
180 } {1 {library routine called out of sequence}} |
|
181 do_test misuse-4.5 { |
|
182 catchsql { |
|
183 SELECT * FROM t1 |
|
184 } |
|
185 } {1 {library routine called out of sequence}} |
|
186 |
|
187 # Attempt to use a database after it has been closed. |
|
188 # |
|
189 do_test misuse-5.1 { |
|
190 db close |
|
191 sqlite3 db test2.db; set ::DB [sqlite3_connection_pointer db] |
|
192 execsql { |
|
193 SELECT * FROM t1 |
|
194 } |
|
195 } {1 2} |
|
196 do_test misuse-5.2 { |
|
197 catchsql2 {SELECT * FROM t1} |
|
198 } {0 {a b 1 2}} |
|
199 do_test misuse-5.3 { |
|
200 db close |
|
201 set r [catch { |
|
202 sqlite3_prepare $::DB {SELECT * FROM t1} -1 TAIL |
|
203 } msg] |
|
204 lappend r $msg |
|
205 } {1 {(21) library routine called out of sequence}} |
|
206 |
|
207 finish_test |