Index: src/test_loadext.c ================================================================== --- src/test_loadext.c +++ src/test_loadext.c @@ -9,13 +9,13 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* ** Test extension for testing the sqlite3_load_extension() function. ** -** $Id: test_loadext.c,v 1.1 2006/06/14 10:38:03 danielk1977 Exp $ +** $Id: test_loadext.c,v 1.2 2008/06/19 15:44:00 drh Exp $ */ - +#include #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 /* ** The half() SQL function returns half of its input value. @@ -25,10 +25,72 @@ int argc, sqlite3_value **argv ){ sqlite3_result_double(context, 0.5*sqlite3_value_double(argv[0])); } + +/* +** SQL functions to call the sqlite3_status function and return results. +*/ +static void statusFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int op, mx, cur, resetFlag, rc; + if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){ + op = sqlite3_value_int(argv[0]); + }else if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){ + int i; + const char *zName; + static const struct { + const char *zName; + int op; + } aOp[] = { + { "MEMORY_USED", SQLITE_STATUS_MEMORY_USED }, + { "PAGECACHE_USED", SQLITE_STATUS_PAGECACHE_USED }, + { "PAGECACHE_OVERFLOW", SQLITE_STATUS_PAGECACHE_OVERFLOW }, + { "SCRATCH_USED", SQLITE_STATUS_SCRATCH_USED }, + { "SCRATCH_OVERFLOW", SQLITE_STATUS_SCRATCH_OVERFLOW }, + { "MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, + }; + int nOp = sizeof(aOp)/sizeof(aOp[0]); + zName = (const char*)sqlite3_value_text(argv[0]); + for(i=0; i=nOp ){ + char *zMsg = sqlite3_mprintf("unknown status property: %s", zName); + sqlite3_result_error(context, zMsg, -1); + sqlite3_free(zMsg); + return; + } + }else{ + sqlite3_result_error(context, "unknown status type", -1); + return; + } + if( argc==2 ){ + resetFlag = sqlite3_value_int(argv[1]); + }else{ + resetFlag = 0; + } + rc = sqlite3_status(op, &cur, &mx, resetFlag); + if( rc!=SQLITE_OK ){ + char *zMsg = sqlite3_mprintf("sqlite3_status(%d,...) returns %d", op, rc); + sqlite3_result_error(context, zMsg, -1); + sqlite3_free(zMsg); + return; + } + if( argc==2 ){ + sqlite3_result_int(context, mx); + }else{ + sqlite3_result_int(context, cur); + } +} /* ** Extension load function. */ int testloadext_init( @@ -36,10 +98,14 @@ char **pzErrMsg, const sqlite3_api_routines *pApi ){ SQLITE_EXTENSION_INIT2(pApi); sqlite3_create_function(db, "half", 1, SQLITE_ANY, 0, halfFunc, 0, 0); + sqlite3_create_function(db, "sqlite3_status", 1, SQLITE_ANY, 0, + statusFunc, 0, 0); + sqlite3_create_function(db, "sqlite3_status", 2, SQLITE_ANY, 0, + statusFunc, 0, 0); return 0; } /* ** Another extension entry point. This one always fails. Index: test/loadext.test ================================================================== --- test/loadext.test +++ test/loadext.test @@ -9,11 +9,11 @@ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this script is extension loading. # -# $Id: loadext.test,v 1.11 2007/09/01 06:19:06 danielk1977 Exp $ +# $Id: loadext.test,v 1.12 2008/06/19 15:44:00 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable !load_ext { @@ -185,10 +185,32 @@ do_test loadext-3.4 { catchsql { SELECT half(5); } } {0 2.5} +do_test loadext-3.5 { + db eval { + SELECT sqlite3_status('MEMORY_USED') AS mused + } break + puts -nonewline " (memory_used=$mused) " + expr {$mused>0} +} {1} +do_test loadext-3.6 { + catchsql { + SELECT sqlite3_status('MEMORY_USED_X') AS mused + } +} {1 {unknown status property: MEMORY_USED_X}} +do_test loadext-3.7 { + catchsql { + SELECT sqlite3_status(4.53) AS mused + } +} {1 {unknown status type}} +do_test loadext-3.8 { + catchsql { + SELECT sqlite3_status(23) AS mused + } +} {1 {sqlite3_status(23,...) returns 21}} # Ticket #1863 # Make sure the extension loading mechanism will not work unless it # is explicitly enabled. #