xref: /sqlite-3.40.0/src/vdbeapi.c (revision 13073931)
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