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