OLD | NEW |
| (Empty) |
1 # 2006 November 08 | |
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 tests the various conditions under which an SQLITE_SCHEMA | |
14 # error should be returned. This is a copy of schema.test that | |
15 # has been altered to use sqlite3_prepare_v2 instead of sqlite3_prepare | |
16 # | |
17 # $Id: schema2.test,v 1.4 2009/02/04 17:40:58 drh Exp $ | |
18 | |
19 #--------------------------------------------------------------------- | |
20 # When any of the following types of SQL statements or actions are | |
21 # executed, all pre-compiled statements are invalidated. An attempt | |
22 # to execute an invalidated statement always returns SQLITE_SCHEMA. | |
23 # | |
24 # CREATE/DROP TABLE...................................schema2-1.* | |
25 # CREATE/DROP VIEW....................................schema2-2.* | |
26 # CREATE/DROP TRIGGER.................................schema2-3.* | |
27 # CREATE/DROP INDEX...................................schema2-4.* | |
28 # DETACH..............................................schema2-5.* | |
29 # Deleting a user-function............................schema2-6.* | |
30 # Deleting a collation sequence.......................schema2-7.* | |
31 # Setting or changing the authorization function......schema2-8.* | |
32 # | |
33 # Test cases schema2-9.* and schema2-10.* test some specific bugs | |
34 # that came up during development. | |
35 # | |
36 # Test cases schema2-11.* test that it is impossible to delete or | |
37 # change a collation sequence or user-function while SQL statements | |
38 # are executing. Adding new collations or functions is allowed. | |
39 # | |
40 | |
41 set testdir [file dirname $argv0] | |
42 source $testdir/tester.tcl | |
43 | |
44 do_test schema2-1.1 { | |
45 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
46 execsql { | |
47 CREATE TABLE abc(a, b, c); | |
48 } | |
49 sqlite3_step $::STMT | |
50 } {SQLITE_ROW} | |
51 do_test schema2-1.2 { | |
52 sqlite3_finalize $::STMT | |
53 } {SQLITE_OK} | |
54 do_test schema2-1.3 { | |
55 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
56 execsql { | |
57 DROP TABLE abc; | |
58 } | |
59 sqlite3_step $::STMT | |
60 } {SQLITE_DONE} | |
61 do_test schema2-1.4 { | |
62 sqlite3_finalize $::STMT | |
63 } {SQLITE_OK} | |
64 | |
65 | |
66 ifcapable view { | |
67 do_test schema2-2.1 { | |
68 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
69 execsql { | |
70 CREATE VIEW v1 AS SELECT * FROM sqlite_master; | |
71 } | |
72 sqlite3_step $::STMT | |
73 } {SQLITE_ROW} | |
74 do_test schema2-2.2 { | |
75 sqlite3_finalize $::STMT | |
76 } {SQLITE_OK} | |
77 do_test schema2-2.3 { | |
78 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
79 execsql { | |
80 DROP VIEW v1; | |
81 } | |
82 sqlite3_step $::STMT | |
83 } {SQLITE_DONE} | |
84 do_test schema2-2.4 { | |
85 sqlite3_finalize $::STMT | |
86 } {SQLITE_OK} | |
87 } | |
88 | |
89 ifcapable trigger { | |
90 do_test schema2-3.1 { | |
91 execsql { | |
92 CREATE TABLE abc(a, b, c); | |
93 } | |
94 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
95 execsql { | |
96 CREATE TRIGGER abc_trig AFTER INSERT ON abc BEGIN | |
97 SELECT 1, 2, 3; | |
98 END; | |
99 } | |
100 sqlite3_step $::STMT | |
101 } {SQLITE_ROW} | |
102 do_test schema2-3.2 { | |
103 sqlite3_finalize $::STMT | |
104 } {SQLITE_OK} | |
105 do_test schema2-3.3 { | |
106 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
107 execsql { | |
108 DROP TRIGGER abc_trig; | |
109 } | |
110 sqlite3_step $::STMT | |
111 } {SQLITE_ROW} | |
112 do_test schema2-3.4 { | |
113 sqlite3_finalize $::STMT | |
114 } {SQLITE_OK} | |
115 } | |
116 | |
117 do_test schema2-4.1 { | |
118 catchsql { | |
119 CREATE TABLE abc(a, b, c); | |
120 } | |
121 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
122 execsql { | |
123 CREATE INDEX abc_index ON abc(a); | |
124 } | |
125 sqlite3_step $::STMT | |
126 } {SQLITE_ROW} | |
127 do_test schema2-4.2 { | |
128 sqlite3_finalize $::STMT | |
129 } {SQLITE_OK} | |
130 do_test schema2-4.3 { | |
131 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
132 execsql { | |
133 DROP INDEX abc_index; | |
134 } | |
135 sqlite3_step $::STMT | |
136 } {SQLITE_ROW} | |
137 do_test schema2-4.4 { | |
138 sqlite3_finalize $::STMT | |
139 } {SQLITE_OK} | |
140 | |
141 #--------------------------------------------------------------------- | |
142 # Tests 5.1 to 5.4 check that prepared statements are invalidated when | |
143 # a database is DETACHed (but not when one is ATTACHed). | |
144 # | |
145 ifcapable attach { | |
146 do_test schema2-5.1 { | |
147 set sql {SELECT * FROM abc;} | |
148 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
149 execsql { | |
150 ATTACH 'test2.db' AS aux; | |
151 } | |
152 sqlite3_step $::STMT | |
153 } {SQLITE_DONE} | |
154 do_test schema2-5.2 { | |
155 sqlite3_reset $::STMT | |
156 } {SQLITE_OK} | |
157 do_test schema2-5.3 { | |
158 execsql { | |
159 DETACH aux; | |
160 } | |
161 sqlite3_step $::STMT | |
162 } {SQLITE_DONE} | |
163 do_test schema2-5.4 { | |
164 sqlite3_finalize $::STMT | |
165 } {SQLITE_OK} | |
166 } | |
167 | |
168 #--------------------------------------------------------------------- | |
169 # Tests 6.* check that prepared statements are invalidated when | |
170 # a user-function is deleted (but not when one is added). | |
171 do_test schema2-6.1 { | |
172 set sql {SELECT * FROM abc;} | |
173 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
174 db function hello_function {} | |
175 sqlite3_step $::STMT | |
176 } {SQLITE_DONE} | |
177 do_test schema2-6.2 { | |
178 sqlite3_reset $::STMT | |
179 } {SQLITE_OK} | |
180 do_test schema2-6.3 { | |
181 sqlite_delete_function $::DB hello_function | |
182 sqlite3_step $::STMT | |
183 } {SQLITE_DONE} | |
184 do_test schema2-6.4 { | |
185 sqlite3_finalize $::STMT | |
186 } {SQLITE_OK} | |
187 | |
188 #--------------------------------------------------------------------- | |
189 # Tests 7.* check that prepared statements are invalidated when | |
190 # a collation sequence is deleted (but not when one is added). | |
191 # | |
192 ifcapable utf16 { | |
193 do_test schema2-7.1 { | |
194 set sql {SELECT * FROM abc;} | |
195 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
196 add_test_collate $::DB 1 1 1 | |
197 sqlite3_step $::STMT | |
198 } {SQLITE_DONE} | |
199 do_test schema2-7.2 { | |
200 sqlite3_reset $::STMT | |
201 } {SQLITE_OK} | |
202 do_test schema2-7.3 { | |
203 add_test_collate $::DB 0 0 0 | |
204 sqlite3_step $::STMT | |
205 } {SQLITE_DONE} | |
206 do_test schema2-7.4 { | |
207 sqlite3_finalize $::STMT | |
208 } {SQLITE_OK} | |
209 } | |
210 | |
211 #--------------------------------------------------------------------- | |
212 # Tests 8.1 and 8.2 check that prepared statements are invalidated when | |
213 # the authorization function is set. | |
214 # | |
215 ifcapable auth { | |
216 do_test schema2-8.1 { | |
217 set ::STMT [sqlite3_prepare_v2 $::DB {SELECT * FROM sqlite_master} -1 TAIL] | |
218 db auth {} | |
219 sqlite3_step $::STMT | |
220 } {SQLITE_ROW} | |
221 do_test schema2-8.3 { | |
222 sqlite3_finalize $::STMT | |
223 } {SQLITE_OK} | |
224 } | |
225 | |
226 #--------------------------------------------------------------------- | |
227 # schema2-9.1: Test that if a table is dropped by one database connection, | |
228 # other database connections are aware of the schema change. | |
229 # schema2-9.2: Test that if a view is dropped by one database connection, | |
230 # other database connections are aware of the schema change. | |
231 # | |
232 do_test schema2-9.1 { | |
233 sqlite3 db2 test.db | |
234 execsql { | |
235 DROP TABLE abc; | |
236 } db2 | |
237 db2 close | |
238 catchsql { | |
239 SELECT * FROM abc; | |
240 } | |
241 } {1 {no such table: abc}} | |
242 execsql { | |
243 CREATE TABLE abc(a, b, c); | |
244 } | |
245 ifcapable view { | |
246 do_test schema2-9.2 { | |
247 execsql { | |
248 CREATE VIEW abcview AS SELECT * FROM abc; | |
249 } | |
250 sqlite3 db2 test.db | |
251 execsql { | |
252 DROP VIEW abcview; | |
253 } db2 | |
254 db2 close | |
255 catchsql { | |
256 SELECT * FROM abcview; | |
257 } | |
258 } {1 {no such table: abcview}} | |
259 } | |
260 | |
261 #--------------------------------------------------------------------- | |
262 # Test that if a CREATE TABLE statement fails because there are other | |
263 # btree cursors open on the same database file it does not corrupt | |
264 # the sqlite_master table. | |
265 # | |
266 # 2007-05-02: These tests have been overcome by events. Open btree | |
267 # cursors no longer block CREATE TABLE. But there is no reason not | |
268 # to keep the tests in the test suite. | |
269 # | |
270 do_test schema2-10.1 { | |
271 execsql { | |
272 INSERT INTO abc VALUES(1, 2, 3); | |
273 } | |
274 set sql {SELECT * FROM abc} | |
275 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
276 sqlite3_step $::STMT | |
277 } {SQLITE_ROW} | |
278 do_test schema2-10.2 { | |
279 catchsql { | |
280 CREATE TABLE t2(a, b, c); | |
281 } | |
282 } {0 {}} | |
283 do_test schema2-10.3 { | |
284 sqlite3_finalize $::STMT | |
285 } {SQLITE_OK} | |
286 do_test schema2-10.4 { | |
287 sqlite3 db2 test.db | |
288 execsql { | |
289 SELECT * FROM abc | |
290 } db2 | |
291 } {1 2 3} | |
292 do_test schema2-10.5 { | |
293 db2 close | |
294 } {} | |
295 | |
296 #--------------------------------------------------------------------- | |
297 # Attempting to delete or replace a user-function or collation sequence | |
298 # while there are active statements returns an SQLITE_BUSY error. | |
299 # | |
300 # schema2-11.1 - 11.4: User function. | |
301 # schema2-11.5 - 11.8: Collation sequence. | |
302 # | |
303 do_test schema2-11.1 { | |
304 db function tstfunc {} | |
305 set sql {SELECT * FROM abc} | |
306 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
307 sqlite3_step $::STMT | |
308 } {SQLITE_ROW} | |
309 do_test schema2-11.2 { | |
310 sqlite_delete_function $::DB tstfunc | |
311 } {SQLITE_BUSY} | |
312 do_test schema2-11.3 { | |
313 set rc [catch { | |
314 db function tstfunc {} | |
315 } msg] | |
316 list $rc $msg | |
317 } {1 {unable to delete/modify user-function due to active statements}} | |
318 do_test schema2-11.4 { | |
319 sqlite3_finalize $::STMT | |
320 } {SQLITE_OK} | |
321 do_test schema2-11.5 { | |
322 db collate tstcollate {} | |
323 set sql {SELECT * FROM abc} | |
324 set ::STMT [sqlite3_prepare_v2 $::DB $sql -1 TAIL] | |
325 sqlite3_step $::STMT | |
326 } {SQLITE_ROW} | |
327 do_test schema2-11.6 { | |
328 sqlite_delete_collation $::DB tstcollate | |
329 } {SQLITE_BUSY} | |
330 do_test schema2-11.7 { | |
331 set rc [catch { | |
332 db collate tstcollate {} | |
333 } msg] | |
334 list $rc $msg | |
335 } {1 {unable to delete/modify collation sequence due to active statements}} | |
336 do_test schema2-11.8 { | |
337 sqlite3_finalize $::STMT | |
338 } {SQLITE_OK} | |
339 | |
340 finish_test | |
OLD | NEW |