From 04f2e68d0caa659e281469880a3c99d69405a42d Mon Sep 17 00:00:00 2001 From: danielk1977 Date: Thu, 27 May 2004 01:04:07 +0000 Subject: [PATCH] Add TCL test bindings and some more test cases for the new query API. (CVS 1467) FossilOrigin-Name: d72adf0c522b442d5e1663862bdd639c282d4495 --- manifest | 16 +-- manifest.uuid | 2 +- src/test1.c | 328 +++++++++++++++++++++++++----------------------- test/capi3.test | 72 ++++++++--- 4 files changed, 233 insertions(+), 185 deletions(-) diff --git a/manifest b/manifest index ccae17782d..a5c7dd6bc8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Break\sMem.flags\sinto\sMem.type\sand\sMem.enc.\s(CVS\s1466) -D 2004-05-26T23:43:12 +C Add\sTCL\stest\sbindings\sand\ssome\smore\stest\scases\sfor\sthe\snew\squery\sAPI.\s(CVS\s1467) +D 2004-05-27T01:04:07 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -59,7 +59,7 @@ F src/sqlite.h.in 68e165dc4dc2d477c95c76b9ede13eed5fbaabf4 F src/sqliteInt.h 6b0d8d856c4af325eb5a00d1c32d89aacf432875 F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2 F src/tclsqlite.c 86daf7bf6ba715bf0f0c7a47beb1d947a15cb868 -F src/test1.c f9d1e36b87b5a2253dabd4c563e110e8d8273dbf +F src/test1.c 039659c18c6746199fe6e23863bb117a8e216f54 F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872 F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968 F src/test4.c 34848a9fd31aa65857b20a8bfc03aff77d8c3426 @@ -90,7 +90,7 @@ F test/btree4.test 3797b4305694c7af6828675b0f4b1424b8ca30e4 F test/btree5.test 8e5ff32c02e685d36516c6499add9375fe1377f2 F test/btree6.test a5ede6bfbbb2ec8b27e62813612c0f28e8f3e027 F test/capi2.test 8fb64e8ab7f78b8254cd4d04bb96822167f731b2 -F test/capi3.test 7ee3e33971ca5301f6a01e92cffaab95f91f417b +F test/capi3.test 64b7bad608d896468a5b4b926ed9037d112b6d77 F test/conflict.test 0911bb2f079046914a6e9c3341b36658c4e2103e F test/copy.test f07ea8d60878da7a67416ab62f78e9706b9d3c45 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 @@ -205,7 +205,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P bba6684d502ba1ecd9614d2470ec94296e3c07c2 -R 3631e4c50022e315d656f5e4e18ecf0f -U drh -Z 55bf782fc149a5ef1b23628e3441dfe2 +P 68ef17028621681f5d091e77d5df84f663a15e27 +R 7a2016da4fa120ff352ff7111a3e7361 +U danielk1977 +Z d6c93a1d5f40d138f387c99f637a146d diff --git a/manifest.uuid b/manifest.uuid index 67c0e42ba1..f4c23351b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68ef17028621681f5d091e77d5df84f663a15e27 \ No newline at end of file +d72adf0c522b442d5e1663862bdd639c282d4495 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index c09ced4cd8..c803bdbcf0 100644 --- a/src/test1.c +++ b/src/test1.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test1.c,v 1.59 2004/05/26 23:25:31 drh Exp $ +** $Id: test1.c,v 1.60 2004/05/27 01:04:07 danielk1977 Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -1315,133 +1315,6 @@ static int test_step( return TCL_OK; } -/* -** Usage: sqlite3_column_text STMT column -** -** Advance the statement to the next row. -*/ -static int test_column_text( - void * clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[] -){ - sqlite3_stmt *pStmt; - int col; - Tcl_Obj *pRet; - - if( objc!=3 ){ - Tcl_AppendResult(interp, "wrong # args: should be \"", - Tcl_GetString(objv[0]), " STMT column", 0); - return TCL_ERROR; - } - - if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; - if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - - if( SQLITE3_BLOB==sqlite3_column_type(pStmt, col) ){ - int len = sqlite3_column_bytes(pStmt, col); - pRet = Tcl_NewByteArrayObj(sqlite3_column_text(pStmt, col), len); - }else{ - pRet = Tcl_NewStringObj(sqlite3_column_text(pStmt, col), -1); - } - Tcl_SetObjResult(interp, pRet); - - return TCL_OK; -} - -/* -** Usage: sqlite3_column_text16 STMT column -** -** Advance the statement to the next row. -*/ -static int test_column_text16( - void * clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[] -){ - sqlite3_stmt *pStmt; - int col; - Tcl_Obj *pRet; - int len; - - if( objc!=3 ){ - Tcl_AppendResult(interp, "wrong # args: should be \"", - Tcl_GetString(objv[0]), " STMT column", 0); - return TCL_ERROR; - } - - if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; - if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - - len = sqlite3_column_bytes16(pStmt, col); - pRet = Tcl_NewByteArrayObj(sqlite3_column_text16(pStmt, col), len); - Tcl_SetObjResult(interp, pRet); - - return TCL_OK; -} - -/* -** Usage: sqlite3_column_name STMT column -** -** Advance the statement to the next row. -*/ -static int test_column_name( - void * clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[] -){ - sqlite3_stmt *pStmt; - int col; - - if( objc!=3 ){ - Tcl_AppendResult(interp, "wrong # args: should be \"", - Tcl_GetString(objv[0]), " STMT column", 0); - return TCL_ERROR; - } - - if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; - if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - - Tcl_SetResult(interp, (char *)sqlite3_column_name(pStmt, col), 0); - - return TCL_OK; -} - -/* -** Usage: sqlite3_column_name16 STMT column -** -** Advance the statement to the next row. -*/ -static int test_column_name16( - void * clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[] -){ - sqlite3_stmt *pStmt; - int col; - Tcl_Obj *pRet; - const void *zName16; - - if( objc!=3 ){ - Tcl_AppendResult(interp, "wrong # args: should be \"", - Tcl_GetString(objv[0]), " STMT column", 0); - return TCL_ERROR; - } - - if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; - if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - - zName16 = sqlite3_column_name16(pStmt, col); - pRet = Tcl_NewByteArrayObj(zName16, sqlite3utf16ByteLen(zName16, -1)+2); - Tcl_SetObjResult(interp, pRet); - - return TCL_OK; -} - /* ** Usage: sqlite3_column_count STMT ** @@ -1516,12 +1389,12 @@ static int test_column_type( } /* -** Usage: sqlite3_column_int STMT column +** Usage: sqlite3_column_int64 STMT column ** ** Return the data in column 'column' of the current row cast as an -** integer. +** wide (64-bit) integer. */ -static int test_column_int( +static int test_column_int64( void * clientData, Tcl_Interp *interp, int objc, @@ -1529,6 +1402,7 @@ static int test_column_int( ){ sqlite3_stmt *pStmt; int col; + i64 iVal; if( objc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", @@ -1539,7 +1413,37 @@ static int test_column_int( if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_column_int(pStmt, col))); + iVal = sqlite3_column_int64(pStmt, col); + Tcl_SetObjResult(interp, Tcl_NewWideIntObj(iVal)); + return TCL_OK; +} + +/* +** Usage: sqlite3_column_double STMT column +** +** Return the data in column 'column' of the current row cast as a double. +*/ +static int test_column_double( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int col; + double rVal; + + if( objc!=3 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " STMT column", 0); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; + + rVal = sqlite3_column_double(pStmt, col); + Tcl_SetObjResult(interp, Tcl_NewDoubleObj(iVal)); return TCL_OK; } @@ -1609,6 +1513,102 @@ static int reverse_collfunc( return TCL_OK; } +/* +** Usage: sqlite3_column_text STMT column +** +** Usage: sqlite3_column_decltype STMT column +** +** Usage: sqlite3_column_name STMT column +*/ +static int test_stmt_utf8( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int col; + const char *(xFunc *)(sqlite3_stmt*, int) = clientData; + + if( objc!=3 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " STMT column", 0); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; + Tcl_SetResult(interp, (char *)xFunc(pStmt, col), 0); + return TCL_OK; +} + +/* +** Usage: sqlite3_column_text STMT column +** +** Usage: sqlite3_column_decltype STMT column +** +** Usage: sqlite3_column_name STMT column +*/ +static int test_stmt_utf16( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int col; + Tcl_Obj *pRet; + const void *zName16; + const void *(xFunc *)(sqlite3_stmt*, int) = clientData; + + if( objc!=3 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " STMT column", 0); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; + + zName16 = xFunc(pStmt, col); + pRet = Tcl_NewByteArrayObj(zName16, sqlite3utf16ByteLen(zName16, -1)+2); + Tcl_SetObjResult(interp, pRet); + + return TCL_OK; +} + +/* +** Usage: sqlite3_column_int STMT column +** +** Usage: sqlite3_column_bytes STMT column +** +** Usage: sqlite3_column_bytes16 STMT column +** +*/ +static int test_stmt_int( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int col; + int (xFunc *)(sqlite3_stmt*, int) = clientData; + + if( objc!=3 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " STMT column", 0); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; + + Tcl_SetObjResult(interp, Tcl_NewIntObj(xFunc(pStmt, col))); + return TCL_OK; +} + + /* ** Register commands with the TCL interpreter. @@ -1645,33 +1645,45 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ static struct { char *zName; Tcl_ObjCmdProc *xProc; + void *clientData; } aObjCmd[] = { - { "sqlite3_bind_int32", (Tcl_ObjCmdProc*)test_bind_int32 }, - { "sqlite3_bind_int64", (Tcl_ObjCmdProc*)test_bind_int64 }, - { "sqlite3_bind_double", (Tcl_ObjCmdProc*)test_bind_double }, - { "sqlite3_bind_null", (Tcl_ObjCmdProc*)test_bind_null }, - { "sqlite3_bind_text", (Tcl_ObjCmdProc*)test_bind_text }, - { "sqlite3_bind_text16", (Tcl_ObjCmdProc*)test_bind_text16 }, - { "sqlite3_bind_blob", (Tcl_ObjCmdProc*)test_bind_blob }, - { "sqlite3_errcode", (Tcl_ObjCmdProc*)test_errcode }, - { "sqlite3_errmsg", (Tcl_ObjCmdProc*)test_errmsg }, - { "sqlite3_errmsg16", (Tcl_ObjCmdProc*)test_errmsg16 }, - { "sqlite3_prepare", (Tcl_ObjCmdProc*)test_prepare }, - { "sqlite3_prepare16", (Tcl_ObjCmdProc*)test_prepare16 }, - { "sqlite3_open", (Tcl_ObjCmdProc*)test_open }, - { "sqlite3_open16", (Tcl_ObjCmdProc*)test_open16 }, - { "sqlite3_finalize", (Tcl_ObjCmdProc*)test_finalize }, - { "sqlite3_reset", (Tcl_ObjCmdProc*)test_reset }, - { "sqlite3_step", (Tcl_ObjCmdProc*)test_step}, - { "sqlite3_column_text", (Tcl_ObjCmdProc*)test_column_text }, - { "sqlite3_column_text16", (Tcl_ObjCmdProc*)test_column_text16 }, - { "sqlite3_column_count", (Tcl_ObjCmdProc*)test_column_count }, - { "sqlite3_column_name", (Tcl_ObjCmdProc*)test_column_name }, - { "sqlite3_column_name16", (Tcl_ObjCmdProc*)test_column_name16 }, - { "sqlite3_column_type", (Tcl_ObjCmdProc*)test_column_type }, - { "sqlite3_column_int", (Tcl_ObjCmdProc*)test_column_int }, - { "sqlite3_data_count", (Tcl_ObjCmdProc*)test_data_count }, - { "add_reverse_collating_func", (Tcl_ObjCmdProc*)reverse_collfunc }, + { "sqlite3_bind_int32", test_bind_int32, 0 }, + { "sqlite3_bind_int64", test_bind_int64 , 0 }, + { "sqlite3_bind_double", test_bind_double, 0 }, + { "sqlite3_bind_null", test_bind_null ,0 }, + { "sqlite3_bind_text", test_bind_text ,0 }, + { "sqlite3_bind_text16", test_bind_text16 ,0 }, + { "sqlite3_bind_blob", test_bind_blob ,0 }, + { "sqlite3_errcode", test_errcode ,0 }, + { "sqlite3_errmsg", test_errmsg ,0 }, + { "sqlite3_errmsg16", test_errmsg16 ,0 }, + { "sqlite3_open", test_open ,0 }, + { "sqlite3_open16", test_open16 ,0 }, + { "add_reverse_collating_func", reverse_collfunc ,0 }, + + { "sqlite3_prepare", test_prepare ,0 }, + { "sqlite3_prepare16", test_prepare16 ,0 }, + { "sqlite3_finalize", test_finalize ,0 }, + { "sqlite3_reset", test_reset ,0 }, + { "sqlite3_step", test_step,0 }, + + /* sqlite3_column_*() API */ + { "sqlite3_column_count", test_column_count ,0 }, + { "sqlite3_data_count", test_data_count ,0 }, + { "sqlite3_column_type", test_column_type ,0 }, + { "sqlite3_column_blob", test_column_name ,0 }, + { "sqlite3_column_double", test_column_double ,0 }, + { "sqlite3_column_int64", test_column_int64 ,0 }, + { "sqlite3_column_int", test_stmt_int ,sqlite3_column_int }, + { "sqlite3_column_bytes", test_stmt_int ,sqlite3_column_bytes }, + { "sqlite3_column_bytes16", test_stmt_int ,sqlite3_column_bytes16 }, + { "sqlite3_column_text", test_stmt_utf8, sqlite3_column_text}, + { "sqlite3_column_decltype", test_stmt_utf8, sqlite3_column_decltype}, + { "sqlite3_column_name", test_stmt_utf8, sqlite3_column_name}, + { "sqlite3_column_text16", test_stmt_utf16, sqlite3_column_text16}, + { "sqlite3_column_decltype16", test_stmt_utf16,sqlite3_column_decltype16}, + { "sqlite3_column_name16", test_stmt_utf16, sqlite3_column_name16}, + }; int i; diff --git a/test/capi3.test b/test/capi3.test index a5ab208c28..4e5dc3fb01 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -11,7 +11,7 @@ # 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.5 2004/05/26 13:27:00 danielk1977 Exp $ +# $Id: capi3.test,v 1.6 2004/05/27 01:04:07 danielk1977 Exp $ # set testdir [file dirname $argv0] @@ -162,16 +162,21 @@ do_test capi3-4.4 { # columns (before the statement is executed). # capi3-5.1: Check we can retrieve column names (before statement execution) # capi3-5.2: Check we can retrieve column names in UTF-16 -# capi3-5.3: Step the statement. -# capi3-5.4: Check the types of the values. -# capi3-5.5: Check the values can be retrieved as integers. -# capi3-5.6: Check the values can be retrieved as UTF-8 text. -# capi3-5.7: Check the values can be retrieved as UTF-16 text. -# capi3-5.8: Check that the types of the values have not been altered by -# retrieving the values as text. # -# Test cases capi3-5.9 - capi3-5.14 are a repeat of 3-8, with a different -# row of data. +# capi3-5.1.3: Step the statement. +# capi3-5.1.4: Check the types of the values. +# capi3-5.1.5: Check the values can be retrieved as integers. +# capi3-5.1.6: Check the values can be retrieved as UTF-8 text. +# capi3-5.1.7: Check the values can be retrieved as floats. +# capi3-5.1.8: Check the values can be retrieved as UTF-16 text. +# capi3-5.1.9: Check the values can be retrieved as integers. +# capi3-5.1.10: Check the values can be retrieved as floats. +# capi3-5.1.11: Check the values can still be retrieved as UTF-8 text. +# capi3-5.1.12: Check that the types of the values have not been altered by +# retrieving the values as text. +# +# Test cases capi3-5.2.3 - capi3-5.2.12 are a repeat of 1.3-1.12, with a +# different row of data. # do_test capi3-5.0 { @@ -198,37 +203,68 @@ do_test capi3-5.2 { set cnamelist } {a b c} -do_test capi3-5.3 { +do_test capi3-5.1.3 { sqlite3_step $STMT } SQLITE_ROW -do_test capi3-5.4 { +# types +do_test capi3-5.1.4 { set types [list] foreach i {0 1 2} {lappend types [sqlite3_column_type $STMT $i]} set types } {INTEGER INTEGER TEXT} -if 0 { -do_test capi3-5.5 { +# Integers +do_test capi3-5.1.5 { set ints [list] foreach i {0 1 2} {lappend ints [sqlite3_column_int $STMT $i]} set ints } {1 2 3} -do_test capi3-5.6 { +# UTF-8 +do_test capi3-5.1.6 { set utf8 [list] foreach i {0 1 2} {lappend utf8 [sqlite3_column_data $STMT $i]} set utf8 } {1 2 3} -} -do_test capi3-5.7 { +# Floats +do_test capi3-5.1.7 { + set utf8 [list] + foreach i {0 1 2} {lappend utf8 [sqlite3_column_double $STMT $i]} + set utf8 +} {1 2 3} + +# UTF-16 +do_test capi3-5.1.8 { set utf8 [list] foreach i {0 1 2} {lappend utf8 [utf8 [sqlite3_column_data16 $STMT $i]]} set utf8 } {1 2 3} -do_test capi3-5.8 { +# Integers +do_test capi3-5.1.9 { + set ints [list] + foreach i {0 1 2} {lappend ints [sqlite3_column_int $STMT $i]} + set ints +} {1 2 3} + +# Floats +do_test capi3-5.1.10 { + set utf8 [list] + foreach i {0 1 2} {lappend utf8 [sqlite3_column_double $STMT $i]} + set utf8 +} {1 2 3} + +# UTF-8 +do_test capi3-5.1.11 { + set utf8 [list] + foreach i {0 1 2} {lappend utf8 [sqlite3_column_data $STMT $i]} + set utf8 +} {1 2 3} + +# Types +do_test capi3-5.1.12 { set types [list] foreach i {0 1 2} {lappend types [sqlite3_column_type $STMT $i]} set types