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) ){ 404f26d6c4Sdrh return p->z; 414f26d6c4Sdrh }else{ 424f26d6c4Sdrh return sqlite3_value_text(pVal); 434f26d6c4Sdrh } 444f26d6c4Sdrh } 454f26d6c4Sdrh int sqlite3_value_bytes(sqlite3_value *pVal){ 4613073931Sdanielk1977 return sqlite3ValueBytes(pVal, SQLITE_UTF8); 474f26d6c4Sdrh } 484f26d6c4Sdrh int sqlite3_value_bytes16(sqlite3_value *pVal){ 4913073931Sdanielk1977 return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); 504f26d6c4Sdrh } 514f26d6c4Sdrh double sqlite3_value_double(sqlite3_value *pVal){ 526a6124e2Sdrh return sqlite3VdbeRealValue((Mem*)pVal); 534f26d6c4Sdrh } 544f26d6c4Sdrh int sqlite3_value_int(sqlite3_value *pVal){ 556a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 564f26d6c4Sdrh } 57efad9995Sdrh sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ 586a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 594f26d6c4Sdrh } 604f26d6c4Sdrh const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ 6100fd957bSdanielk1977 return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); 624f26d6c4Sdrh } 636c62608fSdrh #ifndef SQLITE_OMIT_UTF16 644f26d6c4Sdrh const void *sqlite3_value_text16(sqlite3_value* pVal){ 65dc8453fdSdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); 664f26d6c4Sdrh } 67d8123366Sdanielk1977 const void *sqlite3_value_text16be(sqlite3_value *pVal){ 68d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16BE); 69d8123366Sdanielk1977 } 70d8123366Sdanielk1977 const void *sqlite3_value_text16le(sqlite3_value *pVal){ 71d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16LE); 72d8123366Sdanielk1977 } 736c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 744f26d6c4Sdrh int sqlite3_value_type(sqlite3_value* pVal){ 75f4479501Sdrh return pVal->type; 764f26d6c4Sdrh } 7729d72108Sdrh /* sqlite3_value_numeric_type() defined in vdbe.c */ 784f26d6c4Sdrh 794f26d6c4Sdrh /**************************** sqlite3_result_ ******************************* 804f26d6c4Sdrh ** The following routines are used by user-defined functions to specify 814f26d6c4Sdrh ** the function result. 824f26d6c4Sdrh */ 834f26d6c4Sdrh void sqlite3_result_blob( 844f26d6c4Sdrh sqlite3_context *pCtx, 854f26d6c4Sdrh const void *z, 864f26d6c4Sdrh int n, 87d8123366Sdanielk1977 void (*xDel)(void *) 884f26d6c4Sdrh ){ 895708d2deSdrh assert( n>=0 ); 90d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, 0, xDel); 914f26d6c4Sdrh } 924f26d6c4Sdrh void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ 934f26d6c4Sdrh sqlite3VdbeMemSetDouble(&pCtx->s, rVal); 944f26d6c4Sdrh } 954f26d6c4Sdrh void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ 964f26d6c4Sdrh pCtx->isError = 1; 97d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); 984f26d6c4Sdrh } 99a1686c9aSdanielk1977 #ifndef SQLITE_OMIT_UTF16 1004f26d6c4Sdrh void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ 1014f26d6c4Sdrh pCtx->isError = 1; 102d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); 1034f26d6c4Sdrh } 104a1686c9aSdanielk1977 #endif 105f4479501Sdrh void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ 1064f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal); 1074f26d6c4Sdrh } 1084f26d6c4Sdrh void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ 1094f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, iVal); 1104f26d6c4Sdrh } 1114f26d6c4Sdrh void sqlite3_result_null(sqlite3_context *pCtx){ 112f4479501Sdrh sqlite3VdbeMemSetNull(&pCtx->s); 1134f26d6c4Sdrh } 1144f26d6c4Sdrh void sqlite3_result_text( 1154f26d6c4Sdrh sqlite3_context *pCtx, 1164f26d6c4Sdrh const char *z, 1174f26d6c4Sdrh int n, 118d8123366Sdanielk1977 void (*xDel)(void *) 1194f26d6c4Sdrh ){ 120d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, xDel); 1214f26d6c4Sdrh } 1226c62608fSdrh #ifndef SQLITE_OMIT_UTF16 1234f26d6c4Sdrh void sqlite3_result_text16( 1244f26d6c4Sdrh sqlite3_context *pCtx, 1254f26d6c4Sdrh const void *z, 1264f26d6c4Sdrh int n, 127d8123366Sdanielk1977 void (*xDel)(void *) 1284f26d6c4Sdrh ){ 129d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel); 130d8123366Sdanielk1977 } 131d8123366Sdanielk1977 void sqlite3_result_text16be( 132d8123366Sdanielk1977 sqlite3_context *pCtx, 133d8123366Sdanielk1977 const void *z, 134d8123366Sdanielk1977 int n, 135d8123366Sdanielk1977 void (*xDel)(void *) 136d8123366Sdanielk1977 ){ 137d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16BE, xDel); 138d8123366Sdanielk1977 } 139d8123366Sdanielk1977 void sqlite3_result_text16le( 140d8123366Sdanielk1977 sqlite3_context *pCtx, 141d8123366Sdanielk1977 const void *z, 142d8123366Sdanielk1977 int n, 143d8123366Sdanielk1977 void (*xDel)(void *) 144d8123366Sdanielk1977 ){ 145d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16LE, xDel); 1464f26d6c4Sdrh } 1476c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 1484f26d6c4Sdrh void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ 1494f26d6c4Sdrh sqlite3VdbeMemCopy(&pCtx->s, pValue); 1504f26d6c4Sdrh } 1514f26d6c4Sdrh 1524f26d6c4Sdrh 1534f26d6c4Sdrh /* 1544f26d6c4Sdrh ** Execute the statement pStmt, either until a row of data is ready, the 1554f26d6c4Sdrh ** statement is completely executed or an error occurs. 1564f26d6c4Sdrh */ 1574f26d6c4Sdrh int sqlite3_step(sqlite3_stmt *pStmt){ 1584f26d6c4Sdrh Vdbe *p = (Vdbe*)pStmt; 1599bb575fdSdrh sqlite3 *db; 1604f26d6c4Sdrh int rc; 1614f26d6c4Sdrh 162efaaf579Sdanielk1977 /* Assert that malloc() has not failed */ 1639e12800dSdanielk1977 assert( !sqlite3MallocFailed() ); 164261919ccSdanielk1977 1651bcdb0c0Sdrh if( p==0 || p->magic!=VDBE_MAGIC_RUN ){ 1664f26d6c4Sdrh return SQLITE_MISUSE; 1674f26d6c4Sdrh } 16891b48aa1Sdrh if( p->aborted ){ 16991b48aa1Sdrh return SQLITE_ABORT; 17091b48aa1Sdrh } 171a21c6b6fSdanielk1977 if( p->pc<=0 && p->expired ){ 172a21c6b6fSdanielk1977 if( p->rc==SQLITE_OK ){ 173a21c6b6fSdanielk1977 p->rc = SQLITE_SCHEMA; 174a21c6b6fSdanielk1977 } 175a21c6b6fSdanielk1977 return SQLITE_ERROR; 176a21c6b6fSdanielk1977 } 1774f26d6c4Sdrh db = p->db; 1784f26d6c4Sdrh if( sqlite3SafetyOn(db) ){ 1794f26d6c4Sdrh p->rc = SQLITE_MISUSE; 1804f26d6c4Sdrh return SQLITE_MISUSE; 1814f26d6c4Sdrh } 1821d850a72Sdanielk1977 if( p->pc<0 ){ 18315ca1df1Sdrh /* If there are no other statements currently running, then 18415ca1df1Sdrh ** reset the interrupt flag. This prevents a call to sqlite3_interrupt 18515ca1df1Sdrh ** from interrupting a statement that has not yet started. 18615ca1df1Sdrh */ 18715ca1df1Sdrh if( db->activeVdbeCnt==0 ){ 18815ca1df1Sdrh db->u1.isInterrupted = 0; 18915ca1df1Sdrh } 19015ca1df1Sdrh 19119e2d37fSdrh #ifndef SQLITE_OMIT_TRACE 192c16a03b5Sdrh /* Invoke the trace callback if there is one 193c16a03b5Sdrh */ 19419e2d37fSdrh if( db->xTrace && !db->init.busy ){ 195c16a03b5Sdrh assert( p->nOp>0 ); 196c16a03b5Sdrh assert( p->aOp[p->nOp-1].opcode==OP_Noop ); 197c16a03b5Sdrh assert( p->aOp[p->nOp-1].p3!=0 ); 198c16a03b5Sdrh assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC ); 199c16a03b5Sdrh sqlite3SafetyOff(db); 200c16a03b5Sdrh db->xTrace(db->pTraceArg, p->aOp[p->nOp-1].p3); 201c16a03b5Sdrh if( sqlite3SafetyOn(db) ){ 202c16a03b5Sdrh p->rc = SQLITE_MISUSE; 203c16a03b5Sdrh return SQLITE_MISUSE; 204c16a03b5Sdrh } 205c16a03b5Sdrh } 20619e2d37fSdrh if( db->xProfile && !db->init.busy ){ 20719e2d37fSdrh double rNow; 20866560adaSdrh sqlite3OsCurrentTime(&rNow); 20919e2d37fSdrh p->startTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0; 21019e2d37fSdrh } 21119e2d37fSdrh #endif 212c16a03b5Sdrh 213c16a03b5Sdrh /* Print a copy of SQL as it is executed if the SQL_TRACE pragma is turned 214c16a03b5Sdrh ** on in debugging mode. 215c16a03b5Sdrh */ 216c16a03b5Sdrh #ifdef SQLITE_DEBUG 217c16a03b5Sdrh if( (db->flags & SQLITE_SqlTrace)!=0 ){ 218c16a03b5Sdrh sqlite3DebugPrintf("SQL-trace: %s\n", p->aOp[p->nOp-1].p3); 219c16a03b5Sdrh } 220c16a03b5Sdrh #endif /* SQLITE_DEBUG */ 221c16a03b5Sdrh 2221d850a72Sdanielk1977 db->activeVdbeCnt++; 2231d850a72Sdanielk1977 p->pc = 0; 2241d850a72Sdanielk1977 } 225b7f9164eSdrh #ifndef SQLITE_OMIT_EXPLAIN 2264f26d6c4Sdrh if( p->explain ){ 2274f26d6c4Sdrh rc = sqlite3VdbeList(p); 228b7f9164eSdrh }else 229b7f9164eSdrh #endif /* SQLITE_OMIT_EXPLAIN */ 230b7f9164eSdrh { 2314f26d6c4Sdrh rc = sqlite3VdbeExec(p); 2324f26d6c4Sdrh } 2334f26d6c4Sdrh 2344f26d6c4Sdrh if( sqlite3SafetyOff(db) ){ 2354f26d6c4Sdrh rc = SQLITE_MISUSE; 2364f26d6c4Sdrh } 2374f26d6c4Sdrh 23819e2d37fSdrh #ifndef SQLITE_OMIT_TRACE 23919e2d37fSdrh /* Invoke the profile callback if there is one 24019e2d37fSdrh */ 24119e2d37fSdrh if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy ){ 24219e2d37fSdrh double rNow; 24319e2d37fSdrh u64 elapseTime; 24419e2d37fSdrh 24566560adaSdrh sqlite3OsCurrentTime(&rNow); 24619e2d37fSdrh elapseTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0 - p->startTime; 24719e2d37fSdrh assert( p->nOp>0 ); 24819e2d37fSdrh assert( p->aOp[p->nOp-1].opcode==OP_Noop ); 24919e2d37fSdrh assert( p->aOp[p->nOp-1].p3!=0 ); 25019e2d37fSdrh assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC ); 25119e2d37fSdrh db->xProfile(db->pProfileArg, p->aOp[p->nOp-1].p3, elapseTime); 25219e2d37fSdrh } 25319e2d37fSdrh #endif 25419e2d37fSdrh 25597a227c9Sdanielk1977 sqlite3Error(p->db, rc, 0); 25676e8d1a2Sdanielk1977 p->rc = sqlite3ApiExit(p->db, p->rc); 257*4ac285a1Sdrh assert( (rc&0xff)==rc ); 25876e8d1a2Sdanielk1977 return rc; 2594f26d6c4Sdrh } 2604f26d6c4Sdrh 2614f26d6c4Sdrh /* 262eb2e176aSdrh ** Extract the user data from a sqlite3_context structure and return a 263eb2e176aSdrh ** pointer to it. 264eb2e176aSdrh */ 265eb2e176aSdrh void *sqlite3_user_data(sqlite3_context *p){ 266eb2e176aSdrh assert( p && p->pFunc ); 267eb2e176aSdrh return p->pFunc->pUserData; 268eb2e176aSdrh } 269eb2e176aSdrh 270eb2e176aSdrh /* 271eb2e176aSdrh ** Allocate or return the aggregate context for a user function. A new 272eb2e176aSdrh ** context is allocated on the first call. Subsequent calls return the 273eb2e176aSdrh ** same context that was returned on prior calls. 274eb2e176aSdrh */ 275eb2e176aSdrh void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ 276abfcea25Sdrh Mem *pMem = p->pMem; 277825c662eSdrh assert( p && p->pFunc && p->pFunc->xStep ); 278a10a34b8Sdrh if( (pMem->flags & MEM_Agg)==0 ){ 279a10a34b8Sdrh if( nByte==0 ){ 280a10a34b8Sdrh assert( pMem->flags==MEM_Null ); 281a10a34b8Sdrh pMem->z = 0; 282a10a34b8Sdrh }else{ 283abfcea25Sdrh pMem->flags = MEM_Agg; 2845360ad34Sdrh pMem->xDel = sqlite3FreeX; 285abfcea25Sdrh *(FuncDef**)&pMem->i = p->pFunc; 286eb2e176aSdrh if( nByte<=NBFS ){ 287abfcea25Sdrh pMem->z = pMem->zShort; 288abfcea25Sdrh memset(pMem->z, 0, nByte); 289eb2e176aSdrh }else{ 290abfcea25Sdrh pMem->z = sqliteMalloc( nByte ); 291eb2e176aSdrh } 292eb2e176aSdrh } 293a10a34b8Sdrh } 294abfcea25Sdrh return (void*)pMem->z; 295eb2e176aSdrh } 296eb2e176aSdrh 297eb2e176aSdrh /* 298682f68b0Sdanielk1977 ** Return the auxilary data pointer, if any, for the iArg'th argument to 299682f68b0Sdanielk1977 ** the user-function defined by pCtx. 300682f68b0Sdanielk1977 */ 301682f68b0Sdanielk1977 void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ 302682f68b0Sdanielk1977 VdbeFunc *pVdbeFunc = pCtx->pVdbeFunc; 303682f68b0Sdanielk1977 if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){ 304682f68b0Sdanielk1977 return 0; 305682f68b0Sdanielk1977 } 306f92c7ff7Sdrh return pVdbeFunc->apAux[iArg].pAux; 307682f68b0Sdanielk1977 } 308682f68b0Sdanielk1977 309682f68b0Sdanielk1977 /* 310682f68b0Sdanielk1977 ** Set the auxilary data pointer and delete function, for the iArg'th 311682f68b0Sdanielk1977 ** argument to the user-function defined by pCtx. Any previous value is 312682f68b0Sdanielk1977 ** deleted by calling the delete function specified when it was set. 313682f68b0Sdanielk1977 */ 314682f68b0Sdanielk1977 void sqlite3_set_auxdata( 315682f68b0Sdanielk1977 sqlite3_context *pCtx, 316682f68b0Sdanielk1977 int iArg, 317682f68b0Sdanielk1977 void *pAux, 318682f68b0Sdanielk1977 void (*xDelete)(void*) 319682f68b0Sdanielk1977 ){ 320682f68b0Sdanielk1977 struct AuxData *pAuxData; 321f92c7ff7Sdrh VdbeFunc *pVdbeFunc; 322682f68b0Sdanielk1977 if( iArg<0 ) return; 323682f68b0Sdanielk1977 324f92c7ff7Sdrh pVdbeFunc = pCtx->pVdbeFunc; 325f92c7ff7Sdrh if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){ 326998da3a2Sdrh int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg; 32753f733c7Sdrh pVdbeFunc = sqliteRealloc(pVdbeFunc, nMalloc); 328998da3a2Sdrh if( !pVdbeFunc ) return; 32953f733c7Sdrh pCtx->pVdbeFunc = pVdbeFunc; 3300e3d7476Sdrh memset(&pVdbeFunc->apAux[pVdbeFunc->nAux], 0, 3310e3d7476Sdrh sizeof(struct AuxData)*(iArg+1-pVdbeFunc->nAux)); 332998da3a2Sdrh pVdbeFunc->nAux = iArg+1; 333998da3a2Sdrh pVdbeFunc->pFunc = pCtx->pFunc; 334682f68b0Sdanielk1977 } 335682f68b0Sdanielk1977 336f92c7ff7Sdrh pAuxData = &pVdbeFunc->apAux[iArg]; 337682f68b0Sdanielk1977 if( pAuxData->pAux && pAuxData->xDelete ){ 338682f68b0Sdanielk1977 pAuxData->xDelete(pAuxData->pAux); 339682f68b0Sdanielk1977 } 340682f68b0Sdanielk1977 pAuxData->pAux = pAux; 341682f68b0Sdanielk1977 pAuxData->xDelete = xDelete; 342682f68b0Sdanielk1977 } 343682f68b0Sdanielk1977 344682f68b0Sdanielk1977 /* 345eb2e176aSdrh ** Return the number of times the Step function of a aggregate has been 346eb2e176aSdrh ** called. 347eb2e176aSdrh ** 348cf85a51cSdrh ** This function is deprecated. Do not use it for new code. It is 349cf85a51cSdrh ** provide only to avoid breaking legacy code. New aggregate function 350cf85a51cSdrh ** implementations should keep their own counts within their aggregate 351cf85a51cSdrh ** context. 352eb2e176aSdrh */ 353eb2e176aSdrh int sqlite3_aggregate_count(sqlite3_context *p){ 354eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 355abfcea25Sdrh return p->pMem->n; 356eb2e176aSdrh } 357eb2e176aSdrh 358eb2e176aSdrh /* 3594f26d6c4Sdrh ** Return the number of columns in the result set for the statement pStmt. 3604f26d6c4Sdrh */ 3614f26d6c4Sdrh int sqlite3_column_count(sqlite3_stmt *pStmt){ 3624f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 3631bcdb0c0Sdrh return pVm ? pVm->nResColumn : 0; 3644f26d6c4Sdrh } 3654f26d6c4Sdrh 3664f26d6c4Sdrh /* 3674f26d6c4Sdrh ** Return the number of values available from the current row of the 3684f26d6c4Sdrh ** currently executing statement pStmt. 3694f26d6c4Sdrh */ 3704f26d6c4Sdrh int sqlite3_data_count(sqlite3_stmt *pStmt){ 3714f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 3721bcdb0c0Sdrh if( pVm==0 || !pVm->resOnStack ) return 0; 3734f26d6c4Sdrh return pVm->nResColumn; 3744f26d6c4Sdrh } 3754f26d6c4Sdrh 3764f26d6c4Sdrh 3774f26d6c4Sdrh /* 3784f26d6c4Sdrh ** Check to see if column iCol of the given statement is valid. If 3794f26d6c4Sdrh ** it is, return a pointer to the Mem for the value of that column. 3804f26d6c4Sdrh ** If iCol is not valid, return a pointer to a Mem which has a value 3814f26d6c4Sdrh ** of NULL. 3824f26d6c4Sdrh */ 3834f26d6c4Sdrh static Mem *columnMem(sqlite3_stmt *pStmt, int i){ 3844f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 3854f26d6c4Sdrh int vals = sqlite3_data_count(pStmt); 3864f26d6c4Sdrh if( i>=vals || i<0 ){ 3870f7eb611Sdrh static const Mem nullMem = {0, 0.0, "", 0, MEM_Null, MEM_Null }; 3884f26d6c4Sdrh sqlite3Error(pVm->db, SQLITE_RANGE, 0); 3890f7eb611Sdrh return (Mem*)&nullMem; 3904f26d6c4Sdrh } 3914f26d6c4Sdrh return &pVm->pTos[(1-vals)+i]; 3924f26d6c4Sdrh } 3934f26d6c4Sdrh 3942e588c75Sdanielk1977 /* 3952e588c75Sdanielk1977 ** This function is called after invoking an sqlite3_value_XXX function on a 3962e588c75Sdanielk1977 ** column value (i.e. a value returned by evaluating an SQL expression in the 3972e588c75Sdanielk1977 ** select list of a SELECT statement) that may cause a malloc() failure. If 3982e588c75Sdanielk1977 ** malloc() has failed, the threads mallocFailed flag is cleared and the result 3992e588c75Sdanielk1977 ** code of statement pStmt set to SQLITE_NOMEM. 4002e588c75Sdanielk1977 ** 4012e588c75Sdanielk1977 ** Specificly, this is called from within: 4022e588c75Sdanielk1977 ** 4032e588c75Sdanielk1977 ** sqlite3_column_int() 4042e588c75Sdanielk1977 ** sqlite3_column_int64() 4052e588c75Sdanielk1977 ** sqlite3_column_text() 4062e588c75Sdanielk1977 ** sqlite3_column_text16() 4072e588c75Sdanielk1977 ** sqlite3_column_real() 4082e588c75Sdanielk1977 ** sqlite3_column_bytes() 4092e588c75Sdanielk1977 ** sqlite3_column_bytes16() 4102e588c75Sdanielk1977 ** 4112e588c75Sdanielk1977 ** But not for sqlite3_column_blob(), which never calls malloc(). 4122e588c75Sdanielk1977 */ 4132e588c75Sdanielk1977 static void columnMallocFailure(sqlite3_stmt *pStmt) 4142e588c75Sdanielk1977 { 4152e588c75Sdanielk1977 /* If malloc() failed during an encoding conversion within an 4162e588c75Sdanielk1977 ** sqlite3_column_XXX API, then set the return code of the statement to 4172e588c75Sdanielk1977 ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR 4182e588c75Sdanielk1977 ** and _finalize() will return NOMEM. 4192e588c75Sdanielk1977 */ 42054f0198eSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 42154f0198eSdanielk1977 p->rc = sqlite3ApiExit(0, p->rc); 4222e588c75Sdanielk1977 } 4232e588c75Sdanielk1977 4244f26d6c4Sdrh /**************************** sqlite3_column_ ******************************* 4254f26d6c4Sdrh ** The following routines are used to access elements of the current row 4264f26d6c4Sdrh ** in the result set. 4274f26d6c4Sdrh */ 428c572ef7fSdanielk1977 const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ 4292e588c75Sdanielk1977 const void *val; 4302e588c75Sdanielk1977 sqlite3MallocDisallow(); 4312e588c75Sdanielk1977 val = sqlite3_value_blob( columnMem(pStmt,i) ); 4322e588c75Sdanielk1977 sqlite3MallocAllow(); 4332e588c75Sdanielk1977 return val; 434c572ef7fSdanielk1977 } 4354f26d6c4Sdrh int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ 4362e588c75Sdanielk1977 int val = sqlite3_value_bytes( columnMem(pStmt,i) ); 4372e588c75Sdanielk1977 columnMallocFailure(pStmt); 4382e588c75Sdanielk1977 return val; 4394f26d6c4Sdrh } 4404f26d6c4Sdrh int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ 4412e588c75Sdanielk1977 int val = sqlite3_value_bytes16( columnMem(pStmt,i) ); 4422e588c75Sdanielk1977 columnMallocFailure(pStmt); 4432e588c75Sdanielk1977 return val; 4444f26d6c4Sdrh } 4454f26d6c4Sdrh double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ 4462e588c75Sdanielk1977 double val = sqlite3_value_double( columnMem(pStmt,i) ); 4472e588c75Sdanielk1977 columnMallocFailure(pStmt); 4482e588c75Sdanielk1977 return val; 4494f26d6c4Sdrh } 4504f26d6c4Sdrh int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ 4512e588c75Sdanielk1977 int val = sqlite3_value_int( columnMem(pStmt,i) ); 4522e588c75Sdanielk1977 columnMallocFailure(pStmt); 4532e588c75Sdanielk1977 return val; 4544f26d6c4Sdrh } 455efad9995Sdrh sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ 4562e588c75Sdanielk1977 sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) ); 4572e588c75Sdanielk1977 columnMallocFailure(pStmt); 4582e588c75Sdanielk1977 return val; 4594f26d6c4Sdrh } 4604f26d6c4Sdrh const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ 4612e588c75Sdanielk1977 const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) ); 4622e588c75Sdanielk1977 columnMallocFailure(pStmt); 4632e588c75Sdanielk1977 return val; 4644f26d6c4Sdrh } 465d1e4733dSdrh sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){ 466d1e4733dSdrh return columnMem(pStmt, i); 467d1e4733dSdrh } 4686c62608fSdrh #ifndef SQLITE_OMIT_UTF16 4694f26d6c4Sdrh const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ 4702e588c75Sdanielk1977 const void *val = sqlite3_value_text16( columnMem(pStmt,i) ); 4712e588c75Sdanielk1977 columnMallocFailure(pStmt); 4722e588c75Sdanielk1977 return val; 4734f26d6c4Sdrh } 4746c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 4754f26d6c4Sdrh int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ 4764f26d6c4Sdrh return sqlite3_value_type( columnMem(pStmt,i) ); 4774f26d6c4Sdrh } 4784f26d6c4Sdrh 47929d72108Sdrh /* The following function is experimental and subject to change or 48029d72108Sdrh ** removal */ 48129d72108Sdrh /*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){ 48229d72108Sdrh ** return sqlite3_value_numeric_type( columnMem(pStmt,i) ); 48329d72108Sdrh **} 48429d72108Sdrh */ 48529d72108Sdrh 4865e2517e1Sdrh /* 4875e2517e1Sdrh ** Convert the N-th element of pStmt->pColName[] into a string using 4885e2517e1Sdrh ** xFunc() then return that string. If N is out of range, return 0. 489e590fbdeSdrh ** 490e590fbdeSdrh ** There are up to 5 names for each column. useType determines which 491e590fbdeSdrh ** name is returned. Here are the names: 492e590fbdeSdrh ** 493e590fbdeSdrh ** 0 The column name as it should be displayed for output 494e590fbdeSdrh ** 1 The datatype name for the column 495e590fbdeSdrh ** 2 The name of the database that the column derives from 496e590fbdeSdrh ** 3 The name of the table that the column derives from 497e590fbdeSdrh ** 4 The name of the table column that the result column derives from 498e590fbdeSdrh ** 499e590fbdeSdrh ** If the result is not a simple column reference (if it is an expression 500e590fbdeSdrh ** or a constant) then useTypes 2, 3, and 4 return NULL. 5015e2517e1Sdrh */ 5025e2517e1Sdrh static const void *columnName( 5035e2517e1Sdrh sqlite3_stmt *pStmt, 5045e2517e1Sdrh int N, 5055e2517e1Sdrh const void *(*xFunc)(Mem*), 5065e2517e1Sdrh int useType 5075e2517e1Sdrh ){ 50800fd957bSdanielk1977 const void *ret; 5095e2517e1Sdrh Vdbe *p = (Vdbe *)pStmt; 5105e2517e1Sdrh int n = sqlite3_column_count(pStmt); 5115e2517e1Sdrh 5125e2517e1Sdrh if( p==0 || N>=n || N<0 ){ 5135e2517e1Sdrh return 0; 5145e2517e1Sdrh } 515e590fbdeSdrh N += useType*n; 51600fd957bSdanielk1977 ret = xFunc(&p->aColName[N]); 51700fd957bSdanielk1977 51800fd957bSdanielk1977 /* A malloc may have failed inside of the xFunc() call. If this is the case, 51900fd957bSdanielk1977 ** clear the mallocFailed flag and return NULL. 52000fd957bSdanielk1977 */ 52154f0198eSdanielk1977 sqlite3ApiExit(0, 0); 52200fd957bSdanielk1977 return ret; 5235e2517e1Sdrh } 5245e2517e1Sdrh 5254f26d6c4Sdrh /* 5264f26d6c4Sdrh ** Return the name of the Nth column of the result set returned by SQL 5274f26d6c4Sdrh ** statement pStmt. 5284f26d6c4Sdrh */ 5294f26d6c4Sdrh const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ 530955de52cSdanielk1977 return columnName( 531955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); 5324f26d6c4Sdrh } 533e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 534e590fbdeSdrh const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ 535955de52cSdanielk1977 return columnName( 536955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); 537e590fbdeSdrh } 538e590fbdeSdrh #endif 5394f26d6c4Sdrh 5404f26d6c4Sdrh /* 5416c62608fSdrh ** Return the column declaration type (if applicable) of the 'i'th column 542e590fbdeSdrh ** of the result set of SQL statement pStmt. 5436c62608fSdrh */ 5446c62608fSdrh const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ 545955de52cSdanielk1977 return columnName( 546955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); 5476c62608fSdrh } 5486c62608fSdrh #ifndef SQLITE_OMIT_UTF16 54976d505baSdanielk1977 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ 550955de52cSdanielk1977 return columnName( 551955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); 5524f26d6c4Sdrh } 5536c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 5544f26d6c4Sdrh 5554b1ae99dSdanielk1977 #ifdef SQLITE_ENABLE_COLUMN_METADATA 556e590fbdeSdrh /* 557e590fbdeSdrh ** Return the name of the database from which a result column derives. 558e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 559e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 560e590fbdeSdrh */ 561e590fbdeSdrh const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ 562955de52cSdanielk1977 return columnName( 563955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); 564e590fbdeSdrh } 565e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 566e590fbdeSdrh const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ 567955de52cSdanielk1977 return columnName( 568955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); 569e590fbdeSdrh } 570e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 571e590fbdeSdrh 572e590fbdeSdrh /* 573e590fbdeSdrh ** Return the name of the table from which a result column derives. 574e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 575e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 576e590fbdeSdrh */ 577e590fbdeSdrh const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ 578955de52cSdanielk1977 return columnName( 579955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); 580e590fbdeSdrh } 581e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 582e590fbdeSdrh const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ 583955de52cSdanielk1977 return columnName( 584955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); 585e590fbdeSdrh } 586e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 587e590fbdeSdrh 588e590fbdeSdrh /* 589e590fbdeSdrh ** Return the name of the table column from which a result column derives. 590e590fbdeSdrh ** NULL is returned if the result column is an expression or constant or 591e590fbdeSdrh ** anything else which is not an unabiguous reference to a database column. 592e590fbdeSdrh */ 593e590fbdeSdrh const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ 594955de52cSdanielk1977 return columnName( 595955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); 596e590fbdeSdrh } 597e590fbdeSdrh #ifndef SQLITE_OMIT_UTF16 598e590fbdeSdrh const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ 599955de52cSdanielk1977 return columnName( 600955de52cSdanielk1977 pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); 601e590fbdeSdrh } 602e590fbdeSdrh #endif /* SQLITE_OMIT_UTF16 */ 6034b1ae99dSdanielk1977 #endif /* SQLITE_ENABLE_COLUMN_METADATA */ 604e590fbdeSdrh 605e590fbdeSdrh 6064f26d6c4Sdrh /******************************* sqlite3_bind_ *************************** 6074f26d6c4Sdrh ** 6084f26d6c4Sdrh ** Routines used to attach values to wildcards in a compiled SQL statement. 6094f26d6c4Sdrh */ 6104f26d6c4Sdrh /* 6114f26d6c4Sdrh ** Unbind the value bound to variable i in virtual machine p. This is the 6124f26d6c4Sdrh ** the same as binding a NULL value to the column. If the "i" parameter is 6134f26d6c4Sdrh ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. 6144f26d6c4Sdrh ** 6154f26d6c4Sdrh ** The error code stored in database p->db is overwritten with the return 6164f26d6c4Sdrh ** value in any case. 6174f26d6c4Sdrh */ 6184f26d6c4Sdrh static int vdbeUnbind(Vdbe *p, int i){ 6194f26d6c4Sdrh Mem *pVar; 6201bcdb0c0Sdrh if( p==0 || p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ 621473d179dSdrh if( p ) sqlite3Error(p->db, SQLITE_MISUSE, 0); 6224f26d6c4Sdrh return SQLITE_MISUSE; 6234f26d6c4Sdrh } 6244f26d6c4Sdrh if( i<1 || i>p->nVar ){ 6254f26d6c4Sdrh sqlite3Error(p->db, SQLITE_RANGE, 0); 6264f26d6c4Sdrh return SQLITE_RANGE; 6274f26d6c4Sdrh } 6284f26d6c4Sdrh i--; 629290c1948Sdrh pVar = &p->aVar[i]; 630d8123366Sdanielk1977 sqlite3VdbeMemRelease(pVar); 6314f26d6c4Sdrh pVar->flags = MEM_Null; 6324f26d6c4Sdrh sqlite3Error(p->db, SQLITE_OK, 0); 6334f26d6c4Sdrh return SQLITE_OK; 6344f26d6c4Sdrh } 6354f26d6c4Sdrh 6364f26d6c4Sdrh /* 6375e2517e1Sdrh ** Bind a text or BLOB value. 6384f26d6c4Sdrh */ 6395e2517e1Sdrh static int bindText( 640f4479501Sdrh sqlite3_stmt *pStmt, 6414f26d6c4Sdrh int i, 6424f26d6c4Sdrh const void *zData, 6434f26d6c4Sdrh int nData, 6445e2517e1Sdrh void (*xDel)(void*), 6455e2517e1Sdrh int encoding 6464f26d6c4Sdrh ){ 6474f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 6484f26d6c4Sdrh Mem *pVar; 6494f26d6c4Sdrh int rc; 6504f26d6c4Sdrh 6514f26d6c4Sdrh rc = vdbeUnbind(p, i); 652feac5f8dSdrh if( rc || zData==0 ){ 6534f26d6c4Sdrh return rc; 6544f26d6c4Sdrh } 655290c1948Sdrh pVar = &p->aVar[i-1]; 6565e2517e1Sdrh rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); 6575e2517e1Sdrh if( rc==SQLITE_OK && encoding!=0 ){ 65814db2665Sdanielk1977 rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); 6595e2517e1Sdrh } 66054f0198eSdanielk1977 661771151b6Sdanielk1977 sqlite3Error(((Vdbe *)pStmt)->db, rc, 0); 66254f0198eSdanielk1977 return sqlite3ApiExit(((Vdbe *)pStmt)->db, rc); 6635e2517e1Sdrh } 6645e2517e1Sdrh 6655e2517e1Sdrh 6665e2517e1Sdrh /* 6675e2517e1Sdrh ** Bind a blob value to an SQL statement variable. 6685e2517e1Sdrh */ 6695e2517e1Sdrh int sqlite3_bind_blob( 6705e2517e1Sdrh sqlite3_stmt *pStmt, 6715e2517e1Sdrh int i, 6725e2517e1Sdrh const void *zData, 6735e2517e1Sdrh int nData, 6745e2517e1Sdrh void (*xDel)(void*) 6755e2517e1Sdrh ){ 6765e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, 0); 6775e2517e1Sdrh } 6784f26d6c4Sdrh int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ 6794f26d6c4Sdrh int rc; 6804f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 6814f26d6c4Sdrh rc = vdbeUnbind(p, i); 6824f26d6c4Sdrh if( rc==SQLITE_OK ){ 683290c1948Sdrh sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); 6844f26d6c4Sdrh } 685f4618891Sdanielk1977 return rc; 6864f26d6c4Sdrh } 6874f26d6c4Sdrh int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ 688efad9995Sdrh return sqlite3_bind_int64(p, i, (i64)iValue); 6894f26d6c4Sdrh } 690efad9995Sdrh int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ 6914f26d6c4Sdrh int rc; 6924f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 6934f26d6c4Sdrh rc = vdbeUnbind(p, i); 6944f26d6c4Sdrh if( rc==SQLITE_OK ){ 695290c1948Sdrh sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); 6964f26d6c4Sdrh } 6974f26d6c4Sdrh return rc; 6984f26d6c4Sdrh } 6994f26d6c4Sdrh int sqlite3_bind_null(sqlite3_stmt* p, int i){ 7004f26d6c4Sdrh return vdbeUnbind((Vdbe *)p, i); 7014f26d6c4Sdrh } 7024f26d6c4Sdrh int sqlite3_bind_text( 7034f26d6c4Sdrh sqlite3_stmt *pStmt, 7044f26d6c4Sdrh int i, 7054f26d6c4Sdrh const char *zData, 7064f26d6c4Sdrh int nData, 707d8123366Sdanielk1977 void (*xDel)(void*) 7084f26d6c4Sdrh ){ 7095e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8); 7104f26d6c4Sdrh } 7116c62608fSdrh #ifndef SQLITE_OMIT_UTF16 7124f26d6c4Sdrh int sqlite3_bind_text16( 7134f26d6c4Sdrh sqlite3_stmt *pStmt, 7144f26d6c4Sdrh int i, 7154f26d6c4Sdrh const void *zData, 7164f26d6c4Sdrh int nData, 717d8123366Sdanielk1977 void (*xDel)(void*) 7184f26d6c4Sdrh ){ 7195e2517e1Sdrh return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE); 7204f26d6c4Sdrh } 7216c62608fSdrh #endif /* SQLITE_OMIT_UTF16 */ 72226e4144dSdanielk1977 int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){ 72326e4144dSdanielk1977 int rc; 72426e4144dSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 72526e4144dSdanielk1977 rc = vdbeUnbind(p, i); 72626e4144dSdanielk1977 if( rc==SQLITE_OK ){ 72726e4144dSdanielk1977 sqlite3VdbeMemCopy(&p->aVar[i-1], pValue); 72826e4144dSdanielk1977 } 72926e4144dSdanielk1977 return rc; 73026e4144dSdanielk1977 } 73175f6a032Sdrh 73275f6a032Sdrh /* 73375f6a032Sdrh ** Return the number of wildcards that can be potentially bound to. 73475f6a032Sdrh ** This routine is added to support DBD::SQLite. 73575f6a032Sdrh */ 73675f6a032Sdrh int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ 73792febd92Sdrh Vdbe *p = (Vdbe*)pStmt; 73892febd92Sdrh return p ? p->nVar : 0; 73975f6a032Sdrh } 740895d7472Sdrh 741895d7472Sdrh /* 742fa6bc000Sdrh ** Create a mapping from variable numbers to variable names 743fa6bc000Sdrh ** in the Vdbe.azVar[] array, if such a mapping does not already 744fa6bc000Sdrh ** exist. 745895d7472Sdrh */ 746fa6bc000Sdrh static void createVarMap(Vdbe *p){ 747895d7472Sdrh if( !p->okVar ){ 748895d7472Sdrh int j; 749895d7472Sdrh Op *pOp; 750895d7472Sdrh for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){ 751895d7472Sdrh if( pOp->opcode==OP_Variable ){ 752895d7472Sdrh assert( pOp->p1>0 && pOp->p1<=p->nVar ); 753895d7472Sdrh p->azVar[pOp->p1-1] = pOp->p3; 754895d7472Sdrh } 755895d7472Sdrh } 756895d7472Sdrh p->okVar = 1; 757895d7472Sdrh } 758fa6bc000Sdrh } 759fa6bc000Sdrh 760fa6bc000Sdrh /* 761fa6bc000Sdrh ** Return the name of a wildcard parameter. Return NULL if the index 762fa6bc000Sdrh ** is out of range or if the wildcard is unnamed. 763fa6bc000Sdrh ** 764fa6bc000Sdrh ** The result is always UTF-8. 765fa6bc000Sdrh */ 766fa6bc000Sdrh const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ 767fa6bc000Sdrh Vdbe *p = (Vdbe*)pStmt; 768fa6bc000Sdrh if( p==0 || i<1 || i>p->nVar ){ 769fa6bc000Sdrh return 0; 770fa6bc000Sdrh } 771fa6bc000Sdrh createVarMap(p); 772895d7472Sdrh return p->azVar[i-1]; 773895d7472Sdrh } 774fa6bc000Sdrh 775fa6bc000Sdrh /* 776fa6bc000Sdrh ** Given a wildcard parameter name, return the index of the variable 777fa6bc000Sdrh ** with that name. If there is no variable with the given name, 778fa6bc000Sdrh ** return 0. 779fa6bc000Sdrh */ 780fa6bc000Sdrh int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ 781fa6bc000Sdrh Vdbe *p = (Vdbe*)pStmt; 782fa6bc000Sdrh int i; 783fa6bc000Sdrh if( p==0 ){ 784fa6bc000Sdrh return 0; 785fa6bc000Sdrh } 786fa6bc000Sdrh createVarMap(p); 7876a8903c3Sdrh if( zName ){ 788fa6bc000Sdrh for(i=0; i<p->nVar; i++){ 789971a7c87Sdrh const char *z = p->azVar[i]; 7906a8903c3Sdrh if( z && strcmp(z,zName)==0 ){ 791fa6bc000Sdrh return i+1; 792fa6bc000Sdrh } 793fa6bc000Sdrh } 7946a8903c3Sdrh } 795fa6bc000Sdrh return 0; 796fa6bc000Sdrh } 797f8db1bc0Sdrh 79851942bc3Sdrh /* 799f8db1bc0Sdrh ** Transfer all bindings from the first statement over to the second. 800f8db1bc0Sdrh ** If the two statements contain a different number of bindings, then 801f8db1bc0Sdrh ** an SQLITE_ERROR is returned. 802f8db1bc0Sdrh */ 803f8db1bc0Sdrh int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){ 804f8db1bc0Sdrh Vdbe *pFrom = (Vdbe*)pFromStmt; 805f8db1bc0Sdrh Vdbe *pTo = (Vdbe*)pToStmt; 806f8db1bc0Sdrh int i, rc = SQLITE_OK; 807f8db1bc0Sdrh if( (pFrom->magic!=VDBE_MAGIC_RUN && pFrom->magic!=VDBE_MAGIC_HALT) 808f8db1bc0Sdrh || (pTo->magic!=VDBE_MAGIC_RUN && pTo->magic!=VDBE_MAGIC_HALT) ){ 809f8db1bc0Sdrh return SQLITE_MISUSE; 810f8db1bc0Sdrh } 811f8db1bc0Sdrh if( pFrom->nVar!=pTo->nVar ){ 812f8db1bc0Sdrh return SQLITE_ERROR; 813f8db1bc0Sdrh } 814f8db1bc0Sdrh for(i=0; rc==SQLITE_OK && i<pFrom->nVar; i++){ 815950f054cSdanielk1977 sqlite3MallocDisallow(); 816f8db1bc0Sdrh rc = sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); 817950f054cSdanielk1977 sqlite3MallocAllow(); 818f8db1bc0Sdrh } 819*4ac285a1Sdrh assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); 820f8db1bc0Sdrh return rc; 821f8db1bc0Sdrh } 82251942bc3Sdrh 82351942bc3Sdrh /* 82451942bc3Sdrh ** Return the sqlite3* database handle to which the prepared statement given 82551942bc3Sdrh ** in the argument belongs. This is the same database handle that was 82651942bc3Sdrh ** the first argument to the sqlite3_prepare() that was used to create 82751942bc3Sdrh ** the statement in the first place. 82851942bc3Sdrh */ 82951942bc3Sdrh sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ 83051942bc3Sdrh return pStmt ? ((Vdbe*)pStmt)->db : 0; 83151942bc3Sdrh } 832