OLD | NEW |
| (Empty) |
1 # 2001 September 15 | |
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. The | |
12 # focus of this file is exercising the code in main.c. | |
13 # | |
14 # $Id: main.test,v 1.32 2009/04/28 04:51:29 drh Exp $ | |
15 | |
16 set testdir [file dirname $argv0] | |
17 source $testdir/tester.tcl | |
18 | |
19 # Only do the next group of tests if the sqlite3_complete API is available | |
20 # | |
21 ifcapable {complete} { | |
22 | |
23 # Tests of the sqlite_complete() function. | |
24 # | |
25 do_test main-1.1 { | |
26 db complete {This is a test} | |
27 } {0} | |
28 do_test main-1.2.0 { | |
29 db complete { | |
30 } | |
31 } {0} | |
32 do_test main-1.2.1 { | |
33 db complete {} | |
34 } {0} | |
35 do_test main-1.3.0 { | |
36 db complete { | |
37 -- a comment ; | |
38 } | |
39 } {0} | |
40 do_test main-1.3.1 { | |
41 db complete { | |
42 /* a comment ; */ | |
43 } | |
44 } {0} | |
45 do_test main-1.4.0 { | |
46 db complete { | |
47 -- a comment ; | |
48 ; | |
49 } | |
50 } {1} | |
51 do_test main-1.4.1 { | |
52 db complete { | |
53 /* a comment ; */ | |
54 ; | |
55 } | |
56 } {1} | |
57 do_test main-1.4.2 { | |
58 db complete { | |
59 /* a comment ; */ ; | |
60 } | |
61 } {1} | |
62 do_test main-1.5 { | |
63 db complete {DROP TABLE 'xyz;} | |
64 } {0} | |
65 do_test main-1.6 { | |
66 db complete {DROP TABLE 'xyz';} | |
67 } {1} | |
68 do_test main-1.7 { | |
69 db complete {DROP TABLE "xyz;} | |
70 } {0} | |
71 do_test main-1.8 { | |
72 db complete {DROP TABLE "xyz';} | |
73 } {0} | |
74 do_test main-1.9 { | |
75 db complete {DROP TABLE "xyz";} | |
76 } {1} | |
77 do_test main-1.10 { | |
78 db complete {DROP TABLE xyz; hi} | |
79 } {0} | |
80 do_test main-1.11 { | |
81 db complete {DROP TABLE xyz; } | |
82 } {1} | |
83 do_test main-1.12 { | |
84 db complete {DROP TABLE xyz; -- hi } | |
85 } {1} | |
86 do_test main-1.13 { | |
87 db complete {DROP TABLE xyz; -- hi | |
88 } | |
89 } {1} | |
90 do_test main-1.14 { | |
91 db complete {SELECT a-b FROM t1; } | |
92 } {1} | |
93 do_test main-1.15 { | |
94 db complete {SELECT a/e FROM t1 } | |
95 } {0} | |
96 do_test main-1.16 { | |
97 db complete { | |
98 CREATE TABLE abc(x,y); | |
99 } | |
100 } {1} | |
101 ifcapable {trigger} { | |
102 do_test main-1.17 { | |
103 db complete { | |
104 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; | |
105 } | |
106 } {0} | |
107 do_test main-1.17.2 { | |
108 db complete { | |
109 EXPLAIN CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; | |
110 } | |
111 } {0} | |
112 do_test main-1.17.3 { | |
113 db complete { | |
114 EXPLAIN QUERY PLAN CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; | |
115 } | |
116 } {0} | |
117 do_test main-1.18 { | |
118 db complete { | |
119 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; END; | |
120 } | |
121 } {1} | |
122 do_test main-1.19 { | |
123 db complete { | |
124 CREATE TRIGGER xyz AFTER DELETE abc BEGIN | |
125 UPDATE pqr; | |
126 unknown command; | |
127 } | |
128 } {0} | |
129 do_test main-1.20 { | |
130 db complete { | |
131 CREATE TRIGGER xyz AFTER DELETE backend BEGIN | |
132 UPDATE pqr; | |
133 } | |
134 } {0} | |
135 do_test main-1.21 { | |
136 db complete { | |
137 CREATE TRIGGER xyz AFTER DELETE end BEGIN | |
138 SELECT a, b FROM end; | |
139 } | |
140 } {0} | |
141 do_test main-1.22 { | |
142 db complete { | |
143 CREATE TRIGGER xyz AFTER DELETE end BEGIN | |
144 SELECT a, b FROM end; | |
145 END; | |
146 } | |
147 } {1} | |
148 do_test main-1.23 { | |
149 db complete { | |
150 CREATE TRIGGER xyz AFTER DELETE end BEGIN | |
151 SELECT a, b FROM end; | |
152 END; | |
153 SELECT a, b FROM end; | |
154 } | |
155 } {1} | |
156 do_test main-1.24 { | |
157 db complete { | |
158 CREATE TRIGGER xyz AFTER DELETE [;end;] BEGIN | |
159 UPDATE pqr; | |
160 } | |
161 } {0} | |
162 do_test main-1.25 { | |
163 db complete { | |
164 CREATE TRIGGER xyz AFTER DELETE backend BEGIN | |
165 UPDATE cantor SET a=[;end;];;; | |
166 } | |
167 } {0} | |
168 do_test main-1.26 { | |
169 db complete { | |
170 CREATE -- a comment | |
171 TRIGGER exy AFTER DELETE backend BEGIN | |
172 UPDATE pqr SET a=5; | |
173 } | |
174 } {0} | |
175 do_test main-1.27.1 { | |
176 db complete { | |
177 CREATE -- a comment | |
178 TRIGGERX tangentxx AFTER DELETE backend BEGIN | |
179 UPDATE pqr SET a=5; | |
180 } | |
181 } {1} | |
182 do_test main-1.27.2 { | |
183 db complete { | |
184 CREATE/**/TRIGGER tiger00 AFTER DELETE backend BEGIN | |
185 UPDATE pqr SET a=5; | |
186 } | |
187 } {0} | |
188 ifcapable {explain} { | |
189 do_test main-1.27.3 { | |
190 db complete { | |
191 /* */ EXPLAIN -- A comment | |
192 CREATE/**/TRIGGER ezxyz12 AFTER DELETE backend BEGIN | |
193 UPDATE pqr SET a=5; | |
194 } | |
195 } {0} | |
196 } | |
197 do_test main-1.27.4 { | |
198 db complete { | |
199 BOGUS token | |
200 CREATE TRIGGER xyz AFTER DELETE backend BEGIN | |
201 UPDATE pqr SET a=5; | |
202 } | |
203 } {1} | |
204 ifcapable {explain} { | |
205 do_test main-1.27.5 { | |
206 db complete { | |
207 EXPLAIN | |
208 CREATE TEMP TRIGGER xyz AFTER DELETE backend BEGIN | |
209 UPDATE pqr SET a=5; | |
210 } | |
211 } {0} | |
212 } | |
213 do_test main-1.28 { | |
214 db complete { | |
215 CREATE TEMPORARY TRIGGER xyz AFTER DELETE backend BEGIN | |
216 UPDATE pqr SET a=5; | |
217 } | |
218 } {0} | |
219 do_test main-1.29 { | |
220 db complete { | |
221 CREATE TRIGGER xyz AFTER DELETE backend BEGIN | |
222 UPDATE pqr SET a=5; | |
223 EXPLAIN select * from xyz; | |
224 } | |
225 } {0} | |
226 | |
227 } ;# end ifcapable {complete} | |
228 | |
229 } | |
230 do_test main-1.30 { | |
231 db complete { | |
232 CREATE TABLE /* In comment ; */ | |
233 } | |
234 } {0} | |
235 do_test main-1.31 { | |
236 db complete { | |
237 CREATE TABLE /* In comment ; */ hi; | |
238 } | |
239 } {1} | |
240 do_test main-1.31 { | |
241 db complete { | |
242 CREATE TABLE /* In comment ; */; | |
243 } | |
244 } {1} | |
245 do_test main-1.32 { | |
246 db complete { | |
247 stuff; | |
248 /* | |
249 CREATE TABLE | |
250 multiple lines | |
251 of text | |
252 */ | |
253 } | |
254 } {1} | |
255 do_test main-1.33 { | |
256 db complete { | |
257 /* | |
258 CREATE TABLE | |
259 multiple lines | |
260 of text; | |
261 } | |
262 } {0} | |
263 do_test main-1.34 { | |
264 db complete { | |
265 /* | |
266 CREATE TABLE | |
267 multiple lines "*/ | |
268 of text; | |
269 } | |
270 } {1} | |
271 do_test main-1.35 { | |
272 db complete {hi /**/ there;} | |
273 } {1} | |
274 do_test main-1.36 { | |
275 db complete {hi there/***/;} | |
276 } {1} | |
277 do_test main-1.37 { | |
278 db complete {hi there/**} | |
279 } {0} | |
280 do_test main-1.38 { | |
281 db complete {hi [there} | |
282 } {0} | |
283 | |
284 ifcapable {trigger} { | |
285 # Characters less than \040 can never be part of an identifier. | |
286 # Characters greater than \u177 are always identifier characters. | |
287 do_test main-1.100 { | |
288 db complete "create \037\036\035\034trigger\001\002;" | |
289 } {1} | |
290 do_test main-1.101 { | |
291 db complete "create trigger\200;" | |
292 } {1} | |
293 do_test main-1.102 { | |
294 db complete "create \200trigger;" | |
295 } {1} | |
296 } | |
297 | |
298 | |
299 # Try to open a database with a corrupt database file. | |
300 # | |
301 if {[permutation] == ""} { | |
302 do_test main-2.0 { | |
303 catch {db close} | |
304 forcedelete test.db | |
305 set fd [open test.db w] | |
306 puts $fd hi! | |
307 close $fd | |
308 set v [catch {sqlite3 db test.db} msg] | |
309 if {$v} {lappend v $msg} {lappend v {}} | |
310 } {0 {}} | |
311 } | |
312 | |
313 # Here are some tests for tokenize.c. | |
314 # | |
315 do_test main-3.1 { | |
316 catch {db close} | |
317 foreach f [glob -nocomplain testdb/*] {forcedelete $f} | |
318 forcedelete testdb | |
319 sqlite3 db testdb | |
320 set v [catch {execsql {SELECT * from T1 where x!!5}} msg] | |
321 lappend v $msg | |
322 } {1 {unrecognized token: "!!"}} | |
323 do_test main-3.2 { | |
324 catch {db close} | |
325 foreach f [glob -nocomplain testdb/*] {forcedelete $f} | |
326 forcedelete testdb | |
327 sqlite3 db testdb | |
328 set v [catch {execsql {SELECT * from T1 where ^x}} msg] | |
329 lappend v $msg | |
330 } {1 {unrecognized token: "^"}} | |
331 do_test main-3.2.2 { | |
332 catchsql {select 'abc} | |
333 } {1 {unrecognized token: "'abc"}} | |
334 do_test main-3.2.3 { | |
335 catchsql {select "abc} | |
336 } {1 {unrecognized token: ""abc"}} | |
337 do_test main-3.2.4 { | |
338 catchsql {select [abc} | |
339 } {1 {unrecognized token: "[abc"}} | |
340 do_test main-3.2.5 { | |
341 catchsql {select x'4869} | |
342 } {1 {unrecognized token: "x'4869"}} | |
343 do_test main-3.2.6 { | |
344 catchsql {select x'4869'} | |
345 } {0 Hi} | |
346 do_test main-3.2.7 { | |
347 catchsql {select x'48695'} | |
348 } {1 {unrecognized token: "x'48695'"}} | |
349 do_test main-3.2.8 { | |
350 catchsql {select x'486x'} | |
351 } {1 {unrecognized token: "x'486x'"}} | |
352 do_test main-3.2.9 { | |
353 catchsql {select $abc(} | |
354 } {1 {unrecognized token: "$abc("}} | |
355 do_test main-3.2.10 { | |
356 catchsql {select $abc(x} | |
357 } {1 {unrecognized token: "$abc(x"}} | |
358 set xyz 123 | |
359 do_test main-3.2.11 { | |
360 catchsql {select $::xyz} | |
361 } {0 123} | |
362 namespace eval ::testnamespace { | |
363 variable xyz 321 | |
364 } | |
365 do_test main-3.2.12 { | |
366 catchsql {select $testnamespace::xyz} | |
367 } {0 321} | |
368 do_test main-3.2.13 { | |
369 catchsql {select $(abc)} | |
370 } {1 {unrecognized token: "$"}} | |
371 do_test main-3.2.14 { | |
372 set hi\u1234x 987 | |
373 db eval "select \$hi\u1234x" | |
374 } {987} | |
375 do_test main-3.2.15 { | |
376 catchsql "select 456\u1234" | |
377 } [list 1 "unrecognized token: \"456\u1234\""] | |
378 do_test main-3.2.16 { | |
379 catchsql {select cast(3.14e+4 AS integer)} | |
380 } {0 31400} | |
381 do_test main-3.2.17 { | |
382 catchsql {select cast(3.14e+04 AS integer)} | |
383 } {0 31400} | |
384 do_test main-3.2.18 { | |
385 catchsql {select cast(3.14e+004 AS integer)} | |
386 } {0 31400} | |
387 do_test main-3.2.19 { | |
388 catchsql {select cast(3.14e4 AS integer)} | |
389 } {0 31400} | |
390 do_test main-3.2.20 { | |
391 catchsql {select cast(3.14e04 AS integer)} | |
392 } {0 31400} | |
393 do_test main-3.2.21 { | |
394 catchsql {select cast(3.14e004 AS integer)} | |
395 } {0 31400} | |
396 do_test main-3.2.16 { | |
397 catchsql {select cast(3.14E+4 AS integer)} | |
398 } {0 31400} | |
399 do_test main-3.2.17 { | |
400 catchsql {select cast(3.14E+04 AS integer)} | |
401 } {0 31400} | |
402 do_test main-3.2.18 { | |
403 catchsql {select cast(3.14E+004 AS integer)} | |
404 } {0 31400} | |
405 do_test main-3.2.19 { | |
406 catchsql {select cast(3.14E4 AS integer)} | |
407 } {0 31400} | |
408 do_test main-3.2.20 { | |
409 catchsql {select cast(3.14E04 AS integer)} | |
410 } {0 31400} | |
411 do_test main-3.2.21 { | |
412 catchsql {select cast(3.14E004 AS integer)} | |
413 } {0 31400} | |
414 do_test main-3.2.22 { | |
415 catchsql {select cast(3.14e-4 * 1e8 AS integer)} | |
416 } {0 31400} | |
417 do_test main-3.2.23 { | |
418 catchsql {select cast(3.14E-04 * 1E08 AS integer)} | |
419 } {0 31400} | |
420 do_test main-3.2.24 { | |
421 catchsql {select cast(3.14e-004 * 01.0E+8 AS integer)} | |
422 } {0 31400} | |
423 do_test main-3.2.25 { | |
424 catchsql {select 123/*abc} | |
425 } {0 123} | |
426 do_test main-3.2.26 { | |
427 catchsql {select 123/***abc} | |
428 } {0 123} | |
429 do_test main-3.2.27 { | |
430 catchsql {select 123/*/*2} | |
431 } {0 123} | |
432 do_test main-3.2.28 { | |
433 catchsql {select 123/**/*2} | |
434 } {0 246} | |
435 do_test main-3.2.29 { | |
436 catchsql {select 123/} | |
437 } {1 {near "/": syntax error}} | |
438 do_test main-3.2.30 { | |
439 catchsql {select 123--5} | |
440 } {0 123} | |
441 | |
442 | |
443 do_test main-3.3 { | |
444 catch {db close} | |
445 foreach f [glob -nocomplain testdb/*] {forcedelete $f} | |
446 forcedelete testdb | |
447 sqlite3 db testdb | |
448 execsql { | |
449 create table T1(X REAL); /* C-style comments allowed */ | |
450 insert into T1 values(0.5); | |
451 insert into T1 values(0.5e2); | |
452 insert into T1 values(0.5e-002); | |
453 insert into T1 values(5e-002); | |
454 insert into T1 values(-5.0e-2); | |
455 insert into T1 values(-5.1e-2); | |
456 insert into T1 values(0.5e2); | |
457 insert into T1 values(0.5E+02); | |
458 insert into T1 values(5E+02); | |
459 insert into T1 values(5.0E+03); | |
460 select x*10 from T1 order by x*5; | |
461 } | |
462 } {-0.51 -0.5 0.05 0.5 5.0 500.0 500.0 500.0 5000.0 50000.0} | |
463 do_test main-3.4 { | |
464 set v [catch {execsql {create bogus}} msg] | |
465 lappend v $msg | |
466 } {1 {near "bogus": syntax error}} | |
467 do_test main-3.5 { | |
468 set v [catch {execsql {create}} msg] | |
469 lappend v $msg | |
470 } {1 {near "create": syntax error}} | |
471 do_test main-3.6 { | |
472 catchsql {SELECT 'abc' + #9} | |
473 } {1 {near "#9": syntax error}} | |
474 | |
475 # The following test-case tests the linked list code used to manage | |
476 # sqlite3_vfs structures. | |
477 if {$::tcl_platform(platform)=="unix" | |
478 && [info command sqlite3async_initialize]!=""} { | |
479 ifcapable threadsafe { | |
480 do_test main-4.1 { | |
481 sqlite3_crash_enable 1 | |
482 sqlite3_crash_enable 0 | |
483 | |
484 sqlite3async_initialize "" 1 | |
485 sqlite3async_shutdown | |
486 | |
487 sqlite3_crash_enable 1 | |
488 sqlite3async_initialize "" 1 | |
489 sqlite3_crash_enable 0 | |
490 sqlite3async_shutdown | |
491 | |
492 sqlite3_crash_enable 1 | |
493 sqlite3async_initialize "" 1 | |
494 sqlite3async_shutdown | |
495 sqlite3_crash_enable 0 | |
496 | |
497 sqlite3async_initialize "" 1 | |
498 sqlite3_crash_enable 1 | |
499 sqlite3_crash_enable 0 | |
500 sqlite3async_shutdown | |
501 | |
502 sqlite3async_initialize "" 1 | |
503 sqlite3_crash_enable 1 | |
504 sqlite3async_shutdown | |
505 sqlite3_crash_enable 0 | |
506 } {} | |
507 do_test main-4.2 { | |
508 set rc [catch {sqlite3 db test.db -vfs crash} msg] | |
509 list $rc $msg | |
510 } {1 {no such vfs: crash}} | |
511 do_test main-4.3 { | |
512 set rc [catch {sqlite3 db test.db -vfs async} msg] | |
513 list $rc $msg | |
514 } {1 {no such vfs: async}} | |
515 } | |
516 } | |
517 | |
518 finish_test | |
OLD | NEW |