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.23 2005/01/12 12:44:04 danielk1977 Exp $ 15# 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Return the text values from the current row pointed at by STMT as a list. 21proc get_row_values {STMT} { 22 set VALUES [list] 23 for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} { 24 lappend VALUES [sqlite3_column_text $STMT $i] 25 } 26 return $VALUES 27} 28 29# Return the column names followed by declaration types for the result set 30# of the SQL statement STMT. 31# 32# i.e. for: 33# CREATE TABLE abc(a text, b integer); 34# SELECT * FROM abc; 35# 36# The result is {a b text integer} 37proc get_column_names {STMT} { 38 set VALUES [list] 39 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 40 lappend VALUES [sqlite3_column_name $STMT $i] 41 } 42 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 43 lappend VALUES [sqlite3_column_decltype $STMT $i] 44 } 45 return $VALUES 46} 47 48# Check basic functionality 49# 50do_test capi2-1.1 { 51 db close 52 set DB [sqlite3 db test.db] 53 execsql {CREATE TABLE t1(a,b,c)} 54 set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL] 55 set TAIL 56} {} 57do_test capi2-1.2 { 58 sqlite3_step $VM 59} {SQLITE_ROW} 60do_test capi2-1.3 { 61 sqlite3_data_count $VM 62} {2} 63do_test capi2-1.4 { 64 get_row_values $VM 65} {t1 1} 66do_test capi2-1.5 { 67 get_column_names $VM 68} {name rowid text INTEGER} 69do_test capi2-1.6 { 70 sqlite3_step $VM 71} {SQLITE_DONE} 72do_test capi2-1.7 { 73 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 74} {2 {} {name rowid text INTEGER}} 75do_test capi2-1.8 { 76 sqlite3_step $VM 77} {SQLITE_MISUSE} 78 79# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot 80# be interrogated for more information. However in v3, since the column 81# count, names and types are determined at compile time, these are still 82# accessible after an SQLITE_MISUSE error. 83do_test capi2-1.9 { 84 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 85} {2 {} {name rowid text INTEGER}} 86do_test capi2-1.10 { 87 sqlite3_data_count $VM 88} {0} 89 90do_test capi2-1.11 { 91 sqlite3_finalize $VM 92} {SQLITE_OK} 93 94# Check to make sure that the "tail" of a multi-statement SQL script 95# is returned by sqlite3_prepare. 96# 97do_test capi2-2.1 { 98 set SQL { 99 SELECT name, rowid FROM sqlite_master; 100 SELECT name, rowid FROM sqlite_temp_master; 101 -- A comment at the end 102 } 103 set VM [sqlite3_prepare $DB $SQL -1 SQL] 104 set SQL 105} { 106 SELECT name, rowid FROM sqlite_temp_master; 107 -- A comment at the end 108 } 109do_test capi2-2.2 { 110 set r [sqlite3_step $VM] 111 lappend r [sqlite3_column_count $VM] \ 112 [get_row_values $VM] \ 113 [get_column_names $VM] 114} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}} 115do_test capi2-2.3 { 116 set r [sqlite3_step $VM] 117 lappend r [sqlite3_column_count $VM] \ 118 [get_row_values $VM] \ 119 [get_column_names $VM] 120} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 121do_test capi2-2.4 { 122 sqlite3_finalize $VM 123} {SQLITE_OK} 124do_test capi2-2.5 { 125 set VM [sqlite3_prepare $DB $SQL -1 SQL] 126 set SQL 127} { 128 -- A comment at the end 129 } 130do_test capi2-2.6 { 131 set r [sqlite3_step $VM] 132 lappend r [sqlite3_column_count $VM] \ 133 [get_row_values $VM] \ 134 [get_column_names $VM] 135} {SQLITE_DONE 2 {} {name rowid text INTEGER}} 136do_test capi2-2.7 { 137 sqlite3_finalize $VM 138} {SQLITE_OK} 139do_test capi2-2.8 { 140 set VM [sqlite3_prepare $DB $SQL -1 SQL] 141 list $SQL $VM 142} {{} {}} 143 144# Check the error handling. 145# 146do_test capi2-3.1 { 147 set rc [catch { 148 sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL 149 } msg] 150 lappend rc $msg $TAIL 151} {1 {(1) no such column: bogus} {}} 152do_test capi2-3.2 { 153 set rc [catch { 154 sqlite3_prepare $DB {select bogus from } -1 TAIL 155 } msg] 156 lappend rc $msg $TAIL 157} {1 {(1) near " ": syntax error} {}} 158do_test capi2-3.3 { 159 set rc [catch { 160 sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL 161 } msg] 162 lappend rc $msg $TAIL 163} {1 {(1) no such column: bogus} {}} 164do_test capi2-3.4 { 165 set rc [catch { 166 sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL 167 } msg] 168 lappend rc $msg $TAIL 169} {1 {(1) no such column: bogus} {x;}} 170do_test capi2-3.5 { 171 set rc [catch { 172 sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL 173 } msg] 174 lappend rc $msg $TAIL 175} {1 {(1) no such column: bogus} {;;x;}} 176do_test capi2-3.6 { 177 set rc [catch { 178 sqlite3_prepare $DB {select 5/0} -1 TAIL 179 } VM] 180 lappend rc $TAIL 181} {0 {}} 182do_test capi2-3.7 { 183 list [sqlite3_step $VM] \ 184 [sqlite3_column_count $VM] \ 185 [get_row_values $VM] \ 186 [get_column_names $VM] 187} {SQLITE_ROW 1 {{}} {5/0 {}}} 188do_test capi2-3.8 { 189 sqlite3_finalize $VM 190} {SQLITE_OK} 191do_test capi2-3.9 { 192 execsql {CREATE UNIQUE INDEX i1 ON t1(a)} 193 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL] 194 set TAIL 195} {} 196do_test capi2-3.9b {db changes} {0} 197do_test capi2-3.10 { 198 list [sqlite3_step $VM] \ 199 [sqlite3_column_count $VM] \ 200 [get_row_values $VM] \ 201 [get_column_names $VM] 202} {SQLITE_DONE 0 {} {}} 203 204# Update for v3 - the change has not actually happened until the query is 205# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe? 206# (Later:) The change now happens just before SQLITE_DONE is returned. 207do_test capi2-3.10b {db changes} {1} 208do_test capi2-3.11 { 209 sqlite3_finalize $VM 210} {SQLITE_OK} 211do_test capi2-3.11b {db changes} {1} 212do_test capi2-3.12 { 213 sqlite3_finalize $VM 214} {SQLITE_MISUSE} 215do_test capi2-3.13 { 216 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL] 217 list [sqlite3_step $VM] \ 218 [sqlite3_column_count $VM] \ 219 [get_row_values $VM] \ 220 [get_column_names $VM] 221} {SQLITE_ERROR 0 {} {}} 222 223# Update for v3: Preparing a statement does not affect the change counter. 224# (Test result changes from 0 to 1). (Later:) change counter updates occur 225# when sqlite3_step returns, not at finalize time. 226do_test capi2-3.13b {db changes} {0} 227 228do_test capi2-3.14 { 229 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 230} {SQLITE_CONSTRAINT {column a is not unique}} 231do_test capi2-3.15 { 232 set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL] 233 set TAIL 234} {} 235do_test capi2-3.16 { 236 list [sqlite3_step $VM] \ 237 [sqlite3_column_count $VM] \ 238 [get_row_values $VM] \ 239 [get_column_names $VM] 240} {SQLITE_DONE 0 {} {}} 241do_test capi2-3.17 { 242 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 243} {SQLITE_OK {not an error}} 244do_test capi2-3.18 { 245 set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL] 246 list [sqlite3_step $VM] \ 247 [sqlite3_column_count $VM] \ 248 [get_row_values $VM] \ 249 [get_column_names $VM] 250} {SQLITE_ERROR 0 {} {}} 251do_test capi2-3.19 { 252 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 253} {SQLITE_CONSTRAINT {t2.a may not be NULL}} 254 255# Two or more virtual machines exists at the same time. 256# 257do_test capi2-4.1 { 258 set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL] 259 set TAIL 260} {} 261do_test capi2-4.2 { 262 set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] 263 set TAIL 264} {} 265do_test capi2-4.3 { 266 set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL] 267 set TAIL 268} {} 269do_test capi2-4.4 { 270 list [sqlite3_step $VM2] \ 271 [sqlite3_column_count $VM2] \ 272 [get_row_values $VM2] \ 273 [get_column_names $VM2] 274} {SQLITE_DONE 0 {} {}} 275do_test capi2-4.5 { 276 execsql {SELECT * FROM t2 ORDER BY a} 277} {2 3} 278do_test capi2-4.6 { 279 sqlite3_finalize $VM2 280} {SQLITE_OK} 281do_test capi2-4.7 { 282 list [sqlite3_step $VM3] \ 283 [sqlite3_column_count $VM3] \ 284 [get_row_values $VM3] \ 285 [get_column_names $VM3] 286} {SQLITE_DONE 0 {} {}} 287do_test capi2-4.8 { 288 execsql {SELECT * FROM t2 ORDER BY a} 289} {2 3 3 4} 290do_test capi2-4.9 { 291 sqlite3_finalize $VM3 292} {SQLITE_OK} 293do_test capi2-4.10 { 294 list [sqlite3_step $VM1] \ 295 [sqlite3_column_count $VM1] \ 296 [get_row_values $VM1] \ 297 [get_column_names $VM1] 298} {SQLITE_DONE 0 {} {}} 299do_test capi2-4.11 { 300 execsql {SELECT * FROM t2 ORDER BY a} 301} {1 2 2 3 3 4} 302do_test capi2-4.12 { 303 sqlite3_finalize $VM1 304} {SQLITE_OK} 305 306# Interleaved SELECTs 307# 308do_test capi2-5.1 { 309 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 310 set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 311 set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 312 list [sqlite3_step $VM1] \ 313 [sqlite3_column_count $VM1] \ 314 [get_row_values $VM1] \ 315 [get_column_names $VM1] 316} {SQLITE_ROW 2 {2 3} {a b {} {}}} 317do_test capi2-5.2 { 318 list [sqlite3_step $VM2] \ 319 [sqlite3_column_count $VM2] \ 320 [get_row_values $VM2] \ 321 [get_column_names $VM2] 322} {SQLITE_ROW 2 {2 3} {a b {} {}}} 323do_test capi2-5.3 { 324 list [sqlite3_step $VM1] \ 325 [sqlite3_column_count $VM1] \ 326 [get_row_values $VM1] \ 327 [get_column_names $VM1] 328} {SQLITE_ROW 2 {3 4} {a b {} {}}} 329do_test capi2-5.4 { 330 list [sqlite3_step $VM3] \ 331 [sqlite3_column_count $VM3] \ 332 [get_row_values $VM3] \ 333 [get_column_names $VM3] 334} {SQLITE_ROW 2 {2 3} {a b {} {}}} 335do_test capi2-5.5 { 336 list [sqlite3_step $VM3] \ 337 [sqlite3_column_count $VM3] \ 338 [get_row_values $VM3] \ 339 [get_column_names $VM3] 340} {SQLITE_ROW 2 {3 4} {a b {} {}}} 341do_test capi2-5.6 { 342 list [sqlite3_step $VM3] \ 343 [sqlite3_column_count $VM3] \ 344 [get_row_values $VM3] \ 345 [get_column_names $VM3] 346} {SQLITE_ROW 2 {1 2} {a b {} {}}} 347do_test capi2-5.7 { 348 list [sqlite3_step $VM3] \ 349 [sqlite3_column_count $VM3] \ 350 [get_row_values $VM3] \ 351 [get_column_names $VM3] 352} {SQLITE_DONE 2 {} {a b {} {}}} 353do_test capi2-5.8 { 354 sqlite3_finalize $VM3 355} {SQLITE_OK} 356do_test capi2-5.9 { 357 list [sqlite3_step $VM1] \ 358 [sqlite3_column_count $VM1] \ 359 [get_row_values $VM1] \ 360 [get_column_names $VM1] 361} {SQLITE_ROW 2 {1 2} {a b {} {}}} 362do_test capi2-5.10 { 363 sqlite3_finalize $VM1 364} {SQLITE_OK} 365do_test capi2-5.11 { 366 list [sqlite3_step $VM2] \ 367 [sqlite3_column_count $VM2] \ 368 [get_row_values $VM2] \ 369 [get_column_names $VM2] 370} {SQLITE_ROW 2 {3 4} {a b {} {}}} 371do_test capi2-5.12 { 372 list [sqlite3_step $VM2] \ 373 [sqlite3_column_count $VM2] \ 374 [get_row_values $VM2] \ 375 [get_column_names $VM2] 376} {SQLITE_ROW 2 {1 2} {a b {} {}}} 377do_test capi2-5.11 { 378 sqlite3_finalize $VM2 379} {SQLITE_OK} 380 381# Check for proper SQLITE_BUSY returns. 382# 383do_test capi2-6.1 { 384 execsql { 385 BEGIN; 386 CREATE TABLE t3(x counter); 387 INSERT INTO t3 VALUES(1); 388 INSERT INTO t3 VALUES(2); 389 INSERT INTO t3 SELECT x+2 FROM t3; 390 INSERT INTO t3 SELECT x+4 FROM t3; 391 INSERT INTO t3 SELECT x+8 FROM t3; 392 COMMIT; 393 } 394 set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 395 sqlite3 db2 test.db 396 execsql {BEGIN} db2 397} {} 398# Update for v3: BEGIN doesn't write-lock the database. It is quite 399# difficult to get v3 to write-lock the database, which causes a few 400# problems for test scripts. 401# 402# do_test capi2-6.2 { 403# list [sqlite3_step $VM1] \ 404# [sqlite3_column_count $VM1] \ 405# [get_row_values $VM1] \ 406# [get_column_names $VM1] 407# } {SQLITE_BUSY 0 {} {}} 408do_test capi2-6.3 { 409 execsql {COMMIT} db2 410} {} 411do_test capi2-6.4 { 412 list [sqlite3_step $VM1] \ 413 [sqlite3_column_count $VM1] \ 414 [get_row_values $VM1] \ 415 [get_column_names $VM1] 416} {SQLITE_ROW 1 1 {x counter}} 417do_test capi2-6.5 { 418 catchsql {INSERT INTO t3 VALUES(10);} db2 419} {1 {database is locked}} 420do_test capi2-6.6 { 421 list [sqlite3_step $VM1] \ 422 [sqlite3_column_count $VM1] \ 423 [get_row_values $VM1] \ 424 [get_column_names $VM1] 425} {SQLITE_ROW 1 2 {x counter}} 426do_test capi2-6.7 { 427 execsql {SELECT * FROM t2} db2 428} {2 3 3 4 1 2} 429do_test capi2-6.8 { 430 list [sqlite3_step $VM1] \ 431 [sqlite3_column_count $VM1] \ 432 [get_row_values $VM1] \ 433 [get_column_names $VM1] 434} {SQLITE_ROW 1 3 {x counter}} 435do_test capi2-6.9 { 436 execsql {SELECT * FROM t2} 437} {2 3 3 4 1 2} 438do_test capi2-6.10 { 439 list [sqlite3_step $VM1] \ 440 [sqlite3_column_count $VM1] \ 441 [get_row_values $VM1] \ 442 [get_column_names $VM1] 443} {SQLITE_ROW 1 4 {x counter}} 444do_test capi2-6.11 { 445 execsql {BEGIN} 446} {} 447do_test capi2-6.12 { 448 list [sqlite3_step $VM1] \ 449 [sqlite3_column_count $VM1] \ 450 [get_row_values $VM1] \ 451 [get_column_names $VM1] 452} {SQLITE_ROW 1 5 {x counter}} 453 454do_test capi2-6.13 { 455 catchsql {UPDATE t3 SET x=x+1} 456} {1 {database table is locked}} 457do_test capi2-6.14 { 458 list [sqlite3_step $VM1] \ 459 [sqlite3_column_count $VM1] \ 460 [get_row_values $VM1] \ 461 [get_column_names $VM1] 462} {SQLITE_ROW 1 6 {x counter}} 463do_test capi2-6.15 { 464 execsql {SELECT * FROM t1} 465} {1 2 3} 466do_test capi2-6.16 { 467 list [sqlite3_step $VM1] \ 468 [sqlite3_column_count $VM1] \ 469 [get_row_values $VM1] \ 470 [get_column_names $VM1] 471} {SQLITE_ROW 1 7 {x counter}} 472do_test capi2-6.17 { 473 catchsql {UPDATE t1 SET b=b+1} 474} {0 {}} 475do_test capi2-6.18 { 476 list [sqlite3_step $VM1] \ 477 [sqlite3_column_count $VM1] \ 478 [get_row_values $VM1] \ 479 [get_column_names $VM1] 480} {SQLITE_ROW 1 8 {x counter}} 481do_test capi2-6.19 { 482 execsql {SELECT * FROM t1} 483} {1 3 3} 484do_test capi2-6.20 { 485 list [sqlite3_step $VM1] \ 486 [sqlite3_column_count $VM1] \ 487 [get_row_values $VM1] \ 488 [get_column_names $VM1] 489} {SQLITE_ROW 1 9 {x counter}} 490#do_test capi2-6.21 { 491# execsql {ROLLBACK; SELECT * FROM t1} 492#} {1 2 3} 493do_test capi2-6.22 { 494 list [sqlite3_step $VM1] \ 495 [sqlite3_column_count $VM1] \ 496 [get_row_values $VM1] \ 497 [get_column_names $VM1] 498} {SQLITE_ROW 1 10 {x counter}} 499#do_test capi2-6.23 { 500# execsql {BEGIN TRANSACTION;} 501#} {} 502do_test capi2-6.24 { 503 list [sqlite3_step $VM1] \ 504 [sqlite3_column_count $VM1] \ 505 [get_row_values $VM1] \ 506 [get_column_names $VM1] 507} {SQLITE_ROW 1 11 {x counter}} 508do_test capi2-6.25 { 509 execsql { 510 INSERT INTO t1 VALUES(2,3,4); 511 SELECT * FROM t1; 512 } 513} {1 3 3 2 3 4} 514do_test capi2-6.26 { 515 list [sqlite3_step $VM1] \ 516 [sqlite3_column_count $VM1] \ 517 [get_row_values $VM1] \ 518 [get_column_names $VM1] 519} {SQLITE_ROW 1 12 {x counter}} 520do_test capi2-6.27 { 521 catchsql { 522 INSERT INTO t1 VALUES(2,4,5); 523 SELECT * FROM t1; 524 } 525} {1 {column a is not unique}} 526do_test capi2-6.28 { 527 list [sqlite3_step $VM1] \ 528 [sqlite3_column_count $VM1] \ 529 [get_row_values $VM1] \ 530 [get_column_names $VM1] 531} {SQLITE_ROW 1 13 {x counter}} 532do_test capi2-6.99 { 533 sqlite3_finalize $VM1 534} {SQLITE_OK} 535catchsql {ROLLBACK} 536 537do_test capi2-7.1 { 538 stepsql $DB { 539 SELECT * FROM t1 540 } 541} {0 1 2 3} 542do_test capi2-7.2 { 543 stepsql $DB { 544 PRAGMA count_changes=on 545 } 546} {0} 547do_test capi2-7.3 { 548 stepsql $DB { 549 UPDATE t1 SET a=a+10; 550 } 551} {0 1} 552do_test capi2-7.4 { 553 stepsql $DB { 554 INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1; 555 } 556} {0 1} 557do_test capi2-7.4b {sqlite3_changes $DB} {1} 558do_test capi2-7.5 { 559 stepsql $DB { 560 UPDATE t1 SET a=a+10; 561 } 562} {0 2} 563do_test capi2-7.5b {sqlite3_changes $DB} {2} 564do_test capi2-7.6 { 565 stepsql $DB { 566 SELECT * FROM t1; 567 } 568} {0 21 2 3 22 3 4} 569do_test capi2-7.7 { 570 stepsql $DB { 571 INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1; 572 } 573} {0 2} 574do_test capi2-7.8 { 575 sqlite3_changes $DB 576} {2} 577do_test capi2-7.9 { 578 stepsql $DB { 579 SELECT * FROM t1; 580 } 581} {0 21 2 3 22 3 4 23 4 5 24 5 6} 582do_test capi2-7.10 { 583 stepsql $DB { 584 UPDATE t1 SET a=a-20; 585 SELECT * FROM t1; 586 } 587} {0 4 1 2 3 2 3 4 3 4 5 4 5 6} 588 589# Update for version 3: A SELECT statement no longer resets the change 590# counter (Test result changes from 0 to 4). 591do_test capi2-7.11 { 592 sqlite3_changes $DB 593} {4} 594do_test capi2-7.11a { 595 execsql {SELECT count(*) FROM t1} 596} {4} 597 598ifcapable {explain} { 599 do_test capi2-7.12 { 600 set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] 601 lindex $x 0 602 } {0} 603} 604 605# Ticket #261 - make sure we can finalize before the end of a query. 606# 607do_test capi2-8.1 { 608 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 609 sqlite3_finalize $VM1 610} {SQLITE_OK} 611 612# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare 613# and all of the return pointers in sqlite_step can be null. 614# 615do_test capi2-9.1 { 616 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY] 617 sqlite3_step $VM1 618 sqlite3_finalize $VM1 619} {SQLITE_OK} 620 621do_test capi2-10.1 { 622 sqlite3_finalize 0 623} {SQLITE_OK} 624do_test capi2-10.2 { 625 sqlite3_reset 0 626} {SQLITE_OK} 627 628db2 close 629 630finish_test 631