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