| Index: third_party/sqlite/src/src/test9.c
|
| diff --git a/third_party/sqlite/src/src/test9.c b/third_party/sqlite/src/src/test9.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e5993e8ff78f61c2435b6f97a3b463e227c767ac
|
| --- /dev/null
|
| +++ b/third_party/sqlite/src/src/test9.c
|
| @@ -0,0 +1,200 @@
|
| +/*
|
| +** 2007 March 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 contains obscure tests of the C-interface required
|
| +** for completeness. Test code is written in C for these cases
|
| +** as there is not much point in binding to Tcl.
|
| +*/
|
| +#include "sqliteInt.h"
|
| +#include "tcl.h"
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +
|
| +/*
|
| +** c_collation_test
|
| +*/
|
| +static int c_collation_test(
|
| + ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
| + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
| + int objc, /* Number of arguments */
|
| + Tcl_Obj *CONST objv[] /* Command arguments */
|
| +){
|
| + const char *zErrFunction = "N/A";
|
| + sqlite3 *db;
|
| +
|
| + int rc;
|
| + if( objc!=1 ){
|
| + Tcl_WrongNumArgs(interp, 1, objv, "");
|
| + return TCL_ERROR;
|
| + }
|
| +
|
| + /* Open a database. */
|
| + rc = sqlite3_open(":memory:", &db);
|
| + if( rc!=SQLITE_OK ){
|
| + zErrFunction = "sqlite3_open";
|
| + goto error_out;
|
| + }
|
| +
|
| + rc = sqlite3_create_collation(db, "collate", 456, 0, 0);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + sqlite3_close(db);
|
| + zErrFunction = "sqlite3_create_collation";
|
| + goto error_out;
|
| + }
|
| +
|
| + sqlite3_close(db);
|
| + return TCL_OK;
|
| +
|
| +error_out:
|
| + Tcl_ResetResult(interp);
|
| + Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
| + return TCL_ERROR;
|
| +}
|
| +
|
| +/*
|
| +** c_realloc_test
|
| +*/
|
| +static int c_realloc_test(
|
| + ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
| + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
| + int objc, /* Number of arguments */
|
| + Tcl_Obj *CONST objv[] /* Command arguments */
|
| +){
|
| + void *p;
|
| + const char *zErrFunction = "N/A";
|
| +
|
| + if( objc!=1 ){
|
| + Tcl_WrongNumArgs(interp, 1, objv, "");
|
| + return TCL_ERROR;
|
| + }
|
| +
|
| + p = sqlite3_malloc(5);
|
| + if( !p ){
|
| + zErrFunction = "sqlite3_malloc";
|
| + goto error_out;
|
| + }
|
| +
|
| + /* Test that realloc()ing a block of memory to a negative size is
|
| + ** the same as free()ing that memory.
|
| + */
|
| + p = sqlite3_realloc(p, -1);
|
| + if( p ){
|
| + zErrFunction = "sqlite3_realloc";
|
| + goto error_out;
|
| + }
|
| +
|
| + return TCL_OK;
|
| +
|
| +error_out:
|
| + Tcl_ResetResult(interp);
|
| + Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
| + return TCL_ERROR;
|
| +}
|
| +
|
| +
|
| +/*
|
| +** c_misuse_test
|
| +*/
|
| +static int c_misuse_test(
|
| + ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
|
| + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */
|
| + int objc, /* Number of arguments */
|
| + Tcl_Obj *CONST objv[] /* Command arguments */
|
| +){
|
| + const char *zErrFunction = "N/A";
|
| + sqlite3 *db = 0;
|
| + sqlite3_stmt *pStmt;
|
| + int rc;
|
| +
|
| + if( objc!=1 ){
|
| + Tcl_WrongNumArgs(interp, 1, objv, "");
|
| + return TCL_ERROR;
|
| + }
|
| +
|
| + /* Open a database. Then close it again. We need to do this so that
|
| + ** we have a "closed database handle" to pass to various API functions.
|
| + */
|
| + rc = sqlite3_open(":memory:", &db);
|
| + if( rc!=SQLITE_OK ){
|
| + zErrFunction = "sqlite3_open";
|
| + goto error_out;
|
| + }
|
| + sqlite3_close(db);
|
| +
|
| +
|
| + rc = sqlite3_errcode(db);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + zErrFunction = "sqlite3_errcode";
|
| + goto error_out;
|
| + }
|
| +
|
| + pStmt = (sqlite3_stmt*)1234;
|
| + rc = sqlite3_prepare(db, 0, 0, &pStmt, 0);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + zErrFunction = "sqlite3_prepare";
|
| + goto error_out;
|
| + }
|
| + assert( pStmt==0 ); /* Verify that pStmt is zeroed even on a MISUSE error */
|
| +
|
| + pStmt = (sqlite3_stmt*)1234;
|
| + rc = sqlite3_prepare_v2(db, 0, 0, &pStmt, 0);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + zErrFunction = "sqlite3_prepare_v2";
|
| + goto error_out;
|
| + }
|
| + assert( pStmt==0 );
|
| +
|
| +#ifndef SQLITE_OMIT_UTF16
|
| + pStmt = (sqlite3_stmt*)1234;
|
| + rc = sqlite3_prepare16(db, 0, 0, &pStmt, 0);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + zErrFunction = "sqlite3_prepare16";
|
| + goto error_out;
|
| + }
|
| + assert( pStmt==0 );
|
| + pStmt = (sqlite3_stmt*)1234;
|
| + rc = sqlite3_prepare16_v2(db, 0, 0, &pStmt, 0);
|
| + if( rc!=SQLITE_MISUSE ){
|
| + zErrFunction = "sqlite3_prepare16_v2";
|
| + goto error_out;
|
| + }
|
| + assert( pStmt==0 );
|
| +#endif
|
| +
|
| + return TCL_OK;
|
| +
|
| +error_out:
|
| + Tcl_ResetResult(interp);
|
| + Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
|
| + return TCL_ERROR;
|
| +}
|
| +
|
| +/*
|
| +** Register commands with the TCL interpreter.
|
| +*/
|
| +int Sqlitetest9_Init(Tcl_Interp *interp){
|
| + static struct {
|
| + char *zName;
|
| + Tcl_ObjCmdProc *xProc;
|
| + void *clientData;
|
| + } aObjCmd[] = {
|
| + { "c_misuse_test", c_misuse_test, 0 },
|
| + { "c_realloc_test", c_realloc_test, 0 },
|
| + { "c_collation_test", c_collation_test, 0 },
|
| + };
|
| + int i;
|
| + for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
|
| + Tcl_CreateObjCommand(interp, aObjCmd[i].zName,
|
| + aObjCmd[i].xProc, aObjCmd[i].clientData, 0);
|
| + }
|
| + return TCL_OK;
|
| +}
|
|
|