summaryrefslogtreecommitdiffstats
path: root/src/test9.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 14:07:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 14:07:11 +0000
commit63847496f14c813a5d80efd5b7de0f1294ffe1e3 (patch)
tree01c7571c7c762ceee70638549a99834fdd7c411b /src/test9.c
parentInitial commit. (diff)
downloadsqlite3-63847496f14c813a5d80efd5b7de0f1294ffe1e3.tar.xz
sqlite3-63847496f14c813a5d80efd5b7de0f1294ffe1e3.zip
Adding upstream version 3.45.1.upstream/3.45.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test9.c')
-rw-r--r--src/test9.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/test9.c b/src/test9.c
new file mode 100644
index 0000000..5b139e8
--- /dev/null
+++ b/src/test9.c
@@ -0,0 +1,204 @@
+/*
+** 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"
+#if defined(INCLUDE_SQLITE_TCL_H)
+# include "sqlite_tcl.h"
+#else
+# include "tcl.h"
+#endif
+#include <stdlib.h>
+#include <string.h>
+
+/*
+** c_collation_test
+*/
+static int SQLITE_TCLAPI 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 SQLITE_TCLAPI 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 SQLITE_TCLAPI 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;
+}