blob: 6248e11bb2dbfff3308db40cbb72a3f3ff428d8b [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drhcc85b412000-06-07 15:11:27 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drhcc85b412000-06-07 15:11:27 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drhcc85b412000-06-07 15:11:27 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is exercising the code in main.c.
13#
drh1691cd42009-04-28 04:51:29 +000014# $Id: main.test,v 1.32 2009/04/28 04:51:29 drh Exp $
drhcc85b412000-06-07 15:11:27 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
drhccae6022005-02-26 17:31:26 +000019# Only do the next group of tests if the sqlite3_complete API is available
20#
21ifcapable {complete} {
22
drhcc85b412000-06-07 15:11:27 +000023# Tests of the sqlite_complete() function.
24#
25do_test main-1.1 {
26 db complete {This is a test}
27} {0}
shanehc7d526e2009-12-17 22:17:38 +000028do_test main-1.2.0 {
drhcc85b412000-06-07 15:11:27 +000029 db complete {
30 }
shanehc7d526e2009-12-17 22:17:38 +000031} {0}
32do_test main-1.2.1 {
33 db complete {}
34} {0}
35do_test main-1.3.0 {
drhcc85b412000-06-07 15:11:27 +000036 db complete {
37 -- a comment ;
38 }
shanehc7d526e2009-12-17 22:17:38 +000039} {0}
40do_test main-1.3.1 {
41 db complete {
42 /* a comment ; */
43 }
44} {0}
45do_test main-1.4.0 {
drhcc85b412000-06-07 15:11:27 +000046 db complete {
47 -- a comment ;
48 ;
49 }
50} {1}
shanehc7d526e2009-12-17 22:17:38 +000051do_test main-1.4.1 {
52 db complete {
53 /* a comment ; */
54 ;
55 }
56} {1}
57do_test main-1.4.2 {
58 db complete {
59 /* a comment ; */ ;
60 }
61} {1}
drh8c82b352000-12-10 18:23:50 +000062do_test main-1.5 {
63 db complete {DROP TABLE 'xyz;}
64} {0}
65do_test main-1.6 {
66 db complete {DROP TABLE 'xyz';}
67} {1}
68do_test main-1.7 {
69 db complete {DROP TABLE "xyz;}
70} {0}
71do_test main-1.8 {
72 db complete {DROP TABLE "xyz';}
73} {0}
74do_test main-1.9 {
75 db complete {DROP TABLE "xyz";}
76} {1}
77do_test main-1.10 {
78 db complete {DROP TABLE xyz; hi}
79} {0}
80do_test main-1.11 {
81 db complete {DROP TABLE xyz; }
82} {1}
83do_test main-1.12 {
84 db complete {DROP TABLE xyz; -- hi }
85} {1}
86do_test main-1.13 {
87 db complete {DROP TABLE xyz; -- hi
88 }
89} {1}
drhc4a3c772001-04-04 11:48:57 +000090do_test main-1.14 {
91 db complete {SELECT a-b FROM t1; }
92} {1}
93do_test main-1.15 {
drh48e5aa22005-01-11 17:46:41 +000094 db complete {SELECT a/e FROM t1 }
drhc4a3c772001-04-04 11:48:57 +000095} {0}
drhce9079c2002-05-15 14:17:44 +000096do_test main-1.16 {
97 db complete {
98 CREATE TABLE abc(x,y);
99 }
100} {1}
drh798da522004-11-04 04:42:28 +0000101ifcapable {trigger} {
102 do_test main-1.17 {
drh6bf89572004-11-03 16:27:01 +0000103 db complete {
drh798da522004-11-04 04:42:28 +0000104 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr;
105 }
106 } {0}
drh1691cd42009-04-28 04:51:29 +0000107 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}
drh798da522004-11-04 04:42:28 +0000117 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
drh4b2f9362008-01-22 23:37:09 +0000165 UPDATE cantor SET a=[;end;];;;
drh798da522004-11-04 04:42:28 +0000166 }
167 } {0}
168 do_test main-1.26 {
169 db complete {
170 CREATE -- a comment
drh4b2f9362008-01-22 23:37:09 +0000171 TRIGGER exy AFTER DELETE backend BEGIN
drh798da522004-11-04 04:42:28 +0000172 UPDATE pqr SET a=5;
173 }
174 } {0}
175 do_test main-1.27.1 {
176 db complete {
177 CREATE -- a comment
drh4b2f9362008-01-22 23:37:09 +0000178 TRIGGERX tangentxx AFTER DELETE backend BEGIN
drh798da522004-11-04 04:42:28 +0000179 UPDATE pqr SET a=5;
180 }
181 } {1}
182 do_test main-1.27.2 {
183 db complete {
drh4b2f9362008-01-22 23:37:09 +0000184 CREATE/**/TRIGGER tiger00 AFTER DELETE backend BEGIN
drh6bf89572004-11-03 16:27:01 +0000185 UPDATE pqr SET a=5;
186 }
187 } {0}
drh798da522004-11-04 04:42:28 +0000188 ifcapable {explain} {
189 do_test main-1.27.3 {
190 db complete {
191 /* */ EXPLAIN -- A comment
drh4b2f9362008-01-22 23:37:09 +0000192 CREATE/**/TRIGGER ezxyz12 AFTER DELETE backend BEGIN
drh798da522004-11-04 04:42:28 +0000193 UPDATE pqr SET a=5;
194 }
195 } {0}
drh7ad43342003-05-04 17:58:25 +0000196 }
drh798da522004-11-04 04:42:28 +0000197 do_test main-1.27.4 {
drh6bf89572004-11-03 16:27:01 +0000198 db complete {
drh798da522004-11-04 04:42:28 +0000199 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 {
drh48e5aa22005-01-11 17:46:41 +0000215 CREATE TEMPORARY TRIGGER xyz AFTER DELETE backend BEGIN
drh6bf89572004-11-03 16:27:01 +0000216 UPDATE pqr SET a=5;
217 }
218 } {0}
drh798da522004-11-04 04:42:28 +0000219 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}
drh4b2f9362008-01-22 23:37:09 +0000226
227} ;# end ifcapable {complete}
228
drh6bf89572004-11-03 16:27:01 +0000229}
drh524a5bf2003-04-26 02:31:54 +0000230do_test main-1.30 {
231 db complete {
232 CREATE TABLE /* In comment ; */
233 }
234} {0}
235do_test main-1.31 {
236 db complete {
237 CREATE TABLE /* In comment ; */ hi;
238 }
239} {1}
drh7ad43342003-05-04 17:58:25 +0000240do_test main-1.31 {
241 db complete {
242 CREATE TABLE /* In comment ; */;
243 }
244} {1}
drh524a5bf2003-04-26 02:31:54 +0000245do_test main-1.32 {
246 db complete {
247 stuff;
248 /*
249 CREATE TABLE
250 multiple lines
251 of text
252 */
253 }
254} {1}
255do_test main-1.33 {
256 db complete {
257 /*
258 CREATE TABLE
259 multiple lines
260 of text;
261 }
262} {0}
263do_test main-1.34 {
264 db complete {
265 /*
266 CREATE TABLE
267 multiple lines "*/
268 of text;
269 }
270} {1}
271do_test main-1.35 {
272 db complete {hi /**/ there;}
273} {1}
drh7ad43342003-05-04 17:58:25 +0000274do_test main-1.36 {
275 db complete {hi there/***/;}
276} {1}
drh4b2f9362008-01-22 23:37:09 +0000277do_test main-1.37 {
278 db complete {hi there/**}
279} {0}
280do_test main-1.38 {
281 db complete {hi [there}
282} {0}
drhce9079c2002-05-15 14:17:44 +0000283
drh4b2f9362008-01-22 23:37:09 +0000284ifcapable {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}
drhccae6022005-02-26 17:31:26 +0000297
drhcc85b412000-06-07 15:11:27 +0000298
drh3fc190c2001-09-14 03:24:23 +0000299# Try to open a database with a corrupt database file.
drhcc85b412000-06-07 15:11:27 +0000300#
301do_test main-2.0 {
302 catch {db close}
drh3fc190c2001-09-14 03:24:23 +0000303 file delete -force test.db
304 set fd [open test.db w]
drhcc85b412000-06-07 15:11:27 +0000305 puts $fd hi!
306 close $fd
drhef4ac8f2004-06-19 00:16:31 +0000307 set v [catch {sqlite3 db test.db} msg]
drhc22bd472002-05-10 13:14:07 +0000308 if {$v} {lappend v $msg} {lappend v {}}
drhcc85b412000-06-07 15:11:27 +0000309} {0 {}}
310
drhc837e702000-06-08 16:26:24 +0000311# Here are some tests for tokenize.c.
312#
313do_test main-3.1 {
314 catch {db close}
drh3494ffe2001-03-20 12:55:13 +0000315 foreach f [glob -nocomplain testdb/*] {file delete -force $f}
drhc837e702000-06-08 16:26:24 +0000316 file delete -force testdb
drhef4ac8f2004-06-19 00:16:31 +0000317 sqlite3 db testdb
drhc837e702000-06-08 16:26:24 +0000318 set v [catch {execsql {SELECT * from T1 where x!!5}} msg]
319 lappend v $msg
320} {1 {unrecognized token: "!!"}}
321do_test main-3.2 {
322 catch {db close}
drh3494ffe2001-03-20 12:55:13 +0000323 foreach f [glob -nocomplain testdb/*] {file delete -force $f}
drhc837e702000-06-08 16:26:24 +0000324 file delete -force testdb
drhef4ac8f2004-06-19 00:16:31 +0000325 sqlite3 db testdb
drh0b2a5ee2006-02-09 22:24:41 +0000326 set v [catch {execsql {SELECT * from T1 where ^x}} msg]
drhc837e702000-06-08 16:26:24 +0000327 lappend v $msg
drh0b2a5ee2006-02-09 22:24:41 +0000328} {1 {unrecognized token: "^"}}
drheef8b552005-10-23 11:29:40 +0000329do_test main-3.2.2 {
330 catchsql {select 'abc}
331} {1 {unrecognized token: "'abc"}}
332do_test main-3.2.3 {
333 catchsql {select "abc}
334} {1 {unrecognized token: ""abc"}}
drh4b2f9362008-01-22 23:37:09 +0000335do_test main-3.2.4 {
336 catchsql {select [abc}
337} {1 {unrecognized token: "[abc"}}
338do_test main-3.2.5 {
339 catchsql {select x'4869}
340} {1 {unrecognized token: "x'4869"}}
341do_test main-3.2.6 {
342 catchsql {select x'4869'}
343} {0 Hi}
344do_test main-3.2.7 {
345 catchsql {select x'48695'}
346} {1 {unrecognized token: "x'48695'"}}
347do_test main-3.2.8 {
348 catchsql {select x'486x'}
349} {1 {unrecognized token: "x'486x'"}}
350do_test main-3.2.9 {
351 catchsql {select $abc(}
352} {1 {unrecognized token: "$abc("}}
353do_test main-3.2.10 {
354 catchsql {select $abc(x}
355} {1 {unrecognized token: "$abc(x"}}
356set xyz 123
357do_test main-3.2.11 {
358 catchsql {select $::xyz}
359} {0 123}
360namespace eval ::testnamespace {
361 variable xyz 321
362}
363do_test main-3.2.12 {
364 catchsql {select $testnamespace::xyz}
365} {0 321}
366do_test main-3.2.13 {
367 catchsql {select $(abc)}
368} {1 {unrecognized token: "$"}}
drh4b2f9362008-01-22 23:37:09 +0000369do_test main-3.2.14 {
370 set hi\u1234x 987
371 db eval "select \$hi\u1234x"
372} {987}
373do_test main-3.2.15 {
374 catchsql "select 456\u1234"
375} [list 1 "unrecognized token: \"456\u1234\""]
376do_test main-3.2.16 {
377 catchsql {select cast(3.14e+4 AS integer)}
378} {0 31400}
379do_test main-3.2.17 {
380 catchsql {select cast(3.14e+04 AS integer)}
381} {0 31400}
382do_test main-3.2.18 {
383 catchsql {select cast(3.14e+004 AS integer)}
384} {0 31400}
385do_test main-3.2.19 {
386 catchsql {select cast(3.14e4 AS integer)}
387} {0 31400}
388do_test main-3.2.20 {
389 catchsql {select cast(3.14e04 AS integer)}
390} {0 31400}
391do_test main-3.2.21 {
392 catchsql {select cast(3.14e004 AS integer)}
393} {0 31400}
394do_test main-3.2.16 {
395 catchsql {select cast(3.14E+4 AS integer)}
396} {0 31400}
397do_test main-3.2.17 {
398 catchsql {select cast(3.14E+04 AS integer)}
399} {0 31400}
400do_test main-3.2.18 {
401 catchsql {select cast(3.14E+004 AS integer)}
402} {0 31400}
403do_test main-3.2.19 {
404 catchsql {select cast(3.14E4 AS integer)}
405} {0 31400}
406do_test main-3.2.20 {
407 catchsql {select cast(3.14E04 AS integer)}
408} {0 31400}
409do_test main-3.2.21 {
410 catchsql {select cast(3.14E004 AS integer)}
411} {0 31400}
412do_test main-3.2.22 {
413 catchsql {select cast(3.14e-4 * 1e8 AS integer)}
414} {0 31400}
415do_test main-3.2.23 {
416 catchsql {select cast(3.14E-04 * 1E08 AS integer)}
417} {0 31400}
418do_test main-3.2.24 {
419 catchsql {select cast(3.14e-004 * 01.0E+8 AS integer)}
420} {0 31400}
421do_test main-3.2.25 {
422 catchsql {select 123/*abc}
423} {0 123}
424do_test main-3.2.26 {
425 catchsql {select 123/***abc}
426} {0 123}
427do_test main-3.2.27 {
428 catchsql {select 123/*/*2}
429} {0 123}
430do_test main-3.2.28 {
431 catchsql {select 123/**/*2}
432} {0 246}
433do_test main-3.2.29 {
434 catchsql {select 123/}
435} {1 {near "/": syntax error}}
436do_test main-3.2.30 {
437 catchsql {select 123--5}
438} {0 123}
439
drhc837e702000-06-08 16:26:24 +0000440
441do_test main-3.3 {
442 catch {db close}
drh3494ffe2001-03-20 12:55:13 +0000443 foreach f [glob -nocomplain testdb/*] {file delete -force $f}
drhc837e702000-06-08 16:26:24 +0000444 file delete -force testdb
drhef4ac8f2004-06-19 00:16:31 +0000445 sqlite3 db testdb
drhc837e702000-06-08 16:26:24 +0000446 execsql {
drh48e5aa22005-01-11 17:46:41 +0000447 create table T1(X REAL); /* C-style comments allowed */
drhbb07e9a2003-04-16 02:17:35 +0000448 insert into T1 values(0.5);
drhc837e702000-06-08 16:26:24 +0000449 insert into T1 values(0.5e2);
450 insert into T1 values(0.5e-002);
451 insert into T1 values(5e-002);
452 insert into T1 values(-5.0e-2);
453 insert into T1 values(-5.1e-2);
drhbb07e9a2003-04-16 02:17:35 +0000454 insert into T1 values(0.5e2);
455 insert into T1 values(0.5E+02);
drhc837e702000-06-08 16:26:24 +0000456 insert into T1 values(5E+02);
drhbb07e9a2003-04-16 02:17:35 +0000457 insert into T1 values(5.0E+03);
drhc837e702000-06-08 16:26:24 +0000458 select x*10 from T1 order by x*5;
459 }
drh8a512562005-11-14 22:29:05 +0000460} {-0.51 -0.5 0.05 0.5 5.0 500.0 500.0 500.0 5000.0 50000.0}
drhc837e702000-06-08 16:26:24 +0000461do_test main-3.4 {
462 set v [catch {execsql {create bogus}} msg]
463 lappend v $msg
464} {1 {near "bogus": syntax error}}
465do_test main-3.5 {
466 set v [catch {execsql {create}} msg]
467 lappend v $msg
468} {1 {near "create": syntax error}}
drhbb7ac002005-08-12 22:58:53 +0000469do_test main-3.6 {
470 catchsql {SELECT 'abc' + #9}
471} {1 {near "#9": syntax error}}
472
danielk1977ca0c8972007-09-01 09:02:53 +0000473# The following test-case tests the linked list code used to manage
474# sqlite3_vfs structures.
drh695ba062008-09-18 18:18:29 +0000475if {$::tcl_platform(platform)=="unix"
danielk19776f050aa2009-04-25 08:39:14 +0000476 && [info command sqlite3async_initialize]!=""} {
drh47538892007-09-03 15:42:47 +0000477 ifcapable threadsafe {
478 do_test main-4.1 {
479 sqlite3_crash_enable 1
480 sqlite3_crash_enable 0
481
danielk19776f050aa2009-04-25 08:39:14 +0000482 sqlite3async_initialize "" 1
483 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000484
485 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000486 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000487 sqlite3_crash_enable 0
danielk19776f050aa2009-04-25 08:39:14 +0000488 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000489
490 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000491 sqlite3async_initialize "" 1
492 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000493 sqlite3_crash_enable 0
494
danielk19776f050aa2009-04-25 08:39:14 +0000495 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000496 sqlite3_crash_enable 1
497 sqlite3_crash_enable 0
danielk19776f050aa2009-04-25 08:39:14 +0000498 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000499
danielk19776f050aa2009-04-25 08:39:14 +0000500 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000501 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000502 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000503 sqlite3_crash_enable 0
504 } {}
505 do_test main-4.2 {
506 set rc [catch {sqlite3 db test.db -vfs crash} msg]
507 list $rc $msg
508 } {1 {no such vfs: crash}}
509 do_test main-4.3 {
510 set rc [catch {sqlite3 db test.db -vfs async} msg]
511 list $rc $msg
512 } {1 {no such vfs: async}}
513 }
514}
515
drhcc85b412000-06-07 15:11:27 +0000516finish_test