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