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 519