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" 184f26d6c4Sdrh 194f26d6c4Sdrh /**************************** sqlite3_value_ ******************************* 204f26d6c4Sdrh ** The following routines extract information from a Mem or sqlite3_value 214f26d6c4Sdrh ** structure. 224f26d6c4Sdrh */ 234f26d6c4Sdrh const void *sqlite3_value_blob(sqlite3_value *pVal){ 244f26d6c4Sdrh Mem *p = (Mem*)pVal; 254f26d6c4Sdrh if( p->flags & (MEM_Blob|MEM_Str) ){ 264f26d6c4Sdrh return p->z; 274f26d6c4Sdrh }else{ 284f26d6c4Sdrh return sqlite3_value_text(pVal); 294f26d6c4Sdrh } 304f26d6c4Sdrh } 314f26d6c4Sdrh int sqlite3_value_bytes(sqlite3_value *pVal){ 324f26d6c4Sdrh Mem *p = (Mem*)pVal; 334f26d6c4Sdrh if( (p->flags & MEM_Blob)!=0 || sqlite3_value_text(pVal) ){ 344f26d6c4Sdrh return p->n; 354f26d6c4Sdrh } 364f26d6c4Sdrh return 0; 374f26d6c4Sdrh } 384f26d6c4Sdrh int sqlite3_value_bytes16(sqlite3_value *pVal){ 394f26d6c4Sdrh Mem *p = (Mem*)pVal; 404f26d6c4Sdrh if( (p->flags & MEM_Blob)!=0 || sqlite3_value_text16(pVal) ){ 414f26d6c4Sdrh return ((Mem *)pVal)->n; 424f26d6c4Sdrh } 434f26d6c4Sdrh return 0; 444f26d6c4Sdrh } 454f26d6c4Sdrh double sqlite3_value_double(sqlite3_value *pVal){ 466a6124e2Sdrh return sqlite3VdbeRealValue((Mem*)pVal); 474f26d6c4Sdrh } 484f26d6c4Sdrh int sqlite3_value_int(sqlite3_value *pVal){ 496a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 504f26d6c4Sdrh } 51efad9995Sdrh sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ 526a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 534f26d6c4Sdrh } 544f26d6c4Sdrh const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ 55dc8453fdSdanielk1977 return (const char *)sqlite3ValueText(pVal, SQLITE_UTF8); 564f26d6c4Sdrh } 574f26d6c4Sdrh const void *sqlite3_value_text16(sqlite3_value* pVal){ 58dc8453fdSdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); 594f26d6c4Sdrh } 60d8123366Sdanielk1977 const void *sqlite3_value_text16be(sqlite3_value *pVal){ 61d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16BE); 62d8123366Sdanielk1977 } 63d8123366Sdanielk1977 const void *sqlite3_value_text16le(sqlite3_value *pVal){ 64d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16LE); 65d8123366Sdanielk1977 } 664f26d6c4Sdrh int sqlite3_value_type(sqlite3_value* pVal){ 67f4479501Sdrh return pVal->type; 684f26d6c4Sdrh } 694f26d6c4Sdrh 704f26d6c4Sdrh /**************************** sqlite3_result_ ******************************* 714f26d6c4Sdrh ** The following routines are used by user-defined functions to specify 724f26d6c4Sdrh ** the function result. 734f26d6c4Sdrh */ 744f26d6c4Sdrh void sqlite3_result_blob( 754f26d6c4Sdrh sqlite3_context *pCtx, 764f26d6c4Sdrh const void *z, 774f26d6c4Sdrh int n, 78d8123366Sdanielk1977 void (*xDel)(void *) 794f26d6c4Sdrh ){ 804f26d6c4Sdrh assert( n>0 ); 81d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, 0, xDel); 824f26d6c4Sdrh } 834f26d6c4Sdrh void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ 844f26d6c4Sdrh sqlite3VdbeMemSetDouble(&pCtx->s, rVal); 854f26d6c4Sdrh } 864f26d6c4Sdrh void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ 874f26d6c4Sdrh pCtx->isError = 1; 88d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); 894f26d6c4Sdrh } 904f26d6c4Sdrh void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ 914f26d6c4Sdrh pCtx->isError = 1; 92d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); 934f26d6c4Sdrh } 94f4479501Sdrh void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ 954f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal); 964f26d6c4Sdrh } 974f26d6c4Sdrh void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ 984f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, iVal); 994f26d6c4Sdrh } 1004f26d6c4Sdrh void sqlite3_result_null(sqlite3_context *pCtx){ 101f4479501Sdrh sqlite3VdbeMemSetNull(&pCtx->s); 1024f26d6c4Sdrh } 1034f26d6c4Sdrh void sqlite3_result_text( 1044f26d6c4Sdrh sqlite3_context *pCtx, 1054f26d6c4Sdrh const char *z, 1064f26d6c4Sdrh int n, 107d8123366Sdanielk1977 void (*xDel)(void *) 1084f26d6c4Sdrh ){ 109d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, xDel); 1104f26d6c4Sdrh } 1114f26d6c4Sdrh void sqlite3_result_text16( 1124f26d6c4Sdrh sqlite3_context *pCtx, 1134f26d6c4Sdrh const void *z, 1144f26d6c4Sdrh int n, 115d8123366Sdanielk1977 void (*xDel)(void *) 1164f26d6c4Sdrh ){ 117d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel); 118d8123366Sdanielk1977 } 119d8123366Sdanielk1977 void sqlite3_result_text16be( 120d8123366Sdanielk1977 sqlite3_context *pCtx, 121d8123366Sdanielk1977 const void *z, 122d8123366Sdanielk1977 int n, 123d8123366Sdanielk1977 void (*xDel)(void *) 124d8123366Sdanielk1977 ){ 125d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16BE, xDel); 126d8123366Sdanielk1977 } 127d8123366Sdanielk1977 void sqlite3_result_text16le( 128d8123366Sdanielk1977 sqlite3_context *pCtx, 129d8123366Sdanielk1977 const void *z, 130d8123366Sdanielk1977 int n, 131d8123366Sdanielk1977 void (*xDel)(void *) 132d8123366Sdanielk1977 ){ 133d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16LE, xDel); 1344f26d6c4Sdrh } 1354f26d6c4Sdrh void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ 1364f26d6c4Sdrh sqlite3VdbeMemCopy(&pCtx->s, pValue); 1374f26d6c4Sdrh } 1384f26d6c4Sdrh 1394f26d6c4Sdrh 1404f26d6c4Sdrh /* 1414f26d6c4Sdrh ** Execute the statement pStmt, either until a row of data is ready, the 1424f26d6c4Sdrh ** statement is completely executed or an error occurs. 1434f26d6c4Sdrh */ 1444f26d6c4Sdrh int sqlite3_step(sqlite3_stmt *pStmt){ 1454f26d6c4Sdrh Vdbe *p = (Vdbe*)pStmt; 1464f26d6c4Sdrh sqlite *db; 1474f26d6c4Sdrh int rc; 1484f26d6c4Sdrh 1494f26d6c4Sdrh if( p->magic!=VDBE_MAGIC_RUN ){ 1504f26d6c4Sdrh return SQLITE_MISUSE; 1514f26d6c4Sdrh } 152*91b48aa1Sdrh if( p->aborted ){ 153*91b48aa1Sdrh return SQLITE_ABORT; 154*91b48aa1Sdrh } 1554f26d6c4Sdrh db = p->db; 1564f26d6c4Sdrh if( sqlite3SafetyOn(db) ){ 1574f26d6c4Sdrh p->rc = SQLITE_MISUSE; 1584f26d6c4Sdrh return SQLITE_MISUSE; 1594f26d6c4Sdrh } 1601d850a72Sdanielk1977 if( p->pc<0 ){ 1611d850a72Sdanielk1977 db->activeVdbeCnt++; 1621d850a72Sdanielk1977 p->pc = 0; 1631d850a72Sdanielk1977 } 1644f26d6c4Sdrh if( p->explain ){ 1654f26d6c4Sdrh rc = sqlite3VdbeList(p); 1664f26d6c4Sdrh }else{ 1674f26d6c4Sdrh rc = sqlite3VdbeExec(p); 1684f26d6c4Sdrh } 1694f26d6c4Sdrh 1704f26d6c4Sdrh if( sqlite3SafetyOff(db) ){ 1714f26d6c4Sdrh rc = SQLITE_MISUSE; 1724f26d6c4Sdrh } 1734f26d6c4Sdrh 1744f26d6c4Sdrh sqlite3Error(p->db, rc, p->zErrMsg); 1754f26d6c4Sdrh return rc; 1764f26d6c4Sdrh } 1774f26d6c4Sdrh 1784f26d6c4Sdrh /* 179eb2e176aSdrh ** Extract the user data from a sqlite3_context structure and return a 180eb2e176aSdrh ** pointer to it. 181eb2e176aSdrh */ 182eb2e176aSdrh void *sqlite3_user_data(sqlite3_context *p){ 183eb2e176aSdrh assert( p && p->pFunc ); 184eb2e176aSdrh return p->pFunc->pUserData; 185eb2e176aSdrh } 186eb2e176aSdrh 187eb2e176aSdrh /* 188eb2e176aSdrh ** Allocate or return the aggregate context for a user function. A new 189eb2e176aSdrh ** context is allocated on the first call. Subsequent calls return the 190eb2e176aSdrh ** same context that was returned on prior calls. 191eb2e176aSdrh ** 192eb2e176aSdrh ** This routine is defined here in vdbe.c because it depends on knowing 193eb2e176aSdrh ** the internals of the sqlite3_context structure which is only defined in 194eb2e176aSdrh ** this source file. 195eb2e176aSdrh */ 196eb2e176aSdrh void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ 197eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 198eb2e176aSdrh if( p->pAgg==0 ){ 199eb2e176aSdrh if( nByte<=NBFS ){ 200eb2e176aSdrh p->pAgg = (void*)p->s.z; 201eb2e176aSdrh memset(p->pAgg, 0, nByte); 202eb2e176aSdrh }else{ 203eb2e176aSdrh p->pAgg = sqliteMalloc( nByte ); 204eb2e176aSdrh } 205eb2e176aSdrh } 206eb2e176aSdrh return p->pAgg; 207eb2e176aSdrh } 208eb2e176aSdrh 209eb2e176aSdrh /* 210682f68b0Sdanielk1977 ** Return the auxilary data pointer, if any, for the iArg'th argument to 211682f68b0Sdanielk1977 ** the user-function defined by pCtx. 212682f68b0Sdanielk1977 */ 213682f68b0Sdanielk1977 void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ 214682f68b0Sdanielk1977 VdbeFunc *pVdbeFunc = pCtx->pVdbeFunc; 215682f68b0Sdanielk1977 if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){ 216682f68b0Sdanielk1977 return 0; 217682f68b0Sdanielk1977 } 218f92c7ff7Sdrh return pVdbeFunc->apAux[iArg].pAux; 219682f68b0Sdanielk1977 } 220682f68b0Sdanielk1977 221682f68b0Sdanielk1977 /* 222682f68b0Sdanielk1977 ** Set the auxilary data pointer and delete function, for the iArg'th 223682f68b0Sdanielk1977 ** argument to the user-function defined by pCtx. Any previous value is 224682f68b0Sdanielk1977 ** deleted by calling the delete function specified when it was set. 225682f68b0Sdanielk1977 */ 226682f68b0Sdanielk1977 void sqlite3_set_auxdata( 227682f68b0Sdanielk1977 sqlite3_context *pCtx, 228682f68b0Sdanielk1977 int iArg, 229682f68b0Sdanielk1977 void *pAux, 230682f68b0Sdanielk1977 void (*xDelete)(void*) 231682f68b0Sdanielk1977 ){ 232682f68b0Sdanielk1977 struct AuxData *pAuxData; 233f92c7ff7Sdrh VdbeFunc *pVdbeFunc; 234682f68b0Sdanielk1977 if( iArg<0 ) return; 235682f68b0Sdanielk1977 236f92c7ff7Sdrh pVdbeFunc = pCtx->pVdbeFunc; 237f92c7ff7Sdrh if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){ 238998da3a2Sdrh int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg; 239f92c7ff7Sdrh pCtx->pVdbeFunc = pVdbeFunc = sqliteRealloc(pVdbeFunc, nMalloc); 240998da3a2Sdrh if( !pVdbeFunc ) return; 2410e3d7476Sdrh memset(&pVdbeFunc->apAux[pVdbeFunc->nAux], 0, 2420e3d7476Sdrh sizeof(struct AuxData)*(iArg+1-pVdbeFunc->nAux)); 243998da3a2Sdrh pVdbeFunc->nAux = iArg+1; 244998da3a2Sdrh pVdbeFunc->pFunc = pCtx->pFunc; 245682f68b0Sdanielk1977 } 246682f68b0Sdanielk1977 247f92c7ff7Sdrh pAuxData = &pVdbeFunc->apAux[iArg]; 248682f68b0Sdanielk1977 if( pAuxData->pAux && pAuxData->xDelete ){ 249682f68b0Sdanielk1977 pAuxData->xDelete(pAuxData->pAux); 250682f68b0Sdanielk1977 } 251682f68b0Sdanielk1977 pAuxData->pAux = pAux; 252682f68b0Sdanielk1977 pAuxData->xDelete = xDelete; 253682f68b0Sdanielk1977 } 254682f68b0Sdanielk1977 255682f68b0Sdanielk1977 /* 256eb2e176aSdrh ** Return the number of times the Step function of a aggregate has been 257eb2e176aSdrh ** called. 258eb2e176aSdrh ** 259eb2e176aSdrh ** This routine is defined here in vdbe.c because it depends on knowing 260eb2e176aSdrh ** the internals of the sqlite3_context structure which is only defined in 261eb2e176aSdrh ** this source file. 262eb2e176aSdrh */ 263eb2e176aSdrh int sqlite3_aggregate_count(sqlite3_context *p){ 264eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 265eb2e176aSdrh return p->cnt; 266eb2e176aSdrh } 267eb2e176aSdrh 268eb2e176aSdrh /* 2694f26d6c4Sdrh ** Return the number of columns in the result set for the statement pStmt. 2704f26d6c4Sdrh */ 2714f26d6c4Sdrh int sqlite3_column_count(sqlite3_stmt *pStmt){ 2724f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2734f26d6c4Sdrh return pVm->nResColumn; 2744f26d6c4Sdrh } 2754f26d6c4Sdrh 2764f26d6c4Sdrh /* 2774f26d6c4Sdrh ** Return the number of values available from the current row of the 2784f26d6c4Sdrh ** currently executing statement pStmt. 2794f26d6c4Sdrh */ 2804f26d6c4Sdrh int sqlite3_data_count(sqlite3_stmt *pStmt){ 2814f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2824f26d6c4Sdrh if( !pVm->resOnStack ) return 0; 2834f26d6c4Sdrh return pVm->nResColumn; 2844f26d6c4Sdrh } 2854f26d6c4Sdrh 2864f26d6c4Sdrh 2874f26d6c4Sdrh /* 2884f26d6c4Sdrh ** Check to see if column iCol of the given statement is valid. If 2894f26d6c4Sdrh ** it is, return a pointer to the Mem for the value of that column. 2904f26d6c4Sdrh ** If iCol is not valid, return a pointer to a Mem which has a value 2914f26d6c4Sdrh ** of NULL. 2924f26d6c4Sdrh */ 2934f26d6c4Sdrh static Mem *columnMem(sqlite3_stmt *pStmt, int i){ 2944f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2954f26d6c4Sdrh int vals = sqlite3_data_count(pStmt); 2964f26d6c4Sdrh if( i>=vals || i<0 ){ 2974f26d6c4Sdrh static Mem nullMem; 2984f26d6c4Sdrh if( nullMem.flags==0 ){ nullMem.flags = MEM_Null; } 2994f26d6c4Sdrh sqlite3Error(pVm->db, SQLITE_RANGE, 0); 3004f26d6c4Sdrh return &nullMem; 3014f26d6c4Sdrh } 3024f26d6c4Sdrh return &pVm->pTos[(1-vals)+i]; 3034f26d6c4Sdrh } 3044f26d6c4Sdrh 3054f26d6c4Sdrh /**************************** sqlite3_column_ ******************************* 3064f26d6c4Sdrh ** The following routines are used to access elements of the current row 3074f26d6c4Sdrh ** in the result set. 3084f26d6c4Sdrh */ 309c572ef7fSdanielk1977 const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ 310c572ef7fSdanielk1977 return sqlite3_value_blob( columnMem(pStmt,i) ); 311c572ef7fSdanielk1977 } 3124f26d6c4Sdrh int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ 3134f26d6c4Sdrh return sqlite3_value_bytes( columnMem(pStmt,i) ); 3144f26d6c4Sdrh } 3154f26d6c4Sdrh int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ 3164f26d6c4Sdrh return sqlite3_value_bytes16( columnMem(pStmt,i) ); 3174f26d6c4Sdrh } 3184f26d6c4Sdrh double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ 3194f26d6c4Sdrh return sqlite3_value_double( columnMem(pStmt,i) ); 3204f26d6c4Sdrh } 3214f26d6c4Sdrh int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ 3224f26d6c4Sdrh return sqlite3_value_int( columnMem(pStmt,i) ); 3234f26d6c4Sdrh } 324efad9995Sdrh sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ 3254f26d6c4Sdrh return sqlite3_value_int64( columnMem(pStmt,i) ); 3264f26d6c4Sdrh } 3274f26d6c4Sdrh const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ 3284f26d6c4Sdrh return sqlite3_value_text( columnMem(pStmt,i) ); 3294f26d6c4Sdrh } 3304f26d6c4Sdrh const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ 3314f26d6c4Sdrh return sqlite3_value_text16( columnMem(pStmt,i) ); 3324f26d6c4Sdrh } 3334f26d6c4Sdrh int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ 3344f26d6c4Sdrh return sqlite3_value_type( columnMem(pStmt,i) ); 3354f26d6c4Sdrh } 3364f26d6c4Sdrh 3374f26d6c4Sdrh 3384f26d6c4Sdrh /* 3394f26d6c4Sdrh ** Return the name of the Nth column of the result set returned by SQL 3404f26d6c4Sdrh ** statement pStmt. 3414f26d6c4Sdrh */ 3424f26d6c4Sdrh const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ 3434f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 3444f26d6c4Sdrh Mem *pColName; 3454f26d6c4Sdrh 3464f26d6c4Sdrh if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3474f26d6c4Sdrh return 0; 3484f26d6c4Sdrh } 3494f26d6c4Sdrh 3504f26d6c4Sdrh pColName = &(p->aColName[N]); 3514f26d6c4Sdrh return sqlite3_value_text(pColName); 3524f26d6c4Sdrh } 3534f26d6c4Sdrh 3544f26d6c4Sdrh /* 3554f26d6c4Sdrh ** Return the name of the 'i'th column of the result set of SQL statement 3564f26d6c4Sdrh ** pStmt, encoded as UTF-16. 3574f26d6c4Sdrh */ 3584f26d6c4Sdrh const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ 3594f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 3604f26d6c4Sdrh Mem *pColName; 3614f26d6c4Sdrh 3624f26d6c4Sdrh if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3634f26d6c4Sdrh return 0; 3644f26d6c4Sdrh } 3654f26d6c4Sdrh 3664f26d6c4Sdrh pColName = &(p->aColName[N]); 3674f26d6c4Sdrh return sqlite3_value_text16(pColName); 3684f26d6c4Sdrh } 3694f26d6c4Sdrh 3704f26d6c4Sdrh /* 3714f26d6c4Sdrh ** Return the column declaration type (if applicable) of the 'i'th column 3724f26d6c4Sdrh ** of the result set of SQL statement pStmt, encoded as UTF-8. 3734f26d6c4Sdrh */ 37476d505baSdanielk1977 const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ 3754f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 37676d505baSdanielk1977 Mem *pColName; 3774f26d6c4Sdrh 37876d505baSdanielk1977 if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3794f26d6c4Sdrh return 0; 3804f26d6c4Sdrh } 3814f26d6c4Sdrh 38276d505baSdanielk1977 pColName = &(p->aColName[N+sqlite3_column_count(pStmt)]); 38376d505baSdanielk1977 return sqlite3_value_text(pColName); 3844f26d6c4Sdrh } 3854f26d6c4Sdrh 3864f26d6c4Sdrh /* 3874f26d6c4Sdrh ** Return the column declaration type (if applicable) of the 'i'th column 3884f26d6c4Sdrh ** of the result set of SQL statement pStmt, encoded as UTF-16. 3894f26d6c4Sdrh */ 39076d505baSdanielk1977 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ 39176d505baSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 39276d505baSdanielk1977 Mem *pColName; 39376d505baSdanielk1977 39476d505baSdanielk1977 if( N>=sqlite3_column_count(pStmt) || N<0 ){ 39576d505baSdanielk1977 return 0; 39676d505baSdanielk1977 } 39776d505baSdanielk1977 39876d505baSdanielk1977 pColName = &(p->aColName[N+sqlite3_column_count(pStmt)]); 39976d505baSdanielk1977 return sqlite3_value_text16(pColName); 4004f26d6c4Sdrh } 4014f26d6c4Sdrh 4024f26d6c4Sdrh /******************************* sqlite3_bind_ *************************** 4034f26d6c4Sdrh ** 4044f26d6c4Sdrh ** Routines used to attach values to wildcards in a compiled SQL statement. 4054f26d6c4Sdrh */ 4064f26d6c4Sdrh /* 4074f26d6c4Sdrh ** Unbind the value bound to variable i in virtual machine p. This is the 4084f26d6c4Sdrh ** the same as binding a NULL value to the column. If the "i" parameter is 4094f26d6c4Sdrh ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. 4104f26d6c4Sdrh ** 4114f26d6c4Sdrh ** The error code stored in database p->db is overwritten with the return 4124f26d6c4Sdrh ** value in any case. 4134f26d6c4Sdrh */ 4144f26d6c4Sdrh static int vdbeUnbind(Vdbe *p, int i){ 4154f26d6c4Sdrh Mem *pVar; 4161d850a72Sdanielk1977 if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ 4174f26d6c4Sdrh sqlite3Error(p->db, SQLITE_MISUSE, 0); 4184f26d6c4Sdrh return SQLITE_MISUSE; 4194f26d6c4Sdrh } 4204f26d6c4Sdrh if( i<1 || i>p->nVar ){ 4214f26d6c4Sdrh sqlite3Error(p->db, SQLITE_RANGE, 0); 4224f26d6c4Sdrh return SQLITE_RANGE; 4234f26d6c4Sdrh } 4244f26d6c4Sdrh i--; 4254f26d6c4Sdrh pVar = &p->apVar[i]; 426d8123366Sdanielk1977 sqlite3VdbeMemRelease(pVar); 4274f26d6c4Sdrh pVar->flags = MEM_Null; 4284f26d6c4Sdrh sqlite3Error(p->db, SQLITE_OK, 0); 4294f26d6c4Sdrh return SQLITE_OK; 4304f26d6c4Sdrh } 4314f26d6c4Sdrh 4324f26d6c4Sdrh /* 4334f26d6c4Sdrh ** Bind a blob value to an SQL statement variable. 4344f26d6c4Sdrh */ 4354f26d6c4Sdrh int sqlite3_bind_blob( 436f4479501Sdrh sqlite3_stmt *pStmt, 4374f26d6c4Sdrh int i, 4384f26d6c4Sdrh const void *zData, 4394f26d6c4Sdrh int nData, 440d8123366Sdanielk1977 void (*xDel)(void*) 4414f26d6c4Sdrh ){ 4424f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4434f26d6c4Sdrh Mem *pVar; 4444f26d6c4Sdrh int rc; 4454f26d6c4Sdrh 4464f26d6c4Sdrh rc = vdbeUnbind(p, i); 4474f26d6c4Sdrh if( rc ){ 4484f26d6c4Sdrh return rc; 4494f26d6c4Sdrh } 4504f26d6c4Sdrh pVar = &p->apVar[i-1]; 451d8123366Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, 0, xDel); 4524f26d6c4Sdrh return rc; 4534f26d6c4Sdrh } 4544f26d6c4Sdrh int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ 4554f26d6c4Sdrh int rc; 4564f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4574f26d6c4Sdrh rc = vdbeUnbind(p, i); 4584f26d6c4Sdrh if( rc==SQLITE_OK ){ 459f4479501Sdrh sqlite3VdbeMemSetDouble(&p->apVar[i-1], rValue); 4604f26d6c4Sdrh } 461f4618891Sdanielk1977 return rc; 4624f26d6c4Sdrh } 4634f26d6c4Sdrh int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ 464efad9995Sdrh return sqlite3_bind_int64(p, i, (i64)iValue); 4654f26d6c4Sdrh } 466efad9995Sdrh int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ 4674f26d6c4Sdrh int rc; 4684f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4694f26d6c4Sdrh rc = vdbeUnbind(p, i); 4704f26d6c4Sdrh if( rc==SQLITE_OK ){ 471f4479501Sdrh sqlite3VdbeMemSetInt64(&p->apVar[i-1], iValue); 4724f26d6c4Sdrh } 4734f26d6c4Sdrh return rc; 4744f26d6c4Sdrh } 4754f26d6c4Sdrh int sqlite3_bind_null(sqlite3_stmt* p, int i){ 4764f26d6c4Sdrh return vdbeUnbind((Vdbe *)p, i); 4774f26d6c4Sdrh } 4784f26d6c4Sdrh int sqlite3_bind_text( 4794f26d6c4Sdrh sqlite3_stmt *pStmt, 4804f26d6c4Sdrh int i, 4814f26d6c4Sdrh const char *zData, 4824f26d6c4Sdrh int nData, 483d8123366Sdanielk1977 void (*xDel)(void*) 4844f26d6c4Sdrh ){ 4854f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4864f26d6c4Sdrh Mem *pVar; 4874f26d6c4Sdrh int rc; 4884f26d6c4Sdrh 4894f26d6c4Sdrh rc = vdbeUnbind(p, i); 4904f26d6c4Sdrh if( rc ){ 4914f26d6c4Sdrh return rc; 4924f26d6c4Sdrh } 4934f26d6c4Sdrh pVar = &p->apVar[i-1]; 494d8123366Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, SQLITE_UTF8, xDel); 4954f26d6c4Sdrh if( rc ){ 4964f26d6c4Sdrh return rc; 4974f26d6c4Sdrh } 498f4479501Sdrh rc = sqlite3VdbeChangeEncoding(pVar, p->db->enc); 4994f26d6c4Sdrh return rc; 5004f26d6c4Sdrh } 5014f26d6c4Sdrh int sqlite3_bind_text16( 5024f26d6c4Sdrh sqlite3_stmt *pStmt, 5034f26d6c4Sdrh int i, 5044f26d6c4Sdrh const void *zData, 5054f26d6c4Sdrh int nData, 506d8123366Sdanielk1977 void (*xDel)(void*) 5074f26d6c4Sdrh ){ 5084f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 5094f26d6c4Sdrh Mem *pVar; 5105314c4d7Sdanielk1977 int rc; 5114f26d6c4Sdrh 5124f26d6c4Sdrh rc = vdbeUnbind(p, i); 5134f26d6c4Sdrh if( rc ){ 5144f26d6c4Sdrh return rc; 5154f26d6c4Sdrh } 516f4479501Sdrh pVar = &p->apVar[i-1]; 5174f26d6c4Sdrh 518bfd6cce5Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, SQLITE_UTF16NATIVE, xDel); 5194f26d6c4Sdrh if( rc ){ 5204f26d6c4Sdrh return rc; 5214f26d6c4Sdrh } 522f4479501Sdrh rc = sqlite3VdbeChangeEncoding(pVar, p->db->enc); 5234f26d6c4Sdrh return rc; 5244f26d6c4Sdrh } 525