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.23 2009/07/22 07:27:57 danielk1977 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} 791 792# As of 3.6.5 a COMMIT is OK during while a query is still running - 793# as long as it is a read-only query and not an incremental BLOB write. 794# 795do_test capi3-11.3.1 { 796 catchsql { 797 COMMIT; 798 } 799} {0 {}} 800do_test capi3-11.3.2 { 801 sqlite3_extended_errcode $DB 802} {SQLITE_OK} 803do_test capi3-11.3.3 { 804 sqlite3_get_autocommit $DB 805} 1 806do_test capi3-11.3.4 { 807 db eval {PRAGMA lock_status} 808} {main shared temp closed} 809 810do_test capi3c-11.4 { 811 sqlite3_step $STMT 812} {SQLITE_ERROR} 813do_test capi3c-11.5 { 814 sqlite3_finalize $STMT 815} {SQLITE_ERROR} 816do_test capi3c-11.6 { 817 catchsql { 818 SELECT * FROM t1; 819 } 820} {0 {1 int 2 notatype}} 821do_test capi3c-11.7 { 822 sqlite3_get_autocommit $DB 823} 1 824do_test capi3c-11.8 { 825 execsql { 826 CREATE TABLE t2(a); 827 INSERT INTO t2 VALUES(1); 828 INSERT INTO t2 VALUES(2); 829 BEGIN; 830 INSERT INTO t2 VALUES(3); 831 } 832} {} 833do_test capi3c-11.8.1 { 834 sqlite3_get_autocommit $DB 835} 0 836do_test capi3c-11.9 { 837 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 838 sqlite3_step $STMT 839} {SQLITE_ROW} 840do_test capi3c-11.9.1 { 841 sqlite3_get_autocommit $DB 842} 0 843do_test capi3c-11.9.2 { 844 catchsql { 845 ROLLBACK; 846 } 847} {1 {cannot rollback transaction - SQL statements in progress}} 848do_test capi3c-11.9.3 { 849 sqlite3_get_autocommit $DB 850} 0 851do_test capi3c-11.10 { 852 sqlite3_step $STMT 853} {SQLITE_ROW} 854do_test capi3c-11.11 { 855 sqlite3_step $STMT 856} {SQLITE_ROW} 857do_test capi3c-11.12 { 858 sqlite3_step $STMT 859} {SQLITE_DONE} 860do_test capi3c-11.13 { 861 sqlite3_finalize $STMT 862} {SQLITE_OK} 863do_test capi3c-11.14 { 864 execsql { 865 SELECT a FROM t2; 866 } 867} {1 2 3} 868do_test capi3c-11.14.1 { 869 sqlite3_get_autocommit $DB 870} 0 871do_test capi3c-11.15 { 872 catchsql { 873 ROLLBACK; 874 } 875} {0 {}} 876do_test capi3c-11.15.1 { 877 sqlite3_get_autocommit $DB 878} 1 879do_test capi3c-11.16 { 880 execsql { 881 SELECT a FROM t2; 882 } 883} {1 2} 884 885# Sanity check on the definition of 'outstanding VM'. This means any VM 886# that has had sqlite3_step() called more recently than sqlite3_finalize() or 887# sqlite3_reset(). So a VM that has just been prepared or reset does not 888# count as an active VM. 889do_test capi3c-11.17 { 890 execsql { 891 BEGIN; 892 } 893} {} 894do_test capi3c-11.18 { 895 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL] 896 catchsql { 897 COMMIT; 898 } 899} {0 {}} 900do_test capi3c-11.19 { 901 sqlite3_step $STMT 902} {SQLITE_ROW} 903do_test capi3c-11.20 { 904 catchsql { 905 BEGIN; 906 COMMIT; 907 } 908} {0 {}} 909do_test capi3c-11.20 { 910 sqlite3_reset $STMT 911 catchsql { 912 COMMIT; 913 } 914} {1 {cannot commit - no transaction is active}} 915do_test capi3c-11.21 { 916 sqlite3_finalize $STMT 917} {SQLITE_OK} 918 919# The following tests - capi3c-12.* - check that its Ok to start a 920# transaction while other VMs are active, and that its Ok to execute 921# atomic updates in the same situation 922# 923do_test capi3c-12.1 { 924 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 925 sqlite3_step $STMT 926} {SQLITE_ROW} 927do_test capi3c-12.2 { 928 catchsql { 929 INSERT INTO t1 VALUES(3, NULL); 930 } 931} {0 {}} 932do_test capi3c-12.3 { 933 catchsql { 934 INSERT INTO t2 VALUES(4); 935 } 936} {0 {}} 937do_test capi3c-12.4 { 938 catchsql { 939 BEGIN; 940 INSERT INTO t1 VALUES(4, NULL); 941 } 942} {0 {}} 943do_test capi3c-12.5 { 944 sqlite3_step $STMT 945} {SQLITE_ROW} 946do_test capi3c-12.5.1 { 947 sqlite3_step $STMT 948} {SQLITE_ROW} 949do_test capi3c-12.6 { 950 sqlite3_step $STMT 951} {SQLITE_DONE} 952do_test capi3c-12.7 { 953 sqlite3_finalize $STMT 954} {SQLITE_OK} 955do_test capi3c-12.8 { 956 execsql { 957 COMMIT; 958 SELECT a FROM t1; 959 } 960} {1 2 3 4} 961 962# Test cases capi3c-13.* test the sqlite3_clear_bindings() and 963# sqlite3_sleep APIs. 964# 965if {[llength [info commands sqlite3_clear_bindings]]>0} { 966 do_test capi3c-13.1 { 967 execsql { 968 DELETE FROM t1; 969 } 970 set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 971 sqlite3_step $STMT 972 } {SQLITE_DONE} 973 do_test capi3c-13.2 { 974 sqlite3_reset $STMT 975 sqlite3_bind_text $STMT 1 hello 5 976 sqlite3_bind_text $STMT 2 world 5 977 sqlite3_step $STMT 978 } {SQLITE_DONE} 979 do_test capi3c-13.3 { 980 sqlite3_reset $STMT 981 sqlite3_clear_bindings $STMT 982 sqlite3_step $STMT 983 } {SQLITE_DONE} 984 do_test capi3c-13-4 { 985 sqlite3_finalize $STMT 986 execsql { 987 SELECT * FROM t1; 988 } 989 } {{} {} hello world {} {}} 990} 991if {[llength [info commands sqlite3_sleep]]>0} { 992 do_test capi3c-13-5 { 993 set ms [sqlite3_sleep 80] 994 expr {$ms==80 || $ms==1000} 995 } {1} 996} 997 998# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 999# 1000do_test capi3c-14.1 { 1001 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 1002 lappend rc $msg 1003} {1 SQLITE_MISUSE} 1004 1005# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. 1006# 1007do_test capi3c-15.1 { 1008 set sql {SELECT * FROM t2} 1009 set nbytes [string length $sql] 1010 append sql { WHERE a==1} 1011 set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL] 1012 sqlite3_step $STMT 1013 sqlite3_column_int $STMT 0 1014} {1} 1015do_test capi3c-15.2 { 1016 sqlite3_step $STMT 1017 sqlite3_column_int $STMT 0 1018} {2} 1019do_test capi3c-15.3 { 1020 sqlite3_finalize $STMT 1021} {SQLITE_OK} 1022 1023# Make sure code is always generated even if an IF EXISTS or 1024# IF NOT EXISTS clause is present that the table does not or 1025# does exists. That way we will always have a prepared statement 1026# to expire when the schema changes. 1027# 1028do_test capi3c-16.1 { 1029 set sql {DROP TABLE IF EXISTS t3} 1030 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1031 sqlite3_finalize $STMT 1032 expr {$STMT!=""} 1033} {1} 1034do_test capi3c-16.2 { 1035 set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} 1036 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1037 sqlite3_finalize $STMT 1038 expr {$STMT!=""} 1039} {1} 1040 1041# But still we do not generate code if there is no SQL 1042# 1043do_test capi3c-16.3 { 1044 set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL] 1045 sqlite3_finalize $STMT 1046 expr {$STMT==""} 1047} {1} 1048do_test capi3c-16.4 { 1049 set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL] 1050 sqlite3_finalize $STMT 1051 expr {$STMT==""} 1052} {1} 1053 1054# Ticket #2154. 1055# 1056do_test capi3c-17.1 { 1057 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL] 1058 sqlite3_step $STMT 1059} SQLITE_ROW 1060do_test capi3c-17.2 { 1061 sqlite3_column_int $STMT 0 1062} 4 1063do_test capi3c-17.3 { 1064 sqlite3_step $STMT 1065} SQLITE_DONE 1066do_test capi3c-17.4 { 1067 sqlite3_reset $STMT 1068 db eval {CREATE INDEX i2 ON t2(a)} 1069 sqlite3_step $STMT 1070} SQLITE_ROW 1071do_test capi3c-17.5 { 1072 sqlite3_column_int $STMT 0 1073} 4 1074do_test capi3c-17.6 { 1075 sqlite3_step $STMT 1076} SQLITE_DONE 1077do_test capi3c-17.7 { 1078 sqlite3_reset $STMT 1079 db eval {DROP INDEX i2} 1080 sqlite3_step $STMT 1081} SQLITE_ROW 1082do_test capi3c-17.8 { 1083 sqlite3_column_int $STMT 0 1084} 4 1085do_test capi3c-17.9 { 1086 sqlite3_step $STMT 1087} SQLITE_DONE 1088do_test capi3c-17.10 { 1089 sqlite3_finalize $STMT 1090 set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL] 1091 sqlite3_bind_int $STMT 1 2 1092 db eval { 1093 DELETE FROM t1; 1094 INSERT INTO t1 VALUES(1,'one'); 1095 INSERT INTO t1 VALUES(2,'two'); 1096 INSERT INTO t1 VALUES(3,'three'); 1097 INSERT INTO t1 VALUES(4,'four'); 1098 } 1099 sqlite3_step $STMT 1100} SQLITE_ROW 1101do_test capi3c-17.11 { 1102 sqlite3_column_text $STMT 0 1103} two 1104do_test capi3c-17.12 { 1105 sqlite3_step $STMT 1106} SQLITE_DONE 1107do_test capi3c-17.13 { 1108 sqlite3_reset $STMT 1109 db eval {CREATE INDEX i1 ON t1(a)} 1110 sqlite3_step $STMT 1111} SQLITE_ROW 1112do_test capi3c-17.14 { 1113 sqlite3_column_text $STMT 0 1114} two 1115do_test capi3c-17.15 { 1116 sqlite3_step $STMT 1117} SQLITE_DONE 1118do_test capi3c-17.16 { 1119 sqlite3_reset $STMT 1120 db eval {DROP INDEX i1} 1121 sqlite3_step $STMT 1122} SQLITE_ROW 1123do_test capi3c-17.17 { 1124 sqlite3_column_text $STMT 0 1125} two 1126do_test capi3c-17.18 { 1127 sqlite3_step $STMT 1128} SQLITE_DONE 1129do_test capi3c-17.99 { 1130 sqlite3_finalize $STMT 1131} SQLITE_OK 1132 1133# On the mailing list it has been reported that finalizing after 1134# an SQLITE_BUSY return leads to a segfault. Here we test that case. 1135# 1136do_test capi3c-18.1 { 1137 sqlite3 db2 test.db 1138 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL] 1139 sqlite3_step $STMT 1140} SQLITE_ROW 1141do_test capi3c-18.2 { 1142 sqlite3_column_int $STMT 0 1143} 4 1144do_test capi3c-18.3 { 1145 sqlite3_reset $STMT 1146 db2 eval {BEGIN EXCLUSIVE} 1147 sqlite3_step $STMT 1148} SQLITE_BUSY 1149do_test capi3c-18.4 { 1150 sqlite3_finalize $STMT 1151} SQLITE_BUSY 1152do_test capi3c-18.5 { 1153 db2 eval {COMMIT} 1154 db2 close 1155} {} 1156 1157# Ticket #2158. The sqlite3_step() will still return SQLITE_SCHEMA 1158# if the database schema changes in a way that makes the statement 1159# no longer valid. 1160# 1161do_test capi3c-19.1 { 1162 db eval { 1163 CREATE TABLE t3(x,y); 1164 INSERT INTO t3 VALUES(1,2); 1165 } 1166 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1167 sqlite3_step $STMT 1168} SQLITE_ROW 1169do_test capi3c-19.2 { 1170 sqlite3_column_int $STMT 0 1171} 1 1172do_test capi3c-19.3 { 1173 sqlite3_step $STMT 1174} SQLITE_DONE 1175do_test capi3c-19.4 { 1176 sqlite3_reset $STMT 1177 db eval {DROP TABLE t3} 1178 sqlite3_step $STMT 1179} SQLITE_SCHEMA 1180do_test capi3c-19.4.1 { 1181 sqlite3_errmsg $DB 1182} {no such table: t3} 1183ifcapable deprecated { 1184 do_test capi3c-19.4.2 { 1185 sqlite3_expired $STMT 1186 } 1 1187} 1188do_test capi3c-19.4.3 { 1189 sqlite3_errmsg $DB 1190} {no such table: t3} 1191ifcapable deprecated { 1192 do_test capi3c-19.4.4 { 1193 sqlite3_expired 0 1194 } 1 1195} 1196do_test capi3c-19.5 { 1197 sqlite3_reset $STMT 1198 db eval { 1199 CREATE TABLE t3(x,y); 1200 INSERT INTO t3 VALUES(1,2); 1201 } 1202 sqlite3_step $STMT 1203} SQLITE_ROW 1204ifcapable deprecated { 1205 do_test capi3c-19.5.2 { 1206 sqlite3_expired $STMT 1207 } 0 1208} 1209do_test capi3c-19.6 { 1210 sqlite3_column_int $STMT 1 1211} 2 1212do_test capi3c-19.99 { 1213 sqlite3_finalize $STMT 1214} SQLITE_OK 1215 1216# Make sure a change in a separate database connection does not 1217# cause an SQLITE_SCHEMA return. 1218# 1219do_test capi3c-20.1 { 1220 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1221 sqlite3 db2 test.db 1222 db2 eval {CREATE TABLE t4(x)} 1223 sqlite3_step $STMT 1224} SQLITE_ROW 1225do_test capi3c-20.2 { 1226 sqlite3_column_int $STMT 1 1227} 2 1228do_test capi3c-20.3 { 1229 sqlite3_step $STMT 1230} SQLITE_DONE 1231do_test capi3c-20.4 { 1232 db2 close 1233 sqlite3_finalize $STMT 1234} SQLITE_OK 1235 1236# Test that sqlite3_step() sets the database error code correctly. 1237# See ticket #2497. 1238# 1239ifcapable progress { 1240 do_test capi3c-21.1 { 1241 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1242 db progress 5 "expr 1" 1243 sqlite3_step $STMT 1244 } {SQLITE_INTERRUPT} 1245 do_test capi3c-21.2 { 1246 sqlite3_extended_errcode $DB 1247 } {SQLITE_INTERRUPT} 1248 do_test capi3c-21.3 { 1249 sqlite3_finalize $STMT 1250 } {SQLITE_INTERRUPT} 1251 do_test capi3c-21.4 { 1252 set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 1253 db progress 5 "expr 1" 1254 sqlite3_step $STMT 1255 } {SQLITE_ERROR} 1256 do_test capi3c-21.5 { 1257 sqlite3_errcode $DB 1258 } {SQLITE_ERROR} 1259 do_test capi3c-21.6 { 1260 sqlite3_finalize $STMT 1261 } {SQLITE_INTERRUPT} 1262 do_test capi3c-21.7 { 1263 sqlite3_errcode $DB 1264 } {SQLITE_INTERRUPT} 1265 do_test capi3c-21.8 { 1266 sqlite3_extended_errcode $DB 1267 } {SQLITE_INTERRUPT} 1268} 1269 1270# Make sure sqlite3_result_error_code() returns the correct error code. 1271# See ticket #2940 1272# 1273do_test capi3c-22.1 { 1274 db progress 0 {} 1275 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL] 1276 sqlite3_step $STMT 1277} {SQLITE_PERM} 1278sqlite3_finalize $STMT 1279do_test capi3c-22.2 { 1280 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL] 1281 sqlite3_step $STMT 1282} {SQLITE_ABORT} 1283sqlite3_finalize $STMT 1284do_test capi3c-22.3 { 1285 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL] 1286 sqlite3_step $STMT 1287} {SQLITE_EMPTY} 1288sqlite3_finalize $STMT 1289 1290# For a multi-column result set where the same table column is repeated 1291# in multiple columns of the output, verify that doing a UTF-8 to UTF-16 1292# conversion (or vice versa) on one column does not change the value of 1293# the second. 1294# 1295ifcapable utf16 { 1296 do_test capi3c-23.1 { 1297 set STMT [sqlite3_prepare_v2 db {SELECT b,b,b,b FROM t1} -1 TAIL] 1298 sqlite3_step $STMT 1299 } {SQLITE_ROW} 1300 do_test capi3c-23.2 { 1301 sqlite3_column_text16 $STMT 0 1302 sqlite3_column_text $STMT 1 1303 } {one} 1304 do_test capi3c-23.3 { 1305 sqlite3_column_text16 $STMT 2 1306 sqlite3_column_text $STMT 3 1307 } {one} 1308 sqlite3_finalize $STMT 1309 do_test capi3c-23.4 { 1310 set STMT [sqlite3_prepare_v2 db {SELECT b||'x',b,b,b FROM t1} -1 TAIL] 1311 sqlite3_step $STMT 1312 } {SQLITE_ROW} 1313 do_test capi3c-23.5 { 1314 sqlite3_column_text16 $STMT 0 1315 sqlite3_column_text $STMT 1 1316 } {one} 1317 do_test capi3c-23.6 { 1318 sqlite3_column_text16 $STMT 2 1319 sqlite3_column_text $STMT 3 1320 } {one} 1321 sqlite3_finalize $STMT 1322} 1323 1324# Test decltype on some SELECT statements that contain sub-selects. 1325# 1326proc decltype {zSql} { 1327 set ret [list] 1328 set STMT [sqlite3_prepare_v2 db $zSql -1 TAIL] 1329 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 1330 lappend ret [sqlite3_column_decltype $STMT $i] 1331 } 1332 sqlite3_finalize $STMT 1333 return $ret 1334} 1335do_test capi3c-24.1 { 1336 execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) } 1337 decltype {SELECT * FROM t5} 1338} {INTEGER STRING DATETIME} 1339do_test capi3c-24.2 { 1340 decltype {SELECT (SELECT c) FROM t5} 1341} {DATETIME} 1342do_test capi3c-24.3 { 1343 decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5} 1344} {DATETIME} 1345do_test capi3c-24.4 { 1346 decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b} 1347} {INTEGER STRING DATETIME} 1348do_test capi3c-24.5 { 1349 decltype { 1350 SELECT (SELECT x FROM (SELECT c AS x)) 1351 FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b 1352 } 1353} {DATETIME} 1354do_test capi3c-24.3 { 1355 decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5} 1356} {INTEGER} 1357 1358finish_test 1359