1# 2# 2003 January 29 3# 4# The author disclaims copyright to this source code. In place of 5# a legal notice, here is a blessing: 6# 7# May you do good and not evil. 8# May you find forgiveness for yourself and forgive others. 9# May you share freely, never taking more than you give. 10# 11#*********************************************************************** 12# This file implements regression tests for SQLite library. The 13# focus of this script testing the callback-free C/C++ API. 14# 15# $Id: capi2.test,v 1.10 2003/08/05 13:13:38 drh Exp $ 16# 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21# Check basic functionality 22# 23do_test capi2-1.1 { 24 db close 25 set DB [sqlite db test.db] 26 execsql {CREATE TABLE t1(a,b,c)} 27 set VM [sqlite_compile $DB {SELECT name, rowid FROM sqlite_master} TAIL] 28 set TAIL 29} {} 30do_test capi2-1.2 { 31 sqlite_step $VM N VALUES COLNAMES 32} {SQLITE_ROW} 33do_test capi2-1.3 { 34 set N 35} {2} 36do_test capi2-1.4 { 37 set VALUES 38} {t1 1} 39do_test capi2-1.5 { 40 set COLNAMES 41} {name rowid text INTEGER} 42do_test capi2-1.6 { 43 set N x 44 set VALUES y 45 set COLNAMES z 46 sqlite_step $VM N VALUES COLNAMES 47} {SQLITE_DONE} 48do_test capi2-1.7 { 49 list $N $VALUES $COLNAMES 50} {2 {} {name rowid text INTEGER}} 51do_test capi2-1.8 { 52 set N x 53 set VALUES y 54 set COLNAMES z 55 sqlite_step $VM N VALUES COLNAMES 56} {SQLITE_MISUSE} 57do_test capi2-1.9 { 58 list $N $VALUES $COLNAMES 59} {0 {} {}} 60do_test capi2-1.10 { 61 sqlite_finalize $VM 62} {} 63 64# Check to make sure that the "tail" of a multi-statement SQL script 65# is returned by sqlite_compile. 66# 67do_test capi2-2.1 { 68 set SQL { 69 SELECT name, rowid FROM sqlite_master; 70 SELECT name, rowid FROM sqlite_temp_master; 71 -- A comment at the end 72 } 73 set VM [sqlite_compile $DB $SQL SQL] 74 set SQL 75} { 76 SELECT name, rowid FROM sqlite_temp_master; 77 -- A comment at the end 78 } 79do_test capi2-2.2 { 80 set r [sqlite_step $VM n val colname] 81 lappend r $n $val $colname 82} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}} 83do_test capi2-2.3 { 84 set r [sqlite_step $VM n val colname] 85 lappend r $n $val $colname 86} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 87do_test capi2-2.4 { 88 sqlite_finalize $VM 89} {} 90do_test capi2-2.5 { 91 set VM [sqlite_compile $DB $SQL SQL] 92 set SQL 93} { 94 -- A comment at the end 95 } 96do_test capi2-2.6 { 97 set r [sqlite_step $VM n val colname] 98 lappend r $n $val $colname 99} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 100do_test capi2-2.7 { 101 sqlite_finalize $VM 102} {} 103do_test capi2-2.8 { 104 set VM [sqlite_compile $DB $SQL SQL] 105 list $SQL $VM 106} {{} {}} 107 108# Check the error handling. 109# 110do_test capi2-3.1 { 111 set rc [catch { 112 sqlite_compile $DB {select bogus from sqlite_master} TAIL 113 } msg] 114 lappend rc $msg $TAIL 115} {1 {(1) no such column: bogus} {}} 116do_test capi2-3.2 { 117 set rc [catch { 118 sqlite_compile $DB {select bogus from } TAIL 119 } msg] 120 lappend rc $msg $TAIL 121} {1 {(1) near " ": syntax error} {}} 122do_test capi2-3.3 { 123 set rc [catch { 124 sqlite_compile $DB {;;;;select bogus from sqlite_master} TAIL 125 } msg] 126 lappend rc $msg $TAIL 127} {1 {(1) no such column: bogus} {}} 128do_test capi2-3.4 { 129 set rc [catch { 130 sqlite_compile $DB {select bogus from sqlite_master;x;} TAIL 131 } msg] 132 lappend rc $msg $TAIL 133} {1 {(1) no such column: bogus} {x;}} 134do_test capi2-3.5 { 135 set rc [catch { 136 sqlite_compile $DB {select bogus from sqlite_master;;;x;} TAIL 137 } msg] 138 lappend rc $msg $TAIL 139} {1 {(1) no such column: bogus} {;;x;}} 140do_test capi2-3.6 { 141 set rc [catch { 142 sqlite_compile $DB {select 5/0} TAIL 143 } VM] 144 lappend rc $TAIL 145} {0 {}} 146do_test capi2-3.7 { 147 set N {} 148 set VALUE {} 149 set COLNAME {} 150 list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 151} {SQLITE_ROW 1 {{}} {5/0 NUMERIC}} 152do_test capi2-3.8 { 153 sqlite_finalize $VM 154} {} 155do_test capi2-3.9 { 156 execsql {CREATE UNIQUE INDEX i1 ON t1(a)} 157 set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,2,3)} TAIL] 158 set TAIL 159} {} 160do_test capi2-3.9b {db changes} {0} 161do_test capi2-3.10 { 162 set N {} 163 set VALUE {} 164 set COLNAME {} 165 list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 166} {SQLITE_DONE 0 {} {}} 167do_test capi2-3.10b {db changes} {1} 168do_test capi2-3.11 { 169 sqlite_finalize $VM 170} {} 171do_test capi2-3.11b {db changes} {1} 172do_test capi2-3.12 { 173 list [catch {sqlite_finalize $VM} msg] [set msg] 174} {1 {(21) library routine called out of sequence}} 175do_test capi2-3.13 { 176 set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,3,4)} TAIL] 177 list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 178} {SQLITE_ERROR 0 {} {}} 179do_test capi2-3.13b {db changes} {0} 180do_test capi2-3.14 { 181 list [catch {sqlite_finalize $VM} msg] [set msg] 182} {1 {(19) column a is not unique}} 183do_test capi2-3.15 { 184 set VM [sqlite_compile $DB {CREATE TABLE t2(a NOT NULL, b)} TAIL] 185 set TAIL 186} {} 187do_test capi2-3.16 { 188 list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 189} {SQLITE_DONE 0 {} {}} 190do_test capi2-3.17 { 191 list [catch {sqlite_finalize $VM} msg] [set msg] 192} {0 {}} 193do_test capi2-3.18 { 194 set VM [sqlite_compile $DB {INSERT INTO t2 VALUES(NULL,2)} TAIL] 195 list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 196} {SQLITE_ERROR 0 {} {}} 197do_test capi2-3.19 { 198 list [catch {sqlite_finalize $VM} msg] [set msg] 199} {1 {(19) t2.a may not be NULL}} 200 201# Two or more virtual machines exists at the same time. 202# 203do_test capi2-4.1 { 204 set VM1 [sqlite_compile $DB {INSERT INTO t2 VALUES(1,2)} TAIL] 205 set TAIL 206} {} 207do_test capi2-4.2 { 208 set VM2 [sqlite_compile $DB {INSERT INTO t2 VALUES(2,3)} TAIL] 209 set TAIL 210} {} 211do_test capi2-4.3 { 212 set VM3 [sqlite_compile $DB {INSERT INTO t2 VALUES(3,4)} TAIL] 213 set TAIL 214} {} 215do_test capi2-4.4 { 216 list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 217} {SQLITE_DONE 0 {} {}} 218do_test capi2-4.5 { 219 execsql {SELECT * FROM t2 ORDER BY a} 220} {2 3} 221do_test capi2-4.6 { 222 list [catch {sqlite_finalize $VM2} msg] [set msg] 223} {0 {}} 224do_test capi2-4.7 { 225 list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 226} {SQLITE_DONE 0 {} {}} 227do_test capi2-4.8 { 228 execsql {SELECT * FROM t2 ORDER BY a} 229} {2 3 3 4} 230do_test capi2-4.9 { 231 list [catch {sqlite_finalize $VM3} msg] [set msg] 232} {0 {}} 233do_test capi2-4.10 { 234 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 235} {SQLITE_DONE 0 {} {}} 236do_test capi2-4.11 { 237 execsql {SELECT * FROM t2 ORDER BY a} 238} {1 2 2 3 3 4} 239do_test capi2-4.12 { 240 list [catch {sqlite_finalize $VM1} msg] [set msg] 241} {0 {}} 242 243# Interleaved SELECTs 244# 245do_test capi2-5.1 { 246 set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL] 247 set VM2 [sqlite_compile $DB {SELECT * FROM t2} TAIL] 248 set VM3 [sqlite_compile $DB {SELECT * FROM t2} TAIL] 249 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 250} {SQLITE_ROW 2 {2 3} {a b {} {}}} 251do_test capi2-5.2 { 252 list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 253} {SQLITE_ROW 2 {2 3} {a b {} {}}} 254do_test capi2-5.3 { 255 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 256} {SQLITE_ROW 2 {3 4} {a b {} {}}} 257do_test capi2-5.4 { 258 list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 259} {SQLITE_ROW 2 {2 3} {a b {} {}}} 260do_test capi2-5.5 { 261 list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 262} {SQLITE_ROW 2 {3 4} {a b {} {}}} 263do_test capi2-5.6 { 264 list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 265} {SQLITE_ROW 2 {1 2} {a b {} {}}} 266do_test capi2-5.7 { 267 list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 268} {SQLITE_DONE 2 {} {a b {} {}}} 269do_test capi2-5.8 { 270 list [catch {sqlite_finalize $VM3} msg] [set msg] 271} {0 {}} 272do_test capi2-5.9 { 273 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 274} {SQLITE_ROW 2 {1 2} {a b {} {}}} 275do_test capi2-5.10 { 276 list [catch {sqlite_finalize $VM1} msg] [set msg] 277} {0 {}} 278do_test capi2-5.11 { 279 list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 280} {SQLITE_ROW 2 {3 4} {a b {} {}}} 281do_test capi2-5.12 { 282 list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 283} {SQLITE_ROW 2 {1 2} {a b {} {}}} 284do_test capi2-5.11 { 285 list [catch {sqlite_finalize $VM2} msg] [set msg] 286} {0 {}} 287 288# Check for proper SQLITE_BUSY returns. 289# 290do_test capi2-6.1 { 291 execsql { 292 BEGIN; 293 CREATE TABLE t3(x counter); 294 INSERT INTO t3 VALUES(1); 295 INSERT INTO t3 VALUES(2); 296 INSERT INTO t3 SELECT x+2 FROM t3; 297 INSERT INTO t3 SELECT x+4 FROM t3; 298 INSERT INTO t3 SELECT x+8 FROM t3; 299 COMMIT; 300 } 301 set VM1 [sqlite_compile $DB {SELECT * FROM t3} TAIL] 302 sqlite db2 test.db 303 execsql {BEGIN} db2 304} {} 305do_test capi2-6.2 { 306 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 307} {SQLITE_BUSY 0 {} {}} 308do_test capi2-6.3 { 309 execsql {COMMIT} db2 310} {} 311do_test capi2-6.4 { 312 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 313} {SQLITE_ROW 1 1 {x counter}} 314do_test capi2-6.5 { 315 catchsql {BEGIN} db2 316} {1 {database is locked}} 317do_test capi2-6.6 { 318 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 319} {SQLITE_ROW 1 2 {x counter}} 320do_test capi2-6.7 { 321 execsql {SELECT * FROM t2} db2 322} {2 3 3 4 1 2} 323do_test capi2-6.8 { 324 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 325} {SQLITE_ROW 1 3 {x counter}} 326do_test capi2-6.9 { 327 execsql {SELECT * FROM t2} 328} {2 3 3 4 1 2} 329do_test capi2-6.10 { 330 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 331} {SQLITE_ROW 1 4 {x counter}} 332do_test capi2-6.11 { 333 execsql {BEGIN} 334} {} 335do_test capi2-6.12 { 336 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 337} {SQLITE_ROW 1 5 {x counter}} 338# execsql {pragma vdbe_trace=on} 339do_test capi2-6.13 { 340 catchsql {UPDATE t3 SET x=x+1} 341} {1 {database table is locked}} 342do_test capi2-6.14 { 343 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 344} {SQLITE_ROW 1 6 {x counter}} 345# puts [list [catch {sqlite_finalize $VM1} msg] [set msg]]; exit 346do_test capi2-6.15 { 347 execsql {SELECT * FROM t1} 348} {1 2 3} 349do_test capi2-6.16 { 350 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 351} {SQLITE_ROW 1 7 {x counter}} 352do_test capi2-6.17 { 353 catchsql {UPDATE t1 SET b=b+1} 354} {0 {}} 355do_test capi2-6.18 { 356 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 357} {SQLITE_ROW 1 8 {x counter}} 358do_test capi2-6.19 { 359 execsql {SELECT * FROM t1} 360} {1 3 3} 361do_test capi2-6.20 { 362 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 363} {SQLITE_ROW 1 9 {x counter}} 364do_test capi2-6.21 { 365 execsql {ROLLBACK; SELECT * FROM t1} 366} {1 2 3} 367do_test capi2-6.22 { 368 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 369} {SQLITE_ROW 1 10 {x counter}} 370do_test capi2-6.23 { 371 execsql {BEGIN TRANSACTION ON CONFLICT ROLLBACK;} 372} {} 373do_test capi2-6.24 { 374 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 375} {SQLITE_ROW 1 11 {x counter}} 376do_test capi2-6.25 { 377 execsql { 378 INSERT INTO t1 VALUES(2,3,4); 379 SELECT * FROM t1; 380 } 381} {1 2 3 2 3 4} 382do_test capi2-6.26 { 383 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 384} {SQLITE_ROW 1 12 {x counter}} 385do_test capi2-6.27 { 386 catchsql { 387 INSERT INTO t1 VALUES(2,4,5); 388 SELECT * FROM t1; 389 } 390} {1 {column a is not unique}} 391do_test capi2-6.28 { 392 list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] 393} {SQLITE_ROW 1 13 {x counter}} 394do_test capi2-6.99 { 395 list [catch {sqlite_finalize $VM1} msg] [set msg] 396} {0 {}} 397catchsql {ROLLBACK} 398 399do_test capi2-7.1 { 400 stepsql $DB { 401 SELECT * FROM t1 402 } 403} {0 1 2 3} 404do_test capi2-7.2 { 405 stepsql $DB { 406 PRAGMA count_changes=on 407 } 408} {0} 409do_test capi2-7.3 { 410 stepsql $DB { 411 UPDATE t1 SET a=a+10; 412 } 413} {0 1} 414do_test capi2-7.4 { 415 stepsql $DB { 416 INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1; 417 } 418} {0 1} 419do_test capi2-7.4b {db changes} {1} 420do_test capi2-7.5 { 421 stepsql $DB { 422 UPDATE t1 SET a=a+10; 423 } 424} {0 2} 425do_test capi2-7.5b {db changes} {2} 426do_test capi2-7.6 { 427 stepsql $DB { 428 SELECT * FROM t1; 429 } 430} {0 21 2 3 22 3 4} 431do_test capi2-7.7 { 432 stepsql $DB { 433 INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1; 434 } 435} {0 2} 436do_test capi2-7.8 { 437 db changes 438} {2} 439do_test capi2-7.9 { 440 stepsql $DB { 441 SELECT * FROM t1; 442 } 443} {0 21 2 3 22 3 4 23 4 5 24 5 6} 444do_test capi2-7.10 { 445 stepsql $DB { 446 UPDATE t1 SET a=a-20; 447 SELECT * FROM t1; 448 } 449} {0 4 1 2 3 2 3 4 3 4 5 4 5 6} 450do_test capi2-7.11 { 451 db changes 452} {0} 453do_test capi2-7.12 { 454 set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] 455 lindex $x 0 456} {0} 457 458# Ticket #261 - make sure we can finalize before the end of a query. 459# 460do_test capi2-8.1 { 461 set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL] 462 sqlite_finalize $VM1 463} {} 464 465# Tickets #384 and #385 - make sure the TAIL argument to sqlite_compile 466# and all of the return pointers in sqlite_step can be null. 467# 468do_test capi2-9.1 { 469 set VM1 [sqlite_compile $DB {SELECT * FROM t2}] 470 sqlite_step $VM1 471 sqlite_finalize $VM1 472} {} 473 474db2 close 475 476finish_test 477