📄 capi3c.test
字号:
# 2006 November 08## The author disclaims copyright to this source code. In place of# a legal notice, here is a blessing:## May you do good and not evil.# May you find forgiveness for yourself and forgive others.# May you share freely, never taking more than you give.##***********************************************************************# This file implements regression tests for SQLite library. ## This is a copy of the capi3.test file that has been adapted to# test the new sqlite3_prepare_v2 interface.## $Id: capi3c.test,v 1.9 2007/07/19 22:30:19 drh Exp $#set testdir [file dirname $argv0]source $testdir/tester.tcl# Return the UTF-16 representation of the supplied UTF-8 string $str.# If $nt is true, append two 0x00 bytes as a nul terminator.proc utf16 {str {nt 1}} { set r [encoding convertto unicode $str] if {$nt} { append r "\x00\x00" } return $r}# Return the UTF-8 representation of the supplied UTF-16 string $str. proc utf8 {str} { # If $str ends in two 0x00 0x00 bytes, knock these off before # converting to UTF-8 using TCL. binary scan $str \c* vals if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { set str [binary format \c* [lrange $vals 0 end-2]] } set r [encoding convertfrom unicode $str] return $r}# These tests complement those in capi2.test. They are organized# as follows:## capi3c-1.*: Test sqlite3_prepare_v2 # capi3c-2.*: Test sqlite3_prepare16_v2 # capi3c-3.*: Test sqlite3_open# capi3c-4.*: Test sqlite3_open16# capi3c-5.*: Test the various sqlite3_result_* APIs# capi3c-6.*: Test that sqlite3_close fails if there are outstanding VMs.#set DB [sqlite3_connection_pointer db]do_test capi3c-1.0 { sqlite3_get_autocommit $DB} 1do_test capi3c-1.1 { set STMT [sqlite3_prepare_v2 $DB {SELECT name FROM sqlite_master} -1 TAIL] sqlite3_finalize $STMT set TAIL} {}do_test capi3c-1.2 { sqlite3_errcode $DB} {SQLITE_OK}do_test capi3c-1.3 { sqlite3_errmsg $DB} {not an error}do_test capi3c-1.4 { set sql {SELECT name FROM sqlite_master;SELECT 10} set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] sqlite3_finalize $STMT set TAIL} {SELECT 10}do_test capi3c-1.5 { set sql {SELECT namex FROM sqlite_master} catch { set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] }} {1}do_test capi3c-1.6 { sqlite3_errcode $DB} {SQLITE_ERROR}do_test capi3c-1.7 { sqlite3_errmsg $DB} {no such column: namex}ifcapable {utf16} { do_test capi3c-2.1 { set sql16 [utf16 {SELECT name FROM sqlite_master}] set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 ::TAIL] sqlite3_finalize $STMT utf8 $::TAIL } {} do_test capi3c-2.2 { set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] sqlite3_finalize $STMT utf8 $TAIL } {SELECT 10} do_test capi3c-2.3 { set sql [utf16 {SELECT namex FROM sqlite_master}] catch { set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] } } {1} do_test capi3c-2.4 { sqlite3_errcode $DB } {SQLITE_ERROR} do_test capi3c-2.5 { sqlite3_errmsg $DB } {no such column: namex} ifcapable schema_pragmas { do_test capi3c-2.6 { execsql {CREATE TABLE tablename(x)} set sql16 [utf16 {PRAGMA table_info("TableName")}] set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 TAIL] sqlite3_step $STMT } SQLITE_ROW do_test capi3c-2.7 { sqlite3_step $STMT } SQLITE_DONE do_test capi3c-2.8 { sqlite3_finalize $STMT } SQLITE_OK }} ;# endif utf16# rename sqlite3_open sqlite3_open_old# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}do_test capi3c-3.1 { set db2 [sqlite3_open test.db {}] sqlite3_errcode $db2} {SQLITE_OK}# FIX ME: Should test the db handle works.do_test capi3c-3.2 { sqlite3_close $db2} {SQLITE_OK}do_test capi3c-3.3 { catch { set db2 [sqlite3_open /bogus/path/test.db {}] } sqlite3_errcode $db2} {SQLITE_CANTOPEN}do_test capi3c-3.4 { sqlite3_errmsg $db2} {unable to open database file}do_test capi3c-3.5 { sqlite3_close $db2} {SQLITE_OK}do_test capi3c-3.6.1-misuse { sqlite3_close $db2} {SQLITE_MISUSE}do_test capi3c-3.6.2-misuse { sqlite3_errmsg $db2} {library routine called out of sequence}ifcapable {utf16} { do_test capi3c-3.6.3-misuse { utf8 [sqlite3_errmsg16 $db2] } {library routine called out of sequence}}# rename sqlite3_open ""# rename sqlite3_open_old sqlite3_openifcapable {utf16} {do_test capi3c-4.1 { set db2 [sqlite3_open16 [utf16 test.db] {}] sqlite3_errcode $db2} {SQLITE_OK}# FIX ME: Should test the db handle works.do_test capi3c-4.2 { sqlite3_close $db2} {SQLITE_OK}do_test capi3c-4.3 { catch { set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] } sqlite3_errcode $db2} {SQLITE_CANTOPEN}do_test capi3c-4.4 { utf8 [sqlite3_errmsg16 $db2]} {unable to open database file}do_test capi3c-4.5 { sqlite3_close $db2} {SQLITE_OK}} ;# utf16# This proc is used to test the following API calls:## sqlite3_column_count# sqlite3_column_name# sqlite3_column_name16# sqlite3_column_decltype# sqlite3_column_decltype16## $STMT is a compiled SQL statement. $test is a prefix# to use for test names within this proc. $names is a list# of the column names that should be returned by $STMT.# $decltypes is a list of column declaration types for $STMT.## Example:## set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY]# check_header test1.1 {1 2 3} {"" "" ""}#proc check_header {STMT test names decltypes} { # Use the return value of sqlite3_column_count() to build # a list of column indexes. i.e. If sqlite3_column_count # is 3, build the list {0 1 2}. set ::idxlist [list] set ::numcols [sqlite3_column_count $STMT] for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} # Column names in UTF-8 do_test $test.1 { set cnamelist [list] foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} set cnamelist } $names # Column names in UTF-16 ifcapable {utf16} { do_test $test.2 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] } set cnamelist } $names } # Column names in UTF-8 do_test $test.3 { set cnamelist [list] foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} set cnamelist } $names # Column names in UTF-16 ifcapable {utf16} { do_test $test.4 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] } set cnamelist } $names } # Column names in UTF-8 do_test $test.5 { set cnamelist [list] foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} set cnamelist } $decltypes # Column declaration types in UTF-16 ifcapable {utf16} { do_test $test.6 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] } set cnamelist } $decltypes } # Test some out of range conditions: ifcapable {utf16} { do_test $test.7 { list \ [sqlite3_column_name $STMT -1] \ [sqlite3_column_name16 $STMT -1] \ [sqlite3_column_decltype $STMT -1] \ [sqlite3_column_decltype16 $STMT -1] \ [sqlite3_column_name $STMT $numcols] \ [sqlite3_column_name16 $STMT $numcols] \ [sqlite3_column_decltype $STMT $numcols] \ [sqlite3_column_decltype16 $STMT $numcols] } {{} {} {} {} {} {} {} {}} }} # This proc is used to test the following API calls:## sqlite3_column_origin_name# sqlite3_column_origin_name16# sqlite3_column_table_name# sqlite3_column_table_name16# sqlite3_column_database_name# sqlite3_column_database_name16## $STMT is a compiled SQL statement. $test is a prefix# to use for test names within this proc. $names is a list# of the column names that should be returned by $STMT.# $decltypes is a list of column declaration types for $STMT.## Example:## set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY]# check_header test1.1 {1 2 3} {"" "" ""}#proc check_origin_header {STMT test dbs tables cols} { # If sqlite3_column_origin_name() and friends are not compiled into # this build, this proc is a no-op.ifcapable columnmetadata { # Use the return value of sqlite3_column_count() to build # a list of column indexes. i.e. If sqlite3_column_count # is 3, build the list {0 1 2}. set ::idxlist [list] set ::numcols [sqlite3_column_count $STMT] for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} # Database names in UTF-8 do_test $test.8 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [sqlite3_column_database_name $STMT $i] } set cnamelist } $dbs # Database names in UTF-16 ifcapable {utf16} { do_test $test.9 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]] } set cnamelist } $dbs } # Table names in UTF-8 do_test $test.10 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [sqlite3_column_table_name $STMT $i] } set cnamelist } $tables # Table names in UTF-16 ifcapable {utf16} { do_test $test.11 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]] } set cnamelist } $tables } # Origin names in UTF-8 do_test $test.12 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [sqlite3_column_origin_name $STMT $i] } set cnamelist } $cols # Origin declaration types in UTF-16 ifcapable {utf16} { do_test $test.13 { set cnamelist [list] foreach i $idxlist { lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]] } set cnamelist } $cols } }}# This proc is used to test the following APIs:## sqlite3_data_count# sqlite3_column_type# sqlite3_column_int# sqlite3_column_text# sqlite3_column_text16# sqlite3_column_double## $STMT is a compiled SQL statement for which the previous call # to sqlite3_step returned SQLITE_ROW. $test is a prefix to use # for test names within this proc. $types is a list of the # manifest types for the current row. $ints, $doubles and $strings# are lists of the integer, real and string representations of# the values in the current row.## Example:## set STMT [sqlite3_prepare_v2 "SELECT 'hello', 1.1, NULL" -1 DUMMY]# sqlite3_step $STMT# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}#proc check_data {STMT test types ints doubles strings} { # Use the return value of sqlite3_column_count() to build # a list of column indexes. i.e. If sqlite3_column_count # is 3, build the list {0 1 2}. set ::idxlist [list] set numcols [sqlite3_data_count $STMT] for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -