** 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"
}
/*
-** Usage: sqlite3_column_text STMT column
+** Usage: sqlite3_column_count STMT
**
-** Advance the statement to the next row.
+** Return the number of columns returned by the sql statement STMT.
*/
-static int test_column_text(
+static int test_column_count(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
sqlite3_stmt *pStmt;
- int col;
- Tcl_Obj *pRet;
- if( objc!=3 ){
+ if( objc!=2 ){
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);
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_column_count(pStmt)));
return TCL_OK;
}
/*
-** Usage: sqlite3_column_text16 STMT column
+** Usage: sqlite3_column_type STMT column
**
-** Advance the statement to the next row.
+** Return the type of the data in column 'column' of the current row.
*/
-static int test_column_text16(
+static int test_column_type(
void * clientData,
Tcl_Interp *interp,
int objc,
){
sqlite3_stmt *pStmt;
int col;
- Tcl_Obj *pRet;
- int len;
+ int tp;
if( objc!=3 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
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);
+ tp = sqlite3_column_type(pStmt, col);
+ switch( tp ){
+ case SQLITE3_INTEGER:
+ Tcl_SetResult(interp, "INTEGER", TCL_STATIC);
+ break;
+ case SQLITE3_NULL:
+ Tcl_SetResult(interp, "NULL", TCL_STATIC);
+ break;
+ case SQLITE3_FLOAT:
+ Tcl_SetResult(interp, "FLOAT", TCL_STATIC);
+ break;
+ case SQLITE3_TEXT:
+ Tcl_SetResult(interp, "TEXT", TCL_STATIC);
+ break;
+ case SQLITE3_BLOB:
+ Tcl_SetResult(interp, "BLOB", TCL_STATIC);
+ break;
+ default:
+ assert(0);
+ }
return TCL_OK;
}
/*
-** Usage: sqlite3_column_name STMT column
+** Usage: sqlite3_column_int64 STMT column
**
-** Advance the statement to the next row.
+** Return the data in column 'column' of the current row cast as an
+** wide (64-bit) integer.
*/
-static int test_column_name(
+static int test_column_int64(
void * clientData,
Tcl_Interp *interp,
int objc,
){
sqlite3_stmt *pStmt;
int col;
+ i64 iVal;
if( objc!=3 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
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);
-
+ iVal = sqlite3_column_int64(pStmt, col);
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj(iVal));
return TCL_OK;
}
/*
-** Usage: sqlite3_column_name16 STMT column
+** Usage: sqlite3_column_double STMT column
**
-** Advance the statement to the next row.
+** Return the data in column 'column' of the current row cast as a double.
*/
-static int test_column_name16(
+static int test_column_double(
void * clientData,
Tcl_Interp *interp,
int objc,
){
sqlite3_stmt *pStmt;
int col;
- Tcl_Obj *pRet;
- const void *zName16;
+ double rVal;
if( objc!=3 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
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);
-
+ rVal = sqlite3_column_double(pStmt, col);
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(iVal));
return TCL_OK;
}
/*
-** Usage: sqlite3_column_count STMT
+** Usage: sqlite3_data_count STMT
**
** Return the number of columns returned by the sql statement STMT.
*/
-static int test_column_count(
+static int test_data_count(
void * clientData,
Tcl_Interp *interp,
int objc,
if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
- Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_column_count(pStmt)));
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_data_count(pStmt)));
return TCL_OK;
}
/*
-** Usage: sqlite3_column_type STMT column
+** This is a collating function named "REVERSE" which sorts text
+** in reverse order.
+*/
+static int reverseCollatingFunc(
+ void *NotUsed,
+ int nKey1, const void *pKey1,
+ int nKey2, const void *pKey2
+){
+ int rc, n;
+ n = nKey1<nKey2 ? nKey1 : nKey2;
+ rc = memcmp(pKey1, pKey2, n);
+ if( rc==0 ){
+ rc = nKey1 - nKey2;
+ }
+ return -rc;
+}
+
+/*
+** Usage: add_reverse_collating_func DB
**
-** Return the type of the data in column 'column' of the current row.
+** This routine adds a collation named "REVERSE" to database given.
+** REVERSE is used for testing only.
*/
-static int test_column_type(
+static int reverse_collfunc(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
- sqlite3_stmt *pStmt;
- int col;
- int tp;
+ sqlite3 *db;
- if( objc!=3 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- Tcl_GetString(objv[0]), " STMT column", 0);
+ if( objc!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "DB");
return TCL_ERROR;
}
-
- if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
- if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR;
-
- tp = sqlite3_column_type(pStmt, col);
- switch( tp ){
- case SQLITE3_INTEGER:
- Tcl_SetResult(interp, "INTEGER", TCL_STATIC);
- break;
- case SQLITE3_NULL:
- Tcl_SetResult(interp, "NULL", TCL_STATIC);
- break;
- case SQLITE3_FLOAT:
- Tcl_SetResult(interp, "FLOAT", TCL_STATIC);
- break;
- case SQLITE3_TEXT:
- Tcl_SetResult(interp, "TEXT", TCL_STATIC);
- break;
- case SQLITE3_BLOB:
- Tcl_SetResult(interp, "BLOB", TCL_STATIC);
- break;
- default:
- assert(0);
- }
-
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
+ sqlite3ChangeCollatingFunction(db, "REVERSE", 7, 0, reverseCollatingFunc);
return TCL_OK;
}
/*
-** Usage: sqlite3_column_int STMT column
+** Usage: sqlite3_column_text STMT column
**
-** Return the data in column 'column' of the current row cast as an
-** integer.
+** Usage: sqlite3_column_decltype STMT column
+**
+** Usage: sqlite3_column_name STMT column
*/
-static int test_column_int(
+static int test_stmt_utf8(
void * clientData,
Tcl_Interp *interp,
int objc,
){
sqlite3_stmt *pStmt;
int col;
+ const char *(xFunc *)(sqlite3_stmt*, int) = clientData;
if( objc!=3 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
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)));
+ Tcl_SetResult(interp, (char *)xFunc(pStmt, col), 0);
return TCL_OK;
}
/*
-** Usage: sqlite3_data_count STMT
+** Usage: sqlite3_column_text STMT column
**
-** Return the number of columns returned by the sql statement STMT.
+** Usage: sqlite3_column_decltype STMT column
+**
+** Usage: sqlite3_column_name STMT column
*/
-static int test_data_count(
+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!=2 ){
+ 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(sqlite3_data_count(pStmt)));
- return TCL_OK;
-}
+ zName16 = xFunc(pStmt, col);
+ pRet = Tcl_NewByteArrayObj(zName16, sqlite3utf16ByteLen(zName16, -1)+2);
+ Tcl_SetObjResult(interp, pRet);
-/*
-** This is a collating function named "REVERSE" which sorts text
-** in reverse order.
-*/
-static int reverseCollatingFunc(
- void *NotUsed,
- int nKey1, const void *pKey1,
- int nKey2, const void *pKey2
-){
- int rc, n;
- n = nKey1<nKey2 ? nKey1 : nKey2;
- rc = memcmp(pKey1, pKey2, n);
- if( rc==0 ){
- rc = nKey1 - nKey2;
- }
- return -rc;
+ return TCL_OK;
}
/*
-** Usage: add_reverse_collating_func DB
+** Usage: sqlite3_column_int STMT column
+**
+** Usage: sqlite3_column_bytes STMT column
+**
+** Usage: sqlite3_column_bytes16 STMT column
**
-** This routine adds a collation named "REVERSE" to database given.
-** REVERSE is used for testing only.
*/
-static int reverse_collfunc(
+static int test_stmt_int(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
- sqlite3 *db;
+ sqlite3_stmt *pStmt;
+ int col;
+ int (xFunc *)(sqlite3_stmt*, int) = clientData;
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "DB");
+ if( objc!=3 ){
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ Tcl_GetString(objv[0]), " STMT column", 0);
return TCL_ERROR;
}
- if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
- sqlite3ChangeCollatingFunction(db, "REVERSE", 7, 0, reverseCollatingFunc);
+
+ 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.
*/
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;