📄 capi3.test
字号:
# 2003 January 29## 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. The# focus of this script testing the callback-free C/C++ API.## $Id: capi3.test,v 1.50 2007/06/21 15:25:05 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:## capi3-1.*: Test sqlite3_prepare # capi3-2.*: Test sqlite3_prepare16# capi3-3.*: Test sqlite3_open# capi3-4.*: Test sqlite3_open16# capi3-5.*: Test the various sqlite3_result_* APIs# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.#set DB [sqlite3_connection_pointer db]do_test capi3-1.0 { sqlite3_get_autocommit $DB} 1do_test capi3-1.1 { set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL] sqlite3_finalize $STMT set TAIL} {}do_test capi3-1.2 { sqlite3_errcode $DB} {SQLITE_OK}do_test capi3-1.3 { sqlite3_errmsg $DB} {not an error}do_test capi3-1.4 { set sql {SELECT name FROM sqlite_master;SELECT 10} set STMT [sqlite3_prepare $DB $sql -1 TAIL] sqlite3_finalize $STMT set TAIL} {SELECT 10}do_test capi3-1.5 { set sql {SELECT namex FROM sqlite_master} catch { set STMT [sqlite3_prepare $DB $sql -1 TAIL] }} {1}do_test capi3-1.6 { sqlite3_errcode $DB} {SQLITE_ERROR}do_test capi3-1.7 { sqlite3_errmsg $DB} {no such column: namex}ifcapable {utf16} { do_test capi3-2.1 { set sql16 [utf16 {SELECT name FROM sqlite_master}] set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL] sqlite3_finalize $STMT utf8 $::TAIL } {} do_test capi3-2.2 { set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] sqlite3_finalize $STMT utf8 $TAIL } {SELECT 10} do_test capi3-2.3 { set sql [utf16 {SELECT namex FROM sqlite_master}] catch { set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] } } {1} do_test capi3-2.4 { sqlite3_errcode $DB } {SQLITE_ERROR} do_test capi3-2.5 { sqlite3_errmsg $DB } {no such column: namex} ifcapable schema_pragmas { do_test capi3-2.6 { execsql {CREATE TABLE tablename(x)} set sql16 [utf16 {PRAGMA table_info("TableName")}] set STMT [sqlite3_prepare16 $DB $sql16 -1 TAIL] sqlite3_step $STMT } SQLITE_ROW do_test capi3-2.7 { sqlite3_step $STMT } SQLITE_DONE do_test capi3-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 capi3-3.1 { set db2 [sqlite3_open test.db {}] sqlite3_errcode $db2} {SQLITE_OK}# FIX ME: Should test the db handle works.do_test capi3-3.2 { sqlite3_close $db2} {SQLITE_OK}do_test capi3-3.3 { catch { set db2 [sqlite3_open /bogus/path/test.db {}] } sqlite3_errcode $db2} {SQLITE_CANTOPEN}do_test capi3-3.4 { sqlite3_errmsg $db2} {unable to open database file}do_test capi3-3.5 { sqlite3_close $db2} {SQLITE_OK}do_test capi3-3.6.1-misuse { sqlite3_close $db2} {SQLITE_MISUSE}do_test capi3-3.6.2-misuse { sqlite3_errmsg $db2} {library routine called out of sequence}ifcapable {utf16} { do_test capi3-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 capi3-4.1 { set db2 [sqlite3_open16 [utf16 test.db] {}] sqlite3_errcode $db2} {SQLITE_OK}# FIX ME: Should test the db handle works.do_test capi3-4.2 { sqlite3_close $db2} {SQLITE_OK}do_test capi3-4.3 { catch { set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] } sqlite3_errcode $db2} {SQLITE_CANTOPEN}do_test capi3-4.4 { utf8 [sqlite3_errmsg16 $db2]} {unable to open database file}do_test capi3-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 "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 "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 "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}# typesdo_test $test.1 { set types [list] foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} set types} $types# Integersdo_test $test.2 { set ints [list] foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} set ints} $ints# bytesset lens [list]foreach i $::idxlist { lappend lens [string length [lindex $strings $i]]}do_test $test.3 { set bytes [list] set lens [list] foreach i $idxlist { lappend bytes [sqlite3_column_bytes $STMT $i] } set bytes} $lens# bytes16ifcapable {utf16} { set lens [list] foreach i $::idxlist { lappend lens [expr 2 * [string length [lindex $strings $i]]] } do_test $test.4 { set bytes [list] set lens [list] foreach i $idxlist { lappend bytes [sqlite3_column_bytes16 $STMT $i] } set bytes } $lens}# Blobdo_test $test.5 { set utf8 [list] foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} set utf8} $strings# UTF-8do_test $test.6 { set utf8 [list] foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} set utf8} $strings# Floatsdo_test $test.7 { set utf8 [list] foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} set utf8} $doubles# UTF-16ifcapable {utf16} { do_test $test.8 { set utf8 [list] foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} set utf8 } $strings}# Integersdo_test $test.9 { set ints [list] foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} set ints} $ints# Floatsdo_test $test.10 { set utf8 [list] foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} set utf8} $doubles# UTF-8do_test $test.11 { set utf8 [list] foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} set utf8} $strings# Typesdo_test $test.12 { set types [list] foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} set types} $types# Test that an out of range request returns the equivalent of NULLdo_test $test.13 { sqlite3_column_int $STMT -1} {0}do_test $test.13 { sqlite3_column_text $STMT -1} {}}ifcapable !floatingpoint { finish_test return}do_test capi3-5.0 { execsql { CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); INSERT INTO t1 VALUES(1, 2, 3); INSERT INTO t1 VALUES('one', 'two', NULL); INSERT INTO t1 VALUES(1.2, 1.3, 1.4); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -