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 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19# Only do the next group of tests if the sqlite3_complete API is available 20# 21ifcapable {complete} { 22 23# Tests of the sqlite_complete() function. 24# 25do_test main-1.1 { 26 db complete {This is a test} 27} {0} 28do_test main-1.2 { 29 db complete { 30 } 31} {1} 32do_test main-1.3 { 33 db complete { 34 -- a comment ; 35 } 36} {1} 37do_test main-1.4 { 38 db complete { 39 -- a comment ; 40 ; 41 } 42} {1} 43do_test main-1.5 { 44 db complete {DROP TABLE 'xyz;} 45} {0} 46do_test main-1.6 { 47 db complete {DROP TABLE 'xyz';} 48} {1} 49do_test main-1.7 { 50 db complete {DROP TABLE "xyz;} 51} {0} 52do_test main-1.8 { 53 db complete {DROP TABLE "xyz';} 54} {0} 55do_test main-1.9 { 56 db complete {DROP TABLE "xyz";} 57} {1} 58do_test main-1.10 { 59 db complete {DROP TABLE xyz; hi} 60} {0} 61do_test main-1.11 { 62 db complete {DROP TABLE xyz; } 63} {1} 64do_test main-1.12 { 65 db complete {DROP TABLE xyz; -- hi } 66} {1} 67do_test main-1.13 { 68 db complete {DROP TABLE xyz; -- hi 69 } 70} {1} 71do_test main-1.14 { 72 db complete {SELECT a-b FROM t1; } 73} {1} 74do_test main-1.15 { 75 db complete {SELECT a/e FROM t1 } 76} {0} 77do_test main-1.16 { 78 db complete { 79 CREATE TABLE abc(x,y); 80 } 81} {1} 82ifcapable {trigger} { 83 do_test main-1.17 { 84 db complete { 85 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; 86 } 87 } {0} 88 do_test main-1.17.2 { 89 db complete { 90 EXPLAIN CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; 91 } 92 } {0} 93 do_test main-1.17.3 { 94 db complete { 95 EXPLAIN QUERY PLAN CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; 96 } 97 } {0} 98 do_test main-1.18 { 99 db complete { 100 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; END; 101 } 102 } {1} 103 do_test main-1.19 { 104 db complete { 105 CREATE TRIGGER xyz AFTER DELETE abc BEGIN 106 UPDATE pqr; 107 unknown command; 108 } 109 } {0} 110 do_test main-1.20 { 111 db complete { 112 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 113 UPDATE pqr; 114 } 115 } {0} 116 do_test main-1.21 { 117 db complete { 118 CREATE TRIGGER xyz AFTER DELETE end BEGIN 119 SELECT a, b FROM end; 120 } 121 } {0} 122 do_test main-1.22 { 123 db complete { 124 CREATE TRIGGER xyz AFTER DELETE end BEGIN 125 SELECT a, b FROM end; 126 END; 127 } 128 } {1} 129 do_test main-1.23 { 130 db complete { 131 CREATE TRIGGER xyz AFTER DELETE end BEGIN 132 SELECT a, b FROM end; 133 END; 134 SELECT a, b FROM end; 135 } 136 } {1} 137 do_test main-1.24 { 138 db complete { 139 CREATE TRIGGER xyz AFTER DELETE [;end;] BEGIN 140 UPDATE pqr; 141 } 142 } {0} 143 do_test main-1.25 { 144 db complete { 145 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 146 UPDATE cantor SET a=[;end;];;; 147 } 148 } {0} 149 do_test main-1.26 { 150 db complete { 151 CREATE -- a comment 152 TRIGGER exy AFTER DELETE backend BEGIN 153 UPDATE pqr SET a=5; 154 } 155 } {0} 156 do_test main-1.27.1 { 157 db complete { 158 CREATE -- a comment 159 TRIGGERX tangentxx AFTER DELETE backend BEGIN 160 UPDATE pqr SET a=5; 161 } 162 } {1} 163 do_test main-1.27.2 { 164 db complete { 165 CREATE/**/TRIGGER tiger00 AFTER DELETE backend BEGIN 166 UPDATE pqr SET a=5; 167 } 168 } {0} 169 ifcapable {explain} { 170 do_test main-1.27.3 { 171 db complete { 172 /* */ EXPLAIN -- A comment 173 CREATE/**/TRIGGER ezxyz12 AFTER DELETE backend BEGIN 174 UPDATE pqr SET a=5; 175 } 176 } {0} 177 } 178 do_test main-1.27.4 { 179 db complete { 180 BOGUS token 181 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 182 UPDATE pqr SET a=5; 183 } 184 } {1} 185 ifcapable {explain} { 186 do_test main-1.27.5 { 187 db complete { 188 EXPLAIN 189 CREATE TEMP TRIGGER xyz AFTER DELETE backend BEGIN 190 UPDATE pqr SET a=5; 191 } 192 } {0} 193 } 194 do_test main-1.28 { 195 db complete { 196 CREATE TEMPORARY TRIGGER xyz AFTER DELETE backend BEGIN 197 UPDATE pqr SET a=5; 198 } 199 } {0} 200 do_test main-1.29 { 201 db complete { 202 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 203 UPDATE pqr SET a=5; 204 EXPLAIN select * from xyz; 205 } 206 } {0} 207 208} ;# end ifcapable {complete} 209 210} 211do_test main-1.30 { 212 db complete { 213 CREATE TABLE /* In comment ; */ 214 } 215} {0} 216do_test main-1.31 { 217 db complete { 218 CREATE TABLE /* In comment ; */ hi; 219 } 220} {1} 221do_test main-1.31 { 222 db complete { 223 CREATE TABLE /* In comment ; */; 224 } 225} {1} 226do_test main-1.32 { 227 db complete { 228 stuff; 229 /* 230 CREATE TABLE 231 multiple lines 232 of text 233 */ 234 } 235} {1} 236do_test main-1.33 { 237 db complete { 238 /* 239 CREATE TABLE 240 multiple lines 241 of text; 242 } 243} {0} 244do_test main-1.34 { 245 db complete { 246 /* 247 CREATE TABLE 248 multiple lines "*/ 249 of text; 250 } 251} {1} 252do_test main-1.35 { 253 db complete {hi /**/ there;} 254} {1} 255do_test main-1.36 { 256 db complete {hi there/***/;} 257} {1} 258do_test main-1.37 { 259 db complete {hi there/**} 260} {0} 261do_test main-1.38 { 262 db complete {hi [there} 263} {0} 264 265ifcapable {trigger} { 266 # Characters less than \040 can never be part of an identifier. 267 # Characters greater than \u177 are always identifier characters. 268 do_test main-1.100 { 269 db complete "create \037\036\035\034trigger\001\002;" 270 } {1} 271 do_test main-1.101 { 272 db complete "create trigger\200;" 273 } {1} 274 do_test main-1.102 { 275 db complete "create \200trigger;" 276 } {1} 277} 278 279 280# Try to open a database with a corrupt database file. 281# 282do_test main-2.0 { 283 catch {db close} 284 file delete -force test.db 285 set fd [open test.db w] 286 puts $fd hi! 287 close $fd 288 set v [catch {sqlite3 db test.db} msg] 289 if {$v} {lappend v $msg} {lappend v {}} 290} {0 {}} 291 292# Here are some tests for tokenize.c. 293# 294do_test main-3.1 { 295 catch {db close} 296 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 297 file delete -force testdb 298 sqlite3 db testdb 299 set v [catch {execsql {SELECT * from T1 where x!!5}} msg] 300 lappend v $msg 301} {1 {unrecognized token: "!!"}} 302do_test main-3.2 { 303 catch {db close} 304 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 305 file delete -force testdb 306 sqlite3 db testdb 307 set v [catch {execsql {SELECT * from T1 where ^x}} msg] 308 lappend v $msg 309} {1 {unrecognized token: "^"}} 310do_test main-3.2.2 { 311 catchsql {select 'abc} 312} {1 {unrecognized token: "'abc"}} 313do_test main-3.2.3 { 314 catchsql {select "abc} 315} {1 {unrecognized token: ""abc"}} 316do_test main-3.2.4 { 317 catchsql {select [abc} 318} {1 {unrecognized token: "[abc"}} 319do_test main-3.2.5 { 320 catchsql {select x'4869} 321} {1 {unrecognized token: "x'4869"}} 322do_test main-3.2.6 { 323 catchsql {select x'4869'} 324} {0 Hi} 325do_test main-3.2.7 { 326 catchsql {select x'48695'} 327} {1 {unrecognized token: "x'48695'"}} 328do_test main-3.2.8 { 329 catchsql {select x'486x'} 330} {1 {unrecognized token: "x'486x'"}} 331do_test main-3.2.9 { 332 catchsql {select $abc(} 333} {1 {unrecognized token: "$abc("}} 334do_test main-3.2.10 { 335 catchsql {select $abc(x} 336} {1 {unrecognized token: "$abc(x"}} 337set xyz 123 338do_test main-3.2.11 { 339 catchsql {select $::xyz} 340} {0 123} 341namespace eval ::testnamespace { 342 variable xyz 321 343} 344do_test main-3.2.12 { 345 catchsql {select $testnamespace::xyz} 346} {0 321} 347do_test main-3.2.13 { 348 catchsql {select $(abc)} 349} {1 {unrecognized token: "$"}} 350do_test main-3.2.14 { 351 set hi\u1234x 987 352 db eval "select \$hi\u1234x" 353} {987} 354do_test main-3.2.15 { 355 catchsql "select 456\u1234" 356} [list 1 "unrecognized token: \"456\u1234\""] 357do_test main-3.2.16 { 358 catchsql {select cast(3.14e+4 AS integer)} 359} {0 31400} 360do_test main-3.2.17 { 361 catchsql {select cast(3.14e+04 AS integer)} 362} {0 31400} 363do_test main-3.2.18 { 364 catchsql {select cast(3.14e+004 AS integer)} 365} {0 31400} 366do_test main-3.2.19 { 367 catchsql {select cast(3.14e4 AS integer)} 368} {0 31400} 369do_test main-3.2.20 { 370 catchsql {select cast(3.14e04 AS integer)} 371} {0 31400} 372do_test main-3.2.21 { 373 catchsql {select cast(3.14e004 AS integer)} 374} {0 31400} 375do_test main-3.2.16 { 376 catchsql {select cast(3.14E+4 AS integer)} 377} {0 31400} 378do_test main-3.2.17 { 379 catchsql {select cast(3.14E+04 AS integer)} 380} {0 31400} 381do_test main-3.2.18 { 382 catchsql {select cast(3.14E+004 AS integer)} 383} {0 31400} 384do_test main-3.2.19 { 385 catchsql {select cast(3.14E4 AS integer)} 386} {0 31400} 387do_test main-3.2.20 { 388 catchsql {select cast(3.14E04 AS integer)} 389} {0 31400} 390do_test main-3.2.21 { 391 catchsql {select cast(3.14E004 AS integer)} 392} {0 31400} 393do_test main-3.2.22 { 394 catchsql {select cast(3.14e-4 * 1e8 AS integer)} 395} {0 31400} 396do_test main-3.2.23 { 397 catchsql {select cast(3.14E-04 * 1E08 AS integer)} 398} {0 31400} 399do_test main-3.2.24 { 400 catchsql {select cast(3.14e-004 * 01.0E+8 AS integer)} 401} {0 31400} 402do_test main-3.2.25 { 403 catchsql {select 123/*abc} 404} {0 123} 405do_test main-3.2.26 { 406 catchsql {select 123/***abc} 407} {0 123} 408do_test main-3.2.27 { 409 catchsql {select 123/*/*2} 410} {0 123} 411do_test main-3.2.28 { 412 catchsql {select 123/**/*2} 413} {0 246} 414do_test main-3.2.29 { 415 catchsql {select 123/} 416} {1 {near "/": syntax error}} 417do_test main-3.2.30 { 418 catchsql {select 123--5} 419} {0 123} 420 421 422do_test main-3.3 { 423 catch {db close} 424 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 425 file delete -force testdb 426 sqlite3 db testdb 427 execsql { 428 create table T1(X REAL); /* C-style comments allowed */ 429 insert into T1 values(0.5); 430 insert into T1 values(0.5e2); 431 insert into T1 values(0.5e-002); 432 insert into T1 values(5e-002); 433 insert into T1 values(-5.0e-2); 434 insert into T1 values(-5.1e-2); 435 insert into T1 values(0.5e2); 436 insert into T1 values(0.5E+02); 437 insert into T1 values(5E+02); 438 insert into T1 values(5.0E+03); 439 select x*10 from T1 order by x*5; 440 } 441} {-0.51 -0.5 0.05 0.5 5.0 500.0 500.0 500.0 5000.0 50000.0} 442do_test main-3.4 { 443 set v [catch {execsql {create bogus}} msg] 444 lappend v $msg 445} {1 {near "bogus": syntax error}} 446do_test main-3.5 { 447 set v [catch {execsql {create}} msg] 448 lappend v $msg 449} {1 {near "create": syntax error}} 450do_test main-3.6 { 451 catchsql {SELECT 'abc' + #9} 452} {1 {near "#9": syntax error}} 453 454# The following test-case tests the linked list code used to manage 455# sqlite3_vfs structures. 456if {$::tcl_platform(platform)=="unix" 457 && [info command sqlite3async_initialize]!=""} { 458 ifcapable threadsafe { 459 do_test main-4.1 { 460 sqlite3_crash_enable 1 461 sqlite3_crash_enable 0 462 463 sqlite3async_initialize "" 1 464 sqlite3async_shutdown 465 466 sqlite3_crash_enable 1 467 sqlite3async_initialize "" 1 468 sqlite3_crash_enable 0 469 sqlite3async_shutdown 470 471 sqlite3_crash_enable 1 472 sqlite3async_initialize "" 1 473 sqlite3async_shutdown 474 sqlite3_crash_enable 0 475 476 sqlite3async_initialize "" 1 477 sqlite3_crash_enable 1 478 sqlite3_crash_enable 0 479 sqlite3async_shutdown 480 481 sqlite3async_initialize "" 1 482 sqlite3_crash_enable 1 483 sqlite3async_shutdown 484 sqlite3_crash_enable 0 485 } {} 486 do_test main-4.2 { 487 set rc [catch {sqlite3 db test.db -vfs crash} msg] 488 list $rc $msg 489 } {1 {no such vfs: crash}} 490 do_test main-4.3 { 491 set rc [catch {sqlite3 db test.db -vfs async} msg] 492 list $rc $msg 493 } {1 {no such vfs: async}} 494 } 495} 496 497finish_test 498