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