15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2004 May 26
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains code use to implement APIs that are part of the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vdbeInt.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE (non-zero) of the statement supplied as an argument needs
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be recompiled.  A statement needs to be recompiled whenever the
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** execution environment changes in a way that would alter the program
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that sqlite3_prepare() generates.  For example, if new functions or
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating sequences are registered or if an authorizer function is
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** added or changed.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_expired(sqlite3_stmt *pStmt){
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe*)pStmt;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p==0 || p->expired;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check on a Vdbe to make sure it has not been finalized.  Log
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an error and return true if it has been finalized (or is otherwise
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invalid).  Return false if it is ok.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vdbeSafety(Vdbe *p){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->db==0 ){
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement");
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vdbeSafetyNotNull(Vdbe *p){
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ){
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return vdbeSafety(p);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routine destroys a virtual machine that is created by
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the sqlite3_compile() routine. The integer returned is an SQLITE_
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** success/failure code that describes the result of executing the virtual
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** machine.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine sets the error code and string returned by
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_finalize(sqlite3_stmt *pStmt){
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pStmt==0 ){
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** pointer is a harmless no-op. */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_OK;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v = (Vdbe*)pStmt;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3 *db = v->db;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex *mutex;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutex = v->db->mutex;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_enter(mutex);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeFinalize(v);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3ApiExit(db, rc);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(mutex);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Terminate the current execution of an SQL statement and reset it
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** back to its starting state so that it can be reused. A success code from
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the prior execution is returned.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine sets the error code and string returned by
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_reset(sqlite3_stmt *pStmt){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pStmt==0 ){
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_OK;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v = (Vdbe*)pStmt;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_enter(v->db->mutex);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeReset(v);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMakeReady(v, -1, 0, 0, 0, 0, 0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (rc & (v->db->errMask))==rc );
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3ApiExit(v->db, rc);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(v->db->mutex);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set all the parameters in the compiled SQL statement to NULL.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe*)pStmt;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(mutex);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<p->nVar; i++){
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(&p->aVar[i]);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->aVar[i].flags = MEM_Null;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->isPrepareV2 && p->expmask ){
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->expired = 1;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_leave(mutex);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************** sqlite3_value_  *******************************
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routines extract information from a Mem or sqlite3_value
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_value_blob(sqlite3_value *pVal){
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *p = (Mem*)pVal;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->flags & (MEM_Blob|MEM_Str) ){
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemExpandBlob(p);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->flags &= ~MEM_Str;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->flags |= MEM_Blob;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return p->n ? p->z : 0;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return sqlite3_value_text(pVal);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_value_bytes(sqlite3_value *pVal){
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ValueBytes(pVal, SQLITE_UTF8);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_value_bytes16(sqlite3_value *pVal){
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double sqlite3_value_double(sqlite3_value *pVal){
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3VdbeRealValue((Mem*)pVal);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_value_int(sqlite3_value *pVal){
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (int)sqlite3VdbeIntValue((Mem*)pVal);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3VdbeIntValue((Mem*)pVal);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_value_text16(sqlite3_value* pVal){
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_value_text16be(sqlite3_value *pVal){
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ValueText(pVal, SQLITE_UTF16BE);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_value_text16le(sqlite3_value *pVal){
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ValueText(pVal, SQLITE_UTF16LE);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_value_type(sqlite3_value* pVal){
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pVal->type;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************** sqlite3_result_  *******************************
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routines are used by user-defined functions to specify
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the function result.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The setStrOrError() funtion calls sqlite3VdbeMemSetStr() to store the
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result as a string or blob but if the string or blob is too large, it
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then sets the error code to SQLITE_TOOBIG
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void setResultStrOrError(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,  /* Function context */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z,          /* String pointer */
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,                  /* Bytes in string, or negative */
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc,                 /* Encoding of z.  0 for BLOBs */
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*)     /* Destructor function */
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemSetStr(&pCtx->s, z, n, enc, xDel)==SQLITE_TOOBIG ){
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_error_toobig(pCtx);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_blob(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *z,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n>=0 );
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setResultStrOrError(pCtx, z, n, 0, xDel);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetDouble(&pCtx->s, rVal);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->isError = SQLITE_ERROR;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->isError = SQLITE_ERROR;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_int(sqlite3_context *pCtx, int iVal){
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetInt64(&pCtx->s, iVal);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_null(sqlite3_context *pCtx){
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetNull(&pCtx->s);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_text(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_text16(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *z,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_text16be(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *z,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_text16le(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *z,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemCopy(&pCtx->s, pValue);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetZeroBlob(&pCtx->s, n);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->isError = errCode;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCtx->s.flags & MEM_Null ){
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetStr(&pCtx->s, sqlite3ErrStr(errCode), -1,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         SQLITE_UTF8, SQLITE_STATIC);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Force an SQLITE_TOOBIG error. */
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_error_toobig(sqlite3_context *pCtx){
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->isError = SQLITE_TOOBIG;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetStr(&pCtx->s, "string or blob too big", -1,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SQLITE_UTF8, SQLITE_STATIC);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* An SQLITE_NOMEM error. */
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_result_error_nomem(sqlite3_context *pCtx){
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetNull(&pCtx->s);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->isError = SQLITE_NOMEM;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCtx->s.db->mallocFailed = 1;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is called after a transaction has been committed. It
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invokes callbacks registered with sqlite3_wal_hook() as required.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int doWalCallbacks(sqlite3 *db){
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<db->nDb; i++){
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Btree *pBt = db->aDb[i].pBt;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pBt ){
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute the statement pStmt, either until a row of data is ready, the
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement is completely executed or an error occurs.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine implements the bulk of the logic behind the sqlite_step()
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** API.  The only thing omitted is the automatic recompile if a
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema change has occurred.  That detail is handled by the
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outer sqlite3_step() wrapper procedure.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3Step(Vdbe *p){
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(p);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->magic!=VDBE_MAGIC_RUN ){
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We used to require that sqlite3_reset() be called before retrying
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3_step() after any error or after SQLITE_DONE.  But beginning
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** with version 3.7.0, we changed this so that sqlite3_reset() would
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** be called automatically instead of throwing the SQLITE_MISUSE error.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** This "automatic-reset" change is not technically an incompatibility,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** since any application that receives an SQLITE_MISUSE is broken by
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** definition.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Nevertheless, some published applications that were originally written
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** returns, and the so were broken by the automatic-reset change.  As a
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** legacy behavior of returning SQLITE_MISUSE for cases where the
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** previous sqlite3_step() returned something other than a SQLITE_LOCKED
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** or SQLITE_BUSY error.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_AUTORESET
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->rc==SQLITE_BUSY || p->rc==SQLITE_LOCKED ){
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_reset((sqlite3_stmt*)p);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_MISUSE_BKPT;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_reset((sqlite3_stmt*)p);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Check that malloc() has not failed. If it has, return early. */
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = p->db;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = SQLITE_NOMEM;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_NOMEM;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pc<=0 && p->expired ){
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = SQLITE_SCHEMA;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_ERROR;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto end_of_step;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pc<0 ){
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If there are no other statements currently running, then
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** reset the interrupt flag.  This prevents a call to sqlite3_interrupt
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** from interrupting a statement that has not yet started.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->activeVdbeCnt==0 ){
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->u1.isInterrupted = 0;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->writeVdbeCnt>0 || db->autoCommit==0 || db->nDeferredCons==0 );
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->xProfile && !db->init.busy ){
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->activeVdbeCnt++;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->readOnly==0 ) db->writeVdbeCnt++;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->pc = 0;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->explain ){
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeList(p);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_EXPLAIN */
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->vdbeExecCnt++;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeExec(p);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->vdbeExecCnt--;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invoke the profile callback if there is one
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_int64 iNow;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3OsCurrentTimeInt64(db->pVfs, &iNow);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->xProfile(db->pProfileArg, p->zSql, (iNow - p->startTime)*1000000);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_DONE ){
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p->rc==SQLITE_OK );
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = doWalCallbacks(db);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->rc!=SQLITE_OK ){
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_ERROR;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->errCode = rc;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = SQLITE_NOMEM;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)end_of_step:
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* At this point local variable rc holds the value that should be
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** returned if this statement was compiled using the legacy
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3_prepare() interface. According to the docs, this can only
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** be one of the values in the first assert() below. Variable p->rc
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** contains the value that would be returned if sqlite3_finalize()
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** were called on statement p.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( rc==SQLITE_ROW  || rc==SQLITE_DONE   || rc==SQLITE_ERROR
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || rc==SQLITE_BUSY || rc==SQLITE_MISUSE
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE );
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If this statement was prepared using sqlite3_prepare_v2(), and an
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** error has occured, then return the error code in p->rc to the
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** caller. Set the error code in the database handle to the same value.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = db->errCode = p->rc;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (rc&db->errMask);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is the top-level implementation of sqlite3_step().  Call
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3Step() to do most of the work.  If a schema error occurs,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** call sqlite3Reprepare() and try again.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_step(sqlite3_stmt *pStmt){
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;      /* Result from sqlite3Step() */
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc2 = SQLITE_OK;     /* Result from sqlite3Reprepare() */
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = (Vdbe*)pStmt;  /* the prepared statement */
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cnt = 0;             /* Counter to prevent infinite loop of reprepares */
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;             /* The database connection */
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( vdbeSafetyNotNull(v) ){
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_MISUSE_BKPT;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = v->db;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(db->mutex);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         && cnt++ < 5
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         && (rc2 = rc = sqlite3Reprepare(v))==SQLITE_OK ){
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_reset(pStmt);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v->expired = 0;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This case occurs after failing to recompile an sql statement.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The error message from the SQL compiler has already been loaded
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** into the database handle. This block copies the error message
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** from the database handle into the statement and sets the statement
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** program counter to 0 to ensure that when the statement is
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** finalized or reset the parser error message is available via
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3_errmsg() and sqlite3_errcode().
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zErr = (const char *)sqlite3_value_text(db->pErr);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, v->zErrMsg);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db->mallocFailed ){
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->zErrMsg = sqlite3DbStrDup(db, zErr);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->rc = rc2;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->zErrMsg = 0;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v->rc = rc = SQLITE_NOMEM;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3ApiExit(db, rc);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_leave(db->mutex);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Extract the user data from a sqlite3_context structure and return a
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer to it.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3_user_data(sqlite3_context *p){
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p && p->pFunc );
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p->pFunc->pUserData;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Extract the user data from a sqlite3_context structure and return a
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer to it.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns a copy of the pointer to the database connection (the 1st
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter) of the sqlite3_create_function() and
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_create_function16() routines that originally registered the
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** application defined function.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p && p->pFunc );
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p->s.db;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following is the implementation of an SQL function that always
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fails with an error message stating that the function is used in the
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** wrong context.  The sqlite3_overload_function() API might construct
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQL function that use this routine so that the functions will exist
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for name resolution but are actually overloaded by the xFindFunction
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** method of virtual tables.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3InvalidFunction(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,  /* The function calling context */
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,               /* Number of arguments to the function */
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2   /* Value of each argument */
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zName = context->pFunc->zName;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zErr;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zErr = sqlite3_mprintf(
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "unable to use function %s in the requested context", zName);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_error(context, zErr, -1);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_free(zErr);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate or return the aggregate context for a user function.  A new
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** context is allocated on the first call.  Subsequent calls return the
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** same context that was returned on prior calls.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p && p->pFunc && p->pFunc->xStep );
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(p->s.db->mutex) );
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem = p->pMem;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( nByte<0 );
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pMem->flags & MEM_Agg)==0 ){
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( nByte<=0 ){
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemReleaseExternal(pMem);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->flags = MEM_Null;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->z = 0;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemGrow(pMem, nByte, 0);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->flags = MEM_Agg;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->u.pDef = p->pFunc;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pMem->z ){
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memset(pMem->z, 0, nByte);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (void*)pMem->z;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the auxilary data pointer, if any, for the iArg'th argument to
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the user-function defined by pCtx.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFunc *pVdbeFunc;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVdbeFunc = pCtx->pVdbeFunc;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pVdbeFunc->apAux[iArg].pAux;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the auxilary data pointer and delete function, for the iArg'th
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument to the user-function defined by pCtx. Any previous value is
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** deleted by calling the delete function specified when it was set.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_set_auxdata(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *pCtx,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iArg,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pAux,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDelete)(void*)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct AuxData *pAuxData;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFunc *pVdbeFunc;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iArg<0 ) goto failed;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVdbeFunc = pCtx->pVdbeFunc;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nAux = (pVdbeFunc ? pVdbeFunc->nAux : 0);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVdbeFunc = sqlite3DbRealloc(pCtx->s.db, pVdbeFunc, nMalloc);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pVdbeFunc ){
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto failed;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCtx->pVdbeFunc = pVdbeFunc;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(&pVdbeFunc->apAux[nAux], 0, sizeof(struct AuxData)*(iArg+1-nAux));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVdbeFunc->nAux = iArg+1;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVdbeFunc->pFunc = pCtx->pFunc;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pAuxData = &pVdbeFunc->apAux[iArg];
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pAuxData->pAux && pAuxData->xDelete ){
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pAuxData->xDelete(pAuxData->pAux);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pAuxData->pAux = pAux;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pAuxData->xDelete = xDelete;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)failed:
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( xDelete ){
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xDelete(pAux);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of times the Step function of a aggregate has been
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** called.
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is deprecated.  Do not use it for new code.  It is
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** provide only to avoid breaking legacy code.  New aggregate function
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implementations should keep their own counts within their aggregate
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** context.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_aggregate_count(sqlite3_context *p){
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p && p->pMem && p->pFunc && p->pFunc->xStep );
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p->pMem->n;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of columns in the result set for the statement pStmt.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_column_count(sqlite3_stmt *pStmt){
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVm = (Vdbe *)pStmt;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pVm ? pVm->nResColumn : 0;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of values available from the current row of the
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently executing statement pStmt.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_data_count(sqlite3_stmt *pStmt){
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVm = (Vdbe *)pStmt;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVm==0 || pVm->pResultSet==0 ) return 0;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pVm->nResColumn;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to see if column iCol of the given statement is valid.  If
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is, return a pointer to the Mem for the value of that column.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If iCol is not valid, return a pointer to a Mem which has a value
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of NULL.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Mem *columnMem(sqlite3_stmt *pStmt, int i){
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVm;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pOut;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVm = (Vdbe *)pStmt;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVm && pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_enter(pVm->db->mutex);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut = &pVm->pResultSet[i];
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the value passed as the second argument is out of range, return
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a pointer to the following static Mem object which contains the
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** value SQL NULL. Even though the Mem structure contains an element
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** of type i64, on certain architecture (x86) with certain compiler
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** switches (-Os), gcc may align this Mem object on a 4-byte boundary
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** instead of an 8-byte one. This all works fine, except that when
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** that a Mem structure is located on an 8-byte boundary. To prevent
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** this assert() from failing, when building with SQLITE_DEBUG defined
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** using gcc, force nullMem to be 8-byte aligned using the magical
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** __attribute__((aligned(8))) macro.  */
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const Mem nullMem
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) && defined(__GNUC__)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      __attribute__((aligned(8)))
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = {0, "", (double)0, {0}, 0, MEM_Null, SQLITE_NULL, 0,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         0, 0,  /* pScopyFrom, pFiller */
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         0, 0 };
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pVm && ALWAYS(pVm->db) ){
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_mutex_enter(pVm->db->mutex);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3Error(pVm->db, SQLITE_RANGE, 0);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut = (Mem*)&nullMem;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pOut;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is called after invoking an sqlite3_value_XXX function on a
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column value (i.e. a value returned by evaluating an SQL expression in the
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** select list of a SELECT statement) that may cause a malloc() failure. If
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** malloc() has failed, the threads mallocFailed flag is cleared and the result
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code of statement pStmt set to SQLITE_NOMEM.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Specifically, this is called from within:
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_int()
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_int64()
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_text()
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_text16()
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_real()
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_bytes()
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3_column_bytes16()
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqiite3_column_blob()
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void columnMallocFailure(sqlite3_stmt *pStmt)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If malloc() failed during an encoding conversion within an
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3_column_XXX API, then set the return code of the statement to
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and _finalize() will return NOMEM.
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = sqlite3ApiExit(p->db, p->rc);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************** sqlite3_column_  *******************************
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following routines are used to access elements of the current row
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the result set.
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *val;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  val = sqlite3_value_blob( columnMem(pStmt,i) );
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Even though there is no encoding conversion, value_blob() might
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** need to call malloc() to expand the result of a zeroblob()
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** expression.
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val = sqlite3_value_bytes( columnMem(pStmt,i) );
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val = sqlite3_value_bytes16( columnMem(pStmt,i) );
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double sqlite3_column_double(sqlite3_stmt *pStmt, int i){
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double val = sqlite3_value_double( columnMem(pStmt,i) );
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_column_int(sqlite3_stmt *pStmt, int i){
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val = sqlite3_value_int( columnMem(pStmt,i) );
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) );
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) );
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pOut = columnMem(pStmt, i);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOut->flags&MEM_Static ){
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags &= ~MEM_Static;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags |= MEM_Ephem;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (sqlite3_value *)pOut;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *val = sqlite3_value_text16( columnMem(pStmt,i) );
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return val;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_column_type(sqlite3_stmt *pStmt, int i){
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iType = sqlite3_value_type( columnMem(pStmt,i) );
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columnMallocFailure(pStmt);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return iType;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following function is experimental and subject to change or
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** removal */
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**  return sqlite3_value_numeric_type( columnMem(pStmt,i) );
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**}
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert the N-th element of pStmt->pColName[] into a string using
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xFunc() then return that string.  If N is out of range, return 0.
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There are up to 5 names for each column.  useType determines which
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name is returned.  Here are the names:
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    0      The column name as it should be displayed for output
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    1      The datatype name for the column
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    2      The name of the database that the column derives from
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    3      The name of the table that the column derives from
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    4      The name of the table column that the result column derives from
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the result is not a simple column reference (if it is an expression
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or a constant) then useTypes 2, 3, and 4 return NULL.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const void *columnName(
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int N,
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *(*xFunc)(Mem*),
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int useType
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *ret = 0;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = p->db;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_column_count(pStmt);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( N<n && N>=0 ){
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    N += useType*n;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_enter(db->mutex);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->mallocFailed==0 );
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xFunc(&p->aColName[N]);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /* A malloc may have failed inside of the xFunc() call. If this
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** is the case, clear the mallocFailed flag and return NULL.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->mallocFailed ){
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->mallocFailed = 0;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = 0;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(db->mutex);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ret;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the Nth column of the result set returned by SQL
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement pStmt.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Constraint:  If you have ENABLE_COLUMN_METADATA then you must
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not define OMIT_DECLTYPE.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error "Must not define both SQLITE_OMIT_DECLTYPE \
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         and SQLITE_ENABLE_COLUMN_METADATA"
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DECLTYPE
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the column declaration type (if applicable) of the 'i'th column
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the result set of SQL statement pStmt.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_DECLTYPE */
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the database from which a result column derives.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL is returned if the result column is an expression or constant or
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** anything else which is not an unabiguous reference to a database column.
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the table from which a result column derives.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL is returned if the result column is an expression or constant or
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** anything else which is not an unabiguous reference to a database column.
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of the table column from which a result column derives.
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL is returned if the result column is an expression or constant or
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** anything else which is not an unabiguous reference to a database column.
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return columnName(
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_ENABLE_COLUMN_METADATA */
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/******************************* sqlite3_bind_  ***************************
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routines used to attach values to wildcards in a compiled SQL statement.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unbind the value bound to variable i in virtual machine p. This is the
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the same as binding a NULL value to the column. If the "i" parameter is
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A successful evaluation of this routine acquires the mutex on p.
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the mutex is released if any kind of error occurs.
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The error code stored in database p->db is overwritten with the return
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value in any case.
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int vdbeUnbind(Vdbe *p, int i){
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pVar;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( vdbeSafetyNotNull(p) ){
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_MISUSE_BKPT;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(p->db->mutex);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3Error(p->db, SQLITE_MISUSE, 0);
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_log(SQLITE_MISUSE,
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "bind on a busy prepared statement: [%s]", p->zSql);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_MISUSE_BKPT;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( i<1 || i>p->nVar ){
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3Error(p->db, SQLITE_RANGE, 0);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_RANGE;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i--;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVar = &p->aVar[i];
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(pVar);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVar->flags = MEM_Null;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3Error(p->db, SQLITE_OK, 0);
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the bit corresponding to this variable in Vdbe.expmask is set, then
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** binding a new value to this variable invalidates the current query plan.
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** parameter in the WHERE clause might influence the choice of query plan
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** for a statement, then the statement will be automatically recompiled,
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** as if there had been a schema change, on the first sqlite3_step() call
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** following any change to the bindings of that parameter.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->isPrepareV2 &&
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->expired = 1;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Bind a text or BLOB value.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int bindText(
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt,   /* The statement to bind against */
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i,                 /* Index of the parameter to bind */
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *zData,     /* Pointer to the data to be bound */
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nData,             /* Number of bytes of data to be bound */
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*),   /* Destructor for the data */
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 encoding            /* Encoding for the data */
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pVar;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = vdbeUnbind(p, i);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zData!=0 ){
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pVar = &p->aVar[i-1];
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc==SQLITE_OK && encoding!=0 ){
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3Error(p->db, rc, 0);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3ApiExit(p->db, rc);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xDel((void*)zData);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Bind a blob value to an SQL statement variable.
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_blob(
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt,
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i,
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *zData,
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nData,
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bindText(pStmt, i, zData, nData, xDel, 0);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = vdbeUnbind(p, i);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3_bind_int64(p, i, (i64)iValue);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = vdbeUnbind(p, i);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe*)pStmt;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = vdbeUnbind(p, i);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_text(
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt,
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zData,
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nData,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_text16(
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt,
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i,
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *zData,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nData,
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pValue->type ){
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_INTEGER: {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3_bind_int64(pStmt, i, pValue->u.i);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_FLOAT: {
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3_bind_double(pStmt, i, pValue->r);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_BLOB: {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pValue->flags & MEM_Zero ){
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero);
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_TEXT: {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = bindText(pStmt,i,  pValue->z, pValue->n, SQLITE_TRANSIENT,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              pValue->enc);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3_bind_null(pStmt, i);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe *)pStmt;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = vdbeUnbind(p, i);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of wildcards that can be potentially bound to.
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is added to support DBD::SQLite.
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe*)pStmt;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p ? p->nVar : 0;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Create a mapping from variable numbers to variable names
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the Vdbe.azVar[] array, if such a mapping does not already
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** exist.
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void createVarMap(Vdbe *p){
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !p->okVar ){
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Op *pOp;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_enter(p->db->mutex);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The race condition here is harmless.  If two threads call this
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** routine on the same Vdbe at the same time, they both might end
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** up initializing the Vdbe.azVar[] array.  That is a little extra
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** work but it results in the same answer.
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pOp->opcode==OP_Variable ){
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pOp->p1>0 && pOp->p1<=p->nVar );
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->azVar[pOp->p1-1] = pOp->p4.z;
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->okVar = 1;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_mutex_leave(p->db->mutex);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the name of a wildcard parameter.  Return NULL if the index
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is out of range or if the wildcard is unnamed.
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result is always UTF-8.
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p = (Vdbe*)pStmt;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || i<1 || i>p->nVar ){
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  createVarMap(p);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p->azVar[i-1];
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given a wildcard parameter name, return the index of the variable
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with that name.  If there is no variable with the given name,
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return 0.
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ){
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  createVarMap(p);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zName ){
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<p->nVar; i++){
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *z = p->azVar[i];
1225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      if( z && strncmp(z,zName,nName)==0 && z[nName]==0 ){
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return i+1;
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName));
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transfer all bindings from the first statement over to the second.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pFrom = (Vdbe*)pFromStmt;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pTo = (Vdbe*)pToStmt;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTo->db==pFrom->db );
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTo->nVar==pFrom->nVar );
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(pTo->db->mutex);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pFrom->nVar; i++){
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_leave(pTo->db->mutex);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Deprecated external interface.  Internal/core SQLite code
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** should call sqlite3TransferBindings.
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Is is misuse to call this routine with statements from different
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database connections.  But as this is a deprecated interface, we
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will not bother to check for that condition.
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the two statements contain a different number of bindings, then
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an SQLITE_ERROR is returned.  Nothing else can go wrong, so otherwise
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_OK is returned.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pFrom = (Vdbe*)pFromStmt;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pTo = (Vdbe*)pToStmt;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pFrom->nVar!=pTo->nVar ){
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_ERROR;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTo->isPrepareV2 && pTo->expmask ){
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTo->expired = 1;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pFrom->isPrepareV2 && pFrom->expmask ){
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrom->expired = 1;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3TransferBindings(pFromStmt, pToStmt);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the sqlite3* database handle to which the prepared statement given
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the argument belongs.  This is the same database handle that was
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the first argument to the sqlite3_prepare() that was used to create
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the statement in the first place.
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pStmt ? ((Vdbe*)pStmt)->db : 0;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the prepared statement is guaranteed to not modify the
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database.
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pStmt ? ((Vdbe*)pStmt)->readOnly : 1;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the next prepared statement after pStmt associated
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with database connection pDb.  If pStmt is NULL, return the first
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** prepared statement for the database connection.  Return NULL if there
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are no more.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pNext;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(pDb->mutex);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pStmt==0 ){
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNext = (sqlite3_stmt*)pDb->pVdbe;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_leave(pDb->mutex);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNext;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the value of a status counter for a prepared statement
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVdbe = (Vdbe*)pStmt;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int v = pVdbe->aCounter[op-1];
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( resetFlag ) pVdbe->aCounter[op-1] = 0;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return v;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1327