14f26d6c4Sdrh /* 24f26d6c4Sdrh ** 2004 May 26 34f26d6c4Sdrh ** 44f26d6c4Sdrh ** The author disclaims copyright to this source code. In place of 54f26d6c4Sdrh ** a legal notice, here is a blessing: 64f26d6c4Sdrh ** 74f26d6c4Sdrh ** May you do good and not evil. 84f26d6c4Sdrh ** May you find forgiveness for yourself and forgive others. 94f26d6c4Sdrh ** May you share freely, never taking more than you give. 104f26d6c4Sdrh ** 114f26d6c4Sdrh ************************************************************************* 124f26d6c4Sdrh ** 134f26d6c4Sdrh ** This file contains code use to implement APIs that are part of the 144f26d6c4Sdrh ** VDBE. 154f26d6c4Sdrh */ 164f26d6c4Sdrh #include "sqliteInt.h" 174f26d6c4Sdrh #include "vdbeInt.h" 1819e2d37fSdrh #include "os.h" 194f26d6c4Sdrh 20d89bd007Sdrh /* 21d89bd007Sdrh ** Return TRUE (non-zero) of the statement supplied as an argument needs 22d89bd007Sdrh ** to be recompiled. A statement needs to be recompiled whenever the 23d89bd007Sdrh ** execution environment changes in a way that would alter the program 24d89bd007Sdrh ** that sqlite3_prepare() generates. For example, if new functions or 25d89bd007Sdrh ** collating sequences are registered or if an authorizer function is 26d89bd007Sdrh ** added or changed. 27d89bd007Sdrh */ 28d89bd007Sdrh int sqlite3_expired(sqlite3_stmt *pStmt){ 29d89bd007Sdrh Vdbe *p = (Vdbe*)pStmt; 30d89bd007Sdrh return p==0 || p->expired; 31d89bd007Sdrh } 32d89bd007Sdrh 334f26d6c4Sdrh /**************************** sqlite3_value_ ******************************* 344f26d6c4Sdrh ** The following routines extract information from a Mem or sqlite3_value 354f26d6c4Sdrh ** structure. 364f26d6c4Sdrh */ 374f26d6c4Sdrh const void *sqlite3_value_blob(sqlite3_value *pVal){ 384f26d6c4Sdrh Mem *p = (Mem*)pVal; 394f26d6c4Sdrh if( p->flags & (MEM_Blob|MEM_Str) ){ 401e536953Sdanielk1977 sqlite3VdbeMemExpandBlob(0, p); 419310ef23Sdrh p->flags &= ~MEM_Str; 421f0feef8Sdrh p->flags |= MEM_Blob; 434f26d6c4Sdrh return p->z; 444f26d6c4Sdrh }else{ 454f26d6c4Sdrh return sqlite3_value_text(pVal); 464f26d6c4Sdrh } 474f26d6c4Sdrh } 484f26d6c4Sdrh int sqlite3_value_bytes(sqlite3_value *pVal){ 491e536953Sdanielk1977 return sqlite3ValueBytes(0, pVal, SQLITE_UTF8); 504f26d6c4Sdrh } 514f26d6c4Sdrh int sqlite3_value_bytes16(sqlite3_value *pVal){ 521e536953Sdanielk1977 return sqlite3ValueBytes(0, pVal, SQLITE_UTF16NATIVE); 534f26d6c4Sdrh } 544f26d6c4Sdrh double sqlite3_value_double(sqlite3_value *pVal){ 556a6124e2Sdrh return sqlite3VdbeRealValue((Mem*)pVal); 564f26d6c4Sdrh } 574f26d6c4Sdrh int sqlite3_value_int(sqlite3_value *pVal){ 586a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 594f26d6c4Sdrh } 60efad9995Sdrh sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ 616a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 624f26d6c4Sdrh } 634f26d6c4Sdrh const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ 641e536953Sdanielk1977 return (const unsigned char *)sqlite3ValueText(0, pVal, SQLITE_UTF8); 654f26d6c4Sdrh } 666c62608fSdrh #ifndef SQLITE_OMIT_UTF16 674f26d6c4Sdrh const void *sqlite3_value_text16(sqlite3_value* pVal){ 681e536953Sdanielk1977 return sqlite3ValueText(0, pVal, SQLITE_UTF16NATIVE); 694f26d6c4Sdrh } 70d8123366Sdanielk1977 const void *sqlite3_value_text16be(sqlite3_value *pVal){ 711e536953Sdanielk1977 return sqlite3ValueText(0, pVal, SQLITE_UTF16BE); 72d8123366Sdanielk1977 } 73d8123366Sdanielk1977 const void *sqlite3_value_text16le(sqlite3_value *pVal){ 741e536953Sdanielk1977 return sqlite3ValueText(0, pVal, SQLITE_UTF16LE); 75d8123366Sdanielk1977 } 766c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 774f26d6c4Sdrh int sqlite3_value_type(sqlite3_value* pVal){ 78f4479501Sdrh return pVal->type; 794f26d6c4Sdrh } 8029d72108Sdrh /* sqlite3_value_numeric_type() defined in vdbe.c */ 814f26d6c4Sdrh 824f26d6c4Sdrh /**************************** sqlite3_result_ ******************************* 834f26d6c4Sdrh ** The following routines are used by user-defined functions to specify 844f26d6c4Sdrh ** the function result. 854f26d6c4Sdrh */ 864f26d6c4Sdrh void sqlite3_result_blob( 874f26d6c4Sdrh sqlite3_context *pCtx, 884f26d6c4Sdrh const void *z, 894f26d6c4Sdrh int n, 90d8123366Sdanielk1977 void (*xDel)(void *) 914f26d6c4Sdrh ){ 925708d2deSdrh assert( n>=0 ); 931e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, 0, xDel); 944f26d6c4Sdrh } 954f26d6c4Sdrh void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ 964f26d6c4Sdrh sqlite3VdbeMemSetDouble(&pCtx->s, rVal); 974f26d6c4Sdrh } 984f26d6c4Sdrh void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ 994f26d6c4Sdrh pCtx->isError = 1; 1001e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); 1014f26d6c4Sdrh } 102a1686c9aSdanielk1977 #ifndef SQLITE_OMIT_UTF16 1034f26d6c4Sdrh void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ 1044f26d6c4Sdrh pCtx->isError = 1; 1051e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); 1064f26d6c4Sdrh } 107a1686c9aSdanielk1977 #endif 108f4479501Sdrh void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ 1094f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal); 1104f26d6c4Sdrh } 1114f26d6c4Sdrh void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ 1124f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, iVal); 1134f26d6c4Sdrh } 1144f26d6c4Sdrh void sqlite3_result_null(sqlite3_context *pCtx){ 115f4479501Sdrh sqlite3VdbeMemSetNull(&pCtx->s); 1164f26d6c4Sdrh } 1174f26d6c4Sdrh void sqlite3_result_text( 1184f26d6c4Sdrh sqlite3_context *pCtx, 1194f26d6c4Sdrh const char *z, 1204f26d6c4Sdrh int n, 121d8123366Sdanielk1977 void (*xDel)(void *) 1224f26d6c4Sdrh ){ 1231e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF8, xDel); 1244f26d6c4Sdrh } 1256c62608fSdrh #ifndef SQLITE_OMIT_UTF16 1264f26d6c4Sdrh void sqlite3_result_text16( 1274f26d6c4Sdrh sqlite3_context *pCtx, 1284f26d6c4Sdrh const void *z, 1294f26d6c4Sdrh int n, 130d8123366Sdanielk1977 void (*xDel)(void *) 1314f26d6c4Sdrh ){ 1321e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel); 133d8123366Sdanielk1977 } 134d8123366Sdanielk1977 void sqlite3_result_text16be( 135d8123366Sdanielk1977 sqlite3_context *pCtx, 136d8123366Sdanielk1977 const void *z, 137d8123366Sdanielk1977 int n, 138d8123366Sdanielk1977 void (*xDel)(void *) 139d8123366Sdanielk1977 ){ 1401e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF16BE, xDel); 141d8123366Sdanielk1977 } 142d8123366Sdanielk1977 void sqlite3_result_text16le( 143d8123366Sdanielk1977 sqlite3_context *pCtx, 144d8123366Sdanielk1977 const void *z, 145d8123366Sdanielk1977 int n, 146d8123366Sdanielk1977 void (*xDel)(void *) 147d8123366Sdanielk1977 ){ 1481e536953Sdanielk1977 sqlite3VdbeMemSetStr(0, &pCtx->s, z, n, SQLITE_UTF16LE, xDel); 1494f26d6c4Sdrh } 1506c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 1514f26d6c4Sdrh void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ 1521e536953Sdanielk1977 sqlite3VdbeMemCopy(0, &pCtx->s, pValue); 1534f26d6c4Sdrh } 154b026e05eSdrh void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ 155b026e05eSdrh sqlite3VdbeMemSetZeroBlob(&pCtx->s, n); 156b026e05eSdrh } 1574f26d6c4Sdrh 158a0206bc8Sdrh /* Force an SQLITE_TOOBIG error. */ 159a0206bc8Sdrh void sqlite3_result_error_toobig(sqlite3_context *pCtx){ 160a0206bc8Sdrh sqlite3VdbeMemSetZeroBlob(&pCtx->s, SQLITE_MAX_LENGTH+1); 161a0206bc8Sdrh } 162a0206bc8Sdrh 1634f26d6c4Sdrh 1644f26d6c4Sdrh /* 1654f26d6c4Sdrh ** Execute the statement pStmt, either until a row of data is ready, the 1664f26d6c4Sdrh ** statement is completely executed or an error occurs. 167b900aaf3Sdrh ** 168b900aaf3Sdrh ** This routine implements the bulk of the logic behind the sqlite_step() 169b900aaf3Sdrh ** API. The only thing omitted is the automatic recompile if a 170b900aaf3Sdrh ** schema change has occurred. That detail is handled by the 171b900aaf3Sdrh ** outer sqlite3_step() wrapper procedure. 1724f26d6c4Sdrh */ 173b900aaf3Sdrh static int sqlite3Step(Vdbe *p){ 1749bb575fdSdrh sqlite3 *db; 1754f26d6c4Sdrh int rc; 1764f26d6c4Sdrh 177efaaf579Sdanielk1977 /* Assert that malloc() has not failed */ 17817435752Sdrh db = p->db; 17917435752Sdrh assert( !db->mallocFailed ); 180261919ccSdanielk1977 1811bcdb0c0Sdrh if( p==0 || p->magic!=VDBE_MAGIC_RUN ){ 1824f26d6c4Sdrh return SQLITE_MISUSE; 1834f26d6c4Sdrh } 18491b48aa1Sdrh if( p->aborted ){ 18591b48aa1Sdrh return SQLITE_ABORT; 18691b48aa1Sdrh } 187a21c6b6fSdanielk1977 if( p->pc<=0 && p->expired ){ 188a21c6b6fSdanielk1977 if( p->rc==SQLITE_OK ){ 189a21c6b6fSdanielk1977 p->rc = SQLITE_SCHEMA; 190a21c6b6fSdanielk1977 } 191b900aaf3Sdrh rc = SQLITE_ERROR; 192b900aaf3Sdrh goto end_of_step; 193a21c6b6fSdanielk1977 } 1944f26d6c4Sdrh if( sqlite3SafetyOn(db) ){ 1954f26d6c4Sdrh p->rc = SQLITE_MISUSE; 1964f26d6c4Sdrh return SQLITE_MISUSE; 1974f26d6c4Sdrh } 1981d850a72Sdanielk1977 if( p->pc<0 ){ 19915ca1df1Sdrh /* If there are no other statements currently running, then 20015ca1df1Sdrh ** reset the interrupt flag. This prevents a call to sqlite3_interrupt 20115ca1df1Sdrh ** from interrupting a statement that has not yet started. 20215ca1df1Sdrh */ 20315ca1df1Sdrh if( db->activeVdbeCnt==0 ){ 20415ca1df1Sdrh db->u1.isInterrupted = 0; 20515ca1df1Sdrh } 20615ca1df1Sdrh 20719e2d37fSdrh #ifndef SQLITE_OMIT_TRACE 208c16a03b5Sdrh /* Invoke the trace callback if there is one 209c16a03b5Sdrh */ 21019e2d37fSdrh if( db->xTrace && !db->init.busy ){ 211c16a03b5Sdrh assert( p->nOp>0 ); 212c16a03b5Sdrh assert( p->aOp[p->nOp-1].opcode==OP_Noop ); 213c16a03b5Sdrh assert( p->aOp[p->nOp-1].p3!=0 ); 214c16a03b5Sdrh assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC ); 215c16a03b5Sdrh sqlite3SafetyOff(db); 216c16a03b5Sdrh db->xTrace(db->pTraceArg, p->aOp[p->nOp-1].p3); 217c16a03b5Sdrh if( sqlite3SafetyOn(db) ){ 218c16a03b5Sdrh p->rc = SQLITE_MISUSE; 219c16a03b5Sdrh return SQLITE_MISUSE; 220c16a03b5Sdrh } 221c16a03b5Sdrh } 22219e2d37fSdrh if( db->xProfile && !db->init.busy ){ 22319e2d37fSdrh double rNow; 224*b4b47411Sdanielk1977 sqlite3OsCurrentTime(db->pVfs, &rNow); 22519e2d37fSdrh p->startTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0; 22619e2d37fSdrh } 22719e2d37fSdrh #endif 228c16a03b5Sdrh 229c16a03b5Sdrh /* Print a copy of SQL as it is executed if the SQL_TRACE pragma is turned 230c16a03b5Sdrh ** on in debugging mode. 231c16a03b5Sdrh */ 232c16a03b5Sdrh #ifdef SQLITE_DEBUG 233c16a03b5Sdrh if( (db->flags & SQLITE_SqlTrace)!=0 ){ 234c16a03b5Sdrh sqlite3DebugPrintf("SQL-trace: %s\n", p->aOp[p->nOp-1].p3); 235c16a03b5Sdrh } 236c16a03b5Sdrh #endif /* SQLITE_DEBUG */ 237c16a03b5Sdrh 2381d850a72Sdanielk1977 db->activeVdbeCnt++; 2391d850a72Sdanielk1977 p->pc = 0; 2401d850a72Sdanielk1977 } 241b7f9164eSdrh #ifndef SQLITE_OMIT_EXPLAIN 2424f26d6c4Sdrh if( p->explain ){ 2434f26d6c4Sdrh rc = sqlite3VdbeList(p); 244b7f9164eSdrh }else 245b7f9164eSdrh #endif /* SQLITE_OMIT_EXPLAIN */ 246b7f9164eSdrh { 2474f26d6c4Sdrh rc = sqlite3VdbeExec(p); 2484f26d6c4Sdrh } 2494f26d6c4Sdrh 2504f26d6c4Sdrh if( sqlite3SafetyOff(db) ){ 2514f26d6c4Sdrh rc = SQLITE_MISUSE; 2524f26d6c4Sdrh } 2534f26d6c4Sdrh 25419e2d37fSdrh #ifndef SQLITE_OMIT_TRACE 25519e2d37fSdrh /* Invoke the profile callback if there is one 25619e2d37fSdrh */ 25719e2d37fSdrh if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy ){ 25819e2d37fSdrh double rNow; 25919e2d37fSdrh u64 elapseTime; 26019e2d37fSdrh 261*b4b47411Sdanielk1977 sqlite3OsCurrentTime(db->pVfs, &rNow); 26219e2d37fSdrh elapseTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0 - p->startTime; 26319e2d37fSdrh assert( p->nOp>0 ); 26419e2d37fSdrh assert( p->aOp[p->nOp-1].opcode==OP_Noop ); 26519e2d37fSdrh assert( p->aOp[p->nOp-1].p3!=0 ); 26619e2d37fSdrh assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC ); 26719e2d37fSdrh db->xProfile(db->pProfileArg, p->aOp[p->nOp-1].p3, elapseTime); 26819e2d37fSdrh } 26919e2d37fSdrh #endif 27019e2d37fSdrh 27197a227c9Sdanielk1977 sqlite3Error(p->db, rc, 0); 27276e8d1a2Sdanielk1977 p->rc = sqlite3ApiExit(p->db, p->rc); 273b900aaf3Sdrh end_of_step: 2744ac285a1Sdrh assert( (rc&0xff)==rc ); 275b900aaf3Sdrh if( p->zSql && (rc&0xff)<SQLITE_ROW ){ 276b900aaf3Sdrh /* This behavior occurs if sqlite3_prepare_v2() was used to build 277b900aaf3Sdrh ** the prepared statement. Return error codes directly */ 278612642deSdanielk1977 sqlite3Error(p->db, p->rc, 0); 279b900aaf3Sdrh return p->rc; 280b900aaf3Sdrh }else{ 281b900aaf3Sdrh /* This is for legacy sqlite3_prepare() builds and when the code 282b900aaf3Sdrh ** is SQLITE_ROW or SQLITE_DONE */ 28376e8d1a2Sdanielk1977 return rc; 2844f26d6c4Sdrh } 285b900aaf3Sdrh } 286b900aaf3Sdrh 287b900aaf3Sdrh /* 288b900aaf3Sdrh ** This is the top-level implementation of sqlite3_step(). Call 289b900aaf3Sdrh ** sqlite3Step() to do most of the work. If a schema error occurs, 290b900aaf3Sdrh ** call sqlite3Reprepare() and try again. 291b900aaf3Sdrh */ 292b900aaf3Sdrh #ifdef SQLITE_OMIT_PARSER 293b900aaf3Sdrh int sqlite3_step(sqlite3_stmt *pStmt){ 294b900aaf3Sdrh return sqlite3Step((Vdbe*)pStmt); 295b900aaf3Sdrh } 296b900aaf3Sdrh #else 297b900aaf3Sdrh int sqlite3_step(sqlite3_stmt *pStmt){ 298b900aaf3Sdrh int cnt = 0; 299b900aaf3Sdrh int rc; 300b900aaf3Sdrh Vdbe *v = (Vdbe*)pStmt; 301b900aaf3Sdrh while( (rc = sqlite3Step(v))==SQLITE_SCHEMA 302b900aaf3Sdrh && cnt++ < 5 303b900aaf3Sdrh && sqlite3Reprepare(v) ){ 304b900aaf3Sdrh sqlite3_reset(pStmt); 305b900aaf3Sdrh v->expired = 0; 306b900aaf3Sdrh } 307b900aaf3Sdrh return rc; 308b900aaf3Sdrh } 309b900aaf3Sdrh #endif 3104f26d6c4Sdrh 3114f26d6c4Sdrh /* 312eb2e176aSdrh ** Extract the user data from a sqlite3_context structure and return a 313eb2e176aSdrh ** pointer to it. 314eb2e176aSdrh */ 315eb2e176aSdrh void *sqlite3_user_data(sqlite3_context *p){ 316eb2e176aSdrh assert( p && p->pFunc ); 317eb2e176aSdrh return p->pFunc->pUserData; 318eb2e176aSdrh } 319eb2e176aSdrh 320eb2e176aSdrh /* 321b7481e70Sdrh ** The following is the implementation of an SQL function that always 322b7481e70Sdrh ** fails with an error message stating that the function is used in the 323b7481e70Sdrh ** wrong context. The sqlite3_overload_function() API might construct 324b7481e70Sdrh ** SQL function that use this routine so that the functions will exist 325b7481e70Sdrh ** for name resolution but are actually overloaded by the xFindFunction 326b7481e70Sdrh ** method of virtual tables. 327b7481e70Sdrh */ 328b7481e70Sdrh void sqlite3InvalidFunction( 329b7481e70Sdrh sqlite3_context *context, /* The function calling context */ 330b7481e70Sdrh int argc, /* Number of arguments to the function */ 331b7481e70Sdrh sqlite3_value **argv /* Value of each argument */ 332b7481e70Sdrh ){ 333b7481e70Sdrh const char *zName = context->pFunc->zName; 334b7481e70Sdrh char *zErr; 3351e536953Sdanielk1977 zErr = sqlite3MPrintf(0, 336b7481e70Sdrh "unable to use function %s in the requested context", zName); 337b7481e70Sdrh sqlite3_result_error(context, zErr, -1); 3381e536953Sdanielk1977 sqlite3_free(zErr); 339b7481e70Sdrh } 340b7481e70Sdrh 341b7481e70Sdrh /* 342eb2e176aSdrh ** Allocate or return the aggregate context for a user function. A new 343eb2e176aSdrh ** context is allocated on the first call. Subsequent calls return the 344eb2e176aSdrh ** same context that was returned on prior calls. 345eb2e176aSdrh */ 346eb2e176aSdrh void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ 347abfcea25Sdrh Mem *pMem = p->pMem; 348825c662eSdrh assert( p && p->pFunc && p->pFunc->xStep ); 349a10a34b8Sdrh if( (pMem->flags & MEM_Agg)==0 ){ 350a10a34b8Sdrh if( nByte==0 ){ 351a10a34b8Sdrh assert( pMem->flags==MEM_Null ); 352a10a34b8Sdrh pMem->z = 0; 353a10a34b8Sdrh }else{ 354abfcea25Sdrh pMem->flags = MEM_Agg; 3551e536953Sdanielk1977 pMem->xDel = sqlite3_free; 3563c024d69Sdrh pMem->u.pDef = p->pFunc; 357eb2e176aSdrh if( nByte<=NBFS ){ 358abfcea25Sdrh pMem->z = pMem->zShort; 359abfcea25Sdrh memset(pMem->z, 0, nByte); 360eb2e176aSdrh }else{ 36117435752Sdrh pMem->z = sqlite3DbMallocZero(p->db, nByte); 362eb2e176aSdrh } 363eb2e176aSdrh } 364a10a34b8Sdrh } 365abfcea25Sdrh return (void*)pMem->z; 366eb2e176aSdrh } 367eb2e176aSdrh 368eb2e176aSdrh /* 369682f68b0Sdanielk1977 ** Return the auxilary data pointer, if any, for the iArg'th argument to 370682f68b0Sdanielk1977 ** the user-function defined by pCtx. 371682f68b0Sdanielk1977 */ 372682f68b0Sdanielk1977 void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ 373682f68b0Sdanielk1977 VdbeFunc *pVdbeFunc = pCtx->pVdbeFunc; 374682f68b0Sdanielk1977 if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){ 375682f68b0Sdanielk1977 return 0; 376682f68b0Sdanielk1977 } 377f92c7ff7Sdrh return pVdbeFunc->apAux[iArg].pAux; 378682f68b0Sdanielk1977 } 379682f68b0Sdanielk1977 380682f68b0Sdanielk1977 /* 381682f68b0Sdanielk1977 ** Set the auxilary data pointer and delete function, for the iArg'th 382682f68b0Sdanielk1977 ** argument to the user-function defined by pCtx. Any previous value is 383682f68b0Sdanielk1977 ** deleted by calling the delete function specified when it was set. 384682f68b0Sdanielk1977 */ 385682f68b0Sdanielk1977 void sqlite3_set_auxdata( 386682f68b0Sdanielk1977 sqlite3_context *pCtx, 387682f68b0Sdanielk1977 int iArg, 388682f68b0Sdanielk1977 void *pAux, 389682f68b0Sdanielk1977 void (*xDelete)(void*) 390682f68b0Sdanielk1977 ){ 391682f68b0Sdanielk1977 struct AuxData *pAuxData; 392f92c7ff7Sdrh VdbeFunc *pVdbeFunc; 393e0fc5261Sdanielk1977 if( iArg<0 ) goto failed; 394682f68b0Sdanielk1977 395f92c7ff7Sdrh pVdbeFunc = pCtx->pVdbeFunc; 396f92c7ff7Sdrh if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){ 39731dad9daSdanielk1977 int nAux = (pVdbeFunc ? pVdbeFunc->nAux : 0); 398998da3a2Sdrh int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg; 39917435752Sdrh pVdbeFunc = sqlite3_realloc(pVdbeFunc, nMalloc); 40017435752Sdrh if( !pVdbeFunc ){ 40117435752Sdrh pCtx->db->mallocFailed = 1; 40217435752Sdrh goto failed; 40317435752Sdrh } 40453f733c7Sdrh pCtx->pVdbeFunc = pVdbeFunc; 40531dad9daSdanielk1977 memset(&pVdbeFunc->apAux[nAux], 0, sizeof(struct AuxData)*(iArg+1-nAux)); 406998da3a2Sdrh pVdbeFunc->nAux = iArg+1; 407998da3a2Sdrh pVdbeFunc->pFunc = pCtx->pFunc; 408682f68b0Sdanielk1977 } 409682f68b0Sdanielk1977 410f92c7ff7Sdrh pAuxData = &pVdbeFunc->apAux[iArg]; 411682f68b0Sdanielk1977 if( pAuxData->pAux && pAuxData->xDelete ){ 412682f68b0Sdanielk1977 pAuxData->xDelete(pAuxData->pAux); 413682f68b0Sdanielk1977 } 414682f68b0Sdanielk1977 pAuxData->pAux = pAux; 415682f68b0Sdanielk1977 pAuxData->xDelete = xDelete; 416e0fc5261Sdanielk1977 return; 417e0fc5261Sdanielk1977 418e0fc5261Sdanielk1977 failed: 419e0fc5261Sdanielk1977 if( xDelete ){ 420e0fc5261Sdanielk1977 xDelete(pAux); 421e0fc5261Sdanielk1977 } 422682f68b0Sdanielk1977 } 423682f68b0Sdanielk1977 424682f68b0Sdanielk1977 /* 425eb2e176aSdrh ** Return the number of times the Step function of a aggregate has been 426eb2e176aSdrh ** called. 427eb2e176aSdrh ** 428cf85a51cSdrh ** This function is deprecated. Do not use it for new code. It is 429cf85a51cSdrh ** provide only to avoid breaking legacy code. New aggregate function 430cf85a51cSdrh ** implementations should keep their own counts within their aggregate 431cf85a51cSdrh ** context. 432eb2e176aSdrh */ 433eb2e176aSdrh int sqlite3_aggregate_count(sqlite3_context *p){ 434eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 435abfcea25Sdrh return p->pMem->n; 436eb2e176aSdrh } 437eb2e176aSdrh 438eb2e176aSdrh /* 4394f26d6c4Sdrh ** Return the number of columns in the result set for the statement pStmt. 4404f26d6c4Sdrh */ 4414f26d6c4Sdrh int sqlite3_column_count(sqlite3_stmt *pStmt){ 4424f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 4431bcdb0c0Sdrh return pVm ? pVm->nResColumn : 0; 4444f26d6c4Sdrh } 4454f26d6c4Sdrh 4464f26d6c4Sdrh /* 4474f26d6c4Sdrh ** Return the number of values available from the current row of the 4484f26d6c4Sdrh ** currently executing statement pStmt. 4494f26d6c4Sdrh */ 4504f26d6c4Sdrh int sqlite3_data_count(sqlite3_stmt *pStmt){ 4514f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 4521bcdb0c0Sdrh if( pVm==0 || !pVm->resOnStack ) return 0; 4534f26d6c4Sdrh return pVm->nResColumn; 4544f26d6c4Sdrh } 4554f26d6c4Sdrh 4564f26d6c4Sdrh 4574f26d6c4Sdrh /* 4584f26d6c4Sdrh ** Check to see if column iCol of the given statement is valid. If 4594f26d6c4Sdrh ** it is, return a pointer to the Mem for the value of that column. 4604f26d6c4Sdrh ** If iCol is not valid, return a pointer to a Mem which has a value 4614f26d6c4Sdrh ** of NULL. 4624f26d6c4Sdrh */ 4634f26d6c4Sdrh static Mem *columnMem(sqlite3_stmt *pStmt, int i){ 4644f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 4654f26d6c4Sdrh int vals = sqlite3_data_count(pStmt); 466b21f87ddSdrh if( pVm==0 || pVm->resOnStack==0 || i>=pVm->nResColumn || i<0 ){ 4677a521cfbSdrh static const Mem nullMem = {{0}, 0.0, "", 0, MEM_Null, SQLITE_NULL }; 4684f26d6c4Sdrh sqlite3Error(pVm->db, SQLITE_RANGE, 0); 4690f7eb611Sdrh return (Mem*)&nullMem; 4704f26d6c4Sdrh } 4714f26d6c4Sdrh return &pVm->pTos[(1-vals)+i]; 4724f26d6c4Sdrh } 4734f26d6c4Sdrh 4742e588c75Sdanielk1977 /* 4752e588c75Sdanielk1977 ** This function is called after invoking an sqlite3_value_XXX function on a 4762e588c75Sdanielk1977 ** column value (i.e. a value returned by evaluating an SQL expression in the 4772e588c75Sdanielk1977 ** select list of a SELECT statement) that may cause a malloc() failure. If 4782e588c75Sdanielk1977 ** malloc() has failed, the threads mallocFailed flag is cleared and the result 4792e588c75Sdanielk1977 ** code of statement pStmt set to SQLITE_NOMEM. 4802e588c75Sdanielk1977 ** 4812e588c75Sdanielk1977 ** Specificly, this is called from within: 4822e588c75Sdanielk1977 ** 4832e588c75Sdanielk1977 ** sqlite3_column_int() 4842e588c75Sdanielk1977 ** sqlite3_column_int64() 4852e588c75Sdanielk1977 ** sqlite3_column_text() 4862e588c75Sdanielk1977 ** sqlite3_column_text16() 4872e588c75Sdanielk1977 ** sqlite3_column_real() 4882e588c75Sdanielk1977 ** sqlite3_column_bytes() 4892e588c75Sdanielk1977 ** sqlite3_column_bytes16() 4902e588c75Sdanielk1977 ** 4912e588c75Sdanielk1977 ** But not for sqlite3_column_blob(), which never calls malloc(). 4922e588c75Sdanielk1977 */ 4932e588c75Sdanielk1977 static void columnMallocFailure(sqlite3_stmt *pStmt) 4942e588c75Sdanielk1977 { 4952e588c75Sdanielk1977 /* If malloc() failed during an encoding conversion within an 4962e588c75Sdanielk1977 ** sqlite3_column_XXX API, then set the return code of the statement to 4972e588c75Sdanielk1977 ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR 4982e588c75Sdanielk1977 ** and _finalize() will return NOMEM. 4992e588c75Sdanielk1977 */ 50054f0198eSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 50154f0198eSdanielk1977 p->rc = sqlite3ApiExit(0, p->rc); 5022e588c75Sdanielk1977 } 5032e588c75Sdanielk1977 5044f26d6c4Sdrh /**************************** sqlite3_column_ ******************************* 5054f26d6c4Sdrh ** The following routines are used to access elements of the current row 5064f26d6c4Sdrh ** in the result set. 5074f26d6c4Sdrh */ 508c572ef7fSdanielk1977 const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ 5092e588c75Sdanielk1977 const void *val; 5102e588c75Sdanielk1977 val = sqlite3_value_blob( columnMem(pStmt,i) ); 511c9cf901dSdanielk1977 /* Even though there is no encoding conversion, value_blob() might 512c9cf901dSdanielk1977 ** need to call malloc() to expand the result of a zeroblob() 513c9cf901dSdanielk1977 ** expression. 514c9cf901dSdanielk1977 */ 515c9cf901dSdanielk1977 columnMallocFailure(pStmt); 5162e588c75Sdanielk1977 return val; 517c572ef7fSdanielk1977 } 5184f26d6c4Sdrh int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ 5192e588c75Sdanielk1977 int val = sqlite3_value_bytes( columnMem(pStmt,i) ); 5202e588c75Sdanielk1977 columnMallocFailure(pStmt); 5212e588c75Sdanielk1977 return val; 5224f26d6c4Sdrh } 5234f26d6c4Sdrh int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ 5242e588c75Sdanielk1977 int val = sqlite3_value_bytes16( columnMem(pStmt,i) ); 5252e588c75Sdanielk1977 columnMallocFailure(pStmt); 5262e588c75Sdanielk1977 return val; 5274f26d6c4Sdrh } 5284f26d6c4Sdrh double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ 5292e588c75Sdanielk1977 double val = sqlite3_value_double( columnMem(pStmt,i) ); 5302e588c75Sdanielk1977 columnMallocFailure(pStmt); 5312e588c75Sdanielk1977 return val; 5324f26d6c4Sdrh } 5334f26d6c4Sdrh int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ 5342e588c75Sdanielk1977 int val = sqlite3_value_int( columnMem(pStmt,i) ); 5352e588c75Sdanielk1977 columnMallocFailure(pStmt); 5362e588c75Sdanielk1977 return val; 5374f26d6c4Sdrh } 538efad9995Sdrh sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ 5392e588c75Sdanielk1977 sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) ); 5402e588c75Sdanielk1977 columnMallocFailure(pStmt); 5412e588c75Sdanielk1977 return val; 5424f26d6c4Sdrh } 5434f26d6c4Sdrh const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ 5442e588c75Sdanielk1977 const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) ); 5452e588c75Sdanielk1977 columnMallocFailure(pStmt); 5462e588c75Sdanielk1977 return val; 5474f26d6c4Sdrh } 548d1e4733dSdrh sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){ 549d1e4733dSdrh return columnMem(pStmt, i); 550d1e4733dSdrh } 5516c62608fSdrh #ifndef SQLITE_OMIT_UTF16 5524f26d6c4Sdrh const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ 5532e588c75Sdanielk1977 const void *val = sqlite3_value_text16( columnMem(pStmt,i) ); 5542e588c75Sdanielk1977 columnMallocFailure(pStmt); 5552e588c75Sdanielk1977 return val; 5564f26d6c4Sdrh } 5576c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 5584f26d6c4Sdrh int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ 5594f26d6c4Sdrh return sqlite3_value_type( columnMem(pStmt,i) ); 5604f26d6c4Sdrh } 5614f26d6c4Sdrh 56229d72108Sdrh /* The following function is experimental and subject to change or 56329d72108Sdrh ** removal */ 56429d72108Sdrh /*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){ 56529d72108Sdrh ** return sqlite3_value_numeric_type( columnMem(pStmt,i) ); 56629d72108Sdrh **} 56729d72108Sdrh */ 56829d72108Sdrh 5695e2517e1Sdrh /* 5705e2517e1Sdrh ** Convert the N-th element of pStmt->pColName[] into a string using 5715e2517e1Sdrh ** xFunc() then return that string. If N is out of range, return 0. 572e590fbdeSdrh ** 573e590fbdeSdrh ** There are up to 5 names for each column. useType determines which 574e590fbdeSdrh ** name is returned. Here are the names: 575e590fbdeSdrh ** 576e590fbdeSdrh ** 0 The column name as it should be displayed for output 577e590fbdeSdrh ** 1 The datatype name for the column 578e590fbdeSdrh ** 2 The name of the database that the column derives from 579e590fbdeSdrh ** 3 The name of the table that the column derives from 580e590fbdeSdrh ** 4 The name of the table column that the result column derives from 581e590fbdeSdrh ** 582e590fbdeSdrh ** If the result is not a simple column reference (if it is an expression 583e590fbdeSdrh ** or a constant) then useTypes 2, 3, and 4 return NULL. 5845e2517e1Sdrh */ 5855e2517e1Sdrh static const void *columnName( 5865e2517e1Sdrh sqlite3_stmt *pStmt, 5875e2517e1Sdrh int N, 5885e2517e1Sdrh const void *(*xFunc)(Mem*), 5895e2517e1Sdrh int useType 5905e2517e1Sdrh ){ 59100fd957bSdanielk1977 const void *ret; 5925e2517e1Sdrh Vdbe *p = (Vdbe *)pStmt; 5935e2517e1Sdrh int n = sqlite3_column_count(pStmt); 5945e2517e1Sdrh 5955e2517e1Sdrh if( p==0 || N>=n || N<0 ){ 5965e2517e1Sdrh return 0; 5975e2517e1Sdrh } 598e590fbdeSdrh N += useType*n; 59900fd957bSdanielk1977 ret = xFunc(&p->aColName[N]); 60000fd957bSdanielk1977 60100fd957bSdanielk1977 /* A malloc may have failed inside of the xFunc() call. If this is the case, 60200fd957bSdanielk1977 ** clear the mallocFailed flag and return NULL. 60300fd957bSdanielk1977 */ 60454f0198eSdanielk1977 sqlite3ApiExit(0, 0); 60500fd957bSdanielk1977 return ret; 6065e2517e1Sdrh } 6075e2517e1Sdrh 6084f26d6c4Sdrh /* 6094f26d6c4Sdrh ** Return the name of the Nth column of the result set returned by SQL 6104f26d6c4Sdrh ** statement pStmt. 6114f26d6c4Sdrh */ 6124f26d6c4Sdrh const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ 613955de52cSdanielk1977 return columnName( 614955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); 6154f26d6c4Sdrh } 616e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 617e590fbdeSdrh const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ 618955de52cSdanielk1977 return columnName( 619955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); 620e590fbdeSdrh } 621e590fbdeSdrh #endif 6224f26d6c4Sdrh 6234f26d6c4Sdrh /* 6246c62608fSdrh ** Return the column declaration type (if applicable) of the 'i'th column 625e590fbdeSdrh ** of the result set of SQL statement pStmt. 6266c62608fSdrh */ 6276c62608fSdrh const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ 628955de52cSdanielk1977 return columnName( 629955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); 6306c62608fSdrh } 6316c62608fSdrh #ifndef SQLITE_OMIT_UTF16 63276d505baSdanielk1977 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ 633955de52cSdanielk1977 return columnName( 634955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); 6354f26d6c4Sdrh } 6366c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 6374f26d6c4Sdrh 6384b1ae99dSdanielk1977 #ifdef SQLITE_ENABLE_COLUMN_METADATA 639e590fbdeSdrh /* 640e590fbdeSdrh ** Return the name of the database from which a result column derives. 641e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 642e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 643e590fbdeSdrh */ 644e590fbdeSdrh const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ 645955de52cSdanielk1977 return columnName( 646955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); 647e590fbdeSdrh } 648e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 649e590fbdeSdrh const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ 650955de52cSdanielk1977 return columnName( 651955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); 652e590fbdeSdrh } 653e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 654e590fbdeSdrh 655e590fbdeSdrh /* 656e590fbdeSdrh ** Return the name of the table from which a result column derives. 657e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 658e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 659e590fbdeSdrh */ 660e590fbdeSdrh const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ 661955de52cSdanielk1977 return columnName( 662955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); 663e590fbdeSdrh } 664e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 665e590fbdeSdrh const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ 666955de52cSdanielk1977 return columnName( 667955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); 668e590fbdeSdrh } 669e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 670e590fbdeSdrh 671e590fbdeSdrh /* 672e590fbdeSdrh ** Return the name of the table column from which a result column derives. 673e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 674e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 675e590fbdeSdrh */ 676e590fbdeSdrh const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ 677955de52cSdanielk1977 return columnName( 678955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); 679e590fbdeSdrh } 680e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 681e590fbdeSdrh const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ 682955de52cSdanielk1977 return columnName( 683955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); 684e590fbdeSdrh } 685e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 6864b1ae99dSdanielk1977 #endif /* SQLITE_ENABLE_COLUMN_METADATA */ 687e590fbdeSdrh 688e590fbdeSdrh 6894f26d6c4Sdrh /******************************* sqlite3_bind_ *************************** 6904f26d6c4Sdrh ** 6914f26d6c4Sdrh ** Routines used to attach values to wildcards in a compiled SQL statement. 6924f26d6c4Sdrh */ 6934f26d6c4Sdrh /* 6944f26d6c4Sdrh ** Unbind the value bound to variable i in virtual machine p. This is the 6954f26d6c4Sdrh ** the same as binding a NULL value to the column. If the "i" parameter is 6964f26d6c4Sdrh ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. 6974f26d6c4Sdrh ** 6984f26d6c4Sdrh ** The error code stored in database p->db is overwritten with the return 6994f26d6c4Sdrh ** value in any case. 7004f26d6c4Sdrh */ 7014f26d6c4Sdrh static int vdbeUnbind(Vdbe *p, int i){ 7024f26d6c4Sdrh Mem *pVar; 7031bcdb0c0Sdrh if( p==0 || p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ 704473d179dSdrh if( p ) sqlite3Error(p->db, SQLITE_MISUSE, 0); 7054f26d6c4Sdrh return SQLITE_MISUSE; 7064f26d6c4Sdrh } 7074f26d6c4Sdrh if( i<1 || i>p->nVar ){ 7084f26d6c4Sdrh sqlite3Error(p->db, SQLITE_RANGE, 0); 7094f26d6c4Sdrh return SQLITE_RANGE; 7104f26d6c4Sdrh } 7114f26d6c4Sdrh i--; 712290c1948Sdrh pVar = &p->aVar[i]; 713d8123366Sdanielk1977 sqlite3VdbeMemRelease(pVar); 7144f26d6c4Sdrh pVar->flags = MEM_Null; 7154f26d6c4Sdrh sqlite3Error(p->db, SQLITE_OK, 0); 7164f26d6c4Sdrh return SQLITE_OK; 7174f26d6c4Sdrh } 7184f26d6c4Sdrh 7194f26d6c4Sdrh /* 7205e2517e1Sdrh ** Bind a text or BLOB value. 7214f26d6c4Sdrh */ 7225e2517e1Sdrh static int bindText( 723f4479501Sdrh sqlite3_stmt *pStmt, 7244f26d6c4Sdrh int i, 7254f26d6c4Sdrh const void *zData, 7264f26d6c4Sdrh int nData, 7275e2517e1Sdrh void (*xDel)(void*), 7285e2517e1Sdrh int encoding 7294f26d6c4Sdrh ){ 7304f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 7314f26d6c4Sdrh Mem *pVar; 7324f26d6c4Sdrh int rc; 7334f26d6c4Sdrh 7344f26d6c4Sdrh rc = vdbeUnbind(p, i); 735feac5f8dSdrh if( rc || zData==0 ){ 7364f26d6c4Sdrh return rc; 7374f26d6c4Sdrh } 738290c1948Sdrh pVar = &p->aVar[i-1]; 7391e536953Sdanielk1977 rc = sqlite3VdbeMemSetStr(0, pVar, zData, nData, encoding, xDel); 7405e2517e1Sdrh if( rc==SQLITE_OK && encoding!=0 ){ 7411e536953Sdanielk1977 rc = sqlite3VdbeChangeEncoding(p->db, pVar, ENC(p->db)); 7425e2517e1Sdrh } 74354f0198eSdanielk1977 7441e536953Sdanielk1977 sqlite3Error(p->db, rc, 0); 7451e536953Sdanielk1977 return sqlite3ApiExit(p->db, rc); 7465e2517e1Sdrh } 7475e2517e1Sdrh 7485e2517e1Sdrh 7495e2517e1Sdrh /* 7505e2517e1Sdrh ** Bind a blob value to an SQL statement variable. 7515e2517e1Sdrh */ 7525e2517e1Sdrh int sqlite3_bind_blob( 7535e2517e1Sdrh sqlite3_stmt *pStmt, 7545e2517e1Sdrh int i, 7555e2517e1Sdrh const void *zData, 7565e2517e1Sdrh int nData, 7575e2517e1Sdrh void (*xDel)(void*) 7585e2517e1Sdrh ){ 7595e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, 0); 7605e2517e1Sdrh } 7614f26d6c4Sdrh int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ 7624f26d6c4Sdrh int rc; 7634f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 7644f26d6c4Sdrh rc = vdbeUnbind(p, i); 7654f26d6c4Sdrh if( rc==SQLITE_OK ){ 766290c1948Sdrh sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); 7674f26d6c4Sdrh } 768f4618891Sdanielk1977 return rc; 7694f26d6c4Sdrh } 7704f26d6c4Sdrh int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ 771efad9995Sdrh return sqlite3_bind_int64(p, i, (i64)iValue); 7724f26d6c4Sdrh } 773efad9995Sdrh int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ 7744f26d6c4Sdrh int rc; 7754f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 7764f26d6c4Sdrh rc = vdbeUnbind(p, i); 7774f26d6c4Sdrh if( rc==SQLITE_OK ){ 778290c1948Sdrh sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); 7794f26d6c4Sdrh } 7804f26d6c4Sdrh return rc; 7814f26d6c4Sdrh } 7824f26d6c4Sdrh int sqlite3_bind_null(sqlite3_stmt* p, int i){ 7834f26d6c4Sdrh return vdbeUnbind((Vdbe *)p, i); 7844f26d6c4Sdrh } 7854f26d6c4Sdrh int sqlite3_bind_text( 7864f26d6c4Sdrh sqlite3_stmt *pStmt, 7874f26d6c4Sdrh int i, 7884f26d6c4Sdrh const char *zData, 7894f26d6c4Sdrh int nData, 790d8123366Sdanielk1977 void (*xDel)(void*) 7914f26d6c4Sdrh ){ 7925e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); 7934f26d6c4Sdrh } 7946c62608fSdrh #ifndef SQLITE_OMIT_UTF16 7954f26d6c4Sdrh int sqlite3_bind_text16( 7964f26d6c4Sdrh sqlite3_stmt *pStmt, 7974f26d6c4Sdrh int i, 7984f26d6c4Sdrh const void *zData, 7994f26d6c4Sdrh int nData, 800d8123366Sdanielk1977 void (*xDel)(void*) 8014f26d6c4Sdrh ){ 8025e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); 8034f26d6c4Sdrh } 8046c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 80526e4144dSdanielk1977 int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ 80626e4144dSdanielk1977 int rc; 80726e4144dSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 80826e4144dSdanielk1977 rc = vdbeUnbind(p, i); 80926e4144dSdanielk1977 if( rc==SQLITE_OK ){ 8101e536953Sdanielk1977 rc = sqlite3VdbeMemCopy(0, &p->aVar[i-1], pValue); 81126e4144dSdanielk1977 } 81226e4144dSdanielk1977 return rc; 81326e4144dSdanielk1977 } 814b026e05eSdrh int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ 815b026e05eSdrh int rc; 816b026e05eSdrh Vdbe *p = (Vdbe *)pStmt; 817b026e05eSdrh rc = vdbeUnbind(p, i); 818b026e05eSdrh if( rc==SQLITE_OK ){ 819b026e05eSdrh sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); 820b026e05eSdrh } 821b026e05eSdrh return rc; 822b026e05eSdrh } 82375f6a032Sdrh 82475f6a032Sdrh /* 82575f6a032Sdrh ** Return the number of wildcards that can be potentially bound to. 82675f6a032Sdrh ** This routine is added to support DBD::SQLite. 82775f6a032Sdrh */ 82875f6a032Sdrh int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ 82992febd92Sdrh Vdbe *p = (Vdbe*)pStmt; 83092febd92Sdrh return p ? p->nVar : 0; 83175f6a032Sdrh } 832895d7472Sdrh 833895d7472Sdrh /* 834fa6bc000Sdrh ** Create a mapping from variable numbers to variable names 835fa6bc000Sdrh ** in the Vdbe.azVar[] array, if such a mapping does not already 836fa6bc000Sdrh ** exist. 837895d7472Sdrh */ 838fa6bc000Sdrh static void createVarMap(Vdbe *p){ 839895d7472Sdrh if( !p->okVar ){ 840895d7472Sdrh int j; 841895d7472Sdrh Op *pOp; 842895d7472Sdrh for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){ 843895d7472Sdrh if( pOp->opcode==OP_Variable ){ 844895d7472Sdrh assert( pOp->p1>0 && pOp->p1<=p->nVar ); 845895d7472Sdrh p->azVar[pOp->p1-1] = pOp->p3; 846895d7472Sdrh } 847895d7472Sdrh } 848895d7472Sdrh p->okVar = 1; 849895d7472Sdrh } 850fa6bc000Sdrh } 851fa6bc000Sdrh 852fa6bc000Sdrh /* 853fa6bc000Sdrh ** Return the name of a wildcard parameter. Return NULL if the index 854fa6bc000Sdrh ** is out of range or if the wildcard is unnamed. 855fa6bc000Sdrh ** 856fa6bc000Sdrh ** The result is always UTF-8. 857fa6bc000Sdrh */ 858fa6bc000Sdrh const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ 859fa6bc000Sdrh Vdbe *p = (Vdbe*)pStmt; 860fa6bc000Sdrh if( p==0 || i<1 || i>p->nVar ){ 861fa6bc000Sdrh return 0; 862fa6bc000Sdrh } 863fa6bc000Sdrh createVarMap(p); 864895d7472Sdrh return p->azVar[i-1]; 865895d7472Sdrh } 866fa6bc000Sdrh 867fa6bc000Sdrh /* 868fa6bc000Sdrh ** Given a wildcard parameter name, return the index of the variable 869fa6bc000Sdrh ** with that name. If there is no variable with the given name, 870fa6bc000Sdrh ** return 0. 871fa6bc000Sdrh */ 872fa6bc000Sdrh int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ 873fa6bc000Sdrh Vdbe *p = (Vdbe*)pStmt; 874fa6bc000Sdrh int i; 875fa6bc000Sdrh if( p==0 ){ 876fa6bc000Sdrh return 0; 877fa6bc000Sdrh } 878fa6bc000Sdrh createVarMap(p); 8796a8903c3Sdrh if( zName ){ 880fa6bc000Sdrh for(i=0; i<p->nVar; i++){ 881971a7c87Sdrh const char *z = p->azVar[i]; 8826a8903c3Sdrh if( z && strcmp(z,zName)==0 ){ 883fa6bc000Sdrh return i+1; 884fa6bc000Sdrh } 885fa6bc000Sdrh } 8866a8903c3Sdrh } 887fa6bc000Sdrh return 0; 888fa6bc000Sdrh } 889f8db1bc0Sdrh 89051942bc3Sdrh /* 891f8db1bc0Sdrh ** Transfer all bindings from the first statement over to the second. 892f8db1bc0Sdrh ** If the two statements contain a different number of bindings, then 893f8db1bc0Sdrh ** an SQLITE_ERROR is returned. 894f8db1bc0Sdrh */ 895f8db1bc0Sdrh int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ 896f8db1bc0Sdrh Vdbe *pFrom = (Vdbe*)pFromStmt; 897f8db1bc0Sdrh Vdbe *pTo = (Vdbe*)pToStmt; 898f8db1bc0Sdrh int i, rc = SQLITE_OK; 899f8db1bc0Sdrh if( (pFrom->magic!=VDBE_MAGIC_RUN && pFrom->magic!=VDBE_MAGIC_HALT) 900f8db1bc0Sdrh || (pTo->magic!=VDBE_MAGIC_RUN && pTo->magic!=VDBE_MAGIC_HALT) ){ 901f8db1bc0Sdrh return SQLITE_MISUSE; 902f8db1bc0Sdrh } 903f8db1bc0Sdrh if( pFrom->nVar!=pTo->nVar ){ 904f8db1bc0Sdrh return SQLITE_ERROR; 905f8db1bc0Sdrh } 906f8db1bc0Sdrh for(i=0; rc==SQLITE_OK && i<pFrom->nVar; i++){ 907950f054cSdanielk1977 sqlite3MallocDisallow(); 9081e536953Sdanielk1977 rc = sqlite3VdbeMemMove(0, &pTo->aVar[i], &pFrom->aVar[i]); 909950f054cSdanielk1977 sqlite3MallocAllow(); 910f8db1bc0Sdrh } 9114ac285a1Sdrh assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); 912f8db1bc0Sdrh return rc; 913f8db1bc0Sdrh } 91451942bc3Sdrh 91551942bc3Sdrh /* 91651942bc3Sdrh ** Return the sqlite3* database handle to which the prepared statement given 91751942bc3Sdrh ** in the argument belongs. This is the same database handle that was 91851942bc3Sdrh ** the first argument to the sqlite3_prepare() that was used to create 91951942bc3Sdrh ** the statement in the first place. 92051942bc3Sdrh */ 92151942bc3Sdrh sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ 92251942bc3Sdrh return pStmt ? ((Vdbe*)pStmt)->db : 0; 92351942bc3Sdrh } 924