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