15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code for testing all sorts of SQLite interfaces. This code 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not included in the SQLite library. It is used for automated 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** testing of the SQLite library. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tcl.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is a copy of the first part of the SqliteDb structure in 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclsqlite.c. We need it here so that the get_sqlite_pointer routine 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can extract the sqlite3* pointer from an existing Tcl SQLite 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** connection. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SqliteDb { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert text generated by the "%p" conversion format back into 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a pointer. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testHexToInt(int h){ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( h>='0' && h<='9' ){ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return h - '0'; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( h>='a' && h<='f' ){ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return h - 'a' + 10; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( h>='A' && h<='F' ); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return h - 'A' + 10; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3TestTextToPtr(const char *z){ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *p; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 v; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 v2; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z[0]=='0' && z[1]=='x' ){ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z += 2; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( *z ){ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = (v<<4) + testHexToInt(*z); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z++; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sizeof(p)==sizeof(v) ){ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&p, &v, sizeof(p)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sizeof(p)==sizeof(v2) ); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v2 = (u32)v; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&p, &v2, sizeof(p)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A TCL command that returns the address of the sqlite* pointer 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for an sqlite connection instance. Bad things happen if the 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** input is not an sqlite connection. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int get_sqlite_pointer( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SqliteDb *p; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo cmdInfo; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "SQLITE-CONNECTION"); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !Tcl_GetCommandInfo(interp, Tcl_GetString(objv[1]), &cmdInfo) ){ 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "command not found: ", 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[1]), (char*)0); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = (struct SqliteDb*)cmdInfo.objClientData; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%p", p->db); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strncmp(zBuf,"0x",2) ){ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "0x%p", p->db); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Decode a pointer to an sqlite3 object. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SqliteDb *p; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo cmdInfo; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetCommandInfo(interp, zA, &cmdInfo) ){ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = (struct SqliteDb*)cmdInfo.objClientData; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppDb = p->db; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppDb = (sqlite3*)sqlite3TestTextToPtr(zA); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3TestErrorName(int rc){ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( rc ){ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_OK: zName = "SQLITE_OK"; break; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_ERROR: zName = "SQLITE_ERROR"; break; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_PERM: zName = "SQLITE_PERM"; break; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_ABORT: zName = "SQLITE_ABORT"; break; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_BUSY: zName = "SQLITE_BUSY"; break; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_LOCKED: zName = "SQLITE_LOCKED"; break; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_LOCKED_SHAREDCACHE: zName = "SQLITE_LOCKED_SHAREDCACHE";break; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_CORRUPT: zName = "SQLITE_CORRUPT"; break; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NOTFOUND: zName = "SQLITE_NOTFOUND"; break; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_FULL: zName = "SQLITE_FULL"; break; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_CANTOPEN: zName = "SQLITE_CANTOPEN"; break; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_PROTOCOL: zName = "SQLITE_PROTOCOL"; break; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_EMPTY: zName = "SQLITE_EMPTY"; break; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_SCHEMA: zName = "SQLITE_SCHEMA"; break; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_TOOBIG: zName = "SQLITE_TOOBIG"; break; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_CONSTRAINT: zName = "SQLITE_CONSTRAINT"; break; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_MISMATCH: zName = "SQLITE_MISMATCH"; break; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_MISUSE: zName = "SQLITE_MISUSE"; break; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NOLFS: zName = "SQLITE_NOLFS"; break; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_AUTH: zName = "SQLITE_AUTH"; break; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_FORMAT: zName = "SQLITE_FORMAT"; break; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_RANGE: zName = "SQLITE_RANGE"; break; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NOTADB: zName = "SQLITE_NOTADB"; break; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_ROW: zName = "SQLITE_ROW"; break; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DONE: zName = "SQLITE_DONE"; break; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_SHORT_READ: zName = "SQLITE_IOERR_SHORT_READ"; break; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_WRITE: zName = "SQLITE_IOERR_WRITE"; break; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_FSYNC: zName = "SQLITE_IOERR_FSYNC"; break; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_DIR_FSYNC: zName = "SQLITE_IOERR_DIR_FSYNC"; break; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_TRUNCATE: zName = "SQLITE_IOERR_TRUNCATE"; break; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_FSTAT: zName = "SQLITE_IOERR_FSTAT"; break; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_UNLOCK: zName = "SQLITE_IOERR_UNLOCK"; break; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_RDLOCK: zName = "SQLITE_IOERR_RDLOCK"; break; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_DELETE: zName = "SQLITE_IOERR_DELETE"; break; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_BLOCKED: zName = "SQLITE_IOERR_BLOCKED"; break; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_NOMEM: zName = "SQLITE_IOERR_NOMEM"; break; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_ACCESS: zName = "SQLITE_IOERR_ACCESS"; break; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_CHECKRESERVEDLOCK: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: zName = "SQLITE_Unknown"; break; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zName; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define t1ErrorName sqlite3TestErrorName 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert an sqlite3_stmt* into an sqlite3*. This depends on the 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fact that the sqlite3* is the first field in the Vdbe structure. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define StmtToDb(X) sqlite3_db_handle(X) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check a return value to make sure it agrees with the results 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from sqlite3_errcode. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3TestErrCode(Tcl_Interp *interp, sqlite3 *db, int rc){ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_threadsafe()==0 && rc!=SQLITE_MISUSE && rc!=SQLITE_OK 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && sqlite3_errcode(db)!=rc ){ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[200]; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2 = sqlite3_errcode(db); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "error code %s (%d) does not match sqlite3_errcode %s (%d)", 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1ErrorName(rc), rc, t1ErrorName(r2), r2); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ResetResult(interp); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Decode a pointer to an sqlite3_stmt object. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int getStmtPointer( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zArg, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt **ppStmt 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppStmt = (sqlite3_stmt*)sqlite3TestTextToPtr(zArg); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate a text representation of a pointer that can be understood 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by the getDbPointer and getVmPointer routines above. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The problem is, on some machines (Solaris) if you do a printf with 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "%p" you cannot turn around and do a scanf with the same "%p" and 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** get your pointer back. You have to prepend a "0x" before it will 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** work. Or at least that is what is reported to me (drh). But this 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** behavior varies from machine to machine. The solution used her is 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to test the string right after it is generated to see if it can be 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** understood by scanf, and if not, try prepending an "0x" to see if 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that helps. If nothing works, a fatal error is generated. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3TestMakePointerStr(Tcl_Interp *interp, char *zPtr, void *p){ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(100, zPtr, "%p", p); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The callback routine for sqlite3_exec_printf(). 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exec_printf_cb(void *pArg, int argc, char **argv, char **name){ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DString *str = (Tcl_DString*)pArg; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_DStringLength(str)==0 ){ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<argc; i++){ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringAppendElement(str, name[i] ? name[i] : "NULL"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<argc; i++){ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringAppendElement(str, argv[i] ? argv[i] : "NULL"); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The I/O tracing callback. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static FILE *iotrace_file = 0; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void io_trace_callback(const char *zFormat, ...){ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, zFormat); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vfprintf(iotrace_file, zFormat, ap); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fflush(iotrace_file); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: io_trace FILENAME 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Turn I/O tracing on or off. If FILENAME is not an empty string, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** I/O tracing begins going into FILENAME. If FILENAME is an empty 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string, I/O tracing is turned off. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_io_trace( 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME\"", 0); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iotrace_file ){ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iotrace_file!=stdout && iotrace_file!=stderr ){ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(iotrace_file); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iotrace_file = 0; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3IoTrace = 0; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argv[1][0] ){ 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(argv[1],"stdout")==0 ){ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iotrace_file = stdout; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[1],"stderr")==0 ){ 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iotrace_file = stderr; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iotrace_file = fopen(argv[1], "w"); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3IoTrace = io_trace_callback; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_exec_printf DB FORMAT STRING 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the sqlite3_exec_printf() interface using the open database 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** DB. The SQL is the string FORMAT. The format string should contain 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** one %s or %q. STRING is the value inserted into %s or %q. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_exec_printf( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DString str; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zSql; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=4 ){ 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB FORMAT STRING", 0); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringInit(&str); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = sqlite3_mprintf(argv[2], argv[3]); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_exec(db, zSql, exec_printf_cb, &str, &zErr); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zSql); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", rc); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, rc==SQLITE_OK ? Tcl_DStringValue(&str) : zErr); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringFree(&str); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErr ) sqlite3_free(zErr); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_exec_hex DB HEX 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the sqlite3_exec() on a string that is obtained by translating 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** HEX into ASCII. Most characters are translated as is. %HH becomes 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a hex character. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_exec_hex( 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DString str; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc, i, j; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zHex; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zSql[500]; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB HEX", 0); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zHex = argv[2]; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=j=0; i<sizeof(zSql) && zHex[j]; i++, j++){ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zHex[j]=='%' && zHex[j+2] && zHex[j+2] ){ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[i] = (testHexToInt(zHex[j+1])<<4) + testHexToInt(zHex[j+2]); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j += 2; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[i] = zHex[j]; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[i] = 0; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringInit(&str); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_exec(db, zSql, exec_printf_cb, &str, &zErr); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", rc); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, rc==SQLITE_OK ? Tcl_DStringValue(&str) : zErr); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringFree(&str); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErr ) sqlite3_free(zErr); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: db_enter DB 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** db_leave DB 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Enter or leave the mutex on a database connection. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db_enter( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB", 0); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db_leave( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB", 0); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_exec DB SQL 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the sqlite3_exec interface using the open database DB 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_exec( 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DString str; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zSql; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB SQL", 0); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringInit(&str); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = sqlite3_mprintf("%s", argv[2]); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=j=0; zSql[i];){ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zSql[i]=='%' ){ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j++] = (testHexToInt(zSql[i+1])<<4) + testHexToInt(zSql[i+2]); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += 3; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j++] = zSql[i++]; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j] = 0; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_exec(db, zSql, exec_printf_cb, &str, &zErr); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zSql); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", rc); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, rc==SQLITE_OK ? Tcl_DStringValue(&str) : zErr); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringFree(&str); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErr ) sqlite3_free(zErr); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_exec_nr DB SQL 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the sqlite3_exec interface using the open database DB. Discard 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** all results 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_exec_nr( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB SQL", 0); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_exec(db, argv[2], 0, 0, &zErr); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_z_test SEPARATOR ARG0 ARG1 ... 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the %z format of sqlite_mprintf(). Use multiple mprintf() calls to 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** concatenate arg0 through argn using separator as the separator. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the result. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_mprintf_z( 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zResult = 0; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<argc && (i==2 || zResult); i++){ 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zResult = sqlite3_mprintf("%z%s%s", zResult, argv[1], argv[i]); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zResult, 0); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zResult); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_n_test STRING 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the %n format of sqlite_mprintf(). Return the length of the 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** input string. 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_mprintf_n( 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zStr; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = 0; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zStr = sqlite3_mprintf("%s%n", argv[1], &n); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zStr); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(n)); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_snprintf_int SIZE FORMAT INT 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the of sqlite3_snprintf() routine. SIZE is the size of the 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** output buffer in bytes. The maximum size is 100. FORMAT is the 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** format string. INT is a single integer argument. The FORMAT 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string must require no more than this one integer argument. If 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** You pass in a format string that requires more than one argument, 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** bad things will happen. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_snprintf_int( 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zStr[100]; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = atoi(argv[1]); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zFormat = argv[2]; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a1 = atoi(argv[3]); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n>sizeof(zStr) ) n = sizeof(zStr); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(sizeof(zStr), zStr, "abcdefghijklmnopqrstuvwxyz"); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(n, zStr, zFormat, a1); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zStr, 0); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_GET_TABLE 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_get_table_printf DB FORMAT STRING ?--no-counts? 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the sqlite3_get_table_printf() interface using the open database 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** DB. The SQL is the string FORMAT. The format string should contain 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** one %s or %q. STRING is the value inserted into %s or %q. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_get_table_printf( 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DString str; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nRow, nCol; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **aResult; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zSql; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resCount = -1; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc==5 ){ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[4], &resCount) ) return TCL_ERROR; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=4 && argc!=5 ){ 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB FORMAT STRING ?COUNT?", 0); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DStringInit(&str); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = sqlite3_mprintf(argv[2],argv[3]); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc==5 ){ 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_get_table(db, zSql, &aResult, 0, 0, &zErr); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_get_table(db, zSql, &aResult, &nRow, &nCol, &zErr); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resCount = (nRow+1)*nCol; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zSql); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", rc); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc==4 ){ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", nRow); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", nCol); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zBuf); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<resCount; i++){ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, aResult[i] ? aResult[i] : "NULL"); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendElement(interp, zErr); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free_table(aResult); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErr ) sqlite3_free(zErr); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_GET_TABLE */ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_last_insert_rowid DB 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Returns the integer ROWID of the most recent insert. 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_last_rowid( 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " DB\"", 0); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%lld", sqlite3_last_insert_rowid(db)); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_key DB KEY 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the codec key. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_key( 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zKey; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nKey; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME\"", 0); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zKey = argv[2]; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nKey = strlen(zKey); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_HAS_CODEC 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_key(db, zKey, nKey); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_rekey DB KEY 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Change the codec key. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_rekey( 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zKey; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nKey; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME\"", 0); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zKey = argv[2]; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nKey = strlen(zKey); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_HAS_CODEC 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_rekey(db, zKey, nKey); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_close DB 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Closes the database opened by sqlite3_open. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite_test_close( 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME\"", 0); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_close(db); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the x_coalesce() function. 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the first argument non-NULL argument. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void t1_ifnullFunc( 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<argc; i++){ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = sqlite3_value_bytes(argv[i]); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(context, (char*)sqlite3_value_text(argv[i]), 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n, SQLITE_TRANSIENT); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These are test functions. hex8() interprets its argument as 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UTF8 and returns a hex encoding. hex16le() interprets its argument 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as UTF16le and returns a hex encoding. 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void hex8Func(sqlite3_context *p, int argc, sqlite3_value **argv){ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char *z; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[200]; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_value_text(argv[0]); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(zBuf)/2 - 2 && z[i]; i++){ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(&zBuf[i*2], "%02x", z[i]&0xff); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBuf[i*2] = 0; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(p, (char*)zBuf, -1, SQLITE_TRANSIENT); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void hex16Func(sqlite3_context *p, int argc, sqlite3_value **argv){ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned short int *z; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[400]; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_value_text16(argv[0]); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(zBuf)/4 - 4 && z[i]; i++){ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(&zBuf[i*4], "%04x", z[i]&0xff); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBuf[i*4] = 0; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(p, (char*)zBuf, -1, SQLITE_TRANSIENT); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A structure into which to accumulate text. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct dstr { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nAlloc; /* Space allocated */ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nUsed; /* Space used */ 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; /* The space */ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append text to a dstr 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void dstrAppend(struct dstr *p, const char *z, int divider){ 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = strlen(z); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nUsed + n + 2 > p->nAlloc ){ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zNew; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nAlloc = p->nAlloc*2 + n + 200; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNew = sqlite3_realloc(p->z, p->nAlloc); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zNew==0 ){ 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(p->z); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(p, 0, sizeof(*p)); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->z = zNew; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( divider && p->nUsed>0 ){ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->z[p->nUsed++] = divider; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&p->z[p->nUsed], z, n+1); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nUsed += n; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoked for each callback from sqlite3ExecFunc 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int execFuncCallback(void *pData, int argc, char **argv, char **NotUsed){ 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct dstr *p = (struct dstr*)pData; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<argc; i++){ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argv[i]==0 ){ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dstrAppend(p, "NULL", ' '); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dstrAppend(p, argv[i], ' '); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the x_sqlite_exec() function. This function takes 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a single argument and attempts to execute that argument as SQL code. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is illegal and should set the SQLITE_MISUSE flag on the database. 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2004-Jan-07: We have changed this to make it legal to call sqlite3_exec() 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from within a function call. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine simulates the effect of having two threads attempt to 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use the same database at the same time. 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3ExecFunc( 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct dstr x; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&x, 0, sizeof(x)); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void)sqlite3_exec((sqlite3*)sqlite3_user_data(context), 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)sqlite3_value_text(argv[0]), 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execFuncCallback, &x, 0); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(context, x.z, x.nUsed, SQLITE_TRANSIENT); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(x.z); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of tkt2213func(), a scalar function that takes exactly 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** one argument. It has two interesting features: 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * It calls sqlite3_value_text() 3 times on the argument sqlite3_value*. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the three pointers returned are not the same an SQL error is raised. 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Otherwise it returns a copy of the text representation of its 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument in such a way as the VDBE representation is a Mem* cell 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with the MEM_Term flag clear. 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Ticket #2213 can therefore be tested by evaluating the following 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQL expression: 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tkt2213func(tkt2213func('a string')); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void tkt2213Function( 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nText; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char const *zText1; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char const *zText2; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char const *zText3; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nText = sqlite3_value_bytes(argv[0]); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zText1 = sqlite3_value_text(argv[0]); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zText2 = sqlite3_value_text(argv[0]); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zText3 = sqlite3_value_text(argv[0]); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zText1!=zText2 || zText2!=zText3 ){ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error(context, "tkt2213 is not fixed", -1); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCopy = (char *)sqlite3_malloc(nText); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(zCopy, zText1, nText); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(context, zCopy, nText, sqlite3_free); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following SQL function takes 4 arguments. The 2nd and 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4th argument must be one of these strings: 'text', 'text16', 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or 'blob' corresponding to API functions 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_text() 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_text16() 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_blob() 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The third argument is a string, either 'bytes' or 'bytes16' or 'noop', 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** corresponding to APIs: 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_bytes() 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_bytes16() 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** noop 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The APIs designated by the 2nd through 4th arguments are applied 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the first argument in order. If the pointers returned by the 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** second and fourth are different, this routine returns 1. Otherwise, 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this routine returns 0. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used to test to see when returned pointers from 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the _text(), _text16() and _blob() APIs become invalidated. 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ptrChngFunction( 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *p1, *p2; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zCmd; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=4 ) return; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCmd = (const char*)sqlite3_value_text(argv[1]); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zCmd==0 ) return; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(zCmd,"text")==0 ){ 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1 = (const void*)sqlite3_value_text(argv[0]); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "text16")==0 ){ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1 = (const void*)sqlite3_value_text16(argv[0]); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "blob")==0 ){ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1 = (const void*)sqlite3_value_blob(argv[0]); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCmd = (const char*)sqlite3_value_text(argv[2]); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zCmd==0 ) return; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(zCmd,"bytes")==0 ){ 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_bytes(argv[0]); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "bytes16")==0 ){ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_bytes16(argv[0]); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "noop")==0 ){ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* do nothing */ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCmd = (const char*)sqlite3_value_text(argv[3]); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zCmd==0 ) return; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(zCmd,"text")==0 ){ 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2 = (const void*)sqlite3_value_text(argv[0]); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "text16")==0 ){ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2 = (const void*)sqlite3_value_text16(argv[0]); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(zCmd, "blob")==0 ){ 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2 = (const void*)sqlite3_value_blob(argv[0]); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int(context, p1!=p2); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_test_create_function DB 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call the sqlite3_create_function API on the given database in order 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to create a function named "x_coalesce". This function does the same thing 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as the "coalesce" function. This function also registers an SQL function 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** named "x_sqlite_exec" that invokes sqlite3_exec(). Invoking sqlite3_exec() 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in this way is illegal recursion and should raise an SQLITE_MISUSE error. 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The effect is similar to trying to use the same database connection from 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** two threads at the same time. 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The original motivation for this routine was to be able to call the 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_create_function function while a query is in progress in order 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to test the SQLITE_MISUSE detection logic. 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_create_function( 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB\"", 0); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "x_coalesce", -1, SQLITE_ANY, 0, 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1_ifnullFunc, 0, 0); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "hex8", 1, SQLITE_ANY, 0, 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hex8Func, 0, 0); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "hex16", 1, SQLITE_ANY, 0, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hex16Func, 0, 0); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "tkt2213func", 1, SQLITE_ANY, 0, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tkt2213Function, 0, 0); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "pointer_change", 4, SQLITE_ANY, 0, 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptrChngFunction, 0, 0); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Use the sqlite3_create_function16() API here. Mainly for fun, but also 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** because it is not tested anywhere else. */ 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zUtf16; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(db); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, -1, "x_sqlite_exec", SQLITE_UTF8, SQLITE_STATIC); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zUtf16 = sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_NOMEM; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function16(db, zUtf16, 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, SQLITE_UTF16, db, sqlite3ExecFunc, 0, 0); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routines to implement the x_count() aggregate function. 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x_count() counts the number of non-null arguments. But there are 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** some twists for testing purposes. 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the argument to x_count() is 40 then a UTF-8 error is reported 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the step function. If x_count(41) is seen, then a UTF-16 error 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is reported on the step function. If the total count is 42, then 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a UTF-8 error is reported on the finalize function. 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct t1CountCtx t1CountCtx; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct t1CountCtx { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void t1CountStep( 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1CountCtx *p; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = sqlite3_aggregate_context(context, sizeof(*p)); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0]) ) && p ){ 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->n++; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc>0 ){ 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int v = sqlite3_value_int(argv[0]); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==40 ){ 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error(context, "value of 40 handed to x_count", -1); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( v==41 ){ 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char zUtf16ErrMsg[] = { 0, 0x61, 0, 0x62, 0, 0x63, 0, 0, 0}; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error16(context, &zUtf16ErrMsg[1-SQLITE_BIGENDIAN], -1); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void t1CountFinalize(sqlite3_context *context){ 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1CountCtx *p; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = sqlite3_aggregate_context(context, sizeof(*p)); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->n==42 ){ 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error(context, "x_count totals to 42", -1); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int(context, p ? p->n : 0); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void legacyCountStep( 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *context, 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* no-op */ 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void legacyCountFinalize(sqlite3_context *context){ 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int(context, sqlite3_aggregate_count(context)); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_create_aggregate DB 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call the sqlite3_create_function API on the given database in order 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to create a function named "x_count". This function is similar 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the built-in count() function, with a few special quirks 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for testing the sqlite3_result_error() APIs. 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The original motivation for this routine was to be able to call the 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_create_aggregate function while a query is in progress in order 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to test the SQLITE_MISUSE detection logic. See misuse.test. 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine was later extended to test the use of sqlite3_result_error() 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within aggregate functions. 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Later: It is now also extended to register the aggregate function 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "legacy_count()" with the supplied database handle. This is used 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to test the deprecated sqlite3_aggregate_count() API. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_create_aggregate( 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FILENAME\"", 0); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "x_count", 0, SQLITE_UTF8, 0, 0, 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1CountStep,t1CountFinalize); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "x_count", 1, SQLITE_UTF8, 0, 0, 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1CountStep,t1CountFinalize); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, "legacy_count", 0, SQLITE_ANY, 0, 0, 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) legacyCountStep, legacyCountFinalize 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: printf TEXT 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Send output to printf. Use this rather than puts to merge the output 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the correct sequence with debugging printfs inserted into C code. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Puts uses a separate buffer and debugging statements will be out of 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence if it is used. 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_printf( 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " TEXT\"", 0); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s\n", argv[1]); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_int FORMAT INTEGER INTEGER INTEGER 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with three integer arguments 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_int( 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a[3], i; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT INT INT INT\"", 0); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<5; i++){ 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], a[0], a[1], a[2]); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_int64 FORMAT INTEGER INTEGER INTEGER 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with three 64-bit integer arguments 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_int64( 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_int64 a[3]; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT INT INT INT\"", 0); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<5; i++){ 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3Atoi64(argv[i], &a[i-2], 1000000, SQLITE_UTF8) ){ 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "argument is not a valid 64-bit integer", 0); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], a[0], a[1], a[2]); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_long FORMAT INTEGER INTEGER INTEGER 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with three long integer arguments. This might be the 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** same as sqlite3_mprintf_int or sqlite3_mprintf_int64, depending on 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** platform. 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_long( 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long int a[3]; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int b[3]; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT INT INT INT\"", 0); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<5; i++){ 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[i], &b[i-2]) ) return TCL_ERROR; 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a[i-2] = (long int)b[i-2]; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a[i-2] &= (((u64)1)<<(sizeof(int)*8))-1; 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], a[0], a[1], a[2]); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_str FORMAT INTEGER INTEGER STRING 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with two integer arguments and one string argument 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_str( 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a[3], i; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc<4 || argc>5 ){ 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT INT INT ?STRING?\"", 0); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<4; i++){ 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], a[0], a[1], argc>4 ? argv[4] : NULL); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_snprintf_str INTEGER FORMAT INTEGER INTEGER STRING 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with two integer arguments and one string argument 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_snprintf_str( 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a[3], i; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc<5 || argc>6 ){ 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " INT FORMAT INT INT ?STRING?\"", 0); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n<0 ){ 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "N must be non-negative", 0); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=3; i<5; i++){ 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[i], &a[i-3]) ) return TCL_ERROR; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_malloc( n+1 ); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(n, z, argv[2], a[0], a[1], argc>4 ? argv[5] : NULL); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_double FORMAT INTEGER INTEGER DOUBLE 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with two integer arguments and one double argument 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_double( 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a[3], i; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double r; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT INT INT DOUBLE\"", 0); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<4; i++){ 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[i], &a[i-2]) ) return TCL_ERROR; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetDouble(interp, argv[4], &r) ) return TCL_ERROR; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], a[0], a[1], r); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_scaled FORMAT DOUBLE DOUBLE 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with a single double argument which is the product of the 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** two arguments given above. This is used to generate overflow and underflow 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** doubles to test that they are converted properly. 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_scaled( 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double r[2]; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=4 ){ 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT DOUBLE DOUBLE\"", 0); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=2; i<4; i++){ 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetDouble(interp, argv[i], &r[i-2]) ) return TCL_ERROR; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], r[0]*r[1]); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_stronly FORMAT STRING 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with a single double argument which is the product of the 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** two arguments given above. This is used to generate overflow and underflow 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** doubles to test that they are converted properly. 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_stronly( 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT STRING\"", 0); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], argv[2]); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_mprintf_hexdouble FORMAT HEX 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call mprintf with a single double argument which is derived from the 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** hexadecimal encoding of an IEEE double. 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3_mprintf_hexdouble( 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double r; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int x1, x2; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_uint64 d; 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " FORMAT STRING\"", 0); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sscanf(argv[2], "%08x%08x", &x2, &x1)!=2 ){ 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "2nd argument should be 16-characters of hex", 0); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = x2; 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = (d<<32) + x1; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&r, &d, sizeof(r)); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3_mprintf(argv[1], r); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, z, 0); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(z); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_enable_shared_cache ?BOOLEAN? 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_SHARED_CACHE) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_enable_shared( 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enable; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 && objc!=1 ){ 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "?BOOLEAN?"); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = sqlite3GlobalConfig.sharedCacheEnabled; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==2 ){ 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBooleanFromObj(interp, objv[1], &enable) ){ 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_enable_shared_cache(enable); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3ErrStr(rc), TCL_STATIC); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(ret)); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_extended_result_codes DB BOOLEAN 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_extended_result_codes( 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enable; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB BOOLEAN"); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBooleanFromObj(interp, objv[2], &enable) ) return TCL_ERROR; 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_extended_result_codes(db, enable); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_libversion_number 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_libversion_number( 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_libversion_number())); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_table_column_metadata DB dbname tblname colname 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_table_column_metadata( 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDb; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zTbl; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zCol; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pRet; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDatatype; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zCollseq; 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notnull; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int primarykey; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int autoincrement; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 ){ 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB dbname tblname colname"); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[2]); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTbl = Tcl_GetString(objv[3]); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCol = Tcl_GetString(objv[4]); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strlen(zDb)==0 ) zDb = 0; 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_table_column_metadata(db, zDb, zTbl, zCol, 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &zDatatype, &zCollseq, ¬null, &primarykey, &autoincrement); 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3_errmsg(db), 0); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = Tcl_NewObj(); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zDatatype, -1)); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zCollseq, -1)); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(notnull)); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(primarykey)); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(autoincrement)); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pRet); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INCRBLOB 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int blobHandleFromObj( 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pObj, 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob **ppBlob 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = Tcl_GetStringFromObj(pObj, &n); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n==0 ){ 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppBlob = 0; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notUsed; 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Channel channel; 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData instanceData; 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel = Tcl_GetChannel(interp, z, ¬Used); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !channel ) return TCL_ERROR; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Flush(channel); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Seek(channel, 0, SEEK_SET); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instanceData = Tcl_GetChannelInstanceData(channel); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppBlob = *((sqlite3_blob **)instanceData); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_blob_bytes CHANNEL 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_blob_bytes( 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob *pBlob; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL"); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( blobHandleFromObj(interp, objv[1], &pBlob) ) return TCL_ERROR; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte = sqlite3_blob_bytes(pBlob); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(nByte)); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_blob_close CHANNEL 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_blob_close( 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob *pBlob; 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL"); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( blobHandleFromObj(interp, objv[1], &pBlob) ) return TCL_ERROR; 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_close(pBlob); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_blob_read CHANNEL OFFSET N 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command is used to test the sqlite3_blob_read() in ways that 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the Tcl channel interface does not. The first argument should 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be the name of a valid channel created by the [incrblob] method 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a database handle. This function calls sqlite3_blob_read() 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to read N bytes from offset OFFSET from the underlying SQLite 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** blob handle. 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** On success, a byte-array object containing the read data is 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returned. On failure, the interpreter result is set to the 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** text representation of the returned error code (i.e. "SQLITE_NOMEM") 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and a Tcl exception is thrown. 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_blob_read( 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob *pBlob; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iOffset; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *zBuf = 0; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL OFFSET N"); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( blobHandleFromObj(interp, objv[1], &pBlob) ) return TCL_ERROR; 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &iOffset) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || TCL_OK!=Tcl_GetIntFromObj(interp, objv[3], &nByte) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nByte>0 ){ 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBuf = (unsigned char *)Tcl_Alloc(nByte); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_blob_read(pBlob, zBuf, nByte, iOffset); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(zBuf, nByte)); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Free((char *)zBuf); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (rc==SQLITE_OK ? TCL_OK : TCL_ERROR); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_blob_write CHANNEL OFFSET DATA ?NDATA? 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command is used to test the sqlite3_blob_write() in ways that 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the Tcl channel interface does not. The first argument should 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be the name of a valid channel created by the [incrblob] method 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a database handle. This function calls sqlite3_blob_write() 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to write the DATA byte-array to the underlying SQLite blob handle. 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** at offset OFFSET. 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** On success, an empty string is returned. On failure, the interpreter 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result is set to the text representation of the returned error code 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (i.e. "SQLITE_NOMEM") and a Tcl exception is thrown. 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_blob_write( 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob *pBlob; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iOffset; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *zBuf; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nBuf; 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 && objc!=5 ){ 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL OFFSET DATA ?NDATA?"); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( blobHandleFromObj(interp, objv[1], &pBlob) ) return TCL_ERROR; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &iOffset) ){ 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBuf = Tcl_GetByteArrayFromObj(objv[3], &nBuf); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==5 && Tcl_GetIntFromObj(interp, objv[4], &nBuf) ){ 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_blob_write(pBlob, zBuf, nBuf, iOffset); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (rc==SQLITE_OK ? TCL_OK : TCL_ERROR); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_blob_reopen( 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WideInt iRowid; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob *pBlob; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL ROWID"); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( blobHandleFromObj(interp, objv[1], &pBlob) ) return TCL_ERROR; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetWideIntFromObj(interp, objv[2], &iRowid) ) return TCL_ERROR; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_blob_reopen(pBlob, iRowid); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (rc==SQLITE_OK ? TCL_OK : TCL_ERROR); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_create_collation_v2 DB-HANDLE NAME CMP-PROC DEL-PROC 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This Tcl proc is used for testing the experimental 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_create_collation_v2() interface. 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestCollationX { 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp; 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pCmp; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pDel; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct TestCollationX TestCollationX; 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void testCreateCollationDel(void *pCtx){ 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCollationX *p = (TestCollationX *)pCtx; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = Tcl_EvalObjEx(p->interp, p->pDel, TCL_EVAL_DIRECT|TCL_EVAL_GLOBAL); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=TCL_OK ){ 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_BackgroundError(p->interp); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(p->pCmp); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(p->pDel); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free((void *)p); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testCreateCollationCmp( 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *pCtx, 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nLeft, 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zLeft, 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nRight, 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zRight 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCollationX *p = (TestCollationX *)pCtx; 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pScript = Tcl_DuplicateObj(p->pCmp); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRes = 0; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pScript); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj((char *)zLeft, nLeft)); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj((char *)zRight,nRight)); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_EvalObjEx(p->interp, pScript, TCL_EVAL_DIRECT|TCL_EVAL_GLOBAL) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || TCL_OK!=Tcl_GetIntFromObj(p->interp, Tcl_GetObjResult(p->interp), &iRes) 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_BackgroundError(p->interp); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pScript); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iRes; 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_create_collation_v2( 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCollationX *p; 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 ){ 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB-HANDLE NAME CMP-PROC DEL-PROC"); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = (TestCollationX *)sqlite3_malloc(sizeof(TestCollationX)); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pCmp = objv[3]; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pDel = objv[4]; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->interp = interp; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(p->pCmp); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(p->pDel); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation_v2(db, Tcl_GetString(objv[2]), 16, 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *)p, testCreateCollationCmp, testCreateCollationDel 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_MISUSE ){ 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "sqlite3_create_collate_v2() failed to detect " 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "an invalid encoding", (char*)0); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation_v2(db, Tcl_GetString(objv[2]), SQLITE_UTF8, 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *)p, testCreateCollationCmp, testCreateCollationDel 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** USAGE: sqlite3_create_function_v2 DB NAME NARG ENC ?SWITCHES? 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Available switches are: 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** -func SCRIPT 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** -step SCRIPT 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** -final SCRIPT 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** -destroy SCRIPT 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct CreateFunctionV2 CreateFunctionV2; 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CreateFunctionV2 { 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp; 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pFunc; /* Script for function invocation */ 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pStep; /* Script for agg. step invocation */ 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pFinal; /* Script for agg. finalization invocation */ 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pDestroy; /* Destructor script */ 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cf2Func(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cf2Step(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cf2Final(sqlite3_context *ctx){ 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cf2Destroy(void *pUser){ 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFunctionV2 *p = (CreateFunctionV2 *)pUser; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->interp && p->pDestroy ){ 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = Tcl_EvalObjEx(p->interp, p->pDestroy, 0); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=TCL_OK ) Tcl_BackgroundError(p->interp); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFunc ) Tcl_DecrRefCount(p->pFunc); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pStep ) Tcl_DecrRefCount(p->pStep); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFinal ) Tcl_DecrRefCount(p->pFinal); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pDestroy ) Tcl_DecrRefCount(p->pDestroy); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(p); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_create_function_v2( 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The invoking TCL interpreter */ 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zFunc; 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nArg; 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enc; 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFunctionV2 *p; 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct EncTable { 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zEnc; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enc; 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aEnc[] = { 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"utf8", SQLITE_UTF8 }, 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"utf16", SQLITE_UTF16 }, 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"utf16le", SQLITE_UTF16LE }, 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"utf16be", SQLITE_UTF16BE }, 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"any", SQLITE_ANY }, 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"0", 0 } 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc<5 || (objc%2)==0 ){ 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB NAME NARG ENC SWITCHES..."); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zFunc = Tcl_GetString(objv[2]); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &nArg) ) return TCL_ERROR; 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIndexFromObjStruct(interp, objv[4], aEnc, sizeof(aEnc[0]), 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "encoding", 0, &enc) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enc = aEnc[enc].enc; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = sqlite3_malloc(sizeof(CreateFunctionV2)); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p ); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(p, 0, sizeof(CreateFunctionV2)); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->interp = interp; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=5; i<objc; i+=2){ 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSwitch; 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *azSwitch[] = {"-func", "-step", "-final", "-destroy", 0}; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIndexFromObj(interp, objv[i], azSwitch, "switch", 0, &iSwitch) ){ 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(p); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( iSwitch ){ 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: p->pFunc = objv[i+1]; break; 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: p->pStep = objv[i+1]; break; 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: p->pFinal = objv[i+1]; break; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: p->pDestroy = objv[i+1]; break; 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFunc ) p->pFunc = Tcl_DuplicateObj(p->pFunc); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pStep ) p->pStep = Tcl_DuplicateObj(p->pStep); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFinal ) p->pFinal = Tcl_DuplicateObj(p->pFinal); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pDestroy ) p->pDestroy = Tcl_DuplicateObj(p->pDestroy); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFunc ) Tcl_IncrRefCount(p->pFunc); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pStep ) Tcl_IncrRefCount(p->pStep); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pFinal ) Tcl_IncrRefCount(p->pFinal); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pDestroy ) Tcl_IncrRefCount(p->pDestroy); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function_v2(db, zFunc, nArg, enc, (void *)p, 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (p->pFunc ? cf2Func : 0), 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (p->pStep ? cf2Step : 0), 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (p->pFinal ? cf2Final : 0), 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cf2Destroy 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ResetResult(interp); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_load_extension DB-HANDLE FILE ?PROC? 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_load_extension( 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo cmdInfo; 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb; 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zFile; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zProc = 0; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr = 0; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 && objc!=3 ){ 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB-HANDLE FILE ?PROC?"); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[1]); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zFile = Tcl_GetString(objv[2]); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==4 ){ 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zProc = Tcl_GetString(objv[3]); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Extract the C database handle from the Tcl command name */ 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !Tcl_GetCommandInfo(interp, zDb, &cmdInfo) ){ 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "command not found: ", zDb, (char*)0); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = ((struct SqliteDb*)cmdInfo.objClientData)->db; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(db); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Call the underlying C function. If an error occurs, set rc to 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TCL_ERROR and load any error string into the interpreter. If no 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** error occurs, set rc to TCL_OK. 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_LOAD_EXTENSION 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_ERROR; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErr = sqlite3_mprintf("this build omits sqlite3_load_extension()"); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_load_extension(db, zFile, zProc, &zErr); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, zErr ? zErr : "", TCL_VOLATILE); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = TCL_ERROR; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = TCL_OK; 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zErr); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_enable_load_extension DB-HANDLE ONOFF 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_enable_load( 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Not used */ 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo cmdInfo; 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb; 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onoff; 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB-HANDLE ONOFF"); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[1]); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Extract the C database handle from the Tcl command name */ 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !Tcl_GetCommandInfo(interp, zDb, &cmdInfo) ){ 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "command not found: ", zDb, (char*)0); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = ((struct SqliteDb*)cmdInfo.objClientData)->db; 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(db); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Get the onoff parameter */ 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBooleanFromObj(interp, objv[2], &onoff) ){ 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_LOAD_EXTENSION 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "this build omits sqlite3_load_extension()"); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_enable_load_extension(db, onoff); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_abort 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Shutdown the process immediately. This is not a clean shutdown. 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command is used to test the recoverability of a database in 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the event of a program crash. 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite_abort( 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We do this, otherwise the test will halt with a popup message 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that we have to click away before the test will continue. 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _set_abort_behavior( 0, _CALL_REPORTFAULT ); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(255); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( interp==0 ); /* This will always fail */ 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routine is a user-defined SQL function whose purpose 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is to test the sqlite_set_result() API. 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void testFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( argc>=2 ){ 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zArg0 = (char*)sqlite3_value_text(argv[0]); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zArg0 ){ 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(zArg0, "int") ){ 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int(context, sqlite3_value_int(argv[1])); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zArg0,"int64")==0 ){ 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int64(context, sqlite3_value_int64(argv[1])); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zArg0,"string")==0 ){ 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(context, (char*)sqlite3_value_text(argv[1]), -1, 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_TRANSIENT); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zArg0,"double")==0 ){ 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_double(context, sqlite3_value_double(argv[1])); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zArg0,"null")==0 ){ 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_null(context); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zArg0,"value")==0 ){ 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_value(context, argv[sqlite3_value_int(argv[1])]); 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error_out; 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error_out; 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argc -= 2; 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv += 2; 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error_out: 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error(context,"first argument should be one of: " 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "int int64 string double null value", -1); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_register_test_function DB NAME 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register the test SQL function on the database DB under the name NAME. 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_register_func( 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB FUNCTION-NAME", 0); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, argv[2], -1, SQLITE_UTF8, 0, 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testFunc, 0, 0); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=0 ){ 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_finalize STMT 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Finalize a statement handle. 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_finalize( 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = 0; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = StmtToDb(pStmt); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_finalize(pStmt); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db && sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_stmt_status STMT CODE RESETFLAG 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Get the value of a status counter from a statement. 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stmt_status( 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iValue; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, op, resetFlag; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOpName; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op; 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aOp[] = { 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_STMTSTATUS_FULLSCAN_STEP", SQLITE_STMTSTATUS_FULLSCAN_STEP }, 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_STMTSTATUS_SORT", SQLITE_STMTSTATUS_SORT }, 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_STMTSTATUS_AUTOINDEX", SQLITE_STMTSTATUS_AUTOINDEX }, 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT PARAMETER RESETFLAG"); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOpName = Tcl_GetString(objv[2]); 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<ArraySize(aOp); i++){ 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(aOp[i].zName, zOpName)==0 ){ 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = aOp[i].op; 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=ArraySize(aOp) ){ 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &op) ) return TCL_ERROR; 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBooleanFromObj(interp, objv[3], &resetFlag) ) return TCL_ERROR; 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iValue = sqlite3_stmt_status(pStmt, op, resetFlag); 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(iValue)); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_next_stmt DB STMT 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the next statment in sequence after STMT. 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_next_stmt( 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = 0; 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB STMT", 0); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[2]), &pStmt) ) return TCL_ERROR; 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pStmt = sqlite3_next_stmt(db, pStmt); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_stmt_readonly STMT 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if STMT is a NULL pointer or a pointer to a statement 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is guaranteed to leave the database unmodified. 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stmt_readonly( 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT", 0); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_stmt_readonly(pStmt); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(rc)); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_reset STMT 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reset a statement handle. 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_reset( 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_reset(pStmt); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt && sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ){ 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_expired STMT 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if a recompilation of the statement is recommended. 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_expired( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(sqlite3_expired(pStmt))); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_transfer_bindings FROMSTMT TOSTMT 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transfer all bindings from FROMSTMT over to TOSTMT 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_transfer_bind( 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt1, *pStmt2; 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " FROM-STMT TO-STMT", 0); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt1)) return TCL_ERROR; 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[2]), &pStmt2)) return TCL_ERROR; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewIntObj(sqlite3_transfer_bindings(pStmt1,pStmt2))); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_changes DB 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of changes made to the database by the last SQL 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** execution. 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_changes( 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB", 0); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_changes(db))); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is the "static_bind_value" that variables are bound to when 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the FLAG option of sqlite3_bind is "static" 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *sqlite_static_bind_value = 0; 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite_static_bind_nbyte = 0; 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind VM IDX VALUE FLAGS 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sets the value of the IDX-th occurance of "?" in the original SQL 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string. VALUE is the new value. If FLAGS=="null" then VALUE is 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ignored and the value is set to NULL. If FLAGS=="static" then 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value is set to the value of a static variable named 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "sqlite_static_bind_value". If FLAGS=="normal" then a copy 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the VALUE is made. If FLAGS=="blob10" then a VALUE is ignored 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an a 10-byte blob "abc\000xyz\000pq" is inserted. 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind( 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=5 ){ 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " VM IDX VALUE (null|static|normal)\"", 0); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, argv[1], &pStmt) ) return TCL_ERROR; 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], &idx) ) return TCL_ERROR; 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(argv[4],"null")==0 ){ 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_null(pStmt, idx); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[4],"static")==0 ){ 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text(pStmt, idx, sqlite_static_bind_value, -1, 0); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[4],"static-nbytes")==0 ){ 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text(pStmt, idx, sqlite_static_bind_value, 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_static_bind_nbyte, 0); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[4],"normal")==0 ){ 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text(pStmt, idx, argv[3], -1, SQLITE_TRANSIENT); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[4],"blob10")==0 ){ 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text(pStmt, idx, "abc\000xyz\000pq", 10, SQLITE_STATIC); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "4th argument should be " 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"null\" or \"static\" or \"normal\"", 0); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "(%d) ", rc); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, sqlite3ErrStr(rc), 0); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: add_test_collate <db ptr> <utf8> <utf16le> <utf16be> 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used to test that SQLite selects the correct collation 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence callback when multiple versions (for different text encodings) 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are available. 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Calling this routine registers the collation sequence "test_collate" 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with database handle <db>. The second argument must be a list of three 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** boolean values. If the first is true, then a version of test_collate is 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registered for UTF-8, if the second is true, a version is registered for 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UTF-16le, if the third is true, a UTF-16be version is available. 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Previous versions of test_collate are deleted. 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The collation sequence test_collate is implemented by calling the 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** following TCL script: 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "test_collate <enc> <lhs> <rhs>" 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The <lhs> and <rhs> are the two values being compared, encoded in UTF-8. 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The <enc> parameter is the encoding of the collation function that 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLite selected to call. The TCL test script implements the 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "test_collate" proc. 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that this will only work with one intepreter at a time, as the 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interp pointer to use when evaluating the TCL script is stored in 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pTestCollateInterp. 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Tcl_Interp* pTestCollateInterp; 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_collate_func( 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *pCtx, 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nA, const void *zA, 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nB, const void *zB 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *i = pTestCollateInterp; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int encin = SQLITE_PTR_TO_INT(pCtx); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pX; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pX = Tcl_NewStringObj("test_collate", -1); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pX); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( encin ){ 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_UTF8: 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-8",-1)); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_UTF16LE: 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-16LE",-1)); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_UTF16BE: 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-16BE",-1)); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(0); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BeginBenignMalloc(); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(0); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pVal ){ 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, nA, zA, encin, SQLITE_STATIC); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3_value_bytes(pVal); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(i,pX, 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj((char*)sqlite3_value_text(pVal),n)); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, nB, zB, encin, SQLITE_STATIC); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3_value_bytes(pVal); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(i,pX, 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj((char*)sqlite3_value_text(pVal),n)); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3EndBenignMalloc(); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalObjEx(i, pX, 0); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pX); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetIntFromObj(i, Tcl_GetObjResult(i), &res); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res; 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_collate( 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val; 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 ) goto bad_args; 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTestCollateInterp = interp; 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation(db, "test_collate", SQLITE_UTF8, 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *)SQLITE_UTF8, val?test_collate_func:0); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zUtf16; 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[3], &val) ) return TCL_ERROR; 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation(db, "test_collate", SQLITE_UTF16LE, 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *)SQLITE_UTF16LE, val?test_collate_func:0); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[4], &val) ) return TCL_ERROR; 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_iMallocFail>0 ){ 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_iMallocFail++; 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(db); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, -1, "test_collate", SQLITE_UTF8, SQLITE_STATIC); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zUtf16 = sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_NOMEM; 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation16(db, zUtf16, SQLITE_UTF16BE, 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *)SQLITE_UTF16BE, val?test_collate_func:0); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bad_args: 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " <DB> <utf8> <utf16le> <utf16be>", 0); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When the collation needed callback is invoked, record the name of 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the requested collating function here. The recorded name is linked 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to a TCL variable and used to make sure that the requested collation 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name is correct. 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char zNeededCollation[200]; 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *pzNeededCollation = zNeededCollation; 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Called when a collating sequence is needed. Registered using 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_collation_needed16(). 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_collate_needed_cb( 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *pCtx, 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eTextRep, 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *pName 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int enc = ENC(db); 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(z = (char*)pName, i=0; *z || z[1]; z++){ 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *z ) zNeededCollation[i++] = *z; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNeededCollation[i] = 0; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation( 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db, "test_collate", ENC(db), SQLITE_INT_TO_PTR(enc), test_collate_func); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: add_test_collate_needed DB 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_collate_needed( 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ) goto bad_args; 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_collation_needed16(db, 0, test_collate_needed_cb); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNeededCollation[0] = 0; 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bad_args: 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB"); 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: add_alignment_test_collations DB 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add two new collating sequences to the database DB 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** utf16_aligned 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** utf16_unaligned 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Both collating sequences use the same sort order as BINARY. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The only difference is that the utf16_aligned collating 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence is declared with the SQLITE_UTF16_ALIGNED flag. 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Both collating functions increment the unaligned utf16 counter 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** whenever they see a string that begins on an odd byte boundary. 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int unaligned_string_counter = 0; 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int alignmentCollFunc( 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nKey1, const void *pKey1, 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nKey2, const void *pKey2 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc, n; 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = nKey1<nKey2 ? nKey1 : nKey2; 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nKey1>0 && 1==(1&(SQLITE_PTR_TO_INT(pKey1))) ) unaligned_string_counter++; 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nKey2>0 && 1==(1&(SQLITE_PTR_TO_INT(pKey2))) ) unaligned_string_counter++; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = memcmp(pKey1, pKey2, n); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==0 ){ 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = nKey1 - nKey2; 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int add_alignment_test_collations( 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc>=2 ){ 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation(db, "utf16_unaligned", SQLITE_UTF16, 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, alignmentCollFunc); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation(db, "utf16_aligned", SQLITE_UTF16_ALIGNED, 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, alignmentCollFunc); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_UTF16) */ 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: add_test_function <db ptr> <utf8> <utf16le> <utf16be> 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used to test that SQLite selects the correct user 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function callback when multiple versions (for different text encodings) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are available. 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Calling this routine registers up to three versions of the user function 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "test_function" with database handle <db>. If the second argument is 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true, then a version of test_function is registered for UTF-8, if the 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** third is true, a version is registered for UTF-16le, if the fourth is 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true, a UTF-16be version is available. Previous versions of 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test_function are deleted. 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The user function is implemented by calling the following TCL script: 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "test_function <enc> <arg>" 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Where <enc> is one of UTF-8, UTF-16LE or UTF16BE, and <arg> is the 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** single argument passed to the SQL function. The value returned by 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the TCL script is used as the return value of the SQL function. It 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is passed to SQLite using UTF-16BE for a UTF-8 test_function(), UTF-8 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for a UTF-16LE test_function(), and UTF-16LE for an implementation that 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** prefers UTF-16BE. 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_function_utf8( 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *pCtx, 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nArg, 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp; 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pX; 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp = (Tcl_Interp *)sqlite3_user_data(pCtx); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pX = Tcl_NewStringObj("test_function", -1); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pX); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, Tcl_NewStringObj("UTF-8", -1)); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj((char*)sqlite3_value_text(argv[0]), -1)); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalObjEx(interp, pX, 0); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pX); 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(pCtx, Tcl_GetStringResult(interp), -1, SQLITE_TRANSIENT); 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(0); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, -1, Tcl_GetStringResult(interp), 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_UTF8, SQLITE_STATIC); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16be(pCtx, sqlite3_value_text16be(pVal), 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, SQLITE_TRANSIENT); 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_function_utf16le( 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *pCtx, 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nArg, 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp; 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pX; 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp = (Tcl_Interp *)sqlite3_user_data(pCtx); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pX = Tcl_NewStringObj("test_function", -1); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pX); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, Tcl_NewStringObj("UTF-16LE", -1)); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj((char*)sqlite3_value_text(argv[0]), -1)); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalObjEx(interp, pX, 0); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pX); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(0); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, -1, Tcl_GetStringResult(interp), 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_UTF8, SQLITE_STATIC); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text(pCtx,(char*)sqlite3_value_text(pVal),-1,SQLITE_TRANSIENT); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_function_utf16be( 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context *pCtx, 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nArg, 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value **argv 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pX; 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value *pVal; 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp = (Tcl_Interp *)sqlite3_user_data(pCtx); 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pX = Tcl_NewStringObj("test_function", -1); 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pX); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, Tcl_NewStringObj("UTF-16BE", -1)); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pX, 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj((char*)sqlite3_value_text(argv[0]), -1)); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalObjEx(interp, pX, 0); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pX); 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVal = sqlite3ValueNew(0); 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(pVal, -1, Tcl_GetStringResult(interp), 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_UTF8, SQLITE_STATIC); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16(pCtx, sqlite3_value_text16le(pVal), 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, SQLITE_TRANSIENT); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16be(pCtx, sqlite3_value_text16le(pVal), 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, SQLITE_TRANSIENT); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16le(pCtx, sqlite3_value_text16le(pVal), 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, SQLITE_TRANSIENT); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueFree(pVal); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_function( 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val; 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 ) goto bad_args; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR; 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( val ){ 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function(db, "test_function", 1, SQLITE_UTF8, 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp, test_function_utf8, 0, 0); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[3], &val) ) return TCL_ERROR; 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( val ){ 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function(db, "test_function", 1, SQLITE_UTF16LE, 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp, test_function_utf16le, 0, 0); 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[4], &val) ) return TCL_ERROR; 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( val ){ 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function(db, "test_function", 1, SQLITE_UTF16BE, 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interp, test_function_utf16be, 0, 0); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bad_args: 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " <DB> <utf8> <utf16le> <utf16be>", 0); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_test_errstr <err code> 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test that the english language string equivalents for sqlite error codes 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are sane. The parameter is an integer representing an sqlite error code. 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result is a list of two elements, the string representation of the 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error code and the english language explanation. 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_errstr( 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCode; 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=1 ){ 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "<error code>"); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCode = Tcl_GetString(objv[1]); 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<200; i++){ 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==strcmp(t1ErrorName(i), zCode) ) break; 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3ErrStr(i), 0); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: breakpoint 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine exists for one purpose - to provide a place to put a 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** breakpoint with GDB that can be triggered using TCL code. The use 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for this is when a particular test fails on (say) the 1485th iteration. 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In the TCL test script, we can add code like this: 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if {$i==1485} breakpoint 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then run testfixture in the debugger and wait for the breakpoint to 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fire. Then additional breakpoints can be set to trace down the bug. 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_breakpoint( 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *NotUsed, 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, /* Number of arguments */ 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv /* Text of each argument */ 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; /* Do nothing */ 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_zeroblob STMT IDX N 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_zeroblob interface. STMT is a prepared statement. 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IDX is the index of a wildcard in the prepared statement. This command 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a N-byte zero-filled BLOB to the wildcard. 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_zeroblob( 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT IDX N"); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &n) ) return TCL_ERROR; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_zeroblob(pStmt, idx, n); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_int STMT N VALUE 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_int interface. STMT is a prepared statement. 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a 32-bit integer VALUE to that wildcard. 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_int( 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N VALUE", 0); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &value) ) return TCL_ERROR; 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_int(pStmt, idx, value); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_int64 STMT N VALUE 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_int64 interface. STMT is a prepared statement. 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a 64-bit integer VALUE to that wildcard. 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_int64( 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 value; 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N VALUE", 0); 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetWideIntFromObj(interp, objv[3], &value) ) return TCL_ERROR; 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_int64(pStmt, idx, value); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_double STMT N VALUE 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_double interface. STMT is a prepared statement. 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a 64-bit integer VALUE to that wildcard. 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_double( 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double value; 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zVal; 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; /* Name of the special floating point value */ 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int iUpper; /* Upper 32 bits */ 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int iLower; /* Lower 32 bits */ 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aSpecialFp[] = { 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "NaN", 0x7fffffff, 0xffffffff }, 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SNaN", 0x7ff7ffff, 0xffffffff }, 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "-NaN", 0xffffffff, 0xffffffff }, 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "-SNaN", 0xfff7ffff, 0xffffffff }, 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "+Inf", 0x7ff00000, 0x00000000 }, 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "-Inf", 0xfff00000, 0x00000000 }, 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "Epsilon", 0x00000000, 0x00000001 }, 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "-Epsilon", 0x80000000, 0x00000001 }, 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "NaN0", 0x7ff80000, 0x00000000 }, 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "-NaN0", 0xfff80000, 0x00000000 }, 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N VALUE", 0); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Intercept the string "NaN" and generate a NaN value for it. 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** All other strings are passed through to Tcl_GetDoubleFromObj(). 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Tcl_GetDoubleFromObj() should understand "NaN" but some versions 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contain a bug. 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zVal = Tcl_GetString(objv[3]); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aSpecialFp)/sizeof(aSpecialFp[0]); i++){ 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(aSpecialFp[i].zName, zVal)==0 ){ 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_uint64 x; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = aSpecialFp[i].iUpper; 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x <<= 32; 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x |= aSpecialFp[i].iLower; 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sizeof(value)==8 ); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sizeof(x)==8 ); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&value, &x, 8); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=sizeof(aSpecialFp)/sizeof(aSpecialFp[0]) && 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetDoubleFromObj(interp, objv[3], &value) ){ 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_double(pStmt, idx, value); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_null STMT N 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_null interface. STMT is a prepared statement. 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a NULL to the wildcard. 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_null( 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N", 0); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_null(pStmt, idx); 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_text STMT N STRING BYTES 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_text interface. STMT is a prepared statement. 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a UTF-8 string STRING to the wildcard. The string is BYTES bytes 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** long. 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_text( 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *value; 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 ){ 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N VALUE BYTES", 0); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = (char*)Tcl_GetByteArrayFromObj(objv[3], &bytes); 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR; 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text(pStmt, idx, value, bytes, SQLITE_TRANSIENT); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_text16 ?-static? STMT N STRING BYTES 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_text16 interface. STMT is a prepared statement. 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a UTF-16 string STRING to the wildcard. The string is BYTES bytes 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** long. 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_text16( 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *value; 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (*xDel)() = (objc==6?SQLITE_STATIC:SQLITE_TRANSIENT); 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *oStmt = objv[objc-4]; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *oN = objv[objc-3]; 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *oString = objv[objc-2]; 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *oBytes = objv[objc-1]; 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=6){ 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N VALUE BYTES", 0); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(oStmt), &pStmt) ) return TCL_ERROR; 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, oN, &idx) ) return TCL_ERROR; 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = (char*)Tcl_GetByteArrayFromObj(oString, 0); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, oBytes, &bytes) ) return TCL_ERROR; 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_text16(pStmt, idx, (void *)value, bytes, xDel); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0); 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_blob ?-static? STMT N DATA BYTES 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test the sqlite3_bind_blob interface. STMT is a prepared statement. 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N is the index of a wildcard in the prepared statement. This command 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binds a BLOB to the wildcard. The BLOB is BYTES bytes in size. 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_blob( 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx; 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *value; 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_destructor_type xDestructor = SQLITE_TRANSIENT; 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=6 ){ 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " STMT N DATA BYTES", 0); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==6 ){ 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xDestructor = SQLITE_STATIC; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objv++; 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = Tcl_GetString(objv[3]); 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR; 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_bind_blob(pStmt, idx, value, bytes, xDestructor); 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_parameter_count STMT 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of wildcards in the given statement. 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_parameter_count( 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT"); 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_bind_parameter_count(pStmt))); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_parameter_name STMT N 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the Nth wildcard. The first wildcard is 1. 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An empty string is returned if N is out of range or if the wildcard 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is nameless. 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_parameter_name( 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT N"); 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &i) ) return TCL_ERROR; 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewStringObj(sqlite3_bind_parameter_name(pStmt,i),-1) 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_bind_parameter_index STMT NAME 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the index of the wildcard called NAME. Return 0 if there is 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no such wildcard. 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_bind_parameter_index( 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT NAME"); 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_NewIntObj( 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_parameter_index(pStmt,Tcl_GetString(objv[2])) 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_clear_bindings STMT 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_clear_bindings( 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT"); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_clear_bindings(pStmt))); 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_sleep MILLISECONDS 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_sleep( 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ms; 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "MILLISECONDS"); 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[1], &ms) ){ 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_sleep(ms))); 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_extended_errcode DB 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the string representation of the most recent sqlite3_* API 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error code. e.g. "SQLITE_ERROR". 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_ex_errcode( 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB", 0); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_extended_errcode(db); 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, (char *)t1ErrorName(rc), 0); 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_errcode DB 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the string representation of the most recent sqlite3_* API 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error code. e.g. "SQLITE_ERROR". 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_errcode( 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB", 0); 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_errcode(db); 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, (char *)t1ErrorName(rc), 0); 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_errmsg DB 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Returns the UTF-8 representation of the error message string for the 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** most recent sqlite3_* API call. 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_errmsg( 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zErr; 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB", 0); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErr = sqlite3_errmsg(db); 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewStringObj(zErr, -1)); 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: test_errmsg16 DB 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Returns the UTF-16 representation of the error message string for the 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** most recent sqlite3_* API call. This is a byte array object at the TCL 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** level, and it includes the 0x00 0x00 terminator bytes at the end of the 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UTF-16 string. 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_errmsg16( 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zErr; 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z; 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes = 0; 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB", 0); 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErr = sqlite3_errmsg16(db); 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErr ){ 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = zErr; 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(bytes=0; z[bytes] || z[bytes+1]; bytes+=2){} 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(zErr, bytes)); 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_prepare DB sql bytes ?tailvar? 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compile up to <bytes> bytes of the supplied SQL string <sql> using 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database handle <DB>. The parameter <tailval> is the name of a global 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable that is set to the unused portion of <sql> (if any). A 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** STMT handle is returned. 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_prepare( 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSql; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zTail = 0; 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt = 0; 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=4 ){ 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB sql bytes ?tailvar?", 0); 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = Tcl_GetString(objv[2]); 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare(db, zSql, bytes, &pStmt, objc>=5 ? &zTail : 0); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ResetResult(interp); 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTail && objc>=5 ){ 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( bytes>=0 ){ 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes = bytes - (zTail-zSql); 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strlen(zTail)<bytes ){ 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes = strlen(zTail); 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjSetVar2(interp, objv[4], 0, Tcl_NewStringObj(zTail, bytes), 0); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pStmt==0 ); 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "(%d) ", rc); 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, sqlite3_errmsg(db), 0); 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_prepare_v2 DB sql bytes ?tailvar? 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compile up to <bytes> bytes of the supplied SQL string <sql> using 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database handle <DB>. The parameter <tailval> is the name of a global 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable that is set to the unused portion of <sql> (if any). A 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** STMT handle is returned. 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_prepare_v2( 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSql; 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zTail = 0; 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt = 0; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=4 ){ 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB sql bytes tailvar", 0); 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = Tcl_GetString(objv[2]); 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare_v2(db, zSql, bytes, &pStmt, objc>=5 ? &zTail : 0); 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(rc==SQLITE_OK || pStmt==0); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ResetResult(interp); 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTail && objc>=5 ){ 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( bytes>=0 ){ 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes = bytes - (zTail-zSql); 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjSetVar2(interp, objv[4], 0, Tcl_NewStringObj(zTail, bytes), 0); 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pStmt==0 ); 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "(%d) ", rc); 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, sqlite3_errmsg(db), 0); 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_prepare_tkt3134 DB 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate a prepared statement for a zero-byte string as a test 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for ticket #3134. The string should be preceeded by a zero byte. 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_prepare_tkt3134( 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char zSql[] = "\000SELECT 1"; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt = 0; 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB sql bytes tailvar", 0); 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare_v2(db, &zSql[1], 0, &pStmt, 0); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(rc==SQLITE_OK || pStmt==0); 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ){ 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pStmt==0 ); 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "(%d) ", rc); 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, sqlite3_errmsg(db), 0); 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_prepare16 DB sql bytes tailvar 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compile up to <bytes> bytes of the supplied SQL string <sql> using 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database handle <DB>. The parameter <tailval> is the name of a global 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable that is set to the unused portion of <sql> (if any). A 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** STMT handle is returned. 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_prepare16( 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zSql; 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zTail = 0; 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pTail = 0; 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt = 0; 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; /* The integer specified as arg 3 */ 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objlen; /* The byte-array length of arg 2 */ 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=4 ){ 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB sql bytes ?tailvar?", 0); 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = Tcl_GetByteArrayFromObj(objv[2], &objlen); 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare16(db, zSql, bytes, &pStmt, objc>=5 ? &zTail : 0); 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc>=5 ){ 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTail ){ 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objlen = objlen - ((u8 *)zTail-(u8 *)zSql); 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objlen = 0; 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen); 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pTail); 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0); 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pTail); 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_prepare16_v2 DB sql bytes ?tailvar? 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compile up to <bytes> bytes of the supplied SQL string <sql> using 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database handle <DB>. The parameter <tailval> is the name of a global 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable that is set to the unused portion of <sql> (if any). A 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** STMT handle is returned. 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_prepare16_v2( 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zSql; 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zTail = 0; 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pTail = 0; 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt = 0; 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[50]; 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes; /* The integer specified as arg 3 */ 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objlen; /* The byte-array length of arg 2 */ 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=5 && objc!=4 ){ 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " DB sql bytes ?tailvar?", 0); 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = Tcl_GetByteArrayFromObj(objv[2], &objlen); 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare16_v2(db, zSql, bytes, &pStmt, objc>=5 ? &zTail : 0); 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc>=5 ){ 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTail ){ 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objlen = objlen - ((u8 *)zTail-(u8 *)zSql); 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) objlen = 0; 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen); 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pTail); 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0); 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pTail); 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pStmt ){ 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_open filename ?options-list? 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_open( 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zFilename; 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 && objc!=2 && objc!=1 ){ 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " filename options-list", 0); 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zFilename = objc>1 ? Tcl_GetString(objv[1]) : 0; 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_open(zFilename, &db); 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, db) ) return TCL_ERROR; 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_open16 filename options 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_open16( 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zFilename; 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[100]; 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " filename options-list", 0); 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zFilename = Tcl_GetByteArrayFromObj(objv[1], 0); 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_open16(zFilename, &db); 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TestMakePointerStr(interp, zBuf, db) ) return TCL_ERROR; 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_complete16 <UTF-16 string> 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return 1 if the supplied argument is a complete SQL statement, or zero 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** otherwise. 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_complete16( 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_COMPLETE) && !defined(SQLITE_OMIT_UTF16) 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zBuf; 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "<utf-16 sql>"); 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBuf = (char*)Tcl_GetByteArrayFromObj(objv[1], 0); 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_complete16(zBuf))); 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPLETE && SQLITE_OMIT_UTF16 */ 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_step STMT 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Advance the statement to the next row. 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_step( 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT", 0); 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_step(pStmt); 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if( rc!=SQLITE_DONE && rc!=SQLITE_ROW ) return TCL_ERROR; */ 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0); 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_sql( 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT"); 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3_sql(pStmt), TCL_VOLATILE); 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_count STMT 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of columns returned by the sql statement STMT. 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_column_count( 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_column_count(pStmt))); 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_type STMT column 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the type of the data in column 'column' of the current row. 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_column_type( 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tp; 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tp = sqlite3_column_type(pStmt, col); 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( tp ){ 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_INTEGER: 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, "INTEGER", TCL_STATIC); 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_NULL: 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, "NULL", TCL_STATIC); 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_FLOAT: 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, "FLOAT", TCL_STATIC); 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_TEXT: 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, "TEXT", TCL_STATIC); 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_BLOB: 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, "BLOB", TCL_STATIC); 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(0); 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_int64 STMT column 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the data in column 'column' of the current row cast as an 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** wide (64-bit) integer. 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_column_int64( 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 iVal; 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iVal = sqlite3_column_int64(pStmt, col); 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewWideIntObj(iVal)); 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_blob STMT column 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_column_blob( 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *pBlob; 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = sqlite3_column_bytes(pStmt, col); 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBlob = sqlite3_column_blob(pStmt, col); 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(pBlob, len)); 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_double STMT column 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the data in column 'column' of the current row cast as a double. 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_column_double( 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double rVal; 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rVal = sqlite3_column_double(pStmt, col); 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewDoubleObj(rVal)); 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_data_count STMT 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of columns returned by the sql statement STMT. 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_data_count( 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_data_count(pStmt))); 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_text STMT column 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_decltype STMT column 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_name STMT column 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stmt_utf8( 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, /* Pointer to SQLite API function to be invoke */ 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *(*xFunc)(sqlite3_stmt*, int); 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zRet; 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xFunc = (const char *(*)(sqlite3_stmt*, int))clientData; 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zRet = xFunc(pStmt, col); 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRet ){ 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)zRet, 0); 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_global_recover( 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=1 ){ 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, ""); 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_global_recover(); 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_text STMT column 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_decltype STMT column 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_name STMT column 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stmt_utf16( 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, /* Pointer to SQLite API function to be invoked */ 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pRet; 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zName16; 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *(*xFunc)(sqlite3_stmt*, int); 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xFunc = (const void *(*)(sqlite3_stmt*, int))clientData; 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName16 = xFunc(pStmt, col); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zName16 ){ 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z = zName16; 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(n=0; z[n] || z[n+1]; n+=2){} 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = Tcl_NewByteArrayObj(zName16, n+2); 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pRet); 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_int STMT column 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_bytes STMT column 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_column_bytes16 STMT column 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stmt_int( 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, /* Pointer to SQLite API function to be invoked */ 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col; 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int (*xFunc)(sqlite3_stmt*, int); 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xFunc = (int (*)(sqlite3_stmt*, int))clientData; 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[0]), " STMT column", 0); 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(xFunc(pStmt, col))); 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_set_magic DB MAGIC-NUMBER 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the db->magic value. This is used to test error recovery logic. 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite_set_magic( 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB MAGIC", 0); 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(argv[2], "SQLITE_MAGIC_OPEN")==0 ){ 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->magic = SQLITE_MAGIC_OPEN; 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[2], "SQLITE_MAGIC_CLOSED")==0 ){ 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->magic = SQLITE_MAGIC_CLOSED; 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[2], "SQLITE_MAGIC_BUSY")==0 ){ 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->magic = SQLITE_MAGIC_BUSY; 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( strcmp(argv[2], "SQLITE_MAGIC_ERROR")==0 ){ 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->magic = SQLITE_MAGIC_ERROR; 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( Tcl_GetInt(interp, argv[2], (int*)&db->magic) ){ 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_interrupt DB 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Trigger an interrupt on DB 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_interrupt( 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " DB", 0); 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_interrupt(db); 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 *sqlite3_stack_baseline = 0; 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Fill the stack with a known bitpattern. 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void prepStack(void){ 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 bigBuf[65536]; 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(bigBuf); i++) bigBuf[i] = 0xdeadbeef; 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stack_baseline = (u8*)&bigBuf[65536]; 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Get the current stack depth. Used for debugging only. 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u64 sqlite3StackDepth(void){ 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 x; 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (u64)(sqlite3_stack_baseline - &x); 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_stack_used DB SQL 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Try to measure the amount of stack space used by a call to sqlite3_exec 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_stack_used( 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB SQL", 0); 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepStack(); 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void)sqlite3_exec(db, argv[2], 0, 0, 0); 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=65535; i>=0 && ((u32*)sqlite3_stack_baseline)[-i]==0xdeadbeef; i--){} 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(i*4)); 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_delete_function DB function-name 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete the user function 'function-name' from database handle DB. It 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is assumed that the user function was created as UTF8, any number of 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** arguments (the way the TCL interface does it). 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int delete_function( 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB function-name", 0); 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_function(db, argv[2], -1, SQLITE_UTF8, 0, 0, 0, 0); 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite_delete_collation DB collation-name 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete the collation sequence 'collation-name' from database handle 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** DB. It is assumed that the collation sequence was created as UTF8 (the 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** way the TCL interface does it). 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int delete_collation( 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB function-name", 0); 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_create_collation(db, argv[2], SQLITE_UTF8, 0, 0); 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_get_autocommit DB 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the database DB is currently in auto-commit mode. 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return false if not. 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int get_autocommit( 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zBuf[30]; 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=2 ){ 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB", 0); 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(zBuf, "%d", sqlite3_get_autocommit(db)); 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, zBuf, 0); 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_busy_timeout DB MS 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the busy timeout. This is more easily done using the timeout 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** method of the TCL interface. But we need a way to test the case 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where it returns SQLITE_MISUSE. 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_busy_timeout( 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc, 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **argv 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc, ms; 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " DB", 0); 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetInt(interp, argv[2], &ms) ) return TCL_ERROR; 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_busy_timeout(db, ms); 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0); 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: tcl_variable_type VARIABLENAME 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the internal representation for the 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value of the given variable. 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int tcl_variable_type( 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pVar; 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "VARIABLE"); 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVar = Tcl_GetVar2Ex(interp, Tcl_GetString(objv[1]), 0, TCL_LEAVE_ERR_MSG); 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pVar==0 ) return TCL_ERROR; 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pVar->typePtr ){ 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewStringObj(pVar->typePtr->name, -1)); 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_release_memory ?N? 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attempt to release memory currently held but not actually required. 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The integer N is the number of bytes we are trying to release. The 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return value is the amount of memory actually released. 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_release_memory( 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) && !defined(SQLITE_OMIT_DISKIO) 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int N; 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int amt; 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=1 && objc!=2 ){ 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "?N?"); 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==2 ){ 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[1], &N) ) return TCL_ERROR; 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) N = -1; 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) amt = sqlite3_release_memory(N); 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(amt)); 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_soft_heap_limit ?N? 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Query or set the soft heap limit for the current thread. The 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** limit is only changed if the N is present. The previous limit 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is returned. 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_soft_heap_limit( 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_int64 amt; 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_int64 N = -1; 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=1 && objc!=2 ){ 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "?N?"); 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==2 ){ 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetWideIntFromObj(interp, objv[1], &N) ) return TCL_ERROR; 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) amt = sqlite3_soft_heap_limit64(N); 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewWideIntObj(amt)); 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_thread_cleanup 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call the sqlite3_thread_cleanup API. 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_thread_cleanup( 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_thread_cleanup(); 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage: sqlite3_pager_refcounts DB 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a list of numbers which are the PagerRefcount for all 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pagers on each database connection. 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_pager_refcounts( 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int v, *a; 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pResult; 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB", 0); 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pResult = Tcl_NewObj(); 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->aDb[i].pBt==0 ){ 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = -1; 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = sqlite3PagerStats(sqlite3BtreePager(db->aDb[i].pBt)); 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = a[0]; 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(v)); 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pResult); 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: working_64bit_int 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Some TCL builds (ex: cygwin) do not support 64-bit integers. This 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** leads to a number of test failures. The present command checks the 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TCL build to see whether or not it supports 64-bit integers. It 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns TRUE if it does and FALSE if not. 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command is used to warn users that their TCL build is defective 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and that the errors they are seeing in the test scripts might be 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a result of their defective TCL rather than problems in SQLite. 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int working_64bit_int( 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pTestObj; 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int working = 0; 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTestObj = Tcl_NewWideIntObj(1000000*(i64)1234567890); 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) working = strcmp(Tcl_GetString(pTestObj), "1234567890000000")==0; 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pTestObj); 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewBooleanObj(working)); 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: vfs_unlink_test 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command unregisters the primary VFS and then registers 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it back again. This is used to test the ability to register a 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VFS when none are previously registered, and the ability to 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unregister the only available VFS. Ticket #2738 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vfs_unlink_test( 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pMain; 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *apVfs[20]; 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs one, two; 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(0); /* Unregister of NULL is harmless */ 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one.zName = "__one"; 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) two.zName = "__two"; 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Calling sqlite3_vfs_register with 2nd argument of 0 does not 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** change the default VFS 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMain = sqlite3_vfs_find(0); 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&one, 0); 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pMain==0 || pMain==sqlite3_vfs_find(0) ); 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&two, 0); 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pMain==0 || pMain==sqlite3_vfs_find(0) ); 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We can find a VFS by its name */ 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__one")==&one ); 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__two")==&two ); 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Calling sqlite_vfs_register with non-zero second parameter changes the 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** default VFS, even if the 1st parameter is an existig VFS that is 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** previously registered as the non-default. 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&one, 1); 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__one")==&one ); 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__two")==&two ); 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find(0)==&one ); 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&two, 1); 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__one")==&one ); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__two")==&two ); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find(0)==&two ); 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pMain ){ 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(pMain, 1); 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__one")==&one ); 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__two")==&two ); 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find(0)==pMain ); 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unlink the default VFS. Repeat until there are no more VFSes 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** registered. 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(apVfs)/sizeof(apVfs[0]); i++){ 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apVfs[i] = sqlite3_vfs_find(0); 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( apVfs[i] ){ 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( apVfs[i]==sqlite3_vfs_find(apVfs[i]->zName) ); 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(apVfs[i]); 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( 0==sqlite3_vfs_find(apVfs[i]->zName) ); 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( 0==sqlite3_vfs_find(0) ); 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Register the main VFS as non-default (will be made default, since 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it'll be the only one in existence). 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(pMain, 0); 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find(0)==pMain ); 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Un-register the main VFS again to restore an empty VFS list */ 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(pMain); 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( 0==sqlite3_vfs_find(0) ); 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Relink all VFSes in reverse order. */ 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=sizeof(apVfs)/sizeof(apVfs[0])-1; i>=0; i--){ 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( apVfs[i] ){ 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(apVfs[i], 1); 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( apVfs[i]==sqlite3_vfs_find(0) ); 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( apVfs[i]==sqlite3_vfs_find(apVfs[i]->zName) ); 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unregister out sample VFSes. */ 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(&one); 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(&two); 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unregistering a VFS that is not currently registered is harmless */ 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(&one); 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(&two); 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__one")==0 ); 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find("__two")==0 ); 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We should be left with the original default VFS back as the 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** original */ 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_vfs_find(0)==pMain ); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: vfs_initfail_test 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command attempts to vfs_find and vfs_register when the 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_initialize() interface is failing. All calls should fail. 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vfs_initfail_test( 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs one; 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) one.zName = "__one"; 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_vfs_find(0) ) return TCL_ERROR; 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&one, 0); 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_vfs_find(0) ) return TCL_ERROR; 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&one, 1); 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_vfs_find(0) ) return TCL_ERROR; 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Saved VFSes 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite3_vfs *apVfs[20]; 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nVfs = 0; 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: vfs_unregister_all 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unregister all VFSes. 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vfs_unregister_all( 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<ArraySize(apVfs); i++){ 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apVfs[i] = sqlite3_vfs_find(0); 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( apVfs[i]==0 ) break; 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister(apVfs[i]); 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nVfs = i; 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: vfs_reregister_all 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Restore all VFSes that were removed using vfs_unregister_all 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vfs_reregister_all( 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nVfs; i++){ 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(apVfs[i], i==0); 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: file_control_test DB 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_file_control interface and 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the same. 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int file_control_test( 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iArg = 0; 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB", 0); 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, 0, 0, &iArg); 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==SQLITE_NOTFOUND ); 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, "notadatabase", SQLITE_FCNTL_LOCKSTATE, &iArg); 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==SQLITE_ERROR ); 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, "main", -1, &iArg); 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==SQLITE_NOTFOUND ); 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, "temp", -1, &iArg); 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==SQLITE_NOTFOUND || rc==SQLITE_ERROR ); 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: file_control_lasterrno_test DB 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_file_control interface and 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the SQLITE_LAST_ERRNO verb. 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int file_control_lasterrno_test( 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iArg = 0; 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB", 0); 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, NULL, SQLITE_LAST_ERRNO, &iArg); 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iArg!=0 ) { 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "Unexpected non-zero errno: ", 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(Tcl_NewIntObj(iArg), 0), " ", 0); 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: file_control_chunksize_test DB DBNAME SIZE 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_file_control interface and 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_SET_LOCKPROXYFILE verbs. 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int file_control_chunksize_test( 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nSize; /* New chunk size */ 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb; /* Db name ("main", "temp" etc.) */ 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database handle */ 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; /* file_control() return code */ 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SIZE"); 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || Tcl_GetIntFromObj(interp, objv[3], &nSize) 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[2]); 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zDb[0]=='\0' ) zDb = NULL; 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_CHUNK_SIZE, (void *)&nSize); 48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC); 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: file_control_sizehint_test DB DBNAME SIZE 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_file_control interface and 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_SET_LOCKPROXYFILE verbs. 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int file_control_sizehint_test( 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_int64 nSize; /* Hinted size */ 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb; /* Db name ("main", "temp" etc.) */ 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database handle */ 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; /* file_control() return code */ 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SIZE"); 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || Tcl_GetWideIntFromObj(interp, objv[3], &nSize) 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[2]); 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zDb[0]=='\0' ) zDb = NULL; 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_SIZE_HINT, (void *)&nSize); 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC); 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: file_control_lockproxy_test DB PWD 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_file_control interface and 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_SET_LOCKPROXYFILE verbs. 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int file_control_lockproxy_test( 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zPwd; 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nPwd; 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 ){ 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB PWD", 0); 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zPwd = Tcl_GetStringFromObj(objv[2], &nPwd); 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_ENABLE_LOCKING_STYLE) 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(__APPLE__) 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SQLITE_ENABLE_LOCKING_STYLE 1 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SQLITE_ENABLE_LOCKING_STYLE 0 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *testPath; 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char proxyPath[400]; 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sizeof(proxyPath)<nPwd+20 ){ 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "PWD too big", (void*)0); 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(proxyPath, "%s/test.proxy", zPwd); 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, NULL, SQLITE_SET_LOCKPROXYFILE, proxyPath); 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, NULL, SQLITE_GET_LOCKPROXYFILE, &testPath); 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strncmp(proxyPath,testPath,11) ){ 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "Lock proxy file did not match the " 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "previously assigned value", 0); 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_file_control(db, NULL, SQLITE_SET_LOCKPROXYFILE, proxyPath); 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: sqlite3_vfs_list 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a tcl list containing the names of all registered vfs's. 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vfs_list( 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pRet = Tcl_NewObj(); 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=1 ){ 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, ""); 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj(pVfs->zName, -1)); 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pRet); 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: sqlite3_limit DB ID VALUE 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This TCL command runs the sqlite3_limit interface and 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** verifies correct operation of the same. 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_limit( 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id; 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aId[] = { 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_LENGTH", SQLITE_LIMIT_LENGTH }, 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_SQL_LENGTH", SQLITE_LIMIT_SQL_LENGTH }, 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_COLUMN", SQLITE_LIMIT_COLUMN }, 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_EXPR_DEPTH", SQLITE_LIMIT_EXPR_DEPTH }, 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_COMPOUND_SELECT", SQLITE_LIMIT_COMPOUND_SELECT }, 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_VDBE_OP", SQLITE_LIMIT_VDBE_OP }, 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_FUNCTION_ARG", SQLITE_LIMIT_FUNCTION_ARG }, 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_ATTACHED", SQLITE_LIMIT_ATTACHED }, 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_LIKE_PATTERN_LENGTH", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_VARIABLE_NUMBER", SQLITE_LIMIT_VARIABLE_NUMBER }, 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_TRIGGER_DEPTH", SQLITE_LIMIT_TRIGGER_DEPTH }, 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Out of range test cases */ 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_TOOSMALL", -1, }, 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "SQLITE_LIMIT_TOOBIG", SQLITE_LIMIT_TRIGGER_DEPTH+1 }, 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, id; 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val; 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zId; 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "wrong # args: should be \"", 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetStringFromObj(objv[0], 0), " DB ID VALUE", 0); 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zId = Tcl_GetString(objv[2]); 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aId)/sizeof(aId[0]); i++){ 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(zId, aId[i].zName)==0 ){ 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = aId[i].id; 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=sizeof(aId)/sizeof(aId[0]) ){ 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "unknown limit type: ", zId, (char*)0); 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetIntFromObj(interp, objv[3], &val) ) return TCL_ERROR; 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_limit(db, id, val); 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: save_prng_state 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Save the state of the pseudo-random number generator. 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** At the same time, verify that sqlite3_test_control works even when 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** called with an out-of-range opcode. 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int save_prng_state( 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = sqlite3_test_control(9999); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==0 ); 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_test_control(-1); 51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( rc==0 ); 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SAVE); 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: restore_prng_state 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int restore_prng_state( 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_test_control(SQLITE_TESTCTRL_PRNG_RESTORE); 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: reset_prng_state 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int reset_prng_state( 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_test_control(SQLITE_TESTCTRL_PRNG_RESET); 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: pcache_stats 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_pcache_stats( 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nMin; 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nMax; 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCurrent; 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nRecyclable; 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pRet; 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PcacheStats(&nCurrent, &nMax, &nMin, &nRecyclable); 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = Tcl_NewObj(); 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("current", -1)); 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nCurrent)); 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("max", -1)); 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nMax)); 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("min", -1)); 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nMin)); 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("recyclable", -1)); 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nRecyclable)); 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pRet); 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void test_unlock_notify_cb(void **aArg, int nArg){ 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ii; 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(ii=0; ii<nArg; ii++){ 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalEx((Tcl_Interp *)aArg[ii], "unlock_notify", -1, TCL_EVAL_GLOBAL); 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_ENABLE_UNLOCK_NOTIFY */ 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: sqlite3_unlock_notify db 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_unlock_notify( 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Unused */ 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB"); 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_unlock_notify(db, test_unlock_notify_cb, (void *)interp); 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: sqlite3_wal_checkpoint db ?NAME? 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_wal_checkpoint( 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Unused */ 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb = 0; 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 && objc!=2 ){ 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB ?NAME?"); 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==3 ){ 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[2]); 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_wal_checkpoint(db, zDb); 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: sqlite3_wal_checkpoint_v2 db MODE ?NAME? 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This command calls the wal_checkpoint_v2() function with the specified 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mode argument (passive, full or restart). If present, the database name 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NAME is passed as the second argument to wal_checkpoint_v2(). If it the 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NAME argument is not present, a NULL pointer is passed instead. 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If wal_checkpoint_v2() returns any value other than SQLITE_BUSY or 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_OK, then this command returns TCL_ERROR. The Tcl result is set 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the error message obtained from sqlite3_errmsg(). 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Otherwise, this command returns a list of three integers. The first integer 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is 1 if SQLITE_BUSY was returned, or 0 otherwise. The following two integers 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the values returned via the output paramaters by wal_checkpoint_v2() - 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the number of frames in the log and the number of frames in the log 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that have been checkpointed. 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_wal_checkpoint_v2( 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, /* Unused */ 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zDb = 0; 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eMode; 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nLog = -555; 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCkpt = -555; 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pRet; 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char * aMode[] = { "passive", "full", "restart", 0 }; 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( SQLITE_CHECKPOINT_PASSIVE==0 ); 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( SQLITE_CHECKPOINT_FULL==1 ); 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( SQLITE_CHECKPOINT_RESTART==2 ); 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=3 && objc!=4 ){ 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB MODE ?NAME?"); 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc==4 ){ 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = Tcl_GetString(objv[3]); 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || Tcl_GetIndexFromObj(interp, objv[2], aMode, "mode", 0, &eMode) 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_wal_checkpoint_v2(db, zDb, eMode, &nLog, &nCkpt); 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)sqlite3_errmsg(db), TCL_VOLATILE); 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = Tcl_NewObj(); 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(rc==SQLITE_BUSY?1:0)); 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nLog)); 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(nCkpt)); 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetObjResult(interp, pRet); 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tclcmd: test_sqlite3_log ?SCRIPT? 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct LogCallback { 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *pInterp; 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pObj; 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} logcallback = {0, 0}; 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xLogcallback(void *unused, int err, char *zMsg){ 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *pNew = Tcl_DuplicateObj(logcallback.pObj); 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(pNew); 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement( 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, pNew, Tcl_NewStringObj(sqlite3TestErrorName(err), -1) 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ListObjAppendElement(0, pNew, Tcl_NewStringObj(zMsg, -1)); 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_EvalObjEx(logcallback.pInterp, pNew, TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT); 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(pNew); 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_sqlite3_log( 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientData clientData, 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, /* Number of arguments */ 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] /* Command arguments */ 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc>2 ){ 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "SCRIPT"); 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( logcallback.pObj ){ 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_DecrRefCount(logcallback.pObj); 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logcallback.pObj = 0; 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logcallback.pInterp = 0; 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_config(SQLITE_CONFIG_LOG, 0, 0); 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc>1 ){ 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logcallback.pObj = objv[1]; 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_IncrRefCount(logcallback.pObj); 53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logcallback.pInterp = interp; 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_config(SQLITE_CONFIG_LOG, xLogcallback, 0); 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tcl_objproc COMMANDNAME ARGS... 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Run a TCL command using its objProc interface. Throw an error if 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the command has no objProc interface. 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int runAsObjProc( 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdInfo cmdInfo; 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc<2 ){ 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "COMMAND ..."); 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !Tcl_GetCommandInfo(interp, Tcl_GetString(objv[1]), &cmdInfo) ){ 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "command not found: ", 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[1]), (char*)0); 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cmdInfo.objProc==0 ){ 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "command has no objProc: ", 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_GetString(objv[1]), (char*)0); 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmdInfo.objProc(cmdInfo.objClientData, interp, objc-1, objv+1); 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WARNING: The following function, printExplainQueryPlan() is an exact 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** copy of example code from eqp.in (eqp.html). If this code is modified, 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the documentation copy needs to be modified as well. 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Argument pStmt is a prepared SQL statement. This function compiles 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an EXPLAIN QUERY PLAN command to report on the prepared statement, 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and prints the report to stdout using printf(). 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int printExplainQueryPlan(sqlite3_stmt *pStmt){ 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSql; /* Input SQL */ 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zExplain; /* SQL with EXPLAIN QUERY PLAN prepended */ 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pExplain; /* Compiled EXPLAIN QUERY PLAN command */ 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; /* Return code from sqlite3_prepare_v2() */ 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = sqlite3_sql(pStmt); 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zSql==0 ) return SQLITE_ERROR; 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zExplain = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zSql); 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zExplain==0 ) return SQLITE_NOMEM; 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare_v2(sqlite3_db_handle(pStmt), zExplain, -1, &pExplain, 0); 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zExplain); 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK ) return rc; 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( SQLITE_ROW==sqlite3_step(pExplain) ){ 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSelectid = sqlite3_column_int(pExplain, 0); 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iOrder = sqlite3_column_int(pExplain, 1); 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iFrom = sqlite3_column_int(pExplain, 2); 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDetail = (const char *)sqlite3_column_text(pExplain, 3); 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%d %d %d %s\n", iSelectid, iOrder, iFrom, zDetail); 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3_finalize(pExplain); 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int test_print_eqp( 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=2 ){ 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "STMT"); 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = printExplainQueryPlan(pStmt); 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0); 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_EXPLAIN */ 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** optimization_control DB OPT BOOLEAN 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Enable or disable query optimizations using the sqlite3_test_control() 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interface. Disable if BOOLEAN is false and enable if BOOLEAN is true. 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OPT is the name of the optimization to be disabled. 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int optimization_control( 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * clientData, 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp *interp, 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int objc, 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Obj *CONST objv[] 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOpt; 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onoff; 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask; 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOptName; 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask; 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aOpt[] = { 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "all", SQLITE_OptMask }, 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "query-flattener", SQLITE_QueryFlattener }, 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "column-cache", SQLITE_ColumnCache }, 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "index-sort", SQLITE_IndexSort }, 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "index-search", SQLITE_IndexSearch }, 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "index-cover", SQLITE_IndexCover }, 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "groupby-order", SQLITE_GroupByOrder }, 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "factor-constants", SQLITE_FactorOutConst }, 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( objc!=4 ){ 54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_WrongNumArgs(interp, 1, objv, "DB OPT BOOLEAN"); 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( Tcl_GetBooleanFromObj(interp, objv[3], &onoff) ) return TCL_ERROR; 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOpt = Tcl_GetString(objv[2]); 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aOpt)/sizeof(aOpt[0]); i++){ 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( strcmp(zOpt, aOpt[i].zOptName)==0 ){ 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = aOpt[i].mask; 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onoff ) mask = ~mask; 54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=sizeof(aOpt)/sizeof(aOpt[0]) ){ 54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, "unknown optimization - should be one of:", 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)0); 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aOpt)/sizeof(aOpt[0]); i++){ 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_AppendResult(interp, " ", aOpt[i].zOptName); 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_ERROR; 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, db, mask); 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register commands with the TCL interpreter. 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Sqlitetest1_Init(Tcl_Interp *interp){ 54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_search_count; 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_found_count; 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_interrupt_count; 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_open_file_count; 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_sort_count; 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_current_time; 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_OS_UNIX && defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_hostid_num; 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_max_blobsize; 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3BtreeSharedCacheReport(void*, 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_Interp*,int,Tcl_Obj*CONST*); 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static struct { 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CmdProc *xProc; 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aCmd[] = { 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "db_enter", (Tcl_CmdProc*)db_enter }, 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "db_leave", (Tcl_CmdProc*)db_leave }, 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_int", (Tcl_CmdProc*)sqlite3_mprintf_int }, 55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_int64", (Tcl_CmdProc*)sqlite3_mprintf_int64 }, 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_long", (Tcl_CmdProc*)sqlite3_mprintf_long }, 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_str", (Tcl_CmdProc*)sqlite3_mprintf_str }, 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_snprintf_str", (Tcl_CmdProc*)sqlite3_snprintf_str }, 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_stronly", (Tcl_CmdProc*)sqlite3_mprintf_stronly}, 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_double", (Tcl_CmdProc*)sqlite3_mprintf_double }, 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_scaled", (Tcl_CmdProc*)sqlite3_mprintf_scaled }, 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_hexdouble", (Tcl_CmdProc*)sqlite3_mprintf_hexdouble}, 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z }, 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_mprintf_n_test", (Tcl_CmdProc*)test_mprintf_n }, 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_snprintf_int", (Tcl_CmdProc*)test_snprintf_int }, 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_last_insert_rowid", (Tcl_CmdProc*)test_last_rowid }, 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_exec_printf", (Tcl_CmdProc*)test_exec_printf }, 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_exec_hex", (Tcl_CmdProc*)test_exec_hex }, 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_exec", (Tcl_CmdProc*)test_exec }, 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_exec_nr", (Tcl_CmdProc*)test_exec_nr }, 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_GET_TABLE 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_get_table_printf", (Tcl_CmdProc*)test_get_table_printf }, 55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_close", (Tcl_CmdProc*)sqlite_test_close }, 55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_create_function", (Tcl_CmdProc*)test_create_function }, 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_create_aggregate", (Tcl_CmdProc*)test_create_aggregate }, 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_register_test_function", (Tcl_CmdProc*)test_register_func }, 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_abort", (Tcl_CmdProc*)sqlite_abort }, 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_bind", (Tcl_CmdProc*)test_bind }, 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "breakpoint", (Tcl_CmdProc*)test_breakpoint }, 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_key", (Tcl_CmdProc*)test_key }, 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_rekey", (Tcl_CmdProc*)test_rekey }, 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_set_magic", (Tcl_CmdProc*)sqlite_set_magic }, 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_interrupt", (Tcl_CmdProc*)test_interrupt }, 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_delete_function", (Tcl_CmdProc*)delete_function }, 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite_delete_collation", (Tcl_CmdProc*)delete_collation }, 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_get_autocommit", (Tcl_CmdProc*)get_autocommit }, 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_stack_used", (Tcl_CmdProc*)test_stack_used }, 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_busy_timeout", (Tcl_CmdProc*)test_busy_timeout }, 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "printf", (Tcl_CmdProc*)test_printf }, 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3IoTrace", (Tcl_CmdProc*)test_io_trace }, 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static struct { 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_ObjCmdProc *xProc; 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *clientData; 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aObjCmd[] = { 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_connection_pointer", get_sqlite_pointer, 0 }, 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_int", test_bind_int, 0 }, 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_zeroblob", test_bind_zeroblob, 0 }, 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_int64", test_bind_int64, 0 }, 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_double", test_bind_double, 0 }, 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_null", test_bind_null ,0 }, 55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_text", test_bind_text ,0 }, 55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_text16", test_bind_text16 ,0 }, 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_blob", test_bind_blob ,0 }, 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_parameter_count", test_bind_parameter_count, 0}, 55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_parameter_name", test_bind_parameter_name, 0}, 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_bind_parameter_index", test_bind_parameter_index, 0}, 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_clear_bindings", test_clear_bindings, 0}, 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_sleep", test_sleep, 0}, 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_errcode", test_errcode ,0 }, 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_extended_errcode", test_ex_errcode ,0 }, 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_errmsg", test_errmsg ,0 }, 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_errmsg16", test_errmsg16 ,0 }, 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_open", test_open ,0 }, 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_open16", test_open16 ,0 }, 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_complete16", test_complete16 ,0 }, 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_prepare", test_prepare ,0 }, 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_prepare16", test_prepare16 ,0 }, 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_prepare_v2", test_prepare_v2 ,0 }, 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_prepare_tkt3134", test_prepare_tkt3134, 0}, 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_prepare16_v2", test_prepare16_v2 ,0 }, 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_finalize", test_finalize ,0 }, 55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_stmt_status", test_stmt_status ,0 }, 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_reset", test_reset ,0 }, 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_expired", test_expired ,0 }, 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_transfer_bindings", test_transfer_bind ,0 }, 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_changes", test_changes ,0 }, 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_step", test_step ,0 }, 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_sql", test_sql ,0 }, 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_next_stmt", test_next_stmt ,0 }, 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_stmt_readonly", test_stmt_readonly ,0 }, 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_release_memory", test_release_memory, 0}, 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_soft_heap_limit", test_soft_heap_limit, 0}, 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_thread_cleanup", test_thread_cleanup, 0}, 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_pager_refcounts", test_pager_refcounts, 0}, 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_load_extension", test_load_extension, 0}, 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_enable_load_extension", test_enable_load, 0}, 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_extended_result_codes", test_extended_result_codes, 0}, 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_limit", test_limit, 0}, 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "save_prng_state", save_prng_state, 0 }, 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "restore_prng_state", restore_prng_state, 0 }, 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "reset_prng_state", reset_prng_state, 0 }, 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "optimization_control", optimization_control,0}, 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "tcl_objproc", runAsObjProc, 0 }, 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* sqlite3_column_*() API */ 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_count", test_column_count ,0 }, 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_data_count", test_data_count ,0 }, 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_type", test_column_type ,0 }, 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_blob", test_column_blob ,0 }, 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_double", test_column_double ,0 }, 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_int64", test_column_int64 ,0 }, 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_text", test_stmt_utf8, (void*)sqlite3_column_text }, 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_name", test_stmt_utf8, (void*)sqlite3_column_name }, 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_int", test_stmt_int, (void*)sqlite3_column_int }, 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_bytes", test_stmt_int, (void*)sqlite3_column_bytes}, 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DECLTYPE 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_decltype",test_stmt_utf8,(void*)sqlite3_column_decltype}, 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ "sqlite3_column_database_name",test_stmt_utf8,(void*)sqlite3_column_database_name}, 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ "sqlite3_column_table_name",test_stmt_utf8,(void*)sqlite3_column_table_name}, 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ "sqlite3_column_origin_name",test_stmt_utf8,(void*)sqlite3_column_origin_name}, 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_bytes16", test_stmt_int, (void*)sqlite3_column_bytes16 }, 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_text16", test_stmt_utf16, (void*)sqlite3_column_text16}, 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_name16", test_stmt_utf16, (void*)sqlite3_column_name16}, 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "add_alignment_test_collations", add_alignment_test_collations, 0 }, 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DECLTYPE 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_column_decltype16",test_stmt_utf16,(void*)sqlite3_column_decltype16}, 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){"sqlite3_column_database_name16", 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_stmt_utf16, sqlite3_column_database_name16}, 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){"sqlite3_column_table_name16", test_stmt_utf16, (void*)sqlite3_column_table_name16}, 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){"sqlite3_column_origin_name16", test_stmt_utf16, (void*)sqlite3_column_origin_name16}, 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_create_collation_v2", test_create_collation_v2, 0 }, 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_global_recover", test_global_recover, 0 }, 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "working_64bit_int", working_64bit_int, 0 }, 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vfs_unlink_test", vfs_unlink_test, 0 }, 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vfs_initfail_test", vfs_initfail_test, 0 }, 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vfs_unregister_all", vfs_unregister_all, 0 }, 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vfs_reregister_all", vfs_reregister_all, 0 }, 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "file_control_test", file_control_test, 0 }, 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "file_control_lasterrno_test", file_control_lasterrno_test, 0 }, 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "file_control_lockproxy_test", file_control_lockproxy_test, 0 }, 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "file_control_chunksize_test", file_control_chunksize_test, 0 }, 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "file_control_sizehint_test", file_control_sizehint_test, 0 }, 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_vfs_list", vfs_list, 0 }, 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_create_function_v2", test_create_function_v2, 0 }, 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Functions from os.h */ 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "add_test_collate", test_collate, 0 }, 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "add_test_collate_needed", test_collate_needed, 0 }, 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "add_test_function", test_function, 0 }, 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_test_errstr", test_errstr, 0 }, 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "tcl_variable_type", tcl_variable_type, 0 }, 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SHARED_CACHE 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_enable_shared_cache", test_enable_shared, 0 }, 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_shared_cache_report", sqlite3BtreeSharedCacheReport, 0}, 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_libversion_number", test_libversion_number, 0 }, 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_table_column_metadata", test_table_column_metadata, 0 }, 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INCRBLOB 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_blob_read", test_blob_read, 0 }, 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_blob_write", test_blob_write, 0 }, 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_blob_reopen", test_blob_reopen, 0 }, 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_blob_bytes", test_blob_bytes, 0 }, 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_blob_close", test_blob_close, 0 }, 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "pcache_stats", test_pcache_stats, 0 }, 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_unlock_notify", test_unlock_notify, 0 }, 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_wal_checkpoint", test_wal_checkpoint, 0 }, 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sqlite3_wal_checkpoint_v2",test_wal_checkpoint_v2, 0 }, 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "test_sqlite3_log", test_sqlite3_log, 0 }, 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "print_explain_query_plan", test_print_eqp, 0 }, 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int bitmask_size = sizeof(Bitmask)*8; 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_sync_count, sqlite3_fullsync_count; 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_opentemp_count; 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_like_count; 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_xferopt_count; 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_pager_readdb_count; 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_pager_writedb_count; 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_pager_writej_count; 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_OS_WIN 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_os_type; 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3WhereTrace; 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3OSTrace; 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3VdbeAddopTrace; 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3WalTrace; 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern char sqlite3_query_plan[]; 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static char *query_plan = sqlite3_query_plan; 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_FTS3 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int sqlite3_fts3_enable_parentheses; 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_CreateObjCommand(interp, aObjCmd[i].zName, 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aObjCmd[i].xProc, aObjCmd[i].clientData, 0); 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_search_count", 57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_search_count, TCL_LINK_INT); 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_found_count", 57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_found_count, TCL_LINK_INT); 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_sort_count", 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_sort_count, TCL_LINK_INT); 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite3_max_blobsize", 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_max_blobsize, TCL_LINK_INT); 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_like_count", 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_like_count, TCL_LINK_INT); 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_interrupt_count", 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_interrupt_count, TCL_LINK_INT); 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_open_file_count", 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_open_file_count, TCL_LINK_INT); 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_current_time", 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_current_time, TCL_LINK_INT); 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_OS_UNIX && defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_hostid_num", 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_hostid_num, TCL_LINK_INT); 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite3_xferopt_count", 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_xferopt_count, TCL_LINK_INT); 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite3_pager_readdb_count", 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_pager_readdb_count, TCL_LINK_INT); 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite3_pager_writedb_count", 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_pager_writedb_count, TCL_LINK_INT); 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite3_pager_writej_count", 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_pager_writej_count, TCL_LINK_INT); 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "unaligned_string_counter", 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&unaligned_string_counter, TCL_LINK_INT); 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_last_needed_collation", 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&pzNeededCollation, TCL_LINK_STRING|TCL_LINK_READ_ONLY); 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_OS_WIN 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_os_type", 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_os_type, TCL_LINK_INT); 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_query_plan", 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&query_plan, TCL_LINK_STRING|TCL_LINK_READ_ONLY); 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_addop_trace", 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3VdbeAddopTrace, TCL_LINK_INT); 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_where_trace", 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3WhereTrace, TCL_LINK_INT); 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_os_trace", 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3OSTrace, TCL_LINK_INT); 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_wal_trace", 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3WalTrace, TCL_LINK_INT); 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DISKIO 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_opentemp_count", 57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_opentemp_count, TCL_LINK_INT); 57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_static_bind_value", 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite_static_bind_value, TCL_LINK_STRING); 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_static_bind_nbyte", 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite_static_bind_nbyte, TCL_LINK_INT); 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_temp_directory", 57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_temp_directory, TCL_LINK_STRING); 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "bitmask_size", 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&bitmask_size, TCL_LINK_INT|TCL_LINK_READ_ONLY); 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_sync_count", 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_sync_count, TCL_LINK_INT); 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_fullsync_count", 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_fullsync_count, TCL_LINK_INT); 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_TEST) 57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tcl_LinkVar(interp, "sqlite_fts3_enable_parentheses", 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)&sqlite3_fts3_enable_parentheses, TCL_LINK_INT); 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TCL_OK; 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5798