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.20 2005/02/26 17:31:28 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.18 { 89 db complete { 90 CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; END; 91 } 92 } {1} 93 do_test main-1.19 { 94 db complete { 95 CREATE TRIGGER xyz AFTER DELETE abc BEGIN 96 UPDATE pqr; 97 unknown command; 98 } 99 } {0} 100 do_test main-1.20 { 101 db complete { 102 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 103 UPDATE pqr; 104 } 105 } {0} 106 do_test main-1.21 { 107 db complete { 108 CREATE TRIGGER xyz AFTER DELETE end BEGIN 109 SELECT a, b FROM end; 110 } 111 } {0} 112 do_test main-1.22 { 113 db complete { 114 CREATE TRIGGER xyz AFTER DELETE end BEGIN 115 SELECT a, b FROM end; 116 END; 117 } 118 } {1} 119 do_test main-1.23 { 120 db complete { 121 CREATE TRIGGER xyz AFTER DELETE end BEGIN 122 SELECT a, b FROM end; 123 END; 124 SELECT a, b FROM end; 125 } 126 } {1} 127 do_test main-1.24 { 128 db complete { 129 CREATE TRIGGER xyz AFTER DELETE [;end;] BEGIN 130 UPDATE pqr; 131 } 132 } {0} 133 do_test main-1.25 { 134 db complete { 135 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 136 UPDATE pqr SET a=[;end;];;; 137 } 138 } {0} 139 do_test main-1.26 { 140 db complete { 141 CREATE -- a comment 142 TRIGGER xyz AFTER DELETE backend BEGIN 143 UPDATE pqr SET a=5; 144 } 145 } {0} 146 do_test main-1.27.1 { 147 db complete { 148 CREATE -- a comment 149 TRIGGERX xyz AFTER DELETE backend BEGIN 150 UPDATE pqr SET a=5; 151 } 152 } {1} 153 do_test main-1.27.2 { 154 db complete { 155 CREATE/**/TRIGGER xyz AFTER DELETE backend BEGIN 156 UPDATE pqr SET a=5; 157 } 158 } {0} 159 ifcapable {explain} { 160 do_test main-1.27.3 { 161 db complete { 162 /* */ EXPLAIN -- A comment 163 CREATE/**/TRIGGER xyz AFTER DELETE backend BEGIN 164 UPDATE pqr SET a=5; 165 } 166 } {0} 167 } 168 do_test main-1.27.4 { 169 db complete { 170 BOGUS token 171 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 172 UPDATE pqr SET a=5; 173 } 174 } {1} 175 ifcapable {explain} { 176 do_test main-1.27.5 { 177 db complete { 178 EXPLAIN 179 CREATE TEMP TRIGGER xyz AFTER DELETE backend BEGIN 180 UPDATE pqr SET a=5; 181 } 182 } {0} 183 } 184 do_test main-1.28 { 185 db complete { 186 CREATE TEMPORARY TRIGGER xyz AFTER DELETE backend BEGIN 187 UPDATE pqr SET a=5; 188 } 189 } {0} 190 do_test main-1.29 { 191 db complete { 192 CREATE TRIGGER xyz AFTER DELETE backend BEGIN 193 UPDATE pqr SET a=5; 194 EXPLAIN select * from xyz; 195 } 196 } {0} 197} 198do_test main-1.30 { 199 db complete { 200 CREATE TABLE /* In comment ; */ 201 } 202} {0} 203do_test main-1.31 { 204 db complete { 205 CREATE TABLE /* In comment ; */ hi; 206 } 207} {1} 208do_test main-1.31 { 209 db complete { 210 CREATE TABLE /* In comment ; */; 211 } 212} {1} 213do_test main-1.32 { 214 db complete { 215 stuff; 216 /* 217 CREATE TABLE 218 multiple lines 219 of text 220 */ 221 } 222} {1} 223do_test main-1.33 { 224 db complete { 225 /* 226 CREATE TABLE 227 multiple lines 228 of text; 229 } 230} {0} 231do_test main-1.34 { 232 db complete { 233 /* 234 CREATE TABLE 235 multiple lines "*/ 236 of text; 237 } 238} {1} 239do_test main-1.35 { 240 db complete {hi /**/ there;} 241} {1} 242do_test main-1.36 { 243 db complete {hi there/***/;} 244} {1} 245 246} ;# end ifcapable {complete} 247 248 249# Try to open a database with a corrupt database file. 250# 251do_test main-2.0 { 252 catch {db close} 253 file delete -force test.db 254 set fd [open test.db w] 255 puts $fd hi! 256 close $fd 257 set v [catch {sqlite3 db test.db} msg] 258 if {$v} {lappend v $msg} {lappend v {}} 259} {0 {}} 260 261# Here are some tests for tokenize.c. 262# 263do_test main-3.1 { 264 catch {db close} 265 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 266 file delete -force testdb 267 sqlite3 db testdb 268 set v [catch {execsql {SELECT * from T1 where x!!5}} msg] 269 lappend v $msg 270} {1 {unrecognized token: "!!"}} 271do_test main-3.2 { 272 catch {db close} 273 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 274 file delete -force testdb 275 sqlite3 db testdb 276 set v [catch {execsql {SELECT * from T1 where @x}} msg] 277 lappend v $msg 278} {1 {unrecognized token: "@"}} 279 280do_test main-3.3 { 281 catch {db close} 282 foreach f [glob -nocomplain testdb/*] {file delete -force $f} 283 file delete -force testdb 284 sqlite3 db testdb 285 execsql { 286 create table T1(X REAL); /* C-style comments allowed */ 287 insert into T1 values(0.5); 288 insert into T1 values(0.5e2); 289 insert into T1 values(0.5e-002); 290 insert into T1 values(5e-002); 291 insert into T1 values(-5.0e-2); 292 insert into T1 values(-5.1e-2); 293 insert into T1 values(0.5e2); 294 insert into T1 values(0.5E+02); 295 insert into T1 values(5E+02); 296 insert into T1 values(5.0E+03); 297 select x*10 from T1 order by x*5; 298 } 299} {-0.51 -0.5 0.05 0.5 5.0 500.0 500.0 500.0 5000.0 50000.0} 300do_test main-3.4 { 301 set v [catch {execsql {create bogus}} msg] 302 lappend v $msg 303} {1 {near "bogus": syntax error}} 304do_test main-3.5 { 305 set v [catch {execsql {create}} msg] 306 lappend v $msg 307} {1 {near "create": syntax error}} 308 309finish_test 310