Enhance the command-line completion extension to return the names of
[sqlite.git] / test / main.test
blob13a385b7c49ef958c2385873cec024c7905dc733
1 # 2001 September 15
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this file is exercising the code in main.c.
14 # $Id: main.test,v 1.32 2009/04/28 04:51:29 drh Exp $
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
19 # Only do the next group of tests if the sqlite3_complete API is available
21 ifcapable {complete} {
23 # Tests of the sqlite_complete() function.
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}
227 } ;# end ifcapable {complete}
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}
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}
299 # Try to open a database with a corrupt database file.
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 {}}
313 # Here are some tests for tokenize.c.  
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
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 {incomplete input}}
438 do_test main-3.2.30 {
439   catchsql {select 123--5}
440 } {0 123}
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 {incomplete input}}
471 do_test main-3.6 {
472   catchsql {SELECT 'abc' + #9}
473 } {1 {near "#9": syntax error}}
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   }
518 # Print the version number so that it can be picked up by releasetest.tcl.
520 puts [db one {SELECT 'VERSION: ' ||
521                   sqlite_version() || ' ' ||
522                   sqlite_source_id();}]
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.
529 if {[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
537     
538 finish_test