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){ 32*13073931Sdanielk1977 return sqlite3ValueBytes(pVal, SQLITE_UTF8); 334f26d6c4Sdrh } 344f26d6c4Sdrh int sqlite3_value_bytes16(sqlite3_value *pVal){ 35*13073931Sdanielk1977 return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); 364f26d6c4Sdrh } 374f26d6c4Sdrh double sqlite3_value_double(sqlite3_value *pVal){ 386a6124e2Sdrh return sqlite3VdbeRealValue((Mem*)pVal); 394f26d6c4Sdrh } 404f26d6c4Sdrh int sqlite3_value_int(sqlite3_value *pVal){ 416a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 424f26d6c4Sdrh } 43efad9995Sdrh sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ 446a6124e2Sdrh return sqlite3VdbeIntValue((Mem*)pVal); 454f26d6c4Sdrh } 464f26d6c4Sdrh const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ 47dc8453fdSdanielk1977 return (const char *)sqlite3ValueText(pVal, SQLITE_UTF8); 484f26d6c4Sdrh } 494f26d6c4Sdrh const void *sqlite3_value_text16(sqlite3_value* pVal){ 50dc8453fdSdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE); 514f26d6c4Sdrh } 52d8123366Sdanielk1977 const void *sqlite3_value_text16be(sqlite3_value *pVal){ 53d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16BE); 54d8123366Sdanielk1977 } 55d8123366Sdanielk1977 const void *sqlite3_value_text16le(sqlite3_value *pVal){ 56d8123366Sdanielk1977 return sqlite3ValueText(pVal, SQLITE_UTF16LE); 57d8123366Sdanielk1977 } 584f26d6c4Sdrh int sqlite3_value_type(sqlite3_value* pVal){ 59f4479501Sdrh return pVal->type; 604f26d6c4Sdrh } 614f26d6c4Sdrh 624f26d6c4Sdrh /**************************** sqlite3_result_ ******************************* 634f26d6c4Sdrh ** The following routines are used by user-defined functions to specify 644f26d6c4Sdrh ** the function result. 654f26d6c4Sdrh */ 664f26d6c4Sdrh void sqlite3_result_blob( 674f26d6c4Sdrh sqlite3_context *pCtx, 684f26d6c4Sdrh const void *z, 694f26d6c4Sdrh int n, 70d8123366Sdanielk1977 void (*xDel)(void *) 714f26d6c4Sdrh ){ 724f26d6c4Sdrh assert( n>0 ); 73d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, 0, xDel); 744f26d6c4Sdrh } 754f26d6c4Sdrh void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ 764f26d6c4Sdrh sqlite3VdbeMemSetDouble(&pCtx->s, rVal); 774f26d6c4Sdrh } 784f26d6c4Sdrh void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ 794f26d6c4Sdrh pCtx->isError = 1; 80d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); 814f26d6c4Sdrh } 824f26d6c4Sdrh void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ 834f26d6c4Sdrh pCtx->isError = 1; 84d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); 854f26d6c4Sdrh } 86f4479501Sdrh void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ 874f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal); 884f26d6c4Sdrh } 894f26d6c4Sdrh void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ 904f26d6c4Sdrh sqlite3VdbeMemSetInt64(&pCtx->s, iVal); 914f26d6c4Sdrh } 924f26d6c4Sdrh void sqlite3_result_null(sqlite3_context *pCtx){ 93f4479501Sdrh sqlite3VdbeMemSetNull(&pCtx->s); 944f26d6c4Sdrh } 954f26d6c4Sdrh void sqlite3_result_text( 964f26d6c4Sdrh sqlite3_context *pCtx, 974f26d6c4Sdrh const char *z, 984f26d6c4Sdrh int n, 99d8123366Sdanielk1977 void (*xDel)(void *) 1004f26d6c4Sdrh ){ 101d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, xDel); 1024f26d6c4Sdrh } 1034f26d6c4Sdrh void sqlite3_result_text16( 1044f26d6c4Sdrh sqlite3_context *pCtx, 1054f26d6c4Sdrh const void *z, 1064f26d6c4Sdrh int n, 107d8123366Sdanielk1977 void (*xDel)(void *) 1084f26d6c4Sdrh ){ 109d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel); 110d8123366Sdanielk1977 } 111d8123366Sdanielk1977 void sqlite3_result_text16be( 112d8123366Sdanielk1977 sqlite3_context *pCtx, 113d8123366Sdanielk1977 const void *z, 114d8123366Sdanielk1977 int n, 115d8123366Sdanielk1977 void (*xDel)(void *) 116d8123366Sdanielk1977 ){ 117d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16BE, xDel); 118d8123366Sdanielk1977 } 119d8123366Sdanielk1977 void sqlite3_result_text16le( 120d8123366Sdanielk1977 sqlite3_context *pCtx, 121d8123366Sdanielk1977 const void *z, 122d8123366Sdanielk1977 int n, 123d8123366Sdanielk1977 void (*xDel)(void *) 124d8123366Sdanielk1977 ){ 125d8123366Sdanielk1977 sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16LE, xDel); 1264f26d6c4Sdrh } 1274f26d6c4Sdrh void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ 1284f26d6c4Sdrh sqlite3VdbeMemCopy(&pCtx->s, pValue); 1294f26d6c4Sdrh } 1304f26d6c4Sdrh 1314f26d6c4Sdrh 1324f26d6c4Sdrh /* 1334f26d6c4Sdrh ** Execute the statement pStmt, either until a row of data is ready, the 1344f26d6c4Sdrh ** statement is completely executed or an error occurs. 1354f26d6c4Sdrh */ 1364f26d6c4Sdrh int sqlite3_step(sqlite3_stmt *pStmt){ 1374f26d6c4Sdrh Vdbe *p = (Vdbe*)pStmt; 1384f26d6c4Sdrh sqlite *db; 1394f26d6c4Sdrh int rc; 1404f26d6c4Sdrh 1414f26d6c4Sdrh if( p->magic!=VDBE_MAGIC_RUN ){ 1424f26d6c4Sdrh return SQLITE_MISUSE; 1434f26d6c4Sdrh } 14491b48aa1Sdrh if( p->aborted ){ 14591b48aa1Sdrh return SQLITE_ABORT; 14691b48aa1Sdrh } 1474f26d6c4Sdrh db = p->db; 1484f26d6c4Sdrh if( sqlite3SafetyOn(db) ){ 1494f26d6c4Sdrh p->rc = SQLITE_MISUSE; 1504f26d6c4Sdrh return SQLITE_MISUSE; 1514f26d6c4Sdrh } 1521d850a72Sdanielk1977 if( p->pc<0 ){ 1531d850a72Sdanielk1977 db->activeVdbeCnt++; 1541d850a72Sdanielk1977 p->pc = 0; 1551d850a72Sdanielk1977 } 1564f26d6c4Sdrh if( p->explain ){ 1574f26d6c4Sdrh rc = sqlite3VdbeList(p); 1584f26d6c4Sdrh }else{ 1594f26d6c4Sdrh rc = sqlite3VdbeExec(p); 1604f26d6c4Sdrh } 1614f26d6c4Sdrh 1624f26d6c4Sdrh if( sqlite3SafetyOff(db) ){ 1634f26d6c4Sdrh rc = SQLITE_MISUSE; 1644f26d6c4Sdrh } 1654f26d6c4Sdrh 1664f26d6c4Sdrh sqlite3Error(p->db, rc, p->zErrMsg); 1674f26d6c4Sdrh return rc; 1684f26d6c4Sdrh } 1694f26d6c4Sdrh 1704f26d6c4Sdrh /* 171eb2e176aSdrh ** Extract the user data from a sqlite3_context structure and return a 172eb2e176aSdrh ** pointer to it. 173eb2e176aSdrh */ 174eb2e176aSdrh void *sqlite3_user_data(sqlite3_context *p){ 175eb2e176aSdrh assert( p && p->pFunc ); 176eb2e176aSdrh return p->pFunc->pUserData; 177eb2e176aSdrh } 178eb2e176aSdrh 179eb2e176aSdrh /* 180eb2e176aSdrh ** Allocate or return the aggregate context for a user function. A new 181eb2e176aSdrh ** context is allocated on the first call. Subsequent calls return the 182eb2e176aSdrh ** same context that was returned on prior calls. 183eb2e176aSdrh ** 184eb2e176aSdrh ** This routine is defined here in vdbe.c because it depends on knowing 185eb2e176aSdrh ** the internals of the sqlite3_context structure which is only defined in 186eb2e176aSdrh ** this source file. 187eb2e176aSdrh */ 188eb2e176aSdrh void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ 189eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 190eb2e176aSdrh if( p->pAgg==0 ){ 191eb2e176aSdrh if( nByte<=NBFS ){ 192eb2e176aSdrh p->pAgg = (void*)p->s.z; 193eb2e176aSdrh memset(p->pAgg, 0, nByte); 194eb2e176aSdrh }else{ 195eb2e176aSdrh p->pAgg = sqliteMalloc( nByte ); 196eb2e176aSdrh } 197eb2e176aSdrh } 198eb2e176aSdrh return p->pAgg; 199eb2e176aSdrh } 200eb2e176aSdrh 201eb2e176aSdrh /* 202682f68b0Sdanielk1977 ** Return the auxilary data pointer, if any, for the iArg'th argument to 203682f68b0Sdanielk1977 ** the user-function defined by pCtx. 204682f68b0Sdanielk1977 */ 205682f68b0Sdanielk1977 void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ 206682f68b0Sdanielk1977 VdbeFunc *pVdbeFunc = pCtx->pVdbeFunc; 207682f68b0Sdanielk1977 if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){ 208682f68b0Sdanielk1977 return 0; 209682f68b0Sdanielk1977 } 210f92c7ff7Sdrh return pVdbeFunc->apAux[iArg].pAux; 211682f68b0Sdanielk1977 } 212682f68b0Sdanielk1977 213682f68b0Sdanielk1977 /* 214682f68b0Sdanielk1977 ** Set the auxilary data pointer and delete function, for the iArg'th 215682f68b0Sdanielk1977 ** argument to the user-function defined by pCtx. Any previous value is 216682f68b0Sdanielk1977 ** deleted by calling the delete function specified when it was set. 217682f68b0Sdanielk1977 */ 218682f68b0Sdanielk1977 void sqlite3_set_auxdata( 219682f68b0Sdanielk1977 sqlite3_context *pCtx, 220682f68b0Sdanielk1977 int iArg, 221682f68b0Sdanielk1977 void *pAux, 222682f68b0Sdanielk1977 void (*xDelete)(void*) 223682f68b0Sdanielk1977 ){ 224682f68b0Sdanielk1977 struct AuxData *pAuxData; 225f92c7ff7Sdrh VdbeFunc *pVdbeFunc; 226682f68b0Sdanielk1977 if( iArg<0 ) return; 227682f68b0Sdanielk1977 228f92c7ff7Sdrh pVdbeFunc = pCtx->pVdbeFunc; 229f92c7ff7Sdrh if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){ 230998da3a2Sdrh int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg; 231f92c7ff7Sdrh pCtx->pVdbeFunc = pVdbeFunc = sqliteRealloc(pVdbeFunc, nMalloc); 232998da3a2Sdrh if( !pVdbeFunc ) return; 2330e3d7476Sdrh memset(&pVdbeFunc->apAux[pVdbeFunc->nAux], 0, 2340e3d7476Sdrh sizeof(struct AuxData)*(iArg+1-pVdbeFunc->nAux)); 235998da3a2Sdrh pVdbeFunc->nAux = iArg+1; 236998da3a2Sdrh pVdbeFunc->pFunc = pCtx->pFunc; 237682f68b0Sdanielk1977 } 238682f68b0Sdanielk1977 239f92c7ff7Sdrh pAuxData = &pVdbeFunc->apAux[iArg]; 240682f68b0Sdanielk1977 if( pAuxData->pAux && pAuxData->xDelete ){ 241682f68b0Sdanielk1977 pAuxData->xDelete(pAuxData->pAux); 242682f68b0Sdanielk1977 } 243682f68b0Sdanielk1977 pAuxData->pAux = pAux; 244682f68b0Sdanielk1977 pAuxData->xDelete = xDelete; 245682f68b0Sdanielk1977 } 246682f68b0Sdanielk1977 247682f68b0Sdanielk1977 /* 248eb2e176aSdrh ** Return the number of times the Step function of a aggregate has been 249eb2e176aSdrh ** called. 250eb2e176aSdrh ** 251eb2e176aSdrh ** This routine is defined here in vdbe.c because it depends on knowing 252eb2e176aSdrh ** the internals of the sqlite3_context structure which is only defined in 253eb2e176aSdrh ** this source file. 254eb2e176aSdrh */ 255eb2e176aSdrh int sqlite3_aggregate_count(sqlite3_context *p){ 256eb2e176aSdrh assert( p && p->pFunc && p->pFunc->xStep ); 257eb2e176aSdrh return p->cnt; 258eb2e176aSdrh } 259eb2e176aSdrh 260eb2e176aSdrh /* 2614f26d6c4Sdrh ** Return the number of columns in the result set for the statement pStmt. 2624f26d6c4Sdrh */ 2634f26d6c4Sdrh int sqlite3_column_count(sqlite3_stmt *pStmt){ 2644f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2654f26d6c4Sdrh return pVm->nResColumn; 2664f26d6c4Sdrh } 2674f26d6c4Sdrh 2684f26d6c4Sdrh /* 2694f26d6c4Sdrh ** Return the number of values available from the current row of the 2704f26d6c4Sdrh ** currently executing statement pStmt. 2714f26d6c4Sdrh */ 2724f26d6c4Sdrh int sqlite3_data_count(sqlite3_stmt *pStmt){ 2734f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2744f26d6c4Sdrh if( !pVm->resOnStack ) return 0; 2754f26d6c4Sdrh return pVm->nResColumn; 2764f26d6c4Sdrh } 2774f26d6c4Sdrh 2784f26d6c4Sdrh 2794f26d6c4Sdrh /* 2804f26d6c4Sdrh ** Check to see if column iCol of the given statement is valid. If 2814f26d6c4Sdrh ** it is, return a pointer to the Mem for the value of that column. 2824f26d6c4Sdrh ** If iCol is not valid, return a pointer to a Mem which has a value 2834f26d6c4Sdrh ** of NULL. 2844f26d6c4Sdrh */ 2854f26d6c4Sdrh static Mem *columnMem(sqlite3_stmt *pStmt, int i){ 2864f26d6c4Sdrh Vdbe *pVm = (Vdbe *)pStmt; 2874f26d6c4Sdrh int vals = sqlite3_data_count(pStmt); 2884f26d6c4Sdrh if( i>=vals || i<0 ){ 2894f26d6c4Sdrh static Mem nullMem; 2904f26d6c4Sdrh if( nullMem.flags==0 ){ nullMem.flags = MEM_Null; } 2914f26d6c4Sdrh sqlite3Error(pVm->db, SQLITE_RANGE, 0); 2924f26d6c4Sdrh return &nullMem; 2934f26d6c4Sdrh } 2944f26d6c4Sdrh return &pVm->pTos[(1-vals)+i]; 2954f26d6c4Sdrh } 2964f26d6c4Sdrh 2974f26d6c4Sdrh /**************************** sqlite3_column_ ******************************* 2984f26d6c4Sdrh ** The following routines are used to access elements of the current row 2994f26d6c4Sdrh ** in the result set. 3004f26d6c4Sdrh */ 301c572ef7fSdanielk1977 const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ 302c572ef7fSdanielk1977 return sqlite3_value_blob( columnMem(pStmt,i) ); 303c572ef7fSdanielk1977 } 3044f26d6c4Sdrh int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ 3054f26d6c4Sdrh return sqlite3_value_bytes( columnMem(pStmt,i) ); 3064f26d6c4Sdrh } 3074f26d6c4Sdrh int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){ 3084f26d6c4Sdrh return sqlite3_value_bytes16( columnMem(pStmt,i) ); 3094f26d6c4Sdrh } 3104f26d6c4Sdrh double sqlite3_column_double(sqlite3_stmt *pStmt, int i){ 3114f26d6c4Sdrh return sqlite3_value_double( columnMem(pStmt,i) ); 3124f26d6c4Sdrh } 3134f26d6c4Sdrh int sqlite3_column_int(sqlite3_stmt *pStmt, int i){ 3144f26d6c4Sdrh return sqlite3_value_int( columnMem(pStmt,i) ); 3154f26d6c4Sdrh } 316efad9995Sdrh sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){ 3174f26d6c4Sdrh return sqlite3_value_int64( columnMem(pStmt,i) ); 3184f26d6c4Sdrh } 3194f26d6c4Sdrh const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){ 3204f26d6c4Sdrh return sqlite3_value_text( columnMem(pStmt,i) ); 3214f26d6c4Sdrh } 3224f26d6c4Sdrh const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){ 3234f26d6c4Sdrh return sqlite3_value_text16( columnMem(pStmt,i) ); 3244f26d6c4Sdrh } 3254f26d6c4Sdrh int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ 3264f26d6c4Sdrh return sqlite3_value_type( columnMem(pStmt,i) ); 3274f26d6c4Sdrh } 3284f26d6c4Sdrh 3294f26d6c4Sdrh 3304f26d6c4Sdrh /* 3314f26d6c4Sdrh ** Return the name of the Nth column of the result set returned by SQL 3324f26d6c4Sdrh ** statement pStmt. 3334f26d6c4Sdrh */ 3344f26d6c4Sdrh const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ 3354f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 3364f26d6c4Sdrh Mem *pColName; 3374f26d6c4Sdrh 3384f26d6c4Sdrh if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3394f26d6c4Sdrh return 0; 3404f26d6c4Sdrh } 3414f26d6c4Sdrh 3424f26d6c4Sdrh pColName = &(p->aColName[N]); 3434f26d6c4Sdrh return sqlite3_value_text(pColName); 3444f26d6c4Sdrh } 3454f26d6c4Sdrh 3464f26d6c4Sdrh /* 3474f26d6c4Sdrh ** Return the name of the 'i'th column of the result set of SQL statement 3484f26d6c4Sdrh ** pStmt, encoded as UTF-16. 3494f26d6c4Sdrh */ 3504f26d6c4Sdrh const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ 3514f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 3524f26d6c4Sdrh Mem *pColName; 3534f26d6c4Sdrh 3544f26d6c4Sdrh if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3554f26d6c4Sdrh return 0; 3564f26d6c4Sdrh } 3574f26d6c4Sdrh 3584f26d6c4Sdrh pColName = &(p->aColName[N]); 3594f26d6c4Sdrh return sqlite3_value_text16(pColName); 3604f26d6c4Sdrh } 3614f26d6c4Sdrh 3624f26d6c4Sdrh /* 3634f26d6c4Sdrh ** Return the column declaration type (if applicable) of the 'i'th column 3644f26d6c4Sdrh ** of the result set of SQL statement pStmt, encoded as UTF-8. 3654f26d6c4Sdrh */ 36676d505baSdanielk1977 const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ 3674f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 36876d505baSdanielk1977 Mem *pColName; 3694f26d6c4Sdrh 37076d505baSdanielk1977 if( N>=sqlite3_column_count(pStmt) || N<0 ){ 3714f26d6c4Sdrh return 0; 3724f26d6c4Sdrh } 3734f26d6c4Sdrh 37476d505baSdanielk1977 pColName = &(p->aColName[N+sqlite3_column_count(pStmt)]); 37576d505baSdanielk1977 return sqlite3_value_text(pColName); 3764f26d6c4Sdrh } 3774f26d6c4Sdrh 3784f26d6c4Sdrh /* 3794f26d6c4Sdrh ** Return the column declaration type (if applicable) of the 'i'th column 3804f26d6c4Sdrh ** of the result set of SQL statement pStmt, encoded as UTF-16. 3814f26d6c4Sdrh */ 38276d505baSdanielk1977 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ 38376d505baSdanielk1977 Vdbe *p = (Vdbe *)pStmt; 38476d505baSdanielk1977 Mem *pColName; 38576d505baSdanielk1977 38676d505baSdanielk1977 if( N>=sqlite3_column_count(pStmt) || N<0 ){ 38776d505baSdanielk1977 return 0; 38876d505baSdanielk1977 } 38976d505baSdanielk1977 39076d505baSdanielk1977 pColName = &(p->aColName[N+sqlite3_column_count(pStmt)]); 39176d505baSdanielk1977 return sqlite3_value_text16(pColName); 3924f26d6c4Sdrh } 3934f26d6c4Sdrh 3944f26d6c4Sdrh /******************************* sqlite3_bind_ *************************** 3954f26d6c4Sdrh ** 3964f26d6c4Sdrh ** Routines used to attach values to wildcards in a compiled SQL statement. 3974f26d6c4Sdrh */ 3984f26d6c4Sdrh /* 3994f26d6c4Sdrh ** Unbind the value bound to variable i in virtual machine p. This is the 4004f26d6c4Sdrh ** the same as binding a NULL value to the column. If the "i" parameter is 4014f26d6c4Sdrh ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. 4024f26d6c4Sdrh ** 4034f26d6c4Sdrh ** The error code stored in database p->db is overwritten with the return 4044f26d6c4Sdrh ** value in any case. 4054f26d6c4Sdrh */ 4064f26d6c4Sdrh static int vdbeUnbind(Vdbe *p, int i){ 4074f26d6c4Sdrh Mem *pVar; 4081d850a72Sdanielk1977 if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){ 4094f26d6c4Sdrh sqlite3Error(p->db, SQLITE_MISUSE, 0); 4104f26d6c4Sdrh return SQLITE_MISUSE; 4114f26d6c4Sdrh } 4124f26d6c4Sdrh if( i<1 || i>p->nVar ){ 4134f26d6c4Sdrh sqlite3Error(p->db, SQLITE_RANGE, 0); 4144f26d6c4Sdrh return SQLITE_RANGE; 4154f26d6c4Sdrh } 4164f26d6c4Sdrh i--; 4174f26d6c4Sdrh pVar = &p->apVar[i]; 418d8123366Sdanielk1977 sqlite3VdbeMemRelease(pVar); 4194f26d6c4Sdrh pVar->flags = MEM_Null; 4204f26d6c4Sdrh sqlite3Error(p->db, SQLITE_OK, 0); 4214f26d6c4Sdrh return SQLITE_OK; 4224f26d6c4Sdrh } 4234f26d6c4Sdrh 4244f26d6c4Sdrh /* 4254f26d6c4Sdrh ** Bind a blob value to an SQL statement variable. 4264f26d6c4Sdrh */ 4274f26d6c4Sdrh int sqlite3_bind_blob( 428f4479501Sdrh sqlite3_stmt *pStmt, 4294f26d6c4Sdrh int i, 4304f26d6c4Sdrh const void *zData, 4314f26d6c4Sdrh int nData, 432d8123366Sdanielk1977 void (*xDel)(void*) 4334f26d6c4Sdrh ){ 4344f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4354f26d6c4Sdrh Mem *pVar; 4364f26d6c4Sdrh int rc; 4374f26d6c4Sdrh 4384f26d6c4Sdrh rc = vdbeUnbind(p, i); 4394f26d6c4Sdrh if( rc ){ 4404f26d6c4Sdrh return rc; 4414f26d6c4Sdrh } 4424f26d6c4Sdrh pVar = &p->apVar[i-1]; 443d8123366Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, 0, xDel); 4444f26d6c4Sdrh return rc; 4454f26d6c4Sdrh } 4464f26d6c4Sdrh int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ 4474f26d6c4Sdrh int rc; 4484f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4494f26d6c4Sdrh rc = vdbeUnbind(p, i); 4504f26d6c4Sdrh if( rc==SQLITE_OK ){ 451f4479501Sdrh sqlite3VdbeMemSetDouble(&p->apVar[i-1], rValue); 4524f26d6c4Sdrh } 453f4618891Sdanielk1977 return rc; 4544f26d6c4Sdrh } 4554f26d6c4Sdrh int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){ 456efad9995Sdrh return sqlite3_bind_int64(p, i, (i64)iValue); 4574f26d6c4Sdrh } 458efad9995Sdrh int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){ 4594f26d6c4Sdrh int rc; 4604f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4614f26d6c4Sdrh rc = vdbeUnbind(p, i); 4624f26d6c4Sdrh if( rc==SQLITE_OK ){ 463f4479501Sdrh sqlite3VdbeMemSetInt64(&p->apVar[i-1], iValue); 4644f26d6c4Sdrh } 4654f26d6c4Sdrh return rc; 4664f26d6c4Sdrh } 4674f26d6c4Sdrh int sqlite3_bind_null(sqlite3_stmt* p, int i){ 4684f26d6c4Sdrh return vdbeUnbind((Vdbe *)p, i); 4694f26d6c4Sdrh } 4704f26d6c4Sdrh int sqlite3_bind_text( 4714f26d6c4Sdrh sqlite3_stmt *pStmt, 4724f26d6c4Sdrh int i, 4734f26d6c4Sdrh const char *zData, 4744f26d6c4Sdrh int nData, 475d8123366Sdanielk1977 void (*xDel)(void*) 4764f26d6c4Sdrh ){ 4774f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 4784f26d6c4Sdrh Mem *pVar; 4794f26d6c4Sdrh int rc; 4804f26d6c4Sdrh 4814f26d6c4Sdrh rc = vdbeUnbind(p, i); 4824f26d6c4Sdrh if( rc ){ 4834f26d6c4Sdrh return rc; 4844f26d6c4Sdrh } 4854f26d6c4Sdrh pVar = &p->apVar[i-1]; 486d8123366Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, SQLITE_UTF8, xDel); 4874f26d6c4Sdrh if( rc ){ 4884f26d6c4Sdrh return rc; 4894f26d6c4Sdrh } 490f4479501Sdrh rc = sqlite3VdbeChangeEncoding(pVar, p->db->enc); 4914f26d6c4Sdrh return rc; 4924f26d6c4Sdrh } 4934f26d6c4Sdrh int sqlite3_bind_text16( 4944f26d6c4Sdrh sqlite3_stmt *pStmt, 4954f26d6c4Sdrh int i, 4964f26d6c4Sdrh const void *zData, 4974f26d6c4Sdrh int nData, 498d8123366Sdanielk1977 void (*xDel)(void*) 4994f26d6c4Sdrh ){ 5004f26d6c4Sdrh Vdbe *p = (Vdbe *)pStmt; 5014f26d6c4Sdrh Mem *pVar; 5025314c4d7Sdanielk1977 int rc; 5034f26d6c4Sdrh 5044f26d6c4Sdrh rc = vdbeUnbind(p, i); 5054f26d6c4Sdrh if( rc ){ 5064f26d6c4Sdrh return rc; 5074f26d6c4Sdrh } 508f4479501Sdrh pVar = &p->apVar[i-1]; 5094f26d6c4Sdrh 510bfd6cce5Sdanielk1977 rc = sqlite3VdbeMemSetStr(pVar, zData, nData, SQLITE_UTF16NATIVE, xDel); 5114f26d6c4Sdrh if( rc ){ 5124f26d6c4Sdrh return rc; 5134f26d6c4Sdrh } 514f4479501Sdrh rc = sqlite3VdbeChangeEncoding(pVar, p->db->enc); 5154f26d6c4Sdrh return rc; 5164f26d6c4Sdrh } 517