| Index: third_party/sqlite/src/src/test1.c
 | 
| diff --git a/third_party/sqlite/src/src/test1.c b/third_party/sqlite/src/src/test1.c
 | 
| index c5e71582bcd5a5a21f9f0982e83c465b04f21692..d17fc1022ad4208641894466a6d5fb1a20c76a91 100644
 | 
| --- a/third_party/sqlite/src/src/test1.c
 | 
| +++ b/third_party/sqlite/src/src/test1.c
 | 
| @@ -19,7 +19,11 @@
 | 
|  #endif
 | 
|  
 | 
|  #include "vdbeInt.h"
 | 
| -#include "tcl.h"
 | 
| +#if defined(INCLUDE_SQLITE_TCL_H)
 | 
| +#  include "sqlite_tcl.h"
 | 
| +#else
 | 
| +#  include "tcl.h"
 | 
| +#endif
 | 
|  #include <stdlib.h>
 | 
|  #include <string.h>
 | 
|  
 | 
| @@ -75,7 +79,7 @@ void *sqlite3TestTextToPtr(const char *z){
 | 
|  ** for an sqlite connection instance.  Bad things happen if the
 | 
|  ** input is not an sqlite connection.
 | 
|  */
 | 
| -static int get_sqlite_pointer(
 | 
| +static int SQLITE_TCLAPI get_sqlite_pointer(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -221,7 +225,7 @@ static void io_trace_callback(const char *zFormat, ...){
 | 
|  ** I/O tracing begins going into FILENAME. If FILENAME is an empty
 | 
|  ** string, I/O tracing is turned off.
 | 
|  */
 | 
| -static int test_io_trace(
 | 
| +static int SQLITE_TCLAPI test_io_trace(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -262,7 +266,7 @@ static int test_io_trace(
 | 
|  **
 | 
|  ** Also return true if the OMIT_MISUSE environment variable exists.
 | 
|  */
 | 
| -static int clang_sanitize_address(
 | 
| +static int SQLITE_TCLAPI clang_sanitize_address(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -289,7 +293,7 @@ static int clang_sanitize_address(
 | 
|  ** DB.  The SQL is the string FORMAT.  The format string should contain
 | 
|  ** one %s or %q.  STRING is the value inserted into %s or %q.
 | 
|  */
 | 
| -static int test_exec_printf(
 | 
| +static int SQLITE_TCLAPI test_exec_printf(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -327,7 +331,7 @@ static int test_exec_printf(
 | 
|  ** HEX into ASCII.  Most characters are translated as is.  %HH becomes
 | 
|  ** a hex character.
 | 
|  */
 | 
| -static int test_exec_hex(
 | 
| +static int SQLITE_TCLAPI test_exec_hex(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -373,7 +377,7 @@ static int test_exec_hex(
 | 
|  **
 | 
|  ** Enter or leave the mutex on a database connection.
 | 
|  */
 | 
| -static int db_enter(
 | 
| +static int SQLITE_TCLAPI db_enter(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -389,7 +393,7 @@ static int db_enter(
 | 
|    sqlite3_mutex_enter(db->mutex);
 | 
|    return TCL_OK;
 | 
|  }
 | 
| -static int db_leave(
 | 
| +static int SQLITE_TCLAPI db_leave(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -411,7 +415,7 @@ static int db_leave(
 | 
|  **
 | 
|  ** Invoke the sqlite3_exec interface using the open database DB
 | 
|  */
 | 
| -static int test_exec(
 | 
| +static int SQLITE_TCLAPI test_exec(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -458,7 +462,7 @@ static int test_exec(
 | 
|  ** Invoke the sqlite3_exec interface using the open database DB.  Discard
 | 
|  ** all results
 | 
|  */
 | 
| -static int test_exec_nr(
 | 
| +static int SQLITE_TCLAPI test_exec_nr(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -485,7 +489,7 @@ static int test_exec_nr(
 | 
|  ** concatenate arg0 through argn using separator as the separator.
 | 
|  ** Return the result.
 | 
|  */
 | 
| -static int test_mprintf_z(
 | 
| +static int SQLITE_TCLAPI test_mprintf_z(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -508,7 +512,7 @@ static int test_mprintf_z(
 | 
|  ** Test the %n format of sqlite_mprintf().  Return the length of the
 | 
|  ** input string.
 | 
|  */
 | 
| -static int test_mprintf_n(
 | 
| +static int SQLITE_TCLAPI test_mprintf_n(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -532,7 +536,7 @@ static int test_mprintf_n(
 | 
|  ** You pass in a format string that requires more than one argument,
 | 
|  ** bad things will happen.
 | 
|  */
 | 
| -static int test_snprintf_int(
 | 
| +static int SQLITE_TCLAPI test_snprintf_int(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -558,7 +562,7 @@ static int test_snprintf_int(
 | 
|  ** DB.  The SQL is the string FORMAT.  The format string should contain
 | 
|  ** one %s or %q.  STRING is the value inserted into %s or %q.
 | 
|  */
 | 
| -static int test_get_table_printf(
 | 
| +static int SQLITE_TCLAPI test_get_table_printf(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -621,7 +625,7 @@ static int test_get_table_printf(
 | 
|  **
 | 
|  ** Returns the integer ROWID of the most recent insert.
 | 
|  */
 | 
| -static int test_last_rowid(
 | 
| +static int SQLITE_TCLAPI test_last_rowid(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -645,13 +649,13 @@ static int test_last_rowid(
 | 
|  **
 | 
|  ** Set the codec key.
 | 
|  */
 | 
| -static int test_key(
 | 
| +static int SQLITE_TCLAPI test_key(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
|    char **argv            /* Text of each argument */
 | 
|  ){
 | 
| -#ifdef SQLITE_HAS_CODEC
 | 
| +#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_CODEC_FROM_TCL)
 | 
|    sqlite3 *db;
 | 
|    const char *zKey;
 | 
|    int nKey;
 | 
| @@ -673,7 +677,7 @@ static int test_key(
 | 
|  **
 | 
|  ** Change the codec key.
 | 
|  */
 | 
| -static int test_rekey(
 | 
| +static int SQLITE_TCLAPI test_rekey(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -701,7 +705,7 @@ static int test_rekey(
 | 
|  **
 | 
|  ** Closes the database opened by sqlite3_open.
 | 
|  */
 | 
| -static int sqlite_test_close(
 | 
| +static int SQLITE_TCLAPI sqlite_test_close(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -725,7 +729,7 @@ static int sqlite_test_close(
 | 
|  **
 | 
|  ** Closes the database opened by sqlite3_open.
 | 
|  */
 | 
| -static int sqlite_test_close_v2(
 | 
| +static int SQLITE_TCLAPI sqlite_test_close_v2(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1009,7 +1013,7 @@ static void nondeterministicFunction(
 | 
|  ** sqlite3_create_function function while a query is in progress in order
 | 
|  ** to test the SQLITE_MISUSE detection logic.
 | 
|  */
 | 
| -static int test_create_function(
 | 
| +static int SQLITE_TCLAPI test_create_function(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1166,7 +1170,7 @@ static void legacyCountFinalize(sqlite3_context *context){
 | 
|  ** "legacy_count()" with the supplied database handle. This is used
 | 
|  ** to test the deprecated sqlite3_aggregate_count() API.
 | 
|  */
 | 
| -static int test_create_aggregate(
 | 
| +static int SQLITE_TCLAPI test_create_aggregate(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1207,7 +1211,7 @@ static int test_create_aggregate(
 | 
|  ** Puts uses a separate buffer and debugging statements will be out of
 | 
|  ** sequence if it is used.
 | 
|  */
 | 
| -static int test_printf(
 | 
| +static int SQLITE_TCLAPI test_printf(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1229,7 +1233,7 @@ static int test_printf(
 | 
|  **
 | 
|  ** Call mprintf with three integer arguments
 | 
|  */
 | 
| -static int sqlite3_mprintf_int(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_int(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1256,7 +1260,7 @@ static int sqlite3_mprintf_int(
 | 
|  **
 | 
|  ** Call mprintf with three 64-bit integer arguments
 | 
|  */
 | 
| -static int sqlite3_mprintf_int64(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_int64(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1271,7 +1275,7 @@ static int sqlite3_mprintf_int64(
 | 
|      return TCL_ERROR;
 | 
|    }
 | 
|    for(i=2; i<5; i++){
 | 
| -    if( sqlite3Atoi64(argv[i], &a[i-2], 1000000, SQLITE_UTF8) ){
 | 
| +    if( sqlite3Atoi64(argv[i], &a[i-2], sqlite3Strlen30(argv[i]), SQLITE_UTF8) ){
 | 
|        Tcl_AppendResult(interp, "argument is not a valid 64-bit integer", 0);
 | 
|        return TCL_ERROR;
 | 
|      }
 | 
| @@ -1289,7 +1293,7 @@ static int sqlite3_mprintf_int64(
 | 
|  ** same as sqlite3_mprintf_int or sqlite3_mprintf_int64, depending on
 | 
|  ** platform.
 | 
|  */
 | 
| -static int sqlite3_mprintf_long(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_long(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1320,7 +1324,7 @@ static int sqlite3_mprintf_long(
 | 
|  **
 | 
|  ** Call mprintf with two integer arguments and one string argument
 | 
|  */
 | 
| -static int sqlite3_mprintf_str(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_str(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1347,7 +1351,7 @@ static int sqlite3_mprintf_str(
 | 
|  **
 | 
|  ** Call mprintf with two integer arguments and one string argument
 | 
|  */
 | 
| -static int sqlite3_snprintf_str(
 | 
| +static int SQLITE_TCLAPI sqlite3_snprintf_str(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1381,7 +1385,7 @@ static int sqlite3_snprintf_str(
 | 
|  **
 | 
|  ** Call mprintf with two integer arguments and one double argument
 | 
|  */
 | 
| -static int sqlite3_mprintf_double(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_double(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1412,7 +1416,7 @@ static int sqlite3_mprintf_double(
 | 
|  ** two arguments given above.  This is used to generate overflow and underflow
 | 
|  ** doubles to test that they are converted properly.
 | 
|  */
 | 
| -static int sqlite3_mprintf_scaled(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_scaled(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1442,7 +1446,7 @@ static int sqlite3_mprintf_scaled(
 | 
|  ** two arguments given above.  This is used to generate overflow and underflow
 | 
|  ** doubles to test that they are converted properly.
 | 
|  */
 | 
| -static int sqlite3_mprintf_stronly(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_stronly(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1466,7 +1470,7 @@ static int sqlite3_mprintf_stronly(
 | 
|  ** Call mprintf with a single double argument which is derived from the
 | 
|  ** hexadecimal encoding of an IEEE double.
 | 
|  */
 | 
| -static int sqlite3_mprintf_hexdouble(
 | 
| +static int SQLITE_TCLAPI sqlite3_mprintf_hexdouble(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -1499,7 +1503,7 @@ static int sqlite3_mprintf_hexdouble(
 | 
|  **
 | 
|  */
 | 
|  #if !defined(SQLITE_OMIT_SHARED_CACHE)
 | 
| -static int test_enable_shared(
 | 
| +static int SQLITE_TCLAPI test_enable_shared(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1536,7 +1540,7 @@ static int test_enable_shared(
 | 
|  ** Usage: sqlite3_extended_result_codes   DB    BOOLEAN
 | 
|  **
 | 
|  */
 | 
| -static int test_extended_result_codes(
 | 
| +static int SQLITE_TCLAPI test_extended_result_codes(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1559,7 +1563,7 @@ static int test_extended_result_codes(
 | 
|  ** Usage: sqlite3_libversion_number
 | 
|  **
 | 
|  */
 | 
| -static int test_libversion_number(
 | 
| +static int SQLITE_TCLAPI test_libversion_number(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1573,7 +1577,7 @@ static int test_libversion_number(
 | 
|  ** Usage: sqlite3_table_column_metadata DB dbname tblname colname
 | 
|  **
 | 
|  */
 | 
| -static int test_table_column_metadata(
 | 
| +static int SQLITE_TCLAPI test_table_column_metadata(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1624,7 +1628,7 @@ static int test_table_column_metadata(
 | 
|  
 | 
|  #ifndef SQLITE_OMIT_INCRBLOB
 | 
|  
 | 
| -static int blobHandleFromObj(
 | 
| +static int SQLITE_TCLAPI blobHandleFromObj(
 | 
|    Tcl_Interp *interp, 
 | 
|    Tcl_Obj *pObj,
 | 
|    sqlite3_blob **ppBlob
 | 
| @@ -1653,7 +1657,7 @@ static int blobHandleFromObj(
 | 
|    return TCL_OK;
 | 
|  }
 | 
|  
 | 
| -static int test_blob_reopen(
 | 
| +static int SQLITE_TCLAPI test_blob_reopen(
 | 
|    ClientData clientData, /* Not used */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1729,7 +1733,7 @@ static int testCreateCollationCmp(
 | 
|  
 | 
|    return iRes;
 | 
|  }
 | 
| -static int test_create_collation_v2(
 | 
| +static int SQLITE_TCLAPI test_create_collation_v2(
 | 
|    ClientData clientData, /* Not used */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1804,7 +1808,7 @@ static void cf2Destroy(void *pUser){
 | 
|    if( p->pDestroy ) Tcl_DecrRefCount(p->pDestroy); 
 | 
|    sqlite3_free(p);
 | 
|  }
 | 
| -static int test_create_function_v2(
 | 
| +static int SQLITE_TCLAPI test_create_function_v2(
 | 
|    ClientData clientData,          /* Not used */
 | 
|    Tcl_Interp *interp,             /* The invoking TCL interpreter */
 | 
|    int objc,                       /* Number of arguments */
 | 
| @@ -1892,7 +1896,7 @@ static int test_create_function_v2(
 | 
|  /*
 | 
|  ** Usage: sqlite3_load_extension DB-HANDLE FILE ?PROC?
 | 
|  */
 | 
| -static int test_load_extension(
 | 
| +static int SQLITE_TCLAPI test_load_extension(
 | 
|    ClientData clientData, /* Not used */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1931,6 +1935,8 @@ static int test_load_extension(
 | 
|  #ifdef SQLITE_OMIT_LOAD_EXTENSION
 | 
|    rc = SQLITE_ERROR;
 | 
|    zErr = sqlite3_mprintf("this build omits sqlite3_load_extension()");
 | 
| +  (void)zProc;
 | 
| +  (void)zFile;
 | 
|  #else
 | 
|    rc = sqlite3_load_extension(db, zFile, zProc, &zErr);
 | 
|  #endif
 | 
| @@ -1948,7 +1954,7 @@ static int test_load_extension(
 | 
|  /*
 | 
|  ** Usage: sqlite3_enable_load_extension DB-HANDLE ONOFF
 | 
|  */
 | 
| -static int test_enable_load(
 | 
| +static int SQLITE_TCLAPI test_enable_load(
 | 
|    ClientData clientData, /* Not used */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -1994,7 +2000,7 @@ static int test_enable_load(
 | 
|  ** This command is used to test the recoverability of a database in
 | 
|  ** the event of a program crash.
 | 
|  */
 | 
| -static int sqlite_abort(
 | 
| +static int SQLITE_TCLAPI sqlite_abort(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -2053,7 +2059,7 @@ error_out:
 | 
|  **
 | 
|  ** Register the test SQL function on the database DB under the name NAME.
 | 
|  */
 | 
| -static int test_register_func(
 | 
| +static int SQLITE_TCLAPI test_register_func(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -2082,7 +2088,7 @@ static int test_register_func(
 | 
|  **
 | 
|  ** Finalize a statement handle.
 | 
|  */
 | 
| -static int test_finalize(
 | 
| +static int SQLITE_TCLAPI test_finalize(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2114,7 +2120,7 @@ static int test_finalize(
 | 
|  **
 | 
|  ** Get the value of a status counter from a statement.
 | 
|  */
 | 
| -static int test_stmt_status(
 | 
| +static int SQLITE_TCLAPI test_stmt_status(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2159,7 +2165,7 @@ static int test_stmt_status(
 | 
|  /*
 | 
|  ** Usage:  sqlite3_stmt_scanstatus STMT IDX
 | 
|  */
 | 
| -static int test_stmt_scanstatus(
 | 
| +static int SQLITE_TCLAPI test_stmt_scanstatus(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2209,7 +2215,7 @@ static int test_stmt_scanstatus(
 | 
|  /*
 | 
|  ** Usage:  sqlite3_stmt_scanstatus_reset  STMT
 | 
|  */
 | 
| -static int test_stmt_scanstatus_reset(
 | 
| +static int SQLITE_TCLAPI test_stmt_scanstatus_reset(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2232,7 +2238,7 @@ static int test_stmt_scanstatus_reset(
 | 
|  **
 | 
|  ** Zero the SQLITE_CONFIG_SQLLOG configuration
 | 
|  */
 | 
| -static int test_config_sqllog(
 | 
| +static int SQLITE_TCLAPI test_config_sqllog(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2252,7 +2258,7 @@ static int test_config_sqllog(
 | 
|  **
 | 
|  ** Return the value returned by the default VFS's xCurrentTimeInt64 method.
 | 
|  */
 | 
| -static int vfsCurrentTimeInt64(
 | 
| +static int SQLITE_TCLAPI vfsCurrentTimeInt64(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2273,7 +2279,7 @@ static int vfsCurrentTimeInt64(
 | 
|  /*
 | 
|  ** Usage: sqlite3_snapshot_get DB DBNAME
 | 
|  */
 | 
| -static int test_snapshot_get(
 | 
| +static int SQLITE_TCLAPI test_snapshot_get(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2306,9 +2312,41 @@ static int test_snapshot_get(
 | 
|  
 | 
|  #ifdef SQLITE_ENABLE_SNAPSHOT
 | 
|  /*
 | 
| +** Usage: sqlite3_snapshot_recover DB DBNAME
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_snapshot_recover(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int rc;
 | 
| +  sqlite3 *db;
 | 
| +  char *zName;
 | 
| +
 | 
| +  if( objc!=3 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +  zName = Tcl_GetString(objv[2]);
 | 
| +
 | 
| +  rc = sqlite3_snapshot_recover(db, zName);
 | 
| +  if( rc!=SQLITE_OK ){
 | 
| +    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 | 
| +    return TCL_ERROR;
 | 
| +  }else{
 | 
| +    Tcl_ResetResult(interp);
 | 
| +  }
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +#endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
| +
 | 
| +#ifdef SQLITE_ENABLE_SNAPSHOT
 | 
| +/*
 | 
|  ** Usage: sqlite3_snapshot_open DB DBNAME SNAPSHOT
 | 
|  */
 | 
| -static int test_snapshot_open(
 | 
| +static int SQLITE_TCLAPI test_snapshot_open(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2340,7 +2378,7 @@ static int test_snapshot_open(
 | 
|  /*
 | 
|  ** Usage: sqlite3_snapshot_free SNAPSHOT
 | 
|  */
 | 
| -static int test_snapshot_free(
 | 
| +static int SQLITE_TCLAPI test_snapshot_free(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2357,12 +2395,167 @@ static int test_snapshot_free(
 | 
|  }
 | 
|  #endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
|  
 | 
| +#ifdef SQLITE_ENABLE_SNAPSHOT
 | 
| +/*
 | 
| +** Usage: sqlite3_snapshot_cmp SNAPSHOT1 SNAPSHOT2
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_snapshot_cmp(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int res;
 | 
| +  sqlite3_snapshot *p1;
 | 
| +  sqlite3_snapshot *p2;
 | 
| +  if( objc!=3 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "SNAPSHOT1 SNAPSHOT2");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  p1 = (sqlite3_snapshot*)sqlite3TestTextToPtr(Tcl_GetString(objv[1]));
 | 
| +  p2 = (sqlite3_snapshot*)sqlite3TestTextToPtr(Tcl_GetString(objv[2]));
 | 
| +  res = sqlite3_snapshot_cmp(p1, p2);
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewIntObj(res));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +#endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
| +
 | 
| +#ifdef SQLITE_ENABLE_SNAPSHOT
 | 
| +/*
 | 
| +** Usage: sqlite3_snapshot_get_blob DB DBNAME
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_snapshot_get_blob(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int rc;
 | 
| +  sqlite3 *db;
 | 
| +  char *zName;
 | 
| +  sqlite3_snapshot *pSnapshot = 0;
 | 
| +
 | 
| +  if( objc!=3 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +  zName = Tcl_GetString(objv[2]);
 | 
| +
 | 
| +  rc = sqlite3_snapshot_get(db, zName, &pSnapshot);
 | 
| +  if( rc!=SQLITE_OK ){
 | 
| +    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 | 
| +    return TCL_ERROR;
 | 
| +  }else{
 | 
| +    Tcl_SetObjResult(interp, 
 | 
| +        Tcl_NewByteArrayObj((unsigned char*)pSnapshot, sizeof(sqlite3_snapshot))
 | 
| +    );
 | 
| +    sqlite3_snapshot_free(pSnapshot);
 | 
| +  }
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +#endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
| +
 | 
| +#ifdef SQLITE_ENABLE_SNAPSHOT
 | 
| +  /*
 | 
| +  ** Usage: sqlite3_snapshot_open_blob DB DBNAME SNAPSHOT
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_snapshot_open_blob(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int rc;
 | 
| +  sqlite3 *db;
 | 
| +  char *zName;
 | 
| +  unsigned char *pBlob;
 | 
| +  int nBlob;
 | 
| +
 | 
| +  if( objc!=4 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SNAPSHOT");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +  zName = Tcl_GetString(objv[2]);
 | 
| +  pBlob = Tcl_GetByteArrayFromObj(objv[3], &nBlob);
 | 
| +  if( nBlob!=sizeof(sqlite3_snapshot) ){
 | 
| +    Tcl_AppendResult(interp, "bad SNAPSHOT", 0);
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  rc = sqlite3_snapshot_open(db, zName, (sqlite3_snapshot*)pBlob);
 | 
| +  if( rc!=SQLITE_OK ){
 | 
| +    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +#endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
| +
 | 
| +#ifdef SQLITE_ENABLE_SNAPSHOT
 | 
| +/*
 | 
| +** Usage: sqlite3_snapshot_cmp_blob SNAPSHOT1 SNAPSHOT2
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_snapshot_cmp_blob(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int res;
 | 
| +  unsigned char *p1;
 | 
| +  unsigned char *p2;
 | 
| +  int n1;
 | 
| +  int n2;
 | 
| +
 | 
| +  if( objc!=3 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "SNAPSHOT1 SNAPSHOT2");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +
 | 
| +  p1 = Tcl_GetByteArrayFromObj(objv[1], &n1);
 | 
| +  p2 = Tcl_GetByteArrayFromObj(objv[2], &n2);
 | 
| +
 | 
| +  if( n1!=sizeof(sqlite3_snapshot) || n1!=n2 ){
 | 
| +    Tcl_AppendResult(interp, "bad SNAPSHOT", 0);
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +
 | 
| +  res = sqlite3_snapshot_cmp((sqlite3_snapshot*)p1, (sqlite3_snapshot*)p2);
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewIntObj(res));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +#endif /* SQLITE_ENABLE_SNAPSHOT */
 | 
| +
 | 
| +/*
 | 
| +** Usage: sqlite3_delete_database FILENAME
 | 
| +*/
 | 
| +int sqlite3_delete_database(const char*);   /* in test_delete.c */
 | 
| +static int SQLITE_TCLAPI test_delete_database(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int rc;
 | 
| +  const char *zFile;
 | 
| +  if( objc!=2 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "FILE");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  zFile = (const char*)Tcl_GetString(objv[1]);
 | 
| +  rc = sqlite3_delete_database(zFile);
 | 
| +
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +
 | 
|  /*
 | 
|  ** Usage:  sqlite3_next_stmt  DB  STMT
 | 
|  **
 | 
|  ** Return the next statment in sequence after STMT.
 | 
|  */
 | 
| -static int test_next_stmt(
 | 
| +static int SQLITE_TCLAPI test_next_stmt(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2394,7 +2587,7 @@ static int test_next_stmt(
 | 
|  ** Return true if STMT is a NULL pointer or a pointer to a statement
 | 
|  ** that is guaranteed to leave the database unmodified.
 | 
|  */
 | 
| -static int test_stmt_readonly(
 | 
| +static int SQLITE_TCLAPI test_stmt_readonly(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2421,7 +2614,7 @@ static int test_stmt_readonly(
 | 
|  ** Return true if STMT is a non-NULL pointer to a statement
 | 
|  ** that has been stepped but not to completion.
 | 
|  */
 | 
| -static int test_stmt_busy(
 | 
| +static int SQLITE_TCLAPI test_stmt_busy(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2447,7 +2640,7 @@ static int test_stmt_busy(
 | 
|  **
 | 
|  ** Return true if STMT uses a statement journal.
 | 
|  */
 | 
| -static int uses_stmt_journal(
 | 
| +static int SQLITE_TCLAPI uses_stmt_journal(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2473,7 +2666,7 @@ static int uses_stmt_journal(
 | 
|  **
 | 
|  ** Reset a statement handle.
 | 
|  */
 | 
| -static int test_reset(
 | 
| +static int SQLITE_TCLAPI test_reset(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2508,7 +2701,7 @@ static int test_reset(
 | 
|  **
 | 
|  ** Return TRUE if a recompilation of the statement is recommended.
 | 
|  */
 | 
| -static int test_expired(
 | 
| +static int SQLITE_TCLAPI test_expired(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2532,7 +2725,7 @@ static int test_expired(
 | 
|  **
 | 
|  ** Transfer all bindings from FROMSTMT over to TOSTMT
 | 
|  */
 | 
| -static int test_transfer_bind(
 | 
| +static int SQLITE_TCLAPI test_transfer_bind(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2559,7 +2752,7 @@ static int test_transfer_bind(
 | 
|  ** Return the number of changes made to the database by the last SQL
 | 
|  ** execution.
 | 
|  */
 | 
| -static int test_changes(
 | 
| +static int SQLITE_TCLAPI test_changes(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2594,7 +2787,7 @@ static int sqlite_static_bind_nbyte = 0;
 | 
|  ** of the VALUE is made.  If FLAGS=="blob10" then a VALUE is ignored
 | 
|  ** an a 10-byte blob "abc\000xyz\000pq" is inserted.
 | 
|  */
 | 
| -static int test_bind(
 | 
| +static int SQLITE_TCLAPI test_bind(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -2716,7 +2909,7 @@ static int test_collate_func(
 | 
|    Tcl_GetIntFromObj(i, Tcl_GetObjResult(i), &res);
 | 
|    return res;
 | 
|  }
 | 
| -static int test_collate(
 | 
| +static int SQLITE_TCLAPI test_collate(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2790,7 +2983,7 @@ static int test_utf16bin_collate_func(
 | 
|    if( res==0 ) res = nA - nB;
 | 
|    return res;
 | 
|  }
 | 
| -static int test_utf16bin_collate(
 | 
| +static int SQLITE_TCLAPI test_utf16bin_collate(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2847,7 +3040,7 @@ static void test_collate_needed_cb(
 | 
|  /*
 | 
|  ** Usage: add_test_collate_needed DB
 | 
|  */
 | 
| -static int test_collate_needed(
 | 
| +static int SQLITE_TCLAPI test_collate_needed(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -2898,7 +3091,7 @@ static int alignmentCollFunc(
 | 
|    }
 | 
|    return rc;
 | 
|  }
 | 
| -static int add_alignment_test_collations(
 | 
| +static int SQLITE_TCLAPI add_alignment_test_collations(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3016,7 +3209,7 @@ static void test_function_utf16be(
 | 
|    sqlite3ValueFree(pVal);
 | 
|  }
 | 
|  #endif /* SQLITE_OMIT_UTF16 */
 | 
| -static int test_function(
 | 
| +static int SQLITE_TCLAPI test_function(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3061,7 +3254,7 @@ bad_args:
 | 
|  ** The result is a list of two elements, the string representation of the
 | 
|  ** error code and the english language explanation.
 | 
|  */
 | 
| -static int test_errstr(
 | 
| +static int SQLITE_TCLAPI test_errstr(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3094,7 +3287,7 @@ static int test_errstr(
 | 
|  ** Then run testfixture in the debugger and wait for the breakpoint to
 | 
|  ** fire.  Then additional breakpoints can be set to trace down the bug.
 | 
|  */
 | 
| -static int test_breakpoint(
 | 
| +static int SQLITE_TCLAPI test_breakpoint(
 | 
|    void *NotUsed,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int argc,              /* Number of arguments */
 | 
| @@ -3110,7 +3303,7 @@ static int test_breakpoint(
 | 
|  ** IDX is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a N-byte zero-filled BLOB to the wildcard.
 | 
|  */
 | 
| -static int test_bind_zeroblob(
 | 
| +static int SQLITE_TCLAPI test_bind_zeroblob(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3146,7 +3339,7 @@ static int test_bind_zeroblob(
 | 
|  ** IDX is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a N-byte zero-filled BLOB to the wildcard.
 | 
|  */
 | 
| -static int test_bind_zeroblob64(
 | 
| +static int SQLITE_TCLAPI test_bind_zeroblob64(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3154,7 +3347,7 @@ static int test_bind_zeroblob64(
 | 
|  ){
 | 
|    sqlite3_stmt *pStmt;
 | 
|    int idx;
 | 
| -  i64 n;
 | 
| +  Tcl_WideInt n;
 | 
|    int rc;
 | 
|  
 | 
|    if( objc!=4 ){
 | 
| @@ -3183,7 +3376,7 @@ static int test_bind_zeroblob64(
 | 
|  ** N is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a 32-bit integer VALUE to that wildcard.
 | 
|  */
 | 
| -static int test_bind_int(
 | 
| +static int SQLITE_TCLAPI test_bind_int(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3215,13 +3408,152 @@ static int test_bind_int(
 | 
|  
 | 
|  
 | 
|  /*
 | 
| +** Usage:   intarray_addr  INT  ...
 | 
| +**
 | 
| +** Return the address of a C-language array of 32-bit integers.
 | 
| +**
 | 
| +** Space to hold the array is obtained from malloc().  Call this procedure once
 | 
| +** with no arguments in order to release memory.  Each call to this procedure
 | 
| +** overwrites the previous array.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_intarray_addr(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int i;
 | 
| +  static int *p = 0;
 | 
| +
 | 
| +  sqlite3_free(p);
 | 
| +  p = 0;
 | 
| +  if( objc>1 ){
 | 
| +    p = sqlite3_malloc( sizeof(p[0])*(objc-1) );
 | 
| +    if( p==0 ) return TCL_ERROR;
 | 
| +    for(i=0; i<objc-1; i++){
 | 
| +      if( Tcl_GetIntFromObj(interp, objv[1+i], &p[i]) ){
 | 
| +        sqlite3_free(p);
 | 
| +        p = 0;
 | 
| +        return TCL_ERROR;
 | 
| +      }
 | 
| +    }
 | 
| +  }  
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +/*
 | 
| +** Usage:   intarray_addr  INT  ...
 | 
| +**
 | 
| +** Return the address of a C-language array of 32-bit integers.
 | 
| +**
 | 
| +** Space to hold the array is obtained from malloc().  Call this procedure once
 | 
| +** with no arguments in order to release memory.  Each call to this procedure
 | 
| +** overwrites the previous array.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_int64array_addr(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int i;
 | 
| +  static sqlite3_int64 *p = 0;
 | 
| +
 | 
| +  sqlite3_free(p);
 | 
| +  p = 0;
 | 
| +  if( objc>1 ){
 | 
| +    p = sqlite3_malloc( sizeof(p[0])*(objc-1) );
 | 
| +    if( p==0 ) return TCL_ERROR;
 | 
| +    for(i=0; i<objc-1; i++){
 | 
| +      Tcl_WideInt v;
 | 
| +      if( Tcl_GetWideIntFromObj(interp, objv[1+i], &v) ){
 | 
| +        sqlite3_free(p);
 | 
| +        p = 0;
 | 
| +        return TCL_ERROR;
 | 
| +      }
 | 
| +      p[i] = v;
 | 
| +    }
 | 
| +  }  
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +/*
 | 
| +** Usage:   doublearray_addr  INT  ...
 | 
| +**
 | 
| +** Return the address of a C-language array of doubles.
 | 
| +**
 | 
| +** Space to hold the array is obtained from malloc().  Call this procedure once
 | 
| +** with no arguments in order to release memory.  Each call to this procedure
 | 
| +** overwrites the previous array.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_doublearray_addr(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int i;
 | 
| +  static double *p = 0;
 | 
| +
 | 
| +  sqlite3_free(p);
 | 
| +  p = 0;
 | 
| +  if( objc>1 ){
 | 
| +    p = sqlite3_malloc( sizeof(p[0])*(objc-1) );
 | 
| +    if( p==0 ) return TCL_ERROR;
 | 
| +    for(i=0; i<objc-1; i++){
 | 
| +      if( Tcl_GetDoubleFromObj(interp, objv[1+i], &p[i]) ){
 | 
| +        sqlite3_free(p);
 | 
| +        p = 0;
 | 
| +        return TCL_ERROR;
 | 
| +      }
 | 
| +    }
 | 
| +  }  
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +/*
 | 
| +** Usage:   textarray_addr  TEXT ...
 | 
| +**
 | 
| +** Return the address of a C-language array of strings.
 | 
| +**
 | 
| +** Space to hold the array is obtained from malloc().  Call this procedure once
 | 
| +** with no arguments in order to release memory.  Each call to this procedure
 | 
| +** overwrites the previous array.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_textarray_addr(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int i;
 | 
| +  static int n = 0;
 | 
| +  static char **p = 0;
 | 
| +
 | 
| +  for(i=0; i<n; i++) sqlite3_free(p[i]);
 | 
| +  sqlite3_free(p);
 | 
| +  p = 0;
 | 
| +  if( objc>1 ){
 | 
| +    p = sqlite3_malloc( sizeof(p[0])*(objc-1) );
 | 
| +    if( p==0 ) return TCL_ERROR;
 | 
| +    for(i=0; i<objc-1; i++){
 | 
| +      p[i] = sqlite3_mprintf("%s", Tcl_GetString(objv[1+i]));
 | 
| +    }
 | 
| +  }
 | 
| +  n = objc-1;
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +/*
 | 
|  ** Usage:   sqlite3_bind_int64  STMT N VALUE
 | 
|  **
 | 
|  ** Test the sqlite3_bind_int64 interface.  STMT is a prepared statement.
 | 
|  ** N is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a 64-bit integer VALUE to that wildcard.
 | 
|  */
 | 
| -static int test_bind_int64(
 | 
| +static int SQLITE_TCLAPI test_bind_int64(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3259,7 +3591,7 @@ static int test_bind_int64(
 | 
|  ** N is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a 64-bit integer VALUE to that wildcard.
 | 
|  */
 | 
| -static int test_bind_double(
 | 
| +static int SQLITE_TCLAPI test_bind_double(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3335,7 +3667,7 @@ static int test_bind_double(
 | 
|  ** N is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a NULL to the wildcard.
 | 
|  */
 | 
| -static int test_bind_null(
 | 
| +static int SQLITE_TCLAPI test_bind_null(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3371,7 +3703,7 @@ static int test_bind_null(
 | 
|  ** binds a UTF-8 string STRING to the wildcard.  The string is BYTES bytes
 | 
|  ** long.
 | 
|  */
 | 
| -static int test_bind_text(
 | 
| +static int SQLITE_TCLAPI test_bind_text(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3412,7 +3744,7 @@ static int test_bind_text(
 | 
|  ** binds a UTF-16 string STRING to the wildcard.  The string is BYTES bytes
 | 
|  ** long.
 | 
|  */
 | 
| -static int test_bind_text16(
 | 
| +static int SQLITE_TCLAPI test_bind_text16(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3460,14 +3792,14 @@ static int test_bind_text16(
 | 
|  ** N is the index of a wildcard in the prepared statement.  This command
 | 
|  ** binds a BLOB to the wildcard.  The BLOB is BYTES bytes in size.
 | 
|  */
 | 
| -static int test_bind_blob(
 | 
| +static int SQLITE_TCLAPI test_bind_blob(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
|    Tcl_Obj *CONST objv[]
 | 
|  ){
 | 
|    sqlite3_stmt *pStmt;
 | 
| -  int idx;
 | 
| +  int len, idx;
 | 
|    int bytes;
 | 
|    char *value;
 | 
|    int rc;
 | 
| @@ -3486,9 +3818,18 @@ static int test_bind_blob(
 | 
|  
 | 
|    if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
 | 
|    if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR;
 | 
| -  value = Tcl_GetString(objv[3]);
 | 
| +
 | 
| +  value = (char*)Tcl_GetByteArrayFromObj(objv[3], &len);
 | 
|    if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR;
 | 
|  
 | 
| +  if( bytes>len ){
 | 
| +    char zBuf[200];
 | 
| +    sqlite3_snprintf(sizeof(zBuf), zBuf,
 | 
| +                     "cannot use %d blob bytes, have %d", bytes, len);
 | 
| +    Tcl_AppendResult(interp, zBuf, -1);
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +
 | 
|    rc = sqlite3_bind_blob(pStmt, idx, value, bytes, xDestructor);
 | 
|    if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR;
 | 
|    if( rc!=SQLITE_OK ){
 | 
| @@ -3503,7 +3844,7 @@ static int test_bind_blob(
 | 
|  **
 | 
|  ** Return the number of wildcards in the given statement.
 | 
|  */
 | 
| -static int test_bind_parameter_count(
 | 
| +static int SQLITE_TCLAPI test_bind_parameter_count(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3527,7 +3868,7 @@ static int test_bind_parameter_count(
 | 
|  ** An empty string is returned if N is out of range or if the wildcard
 | 
|  ** is nameless.
 | 
|  */
 | 
| -static int test_bind_parameter_name(
 | 
| +static int SQLITE_TCLAPI test_bind_parameter_name(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3554,7 +3895,7 @@ static int test_bind_parameter_name(
 | 
|  ** Return the index of the wildcard called NAME.  Return 0 if there is
 | 
|  ** no such wildcard.
 | 
|  */
 | 
| -static int test_bind_parameter_index(
 | 
| +static int SQLITE_TCLAPI test_bind_parameter_index(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3579,7 +3920,7 @@ static int test_bind_parameter_index(
 | 
|  ** Usage:   sqlite3_clear_bindings STMT
 | 
|  **
 | 
|  */
 | 
| -static int test_clear_bindings(
 | 
| +static int SQLITE_TCLAPI test_clear_bindings(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3599,7 +3940,7 @@ static int test_clear_bindings(
 | 
|  /*
 | 
|  ** Usage:   sqlite3_sleep MILLISECONDS
 | 
|  */
 | 
| -static int test_sleep(
 | 
| +static int SQLITE_TCLAPI test_sleep(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3624,7 +3965,7 @@ static int test_sleep(
 | 
|  ** Return the string representation of the most recent sqlite3_* API
 | 
|  ** error code. e.g. "SQLITE_ERROR".
 | 
|  */
 | 
| -static int test_ex_errcode(
 | 
| +static int SQLITE_TCLAPI test_ex_errcode(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3651,7 +3992,7 @@ static int test_ex_errcode(
 | 
|  ** Return the string representation of the most recent sqlite3_* API
 | 
|  ** error code. e.g. "SQLITE_ERROR".
 | 
|  */
 | 
| -static int test_errcode(
 | 
| +static int SQLITE_TCLAPI test_errcode(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3677,7 +4018,7 @@ static int test_errcode(
 | 
|  ** Returns the UTF-8 representation of the error message string for the
 | 
|  ** most recent sqlite3_* API call.
 | 
|  */
 | 
| -static int test_errmsg(
 | 
| +static int SQLITE_TCLAPI test_errmsg(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3706,7 +4047,7 @@ static int test_errmsg(
 | 
|  ** level, and it includes the 0x00 0x00 terminator bytes at the end of the
 | 
|  ** UTF-16 string.
 | 
|  */
 | 
| -static int test_errmsg16(
 | 
| +static int SQLITE_TCLAPI test_errmsg16(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3743,7 +4084,7 @@ static int test_errmsg16(
 | 
|  ** variable that is set to the unused portion of <sql> (if any). A
 | 
|  ** STMT handle is returned.
 | 
|  */
 | 
| -static int test_prepare(
 | 
| +static int SQLITE_TCLAPI test_prepare(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3800,7 +4141,7 @@ static int test_prepare(
 | 
|  ** variable that is set to the unused portion of <sql> (if any). A
 | 
|  ** STMT handle is returned.
 | 
|  */
 | 
| -static int test_prepare_v2(
 | 
| +static int SQLITE_TCLAPI test_prepare_v2(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3868,7 +4209,7 @@ static int test_prepare_v2(
 | 
|  ** Generate a prepared statement for a zero-byte string as a test
 | 
|  ** for ticket #3134.  The string should be preceded by a zero byte.
 | 
|  */
 | 
| -static int test_prepare_tkt3134(
 | 
| +static int SQLITE_TCLAPI test_prepare_tkt3134(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3911,7 +4252,7 @@ static int test_prepare_tkt3134(
 | 
|  ** variable that is set to the unused portion of <sql> (if any). A
 | 
|  ** STMT handle is returned.
 | 
|  */
 | 
| -static int test_prepare16(
 | 
| +static int SQLITE_TCLAPI test_prepare16(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -3971,7 +4312,7 @@ static int test_prepare16(
 | 
|  ** variable that is set to the unused portion of <sql> (if any). A
 | 
|  ** STMT handle is returned.
 | 
|  */
 | 
| -static int test_prepare16_v2(
 | 
| +static int SQLITE_TCLAPI test_prepare16_v2(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4026,7 +4367,7 @@ static int test_prepare16_v2(
 | 
|  /*
 | 
|  ** Usage: sqlite3_open filename ?options-list?
 | 
|  */
 | 
| -static int test_open(
 | 
| +static int SQLITE_TCLAPI test_open(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4053,7 +4394,7 @@ static int test_open(
 | 
|  /*
 | 
|  ** Usage: sqlite3_open_v2 FILENAME FLAGS VFS
 | 
|  */
 | 
| -static int test_open_v2(
 | 
| +static int SQLITE_TCLAPI test_open_v2(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4123,7 +4464,7 @@ static int test_open_v2(
 | 
|  /*
 | 
|  ** Usage: sqlite3_open16 filename options
 | 
|  */
 | 
| -static int test_open16(
 | 
| +static int SQLITE_TCLAPI test_open16(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4155,7 +4496,7 @@ static int test_open16(
 | 
|  ** Return 1 if the supplied argument is a complete SQL statement, or zero
 | 
|  ** otherwise.
 | 
|  */
 | 
| -static int test_complete16(
 | 
| +static int SQLITE_TCLAPI test_complete16(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4180,7 +4521,7 @@ static int test_complete16(
 | 
|  **
 | 
|  ** Advance the statement to the next row.
 | 
|  */
 | 
| -static int test_step(
 | 
| +static int SQLITE_TCLAPI test_step(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4203,7 +4544,7 @@ static int test_step(
 | 
|    return TCL_OK;
 | 
|  }
 | 
|  
 | 
| -static int test_sql(
 | 
| +static int SQLITE_TCLAPI test_sql(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4220,13 +4561,33 @@ static int test_sql(
 | 
|    Tcl_SetResult(interp, (char *)sqlite3_sql(pStmt), TCL_VOLATILE);
 | 
|    return TCL_OK;
 | 
|  }
 | 
| +static int SQLITE_TCLAPI test_ex_sql(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  sqlite3_stmt *pStmt;
 | 
| +  char *z;
 | 
| +
 | 
| +  if( objc!=2 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "STMT");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +
 | 
| +  if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
 | 
| +  z = sqlite3_expanded_sql(pStmt);
 | 
| +  Tcl_SetResult(interp, z, TCL_VOLATILE);
 | 
| +  sqlite3_free(z);
 | 
| +  return TCL_OK;
 | 
| +}
 | 
|  
 | 
|  /*
 | 
|  ** Usage: sqlite3_column_count STMT 
 | 
|  **
 | 
|  ** Return the number of columns returned by the sql statement STMT.
 | 
|  */
 | 
| -static int test_column_count(
 | 
| +static int SQLITE_TCLAPI test_column_count(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4251,7 +4612,7 @@ static int test_column_count(
 | 
|  **
 | 
|  ** Return the type of the data in column 'column' of the current row.
 | 
|  */
 | 
| -static int test_column_type(
 | 
| +static int SQLITE_TCLAPI test_column_type(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4300,7 +4661,7 @@ static int test_column_type(
 | 
|  ** Return the data in column 'column' of the current row cast as an
 | 
|  ** wide (64-bit) integer.
 | 
|  */
 | 
| -static int test_column_int64(
 | 
| +static int SQLITE_TCLAPI test_column_int64(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4327,7 +4688,7 @@ static int test_column_int64(
 | 
|  /*
 | 
|  ** Usage: sqlite3_column_blob STMT column
 | 
|  */
 | 
| -static int test_column_blob(
 | 
| +static int SQLITE_TCLAPI test_column_blob(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4359,7 +4720,7 @@ static int test_column_blob(
 | 
|  **
 | 
|  ** Return the data in column 'column' of the current row cast as a double.
 | 
|  */
 | 
| -static int test_column_double(
 | 
| +static int SQLITE_TCLAPI test_column_double(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4388,7 +4749,7 @@ static int test_column_double(
 | 
|  **
 | 
|  ** Return the number of columns returned by the sql statement STMT.
 | 
|  */
 | 
| -static int test_data_count(
 | 
| +static int SQLITE_TCLAPI test_data_count(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4415,7 +4776,7 @@ static int test_data_count(
 | 
|  **
 | 
|  ** Usage: sqlite3_column_name STMT column
 | 
|  */
 | 
| -static int test_stmt_utf8(
 | 
| +static int SQLITE_TCLAPI test_stmt_utf8(
 | 
|    void * clientData,        /* Pointer to SQLite API function to be invoke */
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4442,7 +4803,7 @@ static int test_stmt_utf8(
 | 
|    return TCL_OK;
 | 
|  }
 | 
|  
 | 
| -static int test_global_recover(
 | 
| +static int SQLITE_TCLAPI test_global_recover(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4467,7 +4828,7 @@ static int test_global_recover(
 | 
|  **
 | 
|  ** Usage: sqlite3_column_name STMT column
 | 
|  */
 | 
| -static int test_stmt_utf16(
 | 
| +static int SQLITE_TCLAPI test_stmt_utf16(
 | 
|    void * clientData,     /* Pointer to SQLite API function to be invoked */
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4511,7 +4872,7 @@ static int test_stmt_utf16(
 | 
|  ** Usage: sqlite3_column_bytes16 STMT column
 | 
|  **
 | 
|  */
 | 
| -static int test_stmt_int(
 | 
| +static int SQLITE_TCLAPI test_stmt_int(
 | 
|    void * clientData,    /* Pointer to SQLite API function to be invoked */
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4540,7 +4901,7 @@ static int test_stmt_int(
 | 
|  **
 | 
|  ** Set the db->magic value.  This is used to test error recovery logic.
 | 
|  */
 | 
| -static int sqlite_set_magic(
 | 
| +static int SQLITE_TCLAPI sqlite_set_magic(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4572,7 +4933,7 @@ static int sqlite_set_magic(
 | 
|  **
 | 
|  ** Trigger an interrupt on DB
 | 
|  */
 | 
| -static int test_interrupt(
 | 
| +static int SQLITE_TCLAPI test_interrupt(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4613,7 +4974,7 @@ u64 sqlite3StackDepth(void){
 | 
|  **
 | 
|  ** Try to measure the amount of stack space used by a call to sqlite3_exec
 | 
|  */
 | 
| -static int test_stack_used(
 | 
| +static int SQLITE_TCLAPI test_stack_used(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4641,7 +5002,7 @@ static int test_stack_used(
 | 
|  ** is assumed that the user function was created as UTF8, any number of
 | 
|  ** arguments (the way the TCL interface does it).
 | 
|  */
 | 
| -static int delete_function(
 | 
| +static int SQLITE_TCLAPI delete_function(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4667,7 +5028,7 @@ static int delete_function(
 | 
|  ** DB. It is assumed that the collation sequence was created as UTF8 (the 
 | 
|  ** way the TCL interface does it).
 | 
|  */
 | 
| -static int delete_collation(
 | 
| +static int SQLITE_TCLAPI delete_collation(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4692,7 +5053,7 @@ static int delete_collation(
 | 
|  ** Return true if the database DB is currently in auto-commit mode.
 | 
|  ** Return false if not.
 | 
|  */
 | 
| -static int get_autocommit(
 | 
| +static int SQLITE_TCLAPI get_autocommit(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4718,7 +5079,7 @@ static int get_autocommit(
 | 
|  ** method of the TCL interface.  But we need a way to test the case
 | 
|  ** where it returns SQLITE_MISUSE.
 | 
|  */
 | 
| -static int test_busy_timeout(
 | 
| +static int SQLITE_TCLAPI test_busy_timeout(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int argc,
 | 
| @@ -4744,7 +5105,7 @@ static int test_busy_timeout(
 | 
|  ** Return the name of the internal representation for the
 | 
|  ** value of the given variable.
 | 
|  */
 | 
| -static int tcl_variable_type(
 | 
| +static int SQLITE_TCLAPI tcl_variable_type(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4770,7 +5131,7 @@ static int tcl_variable_type(
 | 
|  ** The integer N is the number of bytes we are trying to release.  The 
 | 
|  ** return value is the amount of memory actually released.
 | 
|  */
 | 
| -static int test_release_memory(
 | 
| +static int SQLITE_TCLAPI test_release_memory(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4801,7 +5162,7 @@ static int test_release_memory(
 | 
|  ** Attempt to release memory currently held by database DB.  Return the
 | 
|  ** result code (which in the current implementation is always zero).
 | 
|  */
 | 
| -static int test_db_release_memory(
 | 
| +static int SQLITE_TCLAPI test_db_release_memory(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4824,7 +5185,7 @@ static int test_db_release_memory(
 | 
|  **
 | 
|  ** Attempt to flush any dirty pages to disk.
 | 
|  */
 | 
| -static int test_db_cacheflush(
 | 
| +static int SQLITE_TCLAPI test_db_cacheflush(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4848,11 +5209,34 @@ static int test_db_cacheflush(
 | 
|  }
 | 
|  
 | 
|  /*
 | 
| +** Usage:  sqlite3_system_errno DB
 | 
| +**
 | 
| +** Return the low-level system errno value.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_system_errno(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  sqlite3 *db;
 | 
| +  int iErrno;
 | 
| +  if( objc!=2 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +  iErrno = sqlite3_system_errno(db);
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewIntObj(iErrno));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
|  ** Usage:  sqlite3_db_filename DB DBNAME
 | 
|  **
 | 
|  ** Return the name of a file associated with a database.
 | 
|  */
 | 
| -static int test_db_filename(
 | 
| +static int SQLITE_TCLAPI test_db_filename(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4876,7 +5260,7 @@ static int test_db_filename(
 | 
|  ** Return 1 or 0 if DBNAME is readonly or not.  Return -1 if DBNAME does
 | 
|  ** not exist.
 | 
|  */
 | 
| -static int test_db_readonly(
 | 
| +static int SQLITE_TCLAPI test_db_readonly(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4901,7 +5285,7 @@ static int test_db_readonly(
 | 
|  ** limit is only changed if the N is present.  The previous limit
 | 
|  ** is returned.
 | 
|  */
 | 
| -static int test_soft_heap_limit(
 | 
| +static int SQLITE_TCLAPI test_soft_heap_limit(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4926,7 +5310,7 @@ static int test_soft_heap_limit(
 | 
|  **
 | 
|  ** Call the sqlite3_thread_cleanup API.
 | 
|  */
 | 
| -static int test_thread_cleanup(
 | 
| +static int SQLITE_TCLAPI test_thread_cleanup(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4944,7 +5328,7 @@ static int test_thread_cleanup(
 | 
|  ** Return a list of numbers which are the PagerRefcount for all
 | 
|  ** pagers on each database connection.
 | 
|  */
 | 
| -static int test_pager_refcounts(
 | 
| +static int SQLITE_TCLAPI test_pager_refcounts(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -4990,7 +5374,7 @@ static int test_pager_refcounts(
 | 
|  ** and that the errors they are seeing in the test scripts might be
 | 
|  ** a result of their defective TCL rather than problems in SQLite.
 | 
|  */
 | 
| -static int working_64bit_int(
 | 
| +static int SQLITE_TCLAPI working_64bit_int(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5015,7 +5399,7 @@ static int working_64bit_int(
 | 
|  ** VFS when none are previously registered, and the ability to 
 | 
|  ** unregister the only available VFS.  Ticket #2738
 | 
|  */
 | 
| -static int vfs_unlink_test(
 | 
| +static int SQLITE_TCLAPI vfs_unlink_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5117,7 +5501,7 @@ static int vfs_unlink_test(
 | 
|  ** This TCL command attempts to vfs_find and vfs_register when the
 | 
|  ** sqlite3_initialize() interface is failing.  All calls should fail.
 | 
|  */
 | 
| -static int vfs_initfail_test(
 | 
| +static int SQLITE_TCLAPI vfs_initfail_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5145,7 +5529,7 @@ static int nVfs = 0;
 | 
|  **
 | 
|  ** Unregister all VFSes.
 | 
|  */
 | 
| -static int vfs_unregister_all(
 | 
| +static int SQLITE_TCLAPI vfs_unregister_all(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5163,17 +5547,19 @@ static int vfs_unregister_all(
 | 
|  /*
 | 
|  ** tclcmd:   vfs_reregister_all
 | 
|  **
 | 
| -** Restore all VFSes that were removed using vfs_unregister_all
 | 
| +** Restore all VFSes that were removed using vfs_unregister_all. Taking
 | 
| +** care to put the linked list back together in the same order as it was
 | 
| +** in before vfs_unregister_all was invoked.
 | 
|  */
 | 
| -static int vfs_reregister_all(
 | 
| +static int SQLITE_TCLAPI vfs_reregister_all(
 | 
|    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 */
 | 
|  ){
 | 
|    int i;
 | 
| -  for(i=0; i<nVfs; i++){
 | 
| -    sqlite3_vfs_register(apVfs[i], i==0);
 | 
| +  for(i=nVfs-1; i>=0; i--){
 | 
| +    sqlite3_vfs_register(apVfs[i], 1);
 | 
|    }
 | 
|    return TCL_OK;
 | 
|  }
 | 
| @@ -5185,7 +5571,7 @@ static int vfs_reregister_all(
 | 
|  ** This TCL command runs the sqlite3_file_control interface and
 | 
|  ** verifies correct operation of the same.
 | 
|  */
 | 
| -static int file_control_test(
 | 
| +static int SQLITE_TCLAPI file_control_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5220,7 +5606,7 @@ static int file_control_test(
 | 
|  ** This TCL command runs the sqlite3_file_control interface and
 | 
|  ** verifies correct operation of the SQLITE_LAST_ERRNO verb.
 | 
|  */
 | 
| -static int file_control_lasterrno_test(
 | 
| +static int SQLITE_TCLAPI file_control_lasterrno_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5258,7 +5644,7 @@ static int file_control_lasterrno_test(
 | 
|  ** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and
 | 
|  ** SQLITE_SET_LOCKPROXYFILE verbs.
 | 
|  */
 | 
| -static int file_control_chunksize_test(
 | 
| +static int SQLITE_TCLAPI file_control_chunksize_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5295,7 +5681,7 @@ static int file_control_chunksize_test(
 | 
|  ** This TCL command runs the sqlite3_file_control interface 
 | 
|  ** with SQLITE_FCNTL_SIZE_HINT
 | 
|  */
 | 
| -static int file_control_sizehint_test(
 | 
| +static int SQLITE_TCLAPI file_control_sizehint_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5333,7 +5719,7 @@ static int file_control_sizehint_test(
 | 
|  ** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and
 | 
|  ** SQLITE_SET_LOCKPROXYFILE verbs.
 | 
|  */
 | 
| -static int file_control_lockproxy_test(
 | 
| +static int SQLITE_TCLAPI file_control_lockproxy_test(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5403,7 +5789,7 @@ static int file_control_lockproxy_test(
 | 
|  ** This TCL command runs the sqlite3_file_control interface with
 | 
|  ** the SQLITE_FCNTL_WIN32_AV_RETRY opcode.
 | 
|  */
 | 
| -static int file_control_win32_av_retry(
 | 
| +static int SQLITE_TCLAPI file_control_win32_av_retry(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5431,12 +5817,44 @@ static int file_control_win32_av_retry(
 | 
|  }
 | 
|  
 | 
|  /*
 | 
| +** tclcmd:   file_control_win32_get_handle DB
 | 
| +**
 | 
| +** This TCL command runs the sqlite3_file_control interface with
 | 
| +** the SQLITE_FCNTL_WIN32_GET_HANDLE opcode.
 | 
| +*/
 | 
| +static int file_control_win32_get_handle(
 | 
| +  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 */
 | 
| +){
 | 
| +  sqlite3 *db;
 | 
| +  int rc;
 | 
| +  HANDLE hFile = NULL;
 | 
| +  char z[100];
 | 
| +
 | 
| +  if( objc!=2 ){
 | 
| +    Tcl_AppendResult(interp, "wrong # args: should be \"",
 | 
| +        Tcl_GetStringFromObj(objv[0], 0), " DB", 0);
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  rc = sqlite3_file_control(db, NULL, SQLITE_FCNTL_WIN32_GET_HANDLE,
 | 
| +                            (void*)&hFile);
 | 
| +  sqlite3_snprintf(sizeof(z), z, "%d %p", rc, (void*)hFile);
 | 
| +  Tcl_AppendResult(interp, z, (char*)0);
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
|  ** tclcmd:   file_control_win32_set_handle DB HANDLE
 | 
|  **
 | 
|  ** This TCL command runs the sqlite3_file_control interface with
 | 
|  ** the SQLITE_FCNTL_WIN32_SET_HANDLE opcode.
 | 
|  */
 | 
| -static int file_control_win32_set_handle(
 | 
| +static int SQLITE_TCLAPI file_control_win32_set_handle(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5472,7 +5890,7 @@ static int file_control_win32_set_handle(
 | 
|  ** This TCL command runs the sqlite3_file_control interface with
 | 
|  ** the SQLITE_FCNTL_PERSIST_WAL opcode.
 | 
|  */
 | 
| -static int file_control_persist_wal(
 | 
| +static int SQLITE_TCLAPI file_control_persist_wal(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5504,7 +5922,7 @@ static int file_control_persist_wal(
 | 
|  ** This TCL command runs the sqlite3_file_control interface with
 | 
|  ** the SQLITE_FCNTL_POWERSAFE_OVERWRITE opcode.
 | 
|  */
 | 
| -static int file_control_powersafe_overwrite(
 | 
| +static int SQLITE_TCLAPI file_control_powersafe_overwrite(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5536,7 +5954,7 @@ static int file_control_powersafe_overwrite(
 | 
|  **
 | 
|  ** Return a string that describes the stack of VFSes.
 | 
|  */
 | 
| -static int file_control_vfsname(
 | 
| +static int SQLITE_TCLAPI file_control_vfsname(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5568,7 +5986,7 @@ static int file_control_vfsname(
 | 
|  **
 | 
|  ** Return a string that is a temporary filename
 | 
|  */
 | 
| -static int file_control_tempfilename(
 | 
| +static int SQLITE_TCLAPI file_control_tempfilename(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5601,7 +6019,7 @@ static int file_control_tempfilename(
 | 
|  **
 | 
|  **   Return a tcl list containing the names of all registered vfs's.
 | 
|  */
 | 
| -static int vfs_list(
 | 
| +static int SQLITE_TCLAPI vfs_list(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5626,7 +6044,7 @@ static int vfs_list(
 | 
|  ** This TCL command runs the sqlite3_limit interface and
 | 
|  ** verifies correct operation of the same.
 | 
|  */
 | 
| -static int test_limit(
 | 
| +static int SQLITE_TCLAPI test_limit(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5689,7 +6107,7 @@ static int test_limit(
 | 
|  ** At the same time, verify that sqlite3_test_control works even when
 | 
|  ** called with an out-of-range opcode.
 | 
|  */
 | 
| -static int save_prng_state(
 | 
| +static int SQLITE_TCLAPI save_prng_state(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5705,7 +6123,7 @@ static int save_prng_state(
 | 
|  /*
 | 
|  ** tclcmd:  restore_prng_state
 | 
|  */
 | 
| -static int restore_prng_state(
 | 
| +static int SQLITE_TCLAPI restore_prng_state(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5717,7 +6135,7 @@ static int restore_prng_state(
 | 
|  /*
 | 
|  ** tclcmd:  reset_prng_state
 | 
|  */
 | 
| -static int reset_prng_state(
 | 
| +static int SQLITE_TCLAPI reset_prng_state(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5733,7 +6151,7 @@ static int reset_prng_state(
 | 
|  ** Indicate that database files might be corrupt.  In other words, set the normal
 | 
|  ** state of operation.
 | 
|  */
 | 
| -static int database_may_be_corrupt(
 | 
| +static int SQLITE_TCLAPI database_may_be_corrupt(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5748,7 +6166,7 @@ static int database_may_be_corrupt(
 | 
|  ** Indicate that database files are always well-formed.  This enables extra assert()
 | 
|  ** statements that test conditions that are always true for well-formed databases.
 | 
|  */
 | 
| -static int database_never_corrupt(
 | 
| +static int SQLITE_TCLAPI database_never_corrupt(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5761,7 +6179,7 @@ static int database_never_corrupt(
 | 
|  /*
 | 
|  ** tclcmd:  pcache_stats
 | 
|  */
 | 
| -static int test_pcache_stats(
 | 
| +static int SQLITE_TCLAPI test_pcache_stats(
 | 
|    ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5803,7 +6221,7 @@ static void test_unlock_notify_cb(void **aArg, int nArg){
 | 
|  ** tclcmd:  sqlite3_unlock_notify db
 | 
|  */
 | 
|  #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
 | 
| -static int test_unlock_notify(
 | 
| +static int SQLITE_TCLAPI test_unlock_notify(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5829,7 +6247,7 @@ static int test_unlock_notify(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_wal_checkpoint db ?NAME?
 | 
|  */
 | 
| -static int test_wal_checkpoint(
 | 
| +static int SQLITE_TCLAPI test_wal_checkpoint(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5873,7 +6291,7 @@ static int test_wal_checkpoint(
 | 
|  ** the number of frames in the log and the number of frames in the log
 | 
|  ** that have been checkpointed.
 | 
|  */
 | 
| -static int test_wal_checkpoint_v2(
 | 
| +static int SQLITE_TCLAPI test_wal_checkpoint_v2(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5929,7 +6347,7 @@ static int test_wal_checkpoint_v2(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_wal_autocheckpoint db VALUE
 | 
|  */
 | 
| -static int test_wal_autocheckpoint(
 | 
| +static int SQLITE_TCLAPI test_wal_autocheckpoint(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -5980,7 +6398,7 @@ static void xLogcallback(void *unused, int err, char *zMsg){
 | 
|    Tcl_EvalObjEx(logcallback.pInterp, pNew, TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
 | 
|    Tcl_DecrRefCount(pNew);
 | 
|  }
 | 
| -static int test_sqlite3_log(
 | 
| +static int SQLITE_TCLAPI test_sqlite3_log(
 | 
|    ClientData clientData,
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6011,7 +6429,7 @@ static int test_sqlite3_log(
 | 
|  ** Run a TCL command using its objProc interface.  Throw an error if
 | 
|  ** the command has no objProc interface.
 | 
|  */
 | 
| -static int runAsObjProc(
 | 
| +static int SQLITE_TCLAPI runAsObjProc(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6074,7 +6492,7 @@ int printExplainQueryPlan(sqlite3_stmt *pStmt){
 | 
|    return sqlite3_finalize(pExplain);
 | 
|  }
 | 
|  
 | 
| -static int test_print_eqp(
 | 
| +static int SQLITE_TCLAPI test_print_eqp(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6102,7 +6520,7 @@ static int test_print_eqp(
 | 
|  /*
 | 
|  ** sqlite3_test_control VERB ARGS...
 | 
|  */
 | 
| -static int test_test_control(
 | 
| +static int SQLITE_TCLAPI test_test_control(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6181,7 +6599,7 @@ static int test_test_control(
 | 
|  #include <sys/time.h>
 | 
|  #include <sys/resource.h>
 | 
|  
 | 
| -static int test_getrusage(
 | 
| +static int SQLITE_TCLAPI test_getrusage(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6224,7 +6642,7 @@ struct win32FileLocker {
 | 
|  /*
 | 
|  ** The background thread that does file locking.
 | 
|  */
 | 
| -static void win32_file_locker(void *pAppData){
 | 
| +static void SQLITE_CDECL win32_file_locker(void *pAppData){
 | 
|    struct win32FileLocker *p = (struct win32FileLocker*)pAppData;
 | 
|    if( p->evName ){
 | 
|      HANDLE ev = OpenEvent(EVENT_MODIFY_STATE, FALSE, p->evName);
 | 
| @@ -6255,7 +6673,7 @@ static void win32_file_locker(void *pAppData){
 | 
|  ** Get an exclusive manditory lock on file for DELAY2 milliseconds.
 | 
|  ** Wait DELAY1 milliseconds before acquiring the lock.
 | 
|  */
 | 
| -static int win32_file_lock(
 | 
| +static int SQLITE_TCLAPI win32_file_lock(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6319,7 +6737,7 @@ static int win32_file_lock(
 | 
|  ** Returns non-zero if the specified path exists, whose fully qualified name
 | 
|  ** may exceed 260 characters if it is prefixed with "\\?\".
 | 
|  */
 | 
| -static int win32_exists_path(
 | 
| +static int SQLITE_TCLAPI win32_exists_path(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6341,7 +6759,7 @@ static int win32_exists_path(
 | 
|  ** whose fully qualified name may exceed 248 characters if it is prefixed with
 | 
|  ** "\\?\".
 | 
|  */
 | 
| -static int win32_find_file(
 | 
| +static int SQLITE_TCLAPI win32_find_file(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6386,7 +6804,7 @@ static int win32_find_file(
 | 
|  ** Deletes the specified file, whose fully qualified name may exceed 260
 | 
|  ** characters if it is prefixed with "\\?\".
 | 
|  */
 | 
| -static int win32_delete_file(
 | 
| +static int SQLITE_TCLAPI win32_delete_file(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6410,7 +6828,7 @@ static int win32_delete_file(
 | 
|  ** Creates the specified directory, whose fully qualified name may exceed 248
 | 
|  ** characters if it is prefixed with "\\?\".
 | 
|  */
 | 
| -static int win32_mkdir(
 | 
| +static int SQLITE_TCLAPI win32_mkdir(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6434,7 +6852,7 @@ static int win32_mkdir(
 | 
|  ** Removes the specified directory, whose fully qualified name may exceed 248
 | 
|  ** characters if it is prefixed with "\\?\".
 | 
|  */
 | 
| -static int win32_rmdir(
 | 
| +static int SQLITE_TCLAPI win32_rmdir(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6461,7 +6879,7 @@ static int win32_rmdir(
 | 
|  ** interface.  Disable if BOOLEAN is false and enable if BOOLEAN is true.
 | 
|  ** OPT is the name of the optimization to be disabled.
 | 
|  */
 | 
| -static int optimization_control(
 | 
| +static int SQLITE_TCLAPI optimization_control(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6518,20 +6936,21 @@ static int optimization_control(
 | 
|    return TCL_OK;
 | 
|  }
 | 
|  
 | 
| -typedef struct sqlite3_api_routines sqlite3_api_routines;
 | 
|  /*
 | 
|  **     load_static_extension DB NAME ...
 | 
|  **
 | 
|  ** Load one or more statically linked extensions.
 | 
|  */
 | 
| -static int tclLoadStaticExtensionCmd(
 | 
| +static int SQLITE_TCLAPI tclLoadStaticExtensionCmd(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
|    Tcl_Obj *CONST objv[]
 | 
|  ){
 | 
|    extern int sqlite3_amatch_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
| +  extern int sqlite3_carray_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_closure_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
| +  extern int sqlite3_csv_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_eval_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_fileio_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_fuzzer_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
| @@ -6539,6 +6958,7 @@ static int tclLoadStaticExtensionCmd(
 | 
|    extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
| +  extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_spellfix_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    extern int sqlite3_totype_init(sqlite3*,char**,const sqlite3_api_routines*);
 | 
| @@ -6548,7 +6968,9 @@ static int tclLoadStaticExtensionCmd(
 | 
|      int (*pInit)(sqlite3*,char**,const sqlite3_api_routines*);
 | 
|    } aExtension[] = {
 | 
|      { "amatch",                sqlite3_amatch_init               },
 | 
| +    { "carray",                sqlite3_carray_init               },
 | 
|      { "closure",               sqlite3_closure_init              },
 | 
| +    { "csv",                   sqlite3_csv_init                  },
 | 
|      { "eval",                  sqlite3_eval_init                 },
 | 
|      { "fileio",                sqlite3_fileio_init               },
 | 
|      { "fuzzer",                sqlite3_fuzzer_init               },
 | 
| @@ -6556,6 +6978,7 @@ static int tclLoadStaticExtensionCmd(
 | 
|      { "nextchar",              sqlite3_nextchar_init             },
 | 
|      { "percentile",            sqlite3_percentile_init           },
 | 
|      { "regexp",                sqlite3_regexp_init               },
 | 
| +    { "remember",              sqlite3_remember_init             },
 | 
|      { "series",                sqlite3_series_init               },
 | 
|      { "spellfix",              sqlite3_spellfix_init             },
 | 
|      { "totype",                sqlite3_totype_init               },
 | 
| @@ -6598,7 +7021,7 @@ static int tclLoadStaticExtensionCmd(
 | 
|  **     sorter_test_fakeheap BOOL
 | 
|  **
 | 
|  */
 | 
| -static int sorter_test_fakeheap(
 | 
| +static int SQLITE_TCLAPI sorter_test_fakeheap(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6638,7 +7061,7 @@ static int sorter_test_fakeheap(
 | 
|  ** Then execute statement $SQL2. Check that the statement returns the same
 | 
|  ** set of integers in the same order as in the previous step (using $SQL1).
 | 
|  */
 | 
| -static int sorter_test_sort4_helper(
 | 
| +static int SQLITE_TCLAPI sorter_test_sort4_helper(
 | 
|    void * clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6648,8 +7071,8 @@ static int sorter_test_sort4_helper(
 | 
|    const char *zSql2;
 | 
|    int nStep; 
 | 
|    int iStep; 
 | 
| -  int iCksum1 = 0; 
 | 
| -  int iCksum2 = 0; 
 | 
| +  unsigned int iCksum1 = 0; 
 | 
| +  unsigned int iCksum2 = 0; 
 | 
|    int rc;
 | 
|    int iB;
 | 
|    sqlite3 *db;
 | 
| @@ -6676,7 +7099,7 @@ static int sorter_test_sort4_helper(
 | 
|        return TCL_ERROR;
 | 
|      }
 | 
|  
 | 
| -    iCksum1 += (iCksum1 << 3) + a;
 | 
| +    iCksum1 += (iCksum1 << 3) + (unsigned int)a;
 | 
|    }
 | 
|    rc = sqlite3_finalize(pStmt);
 | 
|    if( rc!=SQLITE_OK ) goto sql_error;
 | 
| @@ -6685,7 +7108,7 @@ static int sorter_test_sort4_helper(
 | 
|    if( rc!=SQLITE_OK ) goto sql_error;
 | 
|    for(iStep=0; SQLITE_ROW==sqlite3_step(pStmt); iStep++){
 | 
|      int a = sqlite3_column_int(pStmt, 0);
 | 
| -    iCksum2 += (iCksum2 << 3) + a;
 | 
| +    iCksum2 += (iCksum2 << 3) + (unsigned int)a;
 | 
|    }
 | 
|    rc = sqlite3_finalize(pStmt);
 | 
|    if( rc!=SQLITE_OK ) goto sql_error;
 | 
| @@ -6707,7 +7130,7 @@ static int sorter_test_sort4_helper(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_user_authenticate DB USERNAME PASSWORD
 | 
|  */
 | 
| -static int test_user_authenticate(
 | 
| +static int SQLITE_TCLAPI test_user_authenticate(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6738,7 +7161,7 @@ static int test_user_authenticate(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_user_add DB USERNAME PASSWORD ISADMIN
 | 
|  */
 | 
| -static int test_user_add(
 | 
| +static int SQLITE_TCLAPI test_user_add(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6771,7 +7194,7 @@ static int test_user_add(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_user_change DB USERNAME PASSWORD ISADMIN
 | 
|  */
 | 
| -static int test_user_change(
 | 
| +static int SQLITE_TCLAPI test_user_change(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6804,7 +7227,7 @@ static int test_user_change(
 | 
|  /*
 | 
|  ** tclcmd:  sqlite3_user_delete DB USERNAME
 | 
|  */
 | 
| -static int test_user_delete(
 | 
| +static int SQLITE_TCLAPI test_user_delete(
 | 
|    ClientData clientData, /* Unused */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6841,7 +7264,7 @@ static int test_user_delete(
 | 
|  **       3          Read after free
 | 
|  **       4          Panic
 | 
|  */
 | 
| -static int test_bad_behavior(
 | 
| +static int SQLITE_TCLAPI test_bad_behavior(
 | 
|    ClientData clientData, /* Pointer to an integer containing zero */
 | 
|    Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
 | 
|    int objc,              /* Number of arguments */
 | 
| @@ -6891,7 +7314,7 @@ static int test_bad_behavior(
 | 
|  **
 | 
|  ** Cause the dbstat virtual table to be available on the connection DB
 | 
|  */
 | 
| -static int test_register_dbstat_vtab(
 | 
| +static int SQLITE_TCLAPI test_register_dbstat_vtab(
 | 
|    void *clientData,
 | 
|    Tcl_Interp *interp,
 | 
|    int objc,
 | 
| @@ -6921,6 +7344,78 @@ static int test_register_dbstat_vtab(
 | 
|  }
 | 
|  
 | 
|  /*
 | 
| +** tclcmd:   sqlite3_db_config DB SETTING VALUE
 | 
| +**
 | 
| +** Invoke sqlite3_db_config() for one of the setting values.
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_sqlite3_db_config(
 | 
| +  void *clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  static const struct {
 | 
| +    const char *zName;
 | 
| +    int eVal;
 | 
| +  } aSetting[] = {
 | 
| +    { "FKEY",            SQLITE_DBCONFIG_ENABLE_FKEY },
 | 
| +    { "TRIGGER",         SQLITE_DBCONFIG_ENABLE_TRIGGER },
 | 
| +    { "FTS3_TOKENIZER",  SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
 | 
| +    { "LOAD_EXTENSION",  SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
 | 
| +    { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
 | 
| +  };
 | 
| +  int i;
 | 
| +  int v;
 | 
| +  const char *zSetting;
 | 
| +  sqlite3 *db;
 | 
| +
 | 
| +  if( objc!=4 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB SETTING VALUE");
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +  zSetting = Tcl_GetString(objv[2]);
 | 
| +  if( sqlite3_strglob("SQLITE_*", zSetting)==0 ) zSetting += 7;
 | 
| +  if( sqlite3_strglob("DBCONFIG_*", zSetting)==0 ) zSetting += 9;
 | 
| +  if( sqlite3_strglob("ENABLE_*", zSetting)==0 ) zSetting += 7;
 | 
| +  for(i=0; i<ArraySize(aSetting); i++){
 | 
| +    if( strcmp(zSetting, aSetting[i].zName)==0 ) break;
 | 
| +  }
 | 
| +  if( i>=ArraySize(aSetting) ){
 | 
| +    Tcl_SetObjResult(interp,
 | 
| +      Tcl_NewStringObj("unknown sqlite3_db_config setting", -1));
 | 
| +    return TCL_ERROR;
 | 
| +  }
 | 
| +  if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR;
 | 
| +  sqlite3_db_config(db, aSetting[i].eVal, v, &v);
 | 
| +  Tcl_SetObjResult(interp, Tcl_NewIntObj(v));
 | 
| +  return TCL_OK;
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +** Change the name of the main database schema from "main" to "icecube".
 | 
| +*/
 | 
| +static int SQLITE_TCLAPI test_dbconfig_maindbname_icecube(
 | 
| +  void * clientData,
 | 
| +  Tcl_Interp *interp,
 | 
| +  int objc,
 | 
| +  Tcl_Obj *CONST objv[]
 | 
| +){
 | 
| +  int rc;
 | 
| +  sqlite3 *db;
 | 
| +  extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**);
 | 
| +  if( objc!=2 ){
 | 
| +    Tcl_WrongNumArgs(interp, 1, objv, "DB");
 | 
| +    return TCL_ERROR;
 | 
| +  }else{
 | 
| +    if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 | 
| +    rc = sqlite3_db_config(db, SQLITE_DBCONFIG_MAINDBNAME, "icecube");
 | 
| +    Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
 | 
| +    return TCL_OK;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/*
 | 
|  ** Register commands with the TCL interpreter.
 | 
|  */
 | 
|  int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
| @@ -6934,7 +7429,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|    extern int sqlite3_hostid_num;
 | 
|  #endif
 | 
|    extern int sqlite3_max_blobsize;
 | 
| -  extern int sqlite3BtreeSharedCacheReport(void*,
 | 
| +  extern int SQLITE_TCLAPI sqlite3BtreeSharedCacheReport(void*,
 | 
|                                            Tcl_Interp*,int,Tcl_Obj*CONST*);
 | 
|    static int iZero = 0;
 | 
|    static struct {
 | 
| @@ -6989,9 +7484,14 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       Tcl_ObjCmdProc *xProc;
 | 
|       void *clientData;
 | 
|    } aObjCmd[] = {
 | 
| +     { "sqlite3_db_config",             test_sqlite3_db_config, 0 },
 | 
|       { "bad_behavior",                  test_bad_behavior,  (void*)&iZero },
 | 
|       { "register_dbstat_vtab",          test_register_dbstat_vtab  },
 | 
|       { "sqlite3_connection_pointer",    get_sqlite_pointer, 0 },
 | 
| +     { "intarray_addr",                 test_intarray_addr, 0 },
 | 
| +     { "int64array_addr",               test_int64array_addr, 0 },
 | 
| +     { "doublearray_addr",              test_doublearray_addr, 0 },
 | 
| +     { "textarray_addr",                test_textarray_addr, 0 },
 | 
|       { "sqlite3_bind_int",              test_bind_int,      0 },
 | 
|       { "sqlite3_bind_zeroblob",         test_bind_zeroblob, 0 },
 | 
|       { "sqlite3_bind_zeroblob64",       test_bind_zeroblob64, 0 },
 | 
| @@ -7028,6 +7528,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       { "sqlite3_changes",               test_changes       ,0 },
 | 
|       { "sqlite3_step",                  test_step          ,0 },
 | 
|       { "sqlite3_sql",                   test_sql           ,0 },
 | 
| +     { "sqlite3_expanded_sql",          test_ex_sql        ,0 },
 | 
|       { "sqlite3_next_stmt",             test_next_stmt     ,0 },
 | 
|       { "sqlite3_stmt_readonly",         test_stmt_readonly ,0 },
 | 
|       { "sqlite3_stmt_busy",             test_stmt_busy     ,0 },
 | 
| @@ -7036,6 +7537,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       { "sqlite3_release_memory",        test_release_memory,     0},
 | 
|       { "sqlite3_db_release_memory",     test_db_release_memory,  0},
 | 
|       { "sqlite3_db_cacheflush",         test_db_cacheflush,      0},
 | 
| +     { "sqlite3_system_errno",          test_system_errno,       0},
 | 
|       { "sqlite3_db_filename",           test_db_filename,        0},
 | 
|       { "sqlite3_db_readonly",           test_db_readonly,        0},
 | 
|       { "sqlite3_soft_heap_limit",       test_soft_heap_limit,    0},
 | 
| @@ -7046,6 +7548,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       { "sqlite3_enable_load_extension", test_enable_load,        0},
 | 
|       { "sqlite3_extended_result_codes", test_extended_result_codes, 0},
 | 
|       { "sqlite3_limit",                 test_limit,                 0},
 | 
| +     { "dbconfig_maindbname_icecube",   test_dbconfig_maindbname_icecube },
 | 
|  
 | 
|       { "save_prng_state",               save_prng_state,    0 },
 | 
|       { "restore_prng_state",            restore_prng_state, 0 },
 | 
| @@ -7112,6 +7615,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       { "file_control_sizehint_test",  file_control_sizehint_test,   0   },
 | 
|  #if SQLITE_OS_WIN
 | 
|       { "file_control_win32_av_retry", file_control_win32_av_retry,  0   },
 | 
| +     { "file_control_win32_get_handle", file_control_win32_get_handle, 0  },
 | 
|       { "file_control_win32_set_handle", file_control_win32_set_handle, 0  },
 | 
|  #endif
 | 
|       { "file_control_persist_wal",    file_control_persist_wal,     0   },
 | 
| @@ -7175,7 +7679,13 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
 | 
|       { "sqlite3_snapshot_get", test_snapshot_get, 0 },
 | 
|       { "sqlite3_snapshot_open", test_snapshot_open, 0 },
 | 
|       { "sqlite3_snapshot_free", test_snapshot_free, 0 },
 | 
| +     { "sqlite3_snapshot_cmp", test_snapshot_cmp, 0 },
 | 
| +     { "sqlite3_snapshot_recover", test_snapshot_recover, 0 },
 | 
| +     { "sqlite3_snapshot_get_blob", test_snapshot_get_blob, 0 },
 | 
| +     { "sqlite3_snapshot_open_blob", test_snapshot_open_blob, 0 },
 | 
| +     { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 },
 | 
|  #endif
 | 
| +     { "sqlite3_delete_database", test_delete_database, 0 },
 | 
|    };
 | 
|    static int bitmask_size = sizeof(Bitmask)*8;
 | 
|    static int longdouble_size = sizeof(LONGDOUBLE_TYPE);
 | 
| 
 |