wasCSharpSQLite – Blame information for rev 7
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 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 | file delete -force 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/*] {file delete -force $f} |
||
318 | file delete -force 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/*] {file delete -force $f} |
||
326 | file delete -force 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/*] {file delete -force $f} |
||
446 | file delete -force 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 |