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: capi3.test,v 1.33 2005/06/06 17:54:56 drh Exp $ 15# 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Return the UTF-16 representation of the supplied UTF-8 string $str. 21# If $nt is true, append two 0x00 bytes as a nul terminator. 22proc utf16 {str {nt 1}} { 23 set r [encoding convertto unicode $str] 24 if {$nt} { 25 append r "\x00\x00" 26 } 27 return $r 28} 29 30# Return the UTF-8 representation of the supplied UTF-16 string $str. 31proc utf8 {str} { 32 # If $str ends in two 0x00 0x00 bytes, knock these off before 33 # converting to UTF-8 using TCL. 34 binary scan $str \c* vals 35 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 36 set str [binary format \c* [lrange $vals 0 end-2]] 37 } 38 39 set r [encoding convertfrom unicode $str] 40 return $r 41} 42 43# These tests complement those in capi2.test. They are organized 44# as follows: 45# 46# capi3-1.*: Test sqlite3_prepare 47# capi3-2.*: Test sqlite3_prepare16 48# capi3-3.*: Test sqlite3_open 49# capi3-4.*: Test sqlite3_open16 50# capi3-5.*: Test the various sqlite3_result_* APIs 51# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs. 52# 53 54db close 55set DB [sqlite3 db test.db] 56 57do_test capi3-1.0 { 58 sqlite3_get_autocommit $DB 59} 1 60do_test capi3-1.1 { 61 set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL] 62 sqlite3_finalize $STMT 63 set TAIL 64} {} 65do_test capi3-1.2 { 66 sqlite3_errcode $DB 67} {SQLITE_OK} 68do_test capi3-1.3 { 69 sqlite3_errmsg $DB 70} {not an error} 71do_test capi3-1.4 { 72 set sql {SELECT name FROM sqlite_master;SELECT 10} 73 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 74 sqlite3_finalize $STMT 75 set TAIL 76} {SELECT 10} 77do_test capi3-1.5 { 78 set sql {SELECT namex FROM sqlite_master} 79 catch { 80 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 81 } 82} {1} 83do_test capi3-1.6 { 84 sqlite3_errcode $DB 85} {SQLITE_ERROR} 86do_test capi3-1.7 { 87 sqlite3_errmsg $DB 88} {no such column: namex} 89 90ifcapable {utf16} { 91do_test capi3-2.1 { 92 set sql16 [utf16 {SELECT name FROM sqlite_master}] 93 set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL] 94 sqlite3_finalize $STMT 95 utf8 $::TAIL 96} {} 97do_test capi3-2.2 { 98 set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] 99 set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] 100 sqlite3_finalize $STMT 101 utf8 $TAIL 102} {SELECT 10} 103do_test capi3-2.3 { 104 set sql [utf16 {SELECT namex FROM sqlite_master}] 105 catch { 106 set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] 107 } 108} {1} 109do_test capi3-2.4 { 110 sqlite3_errcode $DB 111} {SQLITE_ERROR} 112do_test capi3-2.5 { 113 sqlite3_errmsg $DB 114} {no such column: namex} 115} ;# endif utf16 116 117# rename sqlite3_open sqlite3_open_old 118# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options} 119 120do_test capi3-3.1 { 121 set db2 [sqlite3_open test.db {}] 122 sqlite3_errcode $db2 123} {SQLITE_OK} 124# FIX ME: Should test the db handle works. 125do_test capi3-3.2 { 126 sqlite3_close $db2 127} {SQLITE_OK} 128do_test capi3-3.3 { 129 catch { 130 set db2 [sqlite3_open /bogus/path/test.db {}] 131 } 132 sqlite3_errcode $db2 133} {SQLITE_CANTOPEN} 134do_test capi3-3.4 { 135 sqlite3_errmsg $db2 136} {unable to open database file} 137do_test capi3-3.5 { 138 sqlite3_close $db2 139} {SQLITE_OK} 140do_test capi3-3.6.1 { 141 sqlite3_close $db2 142} {SQLITE_MISUSE} 143do_test capi3-3.6.2 { 144 sqlite3_errmsg $db2 145} {library routine called out of sequence} 146ifcapable {utf16} { 147 do_test capi3-3.6.3 { 148 utf8 [sqlite3_errmsg16 $db2] 149 } {library routine called out of sequence} 150} 151 152# rename sqlite3_open "" 153# rename sqlite3_open_old sqlite3_open 154 155ifcapable {utf16} { 156do_test capi3-4.1 { 157 set db2 [sqlite3_open16 [utf16 test.db] {}] 158 sqlite3_errcode $db2 159} {SQLITE_OK} 160# FIX ME: Should test the db handle works. 161do_test capi3-4.2 { 162 sqlite3_close $db2 163} {SQLITE_OK} 164do_test capi3-4.3 { 165 catch { 166 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] 167 } 168 sqlite3_errcode $db2 169} {SQLITE_CANTOPEN} 170do_test capi3-4.4 { 171 utf8 [sqlite3_errmsg16 $db2] 172} {unable to open database file} 173do_test capi3-4.5 { 174 sqlite3_close $db2 175} {SQLITE_OK} 176} ;# utf16 177 178# This proc is used to test the following API calls: 179# 180# sqlite3_column_count 181# sqlite3_column_name 182# sqlite3_column_name16 183# sqlite3_column_decltype 184# sqlite3_column_decltype16 185# 186# $STMT is a compiled SQL statement. $test is a prefix 187# to use for test names within this proc. $names is a list 188# of the column names that should be returned by $STMT. 189# $decltypes is a list of column declaration types for $STMT. 190# 191# Example: 192# 193# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY] 194# check_header test1.1 {1 2 3} {"" "" ""} 195# 196proc check_header {STMT test names decltypes} { 197 198 # Use the return value of sqlite3_column_count() to build 199 # a list of column indexes. i.e. If sqlite3_column_count 200 # is 3, build the list {0 1 2}. 201 set ::idxlist [list] 202 set ::numcols [sqlite3_column_count $STMT] 203 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 204 205 # Column names in UTF-8 206 do_test $test.1 { 207 set cnamelist [list] 208 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 209 set cnamelist 210 } $names 211 212 # Column names in UTF-16 213 ifcapable {utf16} { 214 do_test $test.2 { 215 set cnamelist [list] 216 foreach i $idxlist { 217 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 218 } 219 set cnamelist 220 } $names 221 } 222 223 # Column names in UTF-8 224 do_test $test.3 { 225 set cnamelist [list] 226 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 227 set cnamelist 228 } $names 229 230 # Column names in UTF-16 231 ifcapable {utf16} { 232 do_test $test.4 { 233 set cnamelist [list] 234 foreach i $idxlist { 235 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 236 } 237 set cnamelist 238 } $names 239 } 240 241 # Column names in UTF-8 242 do_test $test.5 { 243 set cnamelist [list] 244 foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} 245 set cnamelist 246 } $decltypes 247 248 # Column declaration types in UTF-16 249 ifcapable {utf16} { 250 do_test $test.6 { 251 set cnamelist [list] 252 foreach i $idxlist { 253 lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] 254 } 255 set cnamelist 256 } $decltypes 257 } 258 259 260 # Test some out of range conditions: 261 ifcapable {utf16} { 262 do_test $test.7 { 263 list \ 264 [sqlite3_column_name $STMT -1] \ 265 [sqlite3_column_name16 $STMT -1] \ 266 [sqlite3_column_decltype $STMT -1] \ 267 [sqlite3_column_decltype16 $STMT -1] \ 268 [sqlite3_column_name $STMT $numcols] \ 269 [sqlite3_column_name16 $STMT $numcols] \ 270 [sqlite3_column_decltype $STMT $numcols] \ 271 [sqlite3_column_decltype16 $STMT $numcols] 272 } {{} {} {} {} {} {} {} {}} 273 } 274 275} 276 277# This proc is used to test the following APIs: 278# 279# sqlite3_data_count 280# sqlite3_column_type 281# sqlite3_column_int 282# sqlite3_column_text 283# sqlite3_column_text16 284# sqlite3_column_double 285# 286# $STMT is a compiled SQL statement for which the previous call 287# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use 288# for test names within this proc. $types is a list of the 289# manifest types for the current row. $ints, $doubles and $strings 290# are lists of the integer, real and string representations of 291# the values in the current row. 292# 293# Example: 294# 295# set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY] 296# sqlite3_step $STMT 297# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}} 298# 299proc check_data {STMT test types ints doubles strings} { 300 301 # Use the return value of sqlite3_column_count() to build 302 # a list of column indexes. i.e. If sqlite3_column_count 303 # is 3, build the list {0 1 2}. 304 set ::idxlist [list] 305 set numcols [sqlite3_data_count $STMT] 306 for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i} 307 308# types 309do_test $test.1 { 310 set types [list] 311 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 312 set types 313} $types 314 315# Integers 316do_test $test.2 { 317 set ints [list] 318 foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} 319 set ints 320} $ints 321 322# bytes 323set lens [list] 324foreach i $::idxlist { 325 lappend lens [string length [lindex $strings $i]] 326} 327do_test $test.3 { 328 set bytes [list] 329 set lens [list] 330 foreach i $idxlist { 331 lappend bytes [sqlite3_column_bytes $STMT $i] 332 } 333 set bytes 334} $lens 335 336# bytes16 337ifcapable {utf16} { 338 set lens [list] 339 foreach i $::idxlist { 340 lappend lens [expr 2 * [string length [lindex $strings $i]]] 341 } 342 do_test $test.4 { 343 set bytes [list] 344 set lens [list] 345 foreach i $idxlist { 346 lappend bytes [sqlite3_column_bytes16 $STMT $i] 347 } 348 set bytes 349 } $lens 350} 351 352# Blob 353do_test $test.5 { 354 set utf8 [list] 355 foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} 356 set utf8 357} $strings 358 359# UTF-8 360do_test $test.6 { 361 set utf8 [list] 362 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 363 set utf8 364} $strings 365 366# Floats 367do_test $test.7 { 368 set utf8 [list] 369 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 370 set utf8 371} $doubles 372 373# UTF-16 374ifcapable {utf16} { 375 do_test $test.8 { 376 set utf8 [list] 377 foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} 378 set utf8 379 } $strings 380} 381 382# Integers 383do_test $test.9 { 384 set ints [list] 385 foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} 386 set ints 387} $ints 388 389# Floats 390do_test $test.10 { 391 set utf8 [list] 392 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 393 set utf8 394} $doubles 395 396# UTF-8 397do_test $test.11 { 398 set utf8 [list] 399 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 400 set utf8 401} $strings 402 403# Types 404do_test $test.12 { 405 set types [list] 406 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 407 set types 408} $types 409 410# Test that an out of range request returns the equivalent of NULL 411do_test $test.13 { 412 sqlite3_column_int $STMT -1 413} {0} 414do_test $test.13 { 415 sqlite3_column_text $STMT -1 416} {} 417 418} 419 420do_test capi3-5.0 { 421 execsql { 422 CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); 423 INSERT INTO t1 VALUES(1, 2, 3); 424 INSERT INTO t1 VALUES('one', 'two', NULL); 425 INSERT INTO t1 VALUES(1.2, 1.3, 1.4); 426 } 427 set sql "SELECT * FROM t1" 428 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 429 sqlite3_column_count $STMT 430} 3 431 432check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)} 433do_test capi3-5.2 { 434 sqlite3_step $STMT 435} SQLITE_ROW 436 437check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)} 438check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3} 439 440do_test capi3-5.5 { 441 sqlite3_step $STMT 442} SQLITE_ROW 443 444check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)} 445check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}} 446 447do_test capi3-5.8 { 448 sqlite3_step $STMT 449} SQLITE_ROW 450 451check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)} 452check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4} 453 454do_test capi3-5.11 { 455 sqlite3_step $STMT 456} SQLITE_DONE 457 458do_test capi3-5.12 { 459 sqlite3_finalize $STMT 460} SQLITE_OK 461 462set ::ENC [execsql {pragma encoding}] 463db close 464 465do_test capi3-6.0 { 466 set DB [sqlite3_open test.db] 467 sqlite3_key $DB xyzzy 468 set sql {SELECT a FROM t1 order by rowid} 469 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 470 expr 0 471} {0} 472do_test capi3-6.1 { 473 sqlite3_close $DB 474} {SQLITE_BUSY} 475do_test capi3-6.2 { 476 sqlite3_step $STMT 477} {SQLITE_ROW} 478check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1} 479do_test capi3-6.3 { 480 sqlite3_finalize $STMT 481} {SQLITE_OK} 482do_test capi3-6.4 { 483 sqlite3_close $DB 484} {SQLITE_OK} 485 486if {![sqlite3 -has-codec]} { 487 # Test what happens when the library encounters a newer file format. 488 # Do this by updating the file format via the btree layer. 489 do_test capi3-7.1 { 490 set ::bt [btree_open test.db 10 0] 491 btree_begin_transaction $::bt 492 set meta [btree_get_meta $::bt] 493 lset meta 2 4 494 eval [concat btree_update_meta $::bt [lrange $meta 0 end]] 495 btree_commit $::bt 496 btree_close $::bt 497 } {} 498 do_test capi3-7.2 { 499 sqlite3 db test.db 500 catchsql { 501 SELECT * FROM sqlite_master; 502 } 503 } {1 {unsupported file format}} 504 db close 505} 506 507if {![sqlite3 -has-codec]} { 508 # Now test that the library correctly handles bogus entries in the 509 # sqlite_master table (schema corruption). 510 do_test capi3-8.1 { 511 file delete -force test.db 512 file delete -force test.db-journal 513 sqlite3 db test.db 514 execsql { 515 CREATE TABLE t1(a); 516 } 517 db close 518 } {} 519 do_test capi3-8.2 { 520 set ::bt [btree_open test.db 10 0] 521 btree_begin_transaction $::bt 522 set ::bc [btree_cursor $::bt 1 1] 523 524 # Build a 5-field row record consisting of 5 null records. This is 525 # officially black magic. 526 catch {unset data} 527 set data [binary format c6 {6 0 0 0 0 0}] 528 btree_insert $::bc 5 $data 529 530 btree_close_cursor $::bc 531 btree_commit $::bt 532 btree_close $::bt 533 } {} 534 do_test capi3-8.3 { 535 sqlite3 db test.db 536 catchsql { 537 SELECT * FROM sqlite_master; 538 } 539 } {1 {malformed database schema}} 540 do_test capi3-8.4 { 541 set ::bt [btree_open test.db 10 0] 542 btree_begin_transaction $::bt 543 set ::bc [btree_cursor $::bt 1 1] 544 545 # Build a 5-field row record. The first field is a string 'table', and 546 # subsequent fields are all NULL. Replace the other broken record with 547 # this one and try to read the schema again. The broken record uses 548 # either UTF-8 or native UTF-16 (if this file is being run by 549 # utf16.test). 550 if { [string match UTF-16* $::ENC] } { 551 set data [binary format c6a10 {6 33 0 0 0 0} [utf16 table]] 552 } else { 553 set data [binary format c6a5 {6 23 0 0 0 0} table] 554 } 555 btree_insert $::bc 5 $data 556 557 btree_close_cursor $::bc 558 btree_commit $::bt 559 btree_close $::bt 560 } {}; 561 do_test capi3-8.5 { 562 db close 563 sqlite3 db test.db 564 catchsql { 565 SELECT * FROM sqlite_master; 566 } 567 } {1 {malformed database schema}} 568 db close 569} 570file delete -force test.db 571file delete -force test.db-journal 572 573 574# Test the english language string equivalents for sqlite error codes 575set code2english [list \ 576SQLITE_OK {not an error} \ 577SQLITE_ERROR {SQL logic error or missing database} \ 578SQLITE_INTERNAL {internal SQLite implementation flaw} \ 579SQLITE_PERM {access permission denied} \ 580SQLITE_ABORT {callback requested query abort} \ 581SQLITE_BUSY {database is locked} \ 582SQLITE_LOCKED {database table is locked} \ 583SQLITE_NOMEM {out of memory} \ 584SQLITE_READONLY {attempt to write a readonly database} \ 585SQLITE_INTERRUPT {interrupted} \ 586SQLITE_IOERR {disk I/O error} \ 587SQLITE_CORRUPT {database disk image is malformed} \ 588SQLITE_NOTFOUND {table or record not found} \ 589SQLITE_FULL {database is full} \ 590SQLITE_CANTOPEN {unable to open database file} \ 591SQLITE_PROTOCOL {database locking protocol failure} \ 592SQLITE_EMPTY {table contains no data} \ 593SQLITE_SCHEMA {database schema has changed} \ 594SQLITE_TOOBIG {too much data for one table row} \ 595SQLITE_CONSTRAINT {constraint failed} \ 596SQLITE_MISMATCH {datatype mismatch} \ 597SQLITE_MISUSE {library routine called out of sequence} \ 598SQLITE_NOLFS {kernel lacks large file support} \ 599SQLITE_AUTH {authorization denied} \ 600SQLITE_FORMAT {auxiliary database format error} \ 601SQLITE_RANGE {bind or column index out of range} \ 602SQLITE_NOTADB {file is encrypted or is not a database} \ 603unknownerror {unknown error} \ 604] 605 606set test_number 1 607foreach {code english} $code2english { 608 do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english 609 incr test_number 610} 611 612# Test the error message when a "real" out of memory occurs. 613if {[info command sqlite_malloc_stat]!=""} { 614set sqlite_malloc_fail 1 615do_test capi3-10-1 { 616 set ::DB [sqlite3 db test.db] 617 sqlite_malloc_fail 1 618 catchsql { 619 select * from sqlite_master; 620 } 621} {1 {out of memory}} 622do_test capi3-10-2 { 623 sqlite3_errmsg $::DB 624} {out of memory} 625ifcapable {utf16} { 626 do_test capi3-10-3 { 627 utf8 [sqlite3_errmsg16 $::DB] 628 } {out of memory} 629} 630db close 631sqlite_malloc_fail 0 632} 633 634# The following tests - capi3-11.* - test that a COMMIT or ROLLBACK 635# statement issued while there are still outstanding VMs that are part of 636# the transaction fails. 637set DB [sqlite3 db test.db] 638sqlite_register_test_function $DB func 639do_test capi3-11.1 { 640 execsql { 641 BEGIN; 642 CREATE TABLE t1(a, b); 643 INSERT INTO t1 VALUES(1, 'int'); 644 INSERT INTO t1 VALUES(2, 'notatype'); 645 } 646} {} 647do_test capi3-11.1.1 { 648 sqlite3_get_autocommit $DB 649} 0 650do_test capi3-11.2 { 651 set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL] 652 sqlite3_step $STMT 653} {SQLITE_ROW} 654do_test capi3-11.3 { 655 catchsql { 656 COMMIT; 657 } 658} {1 {cannot commit transaction - SQL statements in progress}} 659do_test capi3-11.3.1 { 660 sqlite3_get_autocommit $DB 661} 0 662do_test capi3-11.4 { 663 sqlite3_step $STMT 664} {SQLITE_ERROR} 665do_test capi3-11.5 { 666 sqlite3_finalize $STMT 667} {SQLITE_ERROR} 668do_test capi3-11.6 { 669 catchsql { 670 SELECT * FROM t1; 671 } 672} {0 {1 int 2 notatype}} 673do_test capi3-11.6.1 { 674 sqlite3_get_autocommit $DB 675} 0 676do_test capi3-11.7 { 677 catchsql { 678 COMMIT; 679 } 680} {0 {}} 681do_test capi3-11.7.1 { 682 sqlite3_get_autocommit $DB 683} 1 684do_test capi3-11.8 { 685 execsql { 686 CREATE TABLE t2(a); 687 INSERT INTO t2 VALUES(1); 688 INSERT INTO t2 VALUES(2); 689 BEGIN; 690 INSERT INTO t2 VALUES(3); 691 } 692} {} 693do_test capi3-11.8.1 { 694 sqlite3_get_autocommit $DB 695} 0 696do_test capi3-11.9 { 697 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL] 698 sqlite3_step $STMT 699} {SQLITE_ROW} 700do_test capi3-11.9.1 { 701 sqlite3_get_autocommit $DB 702} 0 703do_test capi3-11.9.2 { 704 catchsql { 705 ROLLBACK; 706 } 707} {1 {cannot rollback transaction - SQL statements in progress}} 708do_test capi3-11.9.3 { 709 sqlite3_get_autocommit $DB 710} 0 711do_test capi3-11.10 { 712 sqlite3_step $STMT 713} {SQLITE_ROW} 714do_test capi3-11.11 { 715 sqlite3_step $STMT 716} {SQLITE_ROW} 717do_test capi3-11.12 { 718 sqlite3_step $STMT 719} {SQLITE_DONE} 720do_test capi3-11.13 { 721 sqlite3_finalize $STMT 722} {SQLITE_OK} 723do_test capi3-11.14 { 724 execsql { 725 SELECT a FROM t2; 726 } 727} {1 2 3} 728do_test capi3-11.14.1 { 729 sqlite3_get_autocommit $DB 730} 0 731do_test capi3-11.15 { 732 catchsql { 733 ROLLBACK; 734 } 735} {0 {}} 736do_test capi3-11.15.1 { 737 sqlite3_get_autocommit $DB 738} 1 739do_test capi3-11.16 { 740 execsql { 741 SELECT a FROM t2; 742 } 743} {1 2} 744 745# Sanity check on the definition of 'outstanding VM'. This means any VM 746# that has had sqlite3_step() called more recently than sqlite3_finalize() or 747# sqlite3_reset(). So a VM that has just been prepared or reset does not 748# count as an active VM. 749do_test capi3-11.17 { 750 execsql { 751 BEGIN; 752 } 753} {} 754do_test capi3-11.18 { 755 set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL] 756 catchsql { 757 COMMIT; 758 } 759} {0 {}} 760do_test capi3-11.19 { 761 sqlite3_step $STMT 762} {SQLITE_ROW} 763do_test capi3-11.20 { 764 catchsql { 765 BEGIN; 766 COMMIT; 767 } 768} {1 {cannot commit transaction - SQL statements in progress}} 769do_test capi3-11.20 { 770 sqlite3_reset $STMT 771 catchsql { 772 COMMIT; 773 } 774} {0 {}} 775do_test capi3-11.21 { 776 sqlite3_finalize $STMT 777} {SQLITE_OK} 778 779# The following tests - capi3-12.* - check that it's Ok to start a 780# transaction while other VMs are active, and that it's Ok to execute 781# atomic updates in the same situation (so long as they are on a different 782# table). 783do_test capi3-12.1 { 784 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL] 785 sqlite3_step $STMT 786} {SQLITE_ROW} 787do_test capi3-12.2 { 788 catchsql { 789 INSERT INTO t1 VALUES(3, NULL); 790 } 791} {0 {}} 792 793do_test capi3-12.3 { 794 catchsql { 795 INSERT INTO t2 VALUES(4); 796 } 797} {1 {database table is locked}} 798do_test capi3-12.4 { 799 catchsql { 800 BEGIN; 801 INSERT INTO t1 VALUES(4, NULL); 802 } 803} {0 {}} 804do_test capi3-12.5 { 805 sqlite3_step $STMT 806} {SQLITE_ROW} 807do_test capi3-12.6 { 808 sqlite3_step $STMT 809} {SQLITE_DONE} 810do_test capi3-12.7 { 811 sqlite3_finalize $STMT 812} {SQLITE_OK} 813do_test capi3-12.8 { 814 execsql { 815 COMMIT; 816 SELECT a FROM t1; 817 } 818} {1 2 3 4} 819 820# Test cases capi3-13.* test the sqlite3_clear_bindings() and 821# sqlite3_sleep APIs. 822# 823if {[llength [info commands sqlite3_clear_bindings]]>0} { 824 do_test capi3-13.1 { 825 execsql { 826 DELETE FROM t1; 827 } 828 set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 829 sqlite3_step $STMT 830 } {SQLITE_DONE} 831 do_test capi3-13.2 { 832 sqlite3_reset $STMT 833 sqlite3_bind_text $STMT 1 hello 5 834 sqlite3_bind_text $STMT 2 world 5 835 sqlite3_step $STMT 836 } {SQLITE_DONE} 837 do_test capi3-13.3 { 838 sqlite3_reset $STMT 839 sqlite3_clear_bindings $STMT 840 sqlite3_step $STMT 841 } {SQLITE_DONE} 842 do_test capi3-13-4 { 843 sqlite3_finalize $STMT 844 execsql { 845 SELECT * FROM t1; 846 } 847 } {{} {} hello world {} {}} 848} 849if {[llength [info commands sqlite3_sleep]]>0} { 850 do_test capi3-13-5 { 851 set ms [sqlite3_sleep 80] 852 expr {$ms==80 || $ms==1000} 853 } {1} 854} 855 856# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 857# 858do_test capi3-14.1 { 859 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 860 lappend rc $msg 861} {1 SQLITE_MISUSE} 862 863 864finish_test 865