1# 2006 November 08 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. 12# 13# This is a copy of the capi3.test file that has been adapted to 14# test the new sqlite3_prepare_v2 interface. 15# 16# $Id: capi3c.test,v 1.17 2008/04/10 17:14:07 drh Exp $ 17# 18 19set testdir [file dirname $argv0] 20source $testdir/tester.tcl 21 22# Return the UTF-16 representation of the supplied UTF-8 string $str. 23# If $nt is true, append two 0x00 bytes as a nul terminator. 24proc utf16 {str {nt 1}} { 25 set r [encoding convertto unicode $str] 26 if {$nt} { 27 append r "\x00\x00" 28 } 29 return $r 30} 31 32# Return the UTF-8 representation of the supplied UTF-16 string $str. 33proc utf8 {str} { 34 # If $str ends in two 0x00 0x00 bytes, knock these off before 35 # converting to UTF-8 using TCL. 36 binary scan $str \c* vals 37 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 38 set str [binary format \c* [lrange $vals 0 end-2]] 39 } 40 41 set r [encoding convertfrom unicode $str] 42 return $r 43} 44 45# These tests complement those in capi2.test. They are organized 46# as follows: 47# 48# capi3c-1.*: Test sqlite3_prepare_v2 49# capi3c-2.*: Test sqlite3_prepare16_v2 50# capi3c-3.*: Test sqlite3_open 51# capi3c-4.*: Test sqlite3_open16 52# capi3c-5.*: Test the various sqlite3_result_* APIs 53# capi3c-6.*: Test that sqlite3_close fails if there are outstanding VMs. 54# 55 56set DB [sqlite3_connection_pointer db] 57 58do_test capi3c-1.0 { 59 sqlite3_get_autocommit $DB 60} 1 61do_test capi3c-1.1 { 62 set STMT [sqlite3_prepare_v2 $DB {SELECT name FROM sqlite_master} -1 TAIL] 63 sqlite3_finalize $STMT 64 set TAIL 65} {} 66do_test capi3c-1.2 { 67 sqlite3_errcode $DB 68} {SQLITE_OK} 69do_test capi3c-1.3 { 70 sqlite3_errmsg $DB 71} {not an error} 72do_test capi3c-1.4 { 73 set sql {SELECT name FROM sqlite_master;SELECT 10} 74 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 75 sqlite3_finalize $STMT 76 set TAIL 77} {SELECT 10} 78do_test capi3c-1.5 { 79 set sql {SELECT namex FROM sqlite_master} 80 catch { 81 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 82 } 83} {1} 84do_test capi3c-1.6 { 85 sqlite3_errcode $DB 86} {SQLITE_ERROR} 87do_test capi3c-1.7 { 88 sqlite3_errmsg $DB 89} {no such column: namex} 90 91 92ifcapable {utf16} { 93 do_test capi3c-2.1 { 94 set sql16 [utf16 {SELECT name FROM sqlite_master}] 95 set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 ::TAIL] 96 sqlite3_finalize $STMT 97 utf8 $::TAIL 98 } {} 99 do_test capi3c-2.2 { 100 set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] 101 set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] 102 sqlite3_finalize $STMT 103 utf8 $TAIL 104 } {SELECT 10} 105 do_test capi3c-2.3 { 106 set sql [utf16 {SELECT namex FROM sqlite_master}] 107 catch { 108 set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] 109 } 110 } {1} 111 do_test capi3c-2.4 { 112 sqlite3_errcode $DB 113 } {SQLITE_ERROR} 114 do_test capi3c-2.5 { 115 sqlite3_errmsg $DB 116 } {no such column: namex} 117 118 ifcapable schema_pragmas { 119 do_test capi3c-2.6 { 120 execsql {CREATE TABLE tablename(x)} 121 set sql16 [utf16 {PRAGMA table_info("TableName")}] 122 set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 TAIL] 123 sqlite3_step $STMT 124 } SQLITE_ROW 125 do_test capi3c-2.7 { 126 sqlite3_step $STMT 127 } SQLITE_DONE 128 do_test capi3c-2.8 { 129 sqlite3_finalize $STMT 130 } SQLITE_OK 131 } 132 133} ;# endif utf16 134 135# rename sqlite3_open sqlite3_open_old 136# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options} 137 138do_test capi3c-3.1 { 139 set db2 [sqlite3_open test.db {}] 140 sqlite3_errcode $db2 141} {SQLITE_OK} 142# FIX ME: Should test the db handle works. 143do_test capi3c-3.2 { 144 sqlite3_close $db2 145} {SQLITE_OK} 146do_test capi3c-3.3 { 147 catch { 148 set db2 [sqlite3_open /bogus/path/test.db {}] 149 } 150 sqlite3_errcode $db2 151} {SQLITE_CANTOPEN} 152do_test capi3c-3.4 { 153 sqlite3_errmsg $db2 154} {unable to open database file} 155do_test capi3c-3.5 { 156 sqlite3_close $db2 157} {SQLITE_OK} 158do_test capi3c-3.6.1-misuse { 159 sqlite3_close $db2 160} {SQLITE_MISUSE} 161do_test capi3c-3.6.2-misuse { 162 sqlite3_errmsg $db2 163} {library routine called out of sequence} 164ifcapable {utf16} { 165 do_test capi3c-3.6.3-misuse { 166 utf8 [sqlite3_errmsg16 $db2] 167 } {library routine called out of sequence} 168} 169 170# rename sqlite3_open "" 171# rename sqlite3_open_old sqlite3_open 172 173ifcapable {utf16} { 174do_test capi3c-4.1 { 175 set db2 [sqlite3_open16 [utf16 test.db] {}] 176 sqlite3_errcode $db2 177} {SQLITE_OK} 178# FIX ME: Should test the db handle works. 179do_test capi3c-4.2 { 180 sqlite3_close $db2 181} {SQLITE_OK} 182do_test capi3c-4.3 { 183 catch { 184 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] 185 } 186 sqlite3_errcode $db2 187} {SQLITE_CANTOPEN} 188do_test capi3c-4.4 { 189 utf8 [sqlite3_errmsg16 $db2] 190} {unable to open database file} 191do_test capi3c-4.5 { 192 sqlite3_close $db2 193} {SQLITE_OK} 194} ;# utf16 195 196# This proc is used to test the following API calls: 197# 198# sqlite3_column_count 199# sqlite3_column_name 200# sqlite3_column_name16 201# sqlite3_column_decltype 202# sqlite3_column_decltype16 203# 204# $STMT is a compiled SQL statement. $test is a prefix 205# to use for test names within this proc. $names is a list 206# of the column names that should be returned by $STMT. 207# $decltypes is a list of column declaration types for $STMT. 208# 209# Example: 210# 211# set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] 212# check_header test1.1 {1 2 3} {"" "" ""} 213# 214proc check_header {STMT test names decltypes} { 215 216 # Use the return value of sqlite3_column_count() to build 217 # a list of column indexes. i.e. If sqlite3_column_count 218 # is 3, build the list {0 1 2}. 219 set ::idxlist [list] 220 set ::numcols [sqlite3_column_count $STMT] 221 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 222 223 # Column names in UTF-8 224 do_test $test.1 { 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.2 { 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.3 { 243 set cnamelist [list] 244 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 245 set cnamelist 246 } $names 247 248 # Column names in UTF-16 249 ifcapable {utf16} { 250 do_test $test.4 { 251 set cnamelist [list] 252 foreach i $idxlist { 253 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 254 } 255 set cnamelist 256 } $names 257 } 258 259 # Column names in UTF-8 260 do_test $test.5 { 261 set cnamelist [list] 262 foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} 263 set cnamelist 264 } $decltypes 265 266 # Column declaration types in UTF-16 267 ifcapable {utf16} { 268 do_test $test.6 { 269 set cnamelist [list] 270 foreach i $idxlist { 271 lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] 272 } 273 set cnamelist 274 } $decltypes 275 } 276 277 278 # Test some out of range conditions: 279 ifcapable {utf16} { 280 do_test $test.7 { 281 list \ 282 [sqlite3_column_name $STMT -1] \ 283 [sqlite3_column_name16 $STMT -1] \ 284 [sqlite3_column_decltype $STMT -1] \ 285 [sqlite3_column_decltype16 $STMT -1] \ 286 [sqlite3_column_name $STMT $numcols] \ 287 [sqlite3_column_name16 $STMT $numcols] \ 288 [sqlite3_column_decltype $STMT $numcols] \ 289 [sqlite3_column_decltype16 $STMT $numcols] 290 } {{} {} {} {} {} {} {} {}} 291 } 292} 293 294# This proc is used to test the following API calls: 295# 296# sqlite3_column_origin_name 297# sqlite3_column_origin_name16 298# sqlite3_column_table_name 299# sqlite3_column_table_name16 300# sqlite3_column_database_name 301# sqlite3_column_database_name16 302# 303# $STMT is a compiled SQL statement. $test is a prefix 304# to use for test names within this proc. $names is a list 305# of the column names that should be returned by $STMT. 306# $decltypes is a list of column declaration types for $STMT. 307# 308# Example: 309# 310# set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] 311# check_header test1.1 {1 2 3} {"" "" ""} 312# 313proc check_origin_header {STMT test dbs tables cols} { 314 # If sqlite3_column_origin_name() and friends are not compiled into 315 # this build, this proc is a no-op. 316ifcapable columnmetadata { 317 318 # Use the return value of sqlite3_column_count() to build 319 # a list of column indexes. i.e. If sqlite3_column_count 320 # is 3, build the list {0 1 2}. 321 set ::idxlist [list] 322 set ::numcols [sqlite3_column_count $STMT] 323 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 324 325 # Database names in UTF-8 326 do_test $test.8 { 327 set cnamelist [list] 328 foreach i $idxlist { 329 lappend cnamelist [sqlite3_column_database_name $STMT $i] 330 } 331 set cnamelist 332 } $dbs 333 334 # Database names in UTF-16 335 ifcapable {utf16} { 336 do_test $test.9 { 337 set cnamelist [list] 338 foreach i $idxlist { 339 lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]] 340 } 341 set cnamelist 342 } $dbs 343 } 344 345 # Table names in UTF-8 346 do_test $test.10 { 347 set cnamelist [list] 348 foreach i $idxlist { 349 lappend cnamelist [sqlite3_column_table_name $STMT $i] 350 } 351 set cnamelist 352 } $tables 353 354 # Table names in UTF-16 355 ifcapable {utf16} { 356 do_test $test.11 { 357 set cnamelist [list] 358 foreach i $idxlist { 359 lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]] 360 } 361 set cnamelist 362 } $tables 363 } 364 365 # Origin names in UTF-8 366 do_test $test.12 { 367 set cnamelist [list] 368 foreach i $idxlist { 369 lappend cnamelist [sqlite3_column_origin_name $STMT $i] 370 } 371 set cnamelist 372 } $cols 373 374 # Origin declaration types in UTF-16 375 ifcapable {utf16} { 376 do_test $test.13 { 377 set cnamelist [list] 378 foreach i $idxlist { 379 lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]] 380 } 381 set cnamelist 382 } $cols 383 } 384 } 385} 386 387# This proc is used to test the following APIs: 388# 389# sqlite3_data_count 390# sqlite3_column_type 391# sqlite3_column_int 392# sqlite3_column_text 393# sqlite3_column_text16 394# sqlite3_column_double 395# 396# $STMT is a compiled SQL statement for which the previous call 397# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use 398# for test names within this proc. $types is a list of the 399# manifest types for the current row. $ints, $doubles and $strings 400# are lists of the integer, real and string representations of 401# the values in the current row. 402# 403# Example: 404# 405# set STMT [sqlite3_prepare_v2 "SELECT 'hello', 1.1, NULL" -1 DUMMY] 406# sqlite3_step $STMT 407# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}} 408# 409proc check_data {STMT test types ints doubles strings} { 410 411 # Use the return value of sqlite3_column_count() to build 412 # a list of column indexes. i.e. If sqlite3_column_count 413 # is 3, build the list {0 1 2}. 414 set ::idxlist [list] 415 set numcols [sqlite3_data_count $STMT] 416 for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i} 417 418# types 419do_test $test.1 { 420 set types [list] 421 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 422 set types 423} $types 424 425# Integers 426do_test $test.2 { 427 set ints [list] 428 foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} 429 set ints 430} $ints 431 432# bytes 433set lens [list] 434foreach i $::idxlist { 435 lappend lens [string length [lindex $strings $i]] 436} 437do_test $test.3 { 438 set bytes [list] 439 set lens [list] 440 foreach i $idxlist { 441 lappend bytes [sqlite3_column_bytes $STMT $i] 442 } 443 set bytes 444} $lens 445 446# bytes16 447ifcapable {utf16} { 448 set lens [list] 449 foreach i $::idxlist { 450 lappend lens [expr 2 * [string length [lindex $strings $i]]] 451 } 452 do_test $test.4 { 453 set bytes [list] 454 set lens [list] 455 foreach i $idxlist { 456 lappend bytes [sqlite3_column_bytes16 $STMT $i] 457 } 458 set bytes 459 } $lens 460} 461 462# Blob 463do_test $test.5 { 464 set utf8 [list] 465 foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} 466 set utf8 467} $strings 468 469# UTF-8 470do_test $test.6 { 471 set utf8 [list] 472 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 473 set utf8 474} $strings 475 476# Floats 477do_test $test.7 { 478 set utf8 [list] 479 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 480 set utf8 481} $doubles 482 483# UTF-16 484ifcapable {utf16} { 485 do_test $test.8 { 486 set utf8 [list] 487 foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} 488 set utf8 489 } $strings 490} 491 492# Integers 493do_test $test.9 { 494 set ints [list] 495 foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} 496 set ints 497} $ints 498 499# Floats 500do_test $test.10 { 501 set utf8 [list] 502 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 503 set utf8 504} $doubles 505 506# UTF-8 507do_test $test.11 { 508 set utf8 [list] 509 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 510 set utf8 511} $strings 512 513# Types 514do_test $test.12 { 515 set types [list] 516 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 517 set types 518} $types 519 520# Test that an out of range request returns the equivalent of NULL 521do_test $test.13 { 522 sqlite3_column_int $STMT -1 523} {0} 524do_test $test.13 { 525 sqlite3_column_text $STMT -1 526} {} 527 528} 529 530ifcapable !floatingpoint { 531 finish_test 532 return 533} 534 535do_test capi3c-5.0 { 536 execsql { 537 CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); 538 INSERT INTO t1 VALUES(1, 2, 3); 539 INSERT INTO t1 VALUES('one', 'two', NULL); 540 INSERT INTO t1 VALUES(1.2, 1.3, 1.4); 541 } 542 set sql "SELECT * FROM t1" 543 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 544 sqlite3_column_count $STMT 545} 3 546 547check_header $STMT capi3c-5.1 {a b c} {VARINT BLOB VARCHAR(16)} 548check_origin_header $STMT capi3c-5.1 {main main main} {t1 t1 t1} {a b c} 549do_test capi3c-5.2 { 550 sqlite3_step $STMT 551} SQLITE_ROW 552 553check_header $STMT capi3c-5.3 {a b c} {VARINT BLOB VARCHAR(16)} 554check_origin_header $STMT capi3c-5.3 {main main main} {t1 t1 t1} {a b c} 555check_data $STMT capi3c-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3} 556 557do_test capi3c-5.5 { 558 sqlite3_step $STMT 559} SQLITE_ROW 560 561check_header $STMT capi3c-5.6 {a b c} {VARINT BLOB VARCHAR(16)} 562check_origin_header $STMT capi3c-5.6 {main main main} {t1 t1 t1} {a b c} 563check_data $STMT capi3c-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}} 564 565do_test capi3c-5.8 { 566 sqlite3_step $STMT 567} SQLITE_ROW 568 569check_header $STMT capi3c-5.9 {a b c} {VARINT BLOB VARCHAR(16)} 570check_origin_header $STMT capi3c-5.9 {main main main} {t1 t1 t1} {a b c} 571check_data $STMT capi3c-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4} 572 573do_test capi3c-5.11 { 574 sqlite3_step $STMT 575} SQLITE_DONE 576 577do_test capi3c-5.12 { 578 sqlite3_finalize $STMT 579} SQLITE_OK 580 581do_test capi3c-5.20 { 582 set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a" 583 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 584 sqlite3_column_count $STMT 585} 3 586 587check_header $STMT capi3c-5.21 {a sum(b) max(c)} {VARINT {} {}} 588check_origin_header $STMT capi3c-5.22 {main {} {}} {t1 {} {}} {a {} {}} 589do_test capi3c-5.23 { 590 sqlite3_finalize $STMT 591} SQLITE_OK 592 593 594set ::ENC [execsql {pragma encoding}] 595db close 596 597do_test capi3c-6.0 { 598 sqlite3 db test.db 599 set DB [sqlite3_connection_pointer db] 600 sqlite3_key $DB xyzzy 601 set sql {SELECT a FROM t1 order by rowid} 602 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 603 expr 0 604} {0} 605do_test capi3c-6.1 { 606 db cache flush 607 sqlite3_close $DB 608} {SQLITE_BUSY} 609do_test capi3c-6.2 { 610 sqlite3_step $STMT 611} {SQLITE_ROW} 612check_data $STMT capi3c-6.3 {INTEGER} {1} {1.0} {1} 613do_test capi3c-6.3 { 614 sqlite3_finalize $STMT 615} {SQLITE_OK} 616do_test capi3c-6.4 { 617 db cache flush 618 sqlite3_close $DB 619} {SQLITE_OK} 620do_test capi3c-6.99-misuse { 621 db close 622} {} 623 624# This procedure sets the value of the file-format in file 'test.db' 625# to $newval. Also, the schema cookie is incremented. 626# 627proc set_file_format {newval} { 628 hexio_write test.db 44 [hexio_render_int32 $newval] 629 set schemacookie [hexio_get_int [hexio_read test.db 40 4]] 630 incr schemacookie 631 hexio_write test.db 40 [hexio_render_int32 $schemacookie] 632 return {} 633} 634 635# This procedure returns the value of the file-format in file 'test.db'. 636# 637proc get_file_format {{fname test.db}} { 638 return [hexio_get_int [hexio_read $fname 44 4]] 639} 640 641if {![sqlite3 -has-codec]} { 642 # Test what happens when the library encounters a newer file format. 643 do_test capi3c-7.1 { 644 set_file_format 5 645 } {} 646 do_test capi3c-7.2 { 647 sqlite3 db test.db 648 catchsql { 649 SELECT * FROM sqlite_master; 650 } 651 } {1 {unsupported file format}} 652 db close 653} 654 655if {![sqlite3 -has-codec]} { 656 # Now test that the library correctly handles bogus entries in the 657 # sqlite_master table (schema corruption). 658 do_test capi3c-8.1 { 659 file delete -force test.db test.db-journal 660 sqlite3 db test.db 661 execsql { 662 CREATE TABLE t1(a); 663 } 664 db close 665 } {} 666 do_test capi3c-8.2 { 667 sqlite3 db test.db 668 execsql { 669 PRAGMA writable_schema=ON; 670 INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL); 671 } 672 db close 673 } {} 674 do_test capi3c-8.3 { 675 sqlite3 db test.db 676 catchsql { 677 SELECT * FROM sqlite_master; 678 } 679 } {1 {malformed database schema (?)}} 680 do_test capi3c-8.4 { 681 # Build a 5-field row record. The first field is a string 'table', and 682 # subsequent fields are all NULL. 683 db close 684 file delete -force test.db test.db-journal 685 sqlite3 db test.db 686 execsql { 687 CREATE TABLE t1(a); 688 PRAGMA writable_schema=ON; 689 INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL); 690 } 691 db close 692 } {}; 693 do_test capi3c-8.5 { 694 sqlite3 db test.db 695 catchsql { 696 SELECT * FROM sqlite_master; 697 } 698 } {1 {malformed database schema (?)}} 699 db close 700} 701file delete -force test.db 702file delete -force test.db-journal 703 704 705# Test the english language string equivalents for sqlite error codes 706set code2english [list \ 707SQLITE_OK {not an error} \ 708SQLITE_ERROR {SQL logic error or missing database} \ 709SQLITE_PERM {access permission denied} \ 710SQLITE_ABORT {callback requested query abort} \ 711SQLITE_BUSY {database is locked} \ 712SQLITE_LOCKED {database table is locked} \ 713SQLITE_NOMEM {out of memory} \ 714SQLITE_READONLY {attempt to write a readonly database} \ 715SQLITE_INTERRUPT {interrupted} \ 716SQLITE_IOERR {disk I/O error} \ 717SQLITE_CORRUPT {database disk image is malformed} \ 718SQLITE_FULL {database or disk is full} \ 719SQLITE_CANTOPEN {unable to open database file} \ 720SQLITE_EMPTY {table contains no data} \ 721SQLITE_SCHEMA {database schema has changed} \ 722SQLITE_CONSTRAINT {constraint failed} \ 723SQLITE_MISMATCH {datatype mismatch} \ 724SQLITE_MISUSE {library routine called out of sequence} \ 725SQLITE_NOLFS {kernel lacks large file support} \ 726SQLITE_AUTH {authorization denied} \ 727SQLITE_FORMAT {auxiliary database format error} \ 728SQLITE_RANGE {bind or column index out of range} \ 729SQLITE_NOTADB {file is encrypted or is not a database} \ 730unknownerror {unknown error} \ 731] 732 733set test_number 1 734foreach {code english} $code2english { 735 do_test capi3c-9.$test_number "sqlite3_test_errstr $code" $english 736 incr test_number 737} 738 739# Test the error message when a "real" out of memory occurs. 740ifcapable memdebug { 741 do_test capi3c-10-1 { 742 sqlite3 db test.db 743 set DB [sqlite3_connection_pointer db] 744 sqlite3_memdebug_fail 0 745 catchsql { 746 select * from sqlite_master; 747 } 748 } {1 {out of memory}} 749 do_test capi3c-10-2 { 750 sqlite3_errmsg $::DB 751 } {out of memory} 752 ifcapable {utf16} { 753 do_test capi3c-10-3 { 754 utf8 [sqlite3_errmsg16 $::DB] 755 } {out of memory} 756 } 757 db close 758 sqlite3_memdebug_fail -1 759} 760 761# The following tests - capi3c-11.* - test that a COMMIT or ROLLBACK 762# statement issued while there are still outstanding VMs that are part of 763# the transaction fails. 764sqlite3 db test.db 765set DB [sqlite3_connection_pointer db] 766sqlite_register_test_function $DB func 767do_test capi3c-11.1 { 768 execsql { 769 BEGIN; 770 CREATE TABLE t1(a, b); 771 INSERT INTO t1 VALUES(1, 'int'); 772 INSERT INTO t1 VALUES(2, 'notatype'); 773 } 774} {} 775do_test capi3c-11.1.1 { 776 sqlite3_get_autocommit $DB 777} 0 778do_test capi3c-11.2 { 779 set STMT [sqlite3_prepare_v2 $DB "SELECT func(b, a) FROM t1" -1 TAIL] 780 sqlite3_step $STMT 781} {SQLITE_ROW} 782do_test capi3c-11.3 { 783 catchsql { 784 COMMIT; 785 } 786} {1 {cannot commit transaction - SQL statements in progress}} 787do_test capi3c-11.3.1 { 788 sqlite3_get_autocommit $DB 789} 0 790do_test capi3c-11.4 { 791 sqlite3_step $STMT 792} {SQLITE_ERROR} 793do_test capi3c-11.5 { 794 sqlite3_finalize $STMT 795} {SQLITE_ERROR} 796do_test capi3c-11.6 { 797 catchsql { 798 SELECT * FROM t1; 799 } 800} {0 {1 int 2 notatype}} 801do_test capi3c-11.6.1 { 802 sqlite3_get_autocommit $DB 803} 0 804do_test capi3c-11.7 { 805 catchsql { 806 COMMIT; 807 } 808} {0 {}} 809do_test capi3c-11.7.1 { 810 sqlite3_get_autocommit $DB 811} 1 812do_test capi3c-11.8 { 813 execsql { 814 CREATE TABLE t2(a); 815 INSERT INTO t2 VALUES(1); 816 INSERT INTO t2 VALUES(2); 817 BEGIN; 818 INSERT INTO t2 VALUES(3); 819 } 820} {} 821do_test capi3c-11.8.1 { 822 sqlite3_get_autocommit $DB 823} 0 824do_test capi3c-11.9 { 825 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 826 sqlite3_step $STMT 827} {SQLITE_ROW} 828do_test capi3c-11.9.1 { 829 sqlite3_get_autocommit $DB 830} 0 831do_test capi3c-11.9.2 { 832 catchsql { 833 ROLLBACK; 834 } 835} {1 {cannot rollback transaction - SQL statements in progress}} 836do_test capi3c-11.9.3 { 837 sqlite3_get_autocommit $DB 838} 0 839do_test capi3c-11.10 { 840 sqlite3_step $STMT 841} {SQLITE_ROW} 842do_test capi3c-11.11 { 843 sqlite3_step $STMT 844} {SQLITE_ROW} 845do_test capi3c-11.12 { 846 sqlite3_step $STMT 847} {SQLITE_DONE} 848do_test capi3c-11.13 { 849 sqlite3_finalize $STMT 850} {SQLITE_OK} 851do_test capi3c-11.14 { 852 execsql { 853 SELECT a FROM t2; 854 } 855} {1 2 3} 856do_test capi3c-11.14.1 { 857 sqlite3_get_autocommit $DB 858} 0 859do_test capi3c-11.15 { 860 catchsql { 861 ROLLBACK; 862 } 863} {0 {}} 864do_test capi3c-11.15.1 { 865 sqlite3_get_autocommit $DB 866} 1 867do_test capi3c-11.16 { 868 execsql { 869 SELECT a FROM t2; 870 } 871} {1 2} 872 873# Sanity check on the definition of 'outstanding VM'. This means any VM 874# that has had sqlite3_step() called more recently than sqlite3_finalize() or 875# sqlite3_reset(). So a VM that has just been prepared or reset does not 876# count as an active VM. 877do_test capi3c-11.17 { 878 execsql { 879 BEGIN; 880 } 881} {} 882do_test capi3c-11.18 { 883 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL] 884 catchsql { 885 COMMIT; 886 } 887} {0 {}} 888do_test capi3c-11.19 { 889 sqlite3_step $STMT 890} {SQLITE_ROW} 891do_test capi3c-11.20 { 892 catchsql { 893 BEGIN; 894 COMMIT; 895 } 896} {1 {cannot commit transaction - SQL statements in progress}} 897do_test capi3c-11.20 { 898 sqlite3_reset $STMT 899 catchsql { 900 COMMIT; 901 } 902} {0 {}} 903do_test capi3c-11.21 { 904 sqlite3_finalize $STMT 905} {SQLITE_OK} 906 907# The following tests - capi3c-12.* - check that its Ok to start a 908# transaction while other VMs are active, and that its Ok to execute 909# atomic updates in the same situation 910# 911do_test capi3c-12.1 { 912 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 913 sqlite3_step $STMT 914} {SQLITE_ROW} 915do_test capi3c-12.2 { 916 catchsql { 917 INSERT INTO t1 VALUES(3, NULL); 918 } 919} {0 {}} 920do_test capi3c-12.3 { 921 catchsql { 922 INSERT INTO t2 VALUES(4); 923 } 924} {0 {}} 925do_test capi3c-12.4 { 926 catchsql { 927 BEGIN; 928 INSERT INTO t1 VALUES(4, NULL); 929 } 930} {0 {}} 931do_test capi3c-12.5 { 932 sqlite3_step $STMT 933} {SQLITE_ROW} 934do_test capi3c-12.5.1 { 935 sqlite3_step $STMT 936} {SQLITE_ROW} 937do_test capi3c-12.6 { 938 sqlite3_step $STMT 939} {SQLITE_DONE} 940do_test capi3c-12.7 { 941 sqlite3_finalize $STMT 942} {SQLITE_OK} 943do_test capi3c-12.8 { 944 execsql { 945 COMMIT; 946 SELECT a FROM t1; 947 } 948} {1 2 3 4} 949 950# Test cases capi3c-13.* test the sqlite3_clear_bindings() and 951# sqlite3_sleep APIs. 952# 953if {[llength [info commands sqlite3_clear_bindings]]>0} { 954 do_test capi3c-13.1 { 955 execsql { 956 DELETE FROM t1; 957 } 958 set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 959 sqlite3_step $STMT 960 } {SQLITE_DONE} 961 do_test capi3c-13.2 { 962 sqlite3_reset $STMT 963 sqlite3_bind_text $STMT 1 hello 5 964 sqlite3_bind_text $STMT 2 world 5 965 sqlite3_step $STMT 966 } {SQLITE_DONE} 967 do_test capi3c-13.3 { 968 sqlite3_reset $STMT 969 sqlite3_clear_bindings $STMT 970 sqlite3_step $STMT 971 } {SQLITE_DONE} 972 do_test capi3c-13-4 { 973 sqlite3_finalize $STMT 974 execsql { 975 SELECT * FROM t1; 976 } 977 } {{} {} hello world {} {}} 978} 979if {[llength [info commands sqlite3_sleep]]>0} { 980 do_test capi3c-13-5 { 981 set ms [sqlite3_sleep 80] 982 expr {$ms==80 || $ms==1000} 983 } {1} 984} 985 986# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 987# 988do_test capi3c-14.1 { 989 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 990 lappend rc $msg 991} {1 SQLITE_MISUSE} 992 993# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. 994# 995do_test capi3c-15.1 { 996 set sql {SELECT * FROM t2} 997 set nbytes [string length $sql] 998 append sql { WHERE a==1} 999 set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL] 1000 sqlite3_step $STMT 1001 sqlite3_column_int $STMT 0 1002} {1} 1003do_test capi3c-15.2 { 1004 sqlite3_step $STMT 1005 sqlite3_column_int $STMT 0 1006} {2} 1007do_test capi3c-15.3 { 1008 sqlite3_finalize $STMT 1009} {SQLITE_OK} 1010 1011# Make sure code is always generated even if an IF EXISTS or 1012# IF NOT EXISTS clause is present that the table does not or 1013# does exists. That way we will always have a prepared statement 1014# to expire when the schema changes. 1015# 1016do_test capi3c-16.1 { 1017 set sql {DROP TABLE IF EXISTS t3} 1018 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1019 sqlite3_finalize $STMT 1020 expr {$STMT!=""} 1021} {1} 1022do_test capi3c-16.2 { 1023 set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} 1024 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1025 sqlite3_finalize $STMT 1026 expr {$STMT!=""} 1027} {1} 1028 1029# But still we do not generate code if there is no SQL 1030# 1031do_test capi3c-16.3 { 1032 set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL] 1033 sqlite3_finalize $STMT 1034 expr {$STMT==""} 1035} {1} 1036do_test capi3c-16.4 { 1037 set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL] 1038 sqlite3_finalize $STMT 1039 expr {$STMT==""} 1040} {1} 1041 1042# Ticket #2154. 1043# 1044do_test capi3c-17.1 { 1045 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL] 1046 sqlite3_step $STMT 1047} SQLITE_ROW 1048do_test capi3c-17.2 { 1049 sqlite3_column_int $STMT 0 1050} 4 1051do_test capi3c-17.3 { 1052 sqlite3_step $STMT 1053} SQLITE_DONE 1054do_test capi3c-17.4 { 1055 sqlite3_reset $STMT 1056 db eval {CREATE INDEX i2 ON t2(a)} 1057 sqlite3_step $STMT 1058} SQLITE_ROW 1059do_test capi3c-17.5 { 1060 sqlite3_column_int $STMT 0 1061} 4 1062do_test capi3c-17.6 { 1063 sqlite3_step $STMT 1064} SQLITE_DONE 1065do_test capi3c-17.7 { 1066 sqlite3_reset $STMT 1067 db eval {DROP INDEX i2} 1068 sqlite3_step $STMT 1069} SQLITE_ROW 1070do_test capi3c-17.8 { 1071 sqlite3_column_int $STMT 0 1072} 4 1073do_test capi3c-17.9 { 1074 sqlite3_step $STMT 1075} SQLITE_DONE 1076do_test capi3c-17.10 { 1077 sqlite3_finalize $STMT 1078 set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL] 1079 sqlite3_bind_int $STMT 1 2 1080 db eval { 1081 DELETE FROM t1; 1082 INSERT INTO t1 VALUES(1,'one'); 1083 INSERT INTO t1 VALUES(2,'two'); 1084 INSERT INTO t1 VALUES(3,'three'); 1085 INSERT INTO t1 VALUES(4,'four'); 1086 } 1087 sqlite3_step $STMT 1088} SQLITE_ROW 1089do_test capi3c-17.11 { 1090 sqlite3_column_text $STMT 0 1091} two 1092do_test capi3c-17.12 { 1093 sqlite3_step $STMT 1094} SQLITE_DONE 1095do_test capi3c-17.13 { 1096 sqlite3_reset $STMT 1097 db eval {CREATE INDEX i1 ON t1(a)} 1098 sqlite3_step $STMT 1099} SQLITE_ROW 1100do_test capi3c-17.14 { 1101 sqlite3_column_text $STMT 0 1102} two 1103do_test capi3c-17.15 { 1104 sqlite3_step $STMT 1105} SQLITE_DONE 1106do_test capi3c-17.16 { 1107 sqlite3_reset $STMT 1108 db eval {DROP INDEX i1} 1109 sqlite3_step $STMT 1110} SQLITE_ROW 1111do_test capi3c-17.17 { 1112 sqlite3_column_text $STMT 0 1113} two 1114do_test capi3c-17.18 { 1115 sqlite3_step $STMT 1116} SQLITE_DONE 1117do_test capi3c-17.99 { 1118 sqlite3_finalize $STMT 1119} SQLITE_OK 1120 1121# On the mailing list it has been reported that finalizing after 1122# an SQLITE_BUSY return leads to a segfault. Here we test that case. 1123# 1124do_test capi3c-18.1 { 1125 sqlite3 db2 test.db 1126 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL] 1127 sqlite3_step $STMT 1128} SQLITE_ROW 1129do_test capi3c-18.2 { 1130 sqlite3_column_int $STMT 0 1131} 4 1132do_test capi3c-18.3 { 1133 sqlite3_reset $STMT 1134 db2 eval {BEGIN EXCLUSIVE} 1135 sqlite3_step $STMT 1136} SQLITE_BUSY 1137do_test capi3c-18.4 { 1138 sqlite3_finalize $STMT 1139} SQLITE_BUSY 1140do_test capi3c-18.5 { 1141 db2 eval {COMMIT} 1142 db2 close 1143} {} 1144 1145# Ticket #2158. The sqlite3_step() will still return SQLITE_SCHEMA 1146# if the database schema changes in a way that makes the statement 1147# no longer valid. 1148# 1149do_test capi3c-19.1 { 1150 db eval { 1151 CREATE TABLE t3(x,y); 1152 INSERT INTO t3 VALUES(1,2); 1153 } 1154 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1155 sqlite3_step $STMT 1156} SQLITE_ROW 1157do_test capi3c-19.2 { 1158 sqlite3_column_int $STMT 0 1159} 1 1160do_test capi3c-19.3 { 1161 sqlite3_step $STMT 1162} SQLITE_DONE 1163do_test capi3c-19.4 { 1164 sqlite3_reset $STMT 1165 db eval {DROP TABLE t3} 1166 sqlite3_step $STMT 1167} SQLITE_SCHEMA 1168do_test capi3c-19.4.1 { 1169 sqlite3_errmsg $DB 1170} {no such table: t3} 1171do_test capi3c-19.4.2 { 1172 sqlite3_expired $STMT 1173} 1 1174do_test capi3c-19.4.3 { 1175 sqlite3_errmsg $DB 1176} {no such table: t3} 1177do_test capi3c-19.4.4 { 1178 sqlite3_expired 0 1179} 1 1180do_test capi3c-19.5 { 1181 sqlite3_reset $STMT 1182 db eval { 1183 CREATE TABLE t3(x,y); 1184 INSERT INTO t3 VALUES(1,2); 1185 } 1186 sqlite3_step $STMT 1187} SQLITE_ROW 1188do_test capi3c-19.5.2 { 1189 sqlite3_expired $STMT 1190} 0 1191do_test capi3c-19.6 { 1192 sqlite3_column_int $STMT 1 1193} 2 1194do_test capi3c-19.99 { 1195 sqlite3_finalize $STMT 1196} SQLITE_OK 1197 1198# Make sure a change in a separate database connection does not 1199# cause an SQLITE_SCHEMA return. 1200# 1201do_test capi3c-20.1 { 1202 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1203 sqlite3 db2 test.db 1204 db2 eval {CREATE TABLE t4(x)} 1205 sqlite3_step $STMT 1206} SQLITE_ROW 1207do_test capi3c-20.2 { 1208 sqlite3_column_int $STMT 1 1209} 2 1210do_test capi3c-20.3 { 1211 sqlite3_step $STMT 1212} SQLITE_DONE 1213do_test capi3c-20.4 { 1214 db2 close 1215 sqlite3_finalize $STMT 1216} SQLITE_OK 1217 1218# Test that sqlite3_step() sets the database error code correctly. 1219# See ticket #2497. 1220# 1221ifcapable progress { 1222 do_test capi3c-21.1 { 1223 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1224 db progress 5 "expr 1" 1225 sqlite3_step $STMT 1226 } {SQLITE_INTERRUPT} 1227 do_test capi3c-21.2 { 1228 sqlite3_errcode $DB 1229 } {SQLITE_INTERRUPT} 1230 do_test capi3c-21.3 { 1231 sqlite3_finalize $STMT 1232 } {SQLITE_INTERRUPT} 1233 do_test capi3c-21.4 { 1234 set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 1235 db progress 5 "expr 1" 1236 sqlite3_step $STMT 1237 } {SQLITE_ERROR} 1238 do_test capi3c-21.5 { 1239 sqlite3_errcode $DB 1240 } {SQLITE_ERROR} 1241 do_test capi3c-21.6 { 1242 sqlite3_finalize $STMT 1243 } {SQLITE_INTERRUPT} 1244 do_test capi3c-21.7 { 1245 sqlite3_errcode $DB 1246 } {SQLITE_INTERRUPT} 1247} 1248 1249# Make sure sqlite3_result_error_code() returns the correct error code. 1250# See ticket #2940 1251# 1252do_test capi3c-22.1 { 1253 db progress 0 {} 1254 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL] 1255 sqlite3_step $STMT 1256} {SQLITE_PERM} 1257sqlite3_finalize $STMT 1258do_test capi3c-22.2 { 1259 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL] 1260 sqlite3_step $STMT 1261} {SQLITE_ABORT} 1262sqlite3_finalize $STMT 1263do_test capi3c-22.3 { 1264 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL] 1265 sqlite3_step $STMT 1266} {SQLITE_EMPTY} 1267sqlite3_finalize $STMT 1268 1269 1270finish_test 1271