blob: 13a385b7c49ef958c2385873cec024c7905dc733 [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#
dancb354602010-07-08 09:44:42 +0000301if {[permutation] == ""} {
302 do_test main-2.0 {
303 catch {db close}
mistachkinfda06be2011-08-02 00:57:34 +0000304 forcedelete test.db
dancb354602010-07-08 09:44:42 +0000305 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}
drhcc85b412000-06-07 15:11:27 +0000312
drhc837e702000-06-08 16:26:24 +0000313# Here are some tests for tokenize.c.
314#
315do_test main-3.1 {
316 catch {db close}
mistachkinfda06be2011-08-02 00:57:34 +0000317 foreach f [glob -nocomplain testdb/*] {forcedelete $f}
318 forcedelete testdb
drhef4ac8f2004-06-19 00:16:31 +0000319 sqlite3 db testdb
drhc837e702000-06-08 16:26:24 +0000320 set v [catch {execsql {SELECT * from T1 where x!!5}} msg]
321 lappend v $msg
drhb2bddbb2016-02-18 14:49:28 +0000322} {1 {unrecognized token: "!"}}
drhc837e702000-06-08 16:26:24 +0000323do_test main-3.2 {
324 catch {db close}
mistachkinfda06be2011-08-02 00:57:34 +0000325 foreach f [glob -nocomplain testdb/*] {forcedelete $f}
326 forcedelete testdb
drhef4ac8f2004-06-19 00:16:31 +0000327 sqlite3 db testdb
drh0b2a5ee2006-02-09 22:24:41 +0000328 set v [catch {execsql {SELECT * from T1 where ^x}} msg]
drhc837e702000-06-08 16:26:24 +0000329 lappend v $msg
drh0b2a5ee2006-02-09 22:24:41 +0000330} {1 {unrecognized token: "^"}}
drheef8b552005-10-23 11:29:40 +0000331do_test main-3.2.2 {
332 catchsql {select 'abc}
333} {1 {unrecognized token: "'abc"}}
334do_test main-3.2.3 {
335 catchsql {select "abc}
336} {1 {unrecognized token: ""abc"}}
drh4b2f9362008-01-22 23:37:09 +0000337do_test main-3.2.4 {
338 catchsql {select [abc}
339} {1 {unrecognized token: "[abc"}}
340do_test main-3.2.5 {
341 catchsql {select x'4869}
342} {1 {unrecognized token: "x'4869"}}
343do_test main-3.2.6 {
344 catchsql {select x'4869'}
345} {0 Hi}
346do_test main-3.2.7 {
347 catchsql {select x'48695'}
348} {1 {unrecognized token: "x'48695'"}}
349do_test main-3.2.8 {
350 catchsql {select x'486x'}
351} {1 {unrecognized token: "x'486x'"}}
352do_test main-3.2.9 {
353 catchsql {select $abc(}
354} {1 {unrecognized token: "$abc("}}
355do_test main-3.2.10 {
356 catchsql {select $abc(x}
357} {1 {unrecognized token: "$abc(x"}}
358set xyz 123
359do_test main-3.2.11 {
360 catchsql {select $::xyz}
361} {0 123}
362namespace eval ::testnamespace {
363 variable xyz 321
364}
365do_test main-3.2.12 {
366 catchsql {select $testnamespace::xyz}
367} {0 321}
368do_test main-3.2.13 {
369 catchsql {select $(abc)}
370} {1 {unrecognized token: "$"}}
drh4b2f9362008-01-22 23:37:09 +0000371do_test main-3.2.14 {
372 set hi\u1234x 987
373 db eval "select \$hi\u1234x"
374} {987}
375do_test main-3.2.15 {
376 catchsql "select 456\u1234"
377} [list 1 "unrecognized token: \"456\u1234\""]
378do_test main-3.2.16 {
379 catchsql {select cast(3.14e+4 AS integer)}
380} {0 31400}
381do_test main-3.2.17 {
382 catchsql {select cast(3.14e+04 AS integer)}
383} {0 31400}
384do_test main-3.2.18 {
385 catchsql {select cast(3.14e+004 AS integer)}
386} {0 31400}
387do_test main-3.2.19 {
388 catchsql {select cast(3.14e4 AS integer)}
389} {0 31400}
390do_test main-3.2.20 {
391 catchsql {select cast(3.14e04 AS integer)}
392} {0 31400}
393do_test main-3.2.21 {
394 catchsql {select cast(3.14e004 AS integer)}
395} {0 31400}
396do_test main-3.2.16 {
397 catchsql {select cast(3.14E+4 AS integer)}
398} {0 31400}
399do_test main-3.2.17 {
400 catchsql {select cast(3.14E+04 AS integer)}
401} {0 31400}
402do_test main-3.2.18 {
403 catchsql {select cast(3.14E+004 AS integer)}
404} {0 31400}
405do_test main-3.2.19 {
406 catchsql {select cast(3.14E4 AS integer)}
407} {0 31400}
408do_test main-3.2.20 {
409 catchsql {select cast(3.14E04 AS integer)}
410} {0 31400}
411do_test main-3.2.21 {
412 catchsql {select cast(3.14E004 AS integer)}
413} {0 31400}
414do_test main-3.2.22 {
415 catchsql {select cast(3.14e-4 * 1e8 AS integer)}
416} {0 31400}
417do_test main-3.2.23 {
418 catchsql {select cast(3.14E-04 * 1E08 AS integer)}
419} {0 31400}
420do_test main-3.2.24 {
421 catchsql {select cast(3.14e-004 * 01.0E+8 AS integer)}
422} {0 31400}
423do_test main-3.2.25 {
424 catchsql {select 123/*abc}
425} {0 123}
426do_test main-3.2.26 {
427 catchsql {select 123/***abc}
428} {0 123}
429do_test main-3.2.27 {
430 catchsql {select 123/*/*2}
431} {0 123}
432do_test main-3.2.28 {
433 catchsql {select 123/**/*2}
434} {0 246}
435do_test main-3.2.29 {
436 catchsql {select 123/}
drh6116ee42018-01-10 00:40:06 +0000437} {1 {incomplete input}}
drh4b2f9362008-01-22 23:37:09 +0000438do_test main-3.2.30 {
439 catchsql {select 123--5}
440} {0 123}
441
drhc837e702000-06-08 16:26:24 +0000442
443do_test main-3.3 {
444 catch {db close}
mistachkinfda06be2011-08-02 00:57:34 +0000445 foreach f [glob -nocomplain testdb/*] {forcedelete $f}
446 forcedelete testdb
drhef4ac8f2004-06-19 00:16:31 +0000447 sqlite3 db testdb
drhc837e702000-06-08 16:26:24 +0000448 execsql {
drh48e5aa22005-01-11 17:46:41 +0000449 create table T1(X REAL); /* C-style comments allowed */
drhbb07e9a2003-04-16 02:17:35 +0000450 insert into T1 values(0.5);
drhc837e702000-06-08 16:26:24 +0000451 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);
drhbb07e9a2003-04-16 02:17:35 +0000456 insert into T1 values(0.5e2);
457 insert into T1 values(0.5E+02);
drhc837e702000-06-08 16:26:24 +0000458 insert into T1 values(5E+02);
drhbb07e9a2003-04-16 02:17:35 +0000459 insert into T1 values(5.0E+03);
drhc837e702000-06-08 16:26:24 +0000460 select x*10 from T1 order by x*5;
461 }
drh8a512562005-11-14 22:29:05 +0000462} {-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 +0000463do_test main-3.4 {
464 set v [catch {execsql {create bogus}} msg]
465 lappend v $msg
466} {1 {near "bogus": syntax error}}
467do_test main-3.5 {
468 set v [catch {execsql {create}} msg]
469 lappend v $msg
drh6116ee42018-01-10 00:40:06 +0000470} {1 {incomplete input}}
drhbb7ac002005-08-12 22:58:53 +0000471do_test main-3.6 {
472 catchsql {SELECT 'abc' + #9}
473} {1 {near "#9": syntax error}}
474
danielk1977ca0c8972007-09-01 09:02:53 +0000475# The following test-case tests the linked list code used to manage
476# sqlite3_vfs structures.
drh695ba062008-09-18 18:18:29 +0000477if {$::tcl_platform(platform)=="unix"
danielk19776f050aa2009-04-25 08:39:14 +0000478 && [info command sqlite3async_initialize]!=""} {
drh47538892007-09-03 15:42:47 +0000479 ifcapable threadsafe {
480 do_test main-4.1 {
481 sqlite3_crash_enable 1
482 sqlite3_crash_enable 0
483
danielk19776f050aa2009-04-25 08:39:14 +0000484 sqlite3async_initialize "" 1
485 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000486
487 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000488 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000489 sqlite3_crash_enable 0
danielk19776f050aa2009-04-25 08:39:14 +0000490 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000491
492 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000493 sqlite3async_initialize "" 1
494 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000495 sqlite3_crash_enable 0
496
danielk19776f050aa2009-04-25 08:39:14 +0000497 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000498 sqlite3_crash_enable 1
499 sqlite3_crash_enable 0
danielk19776f050aa2009-04-25 08:39:14 +0000500 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000501
danielk19776f050aa2009-04-25 08:39:14 +0000502 sqlite3async_initialize "" 1
drh47538892007-09-03 15:42:47 +0000503 sqlite3_crash_enable 1
danielk19776f050aa2009-04-25 08:39:14 +0000504 sqlite3async_shutdown
drh47538892007-09-03 15:42:47 +0000505 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}
drh5bfff9d2015-01-08 01:05:42 +0000517
518# Print the version number so that it can be picked up by releasetest.tcl.
519#
520puts [db one {SELECT 'VERSION: ' ||
521 sqlite_version() || ' ' ||
522 sqlite_source_id();}]
drhedb31cd2015-01-08 02:15:11 +0000523
524# Do deliberate failures if the TEST_FAILURE environment variable is set.
525# This is done to verify that failure notifications are detected by the
526# releasetest.tcl script, or possibly by other scripts involved in automatic
527# testing.
528#
529if {[info exists ::env(TEST_FAILURE)]} {
530 set res 123
531 if {$::env(TEST_FAILURE)==0} {set res 234}
532 do_test main-99.1 {
533 bad_behavior $::env(TEST_FAILURE)
534 set x 123
535 } $res
536}
drh47538892007-09-03 15:42:47 +0000537
drhcc85b412000-06-07 15:11:27 +0000538finish_test