15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2008 June 18 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 module implements the sqlite3_status() interface and related 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** functionality. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vdbeInt.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Variables in which to record status information. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct sqlite3StatType sqlite3StatType; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static SQLITE_WSD struct sqlite3StatType { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nowValue[10]; /* Current value */ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mxValue[10]; /* Maximum value */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} sqlite3Stat = { {0,}, {0,} }; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The "wsdStat" macro will resolve to the status information 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** state vector. If writable static data is unsupported on the target, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** we have to locate the state vector at run-time. In the more common 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case where writable static data is supported, wsdStat can refer directly 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the "sqlite3Stat" state vector declared above. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_WSD 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdStat x[0] 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdStatInit 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdStat sqlite3Stat 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the current value of a status parameter. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3StatusValue(int op){ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStatInit; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return wsdStat.nowValue[op]; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add N to the value of a status record. It is assumed that the 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** caller holds appropriate locks. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StatusAdd(int op, int N){ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStatInit; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStat.nowValue[op] += N; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStat.mxValue[op] = wsdStat.nowValue[op]; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the value of a status to X. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StatusSet(int op, int X){ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStatInit; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStat.nowValue[op] = X; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStat.mxValue[op] = wsdStat.nowValue[op]; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Query status information. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This implementation assumes that reading or writing an aligned 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 32-bit integer is an atomic operation. If that assumption is not true, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then this routine is not threadsafe. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStatInit; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_MISUSE_BKPT; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = wsdStat.nowValue[op]; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = wsdStat.mxValue[op]; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( resetFlag ){ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdStat.mxValue[op] = wsdStat.nowValue[op]; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Query status information for a single database connection 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_db_status( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* The database connection whose status is desired */ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op, /* Status verb */ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pCurrent, /* Write current value here */ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pHighwater, /* Write high-water mark here */ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int resetFlag /* Reset high-water mark if true */ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = SQLITE_OK; /* Return code */ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( op ){ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_LOOKASIDE_USED: { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = db->lookaside.nOut; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = db->lookaside.mxOut; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( resetFlag ){ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->lookaside.mxOut = db->lookaside.nOut; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_LOOKASIDE_HIT: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT ); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE ); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL ); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = 0; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT]; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( resetFlag ){ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return an approximation for the amount of memory currently used 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by all pagers associated with the given database connection. The 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** highwater mark is meaningless and is returned as zero. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_CACHE_USED: { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int totalUsed = 0; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnterAll(db); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt = db->aDb[i].pBt; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pBt ){ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager = sqlite3BtreePager(pBt); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) totalUsed += sqlite3PagerMemUsed(pPager); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeaveAll(db); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = totalUsed; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = 0; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** *pCurrent gets an accurate estimate of the amount of memory used 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to store the schema for all databases (main, temp, and any ATTACHed 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** databases. *pHighwater is set to zero. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_SCHEMA_USED: { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Used to iterate through schemas */ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = 0; /* Used to accumulate return value */ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeEnterAll(db); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->pnBytesFreed = &nByte; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema *pSchema = db->aDb[i].pSchema; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pSchema!=0) ){ 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HashElem *p; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * ( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSchema->tblHash.count 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) + pSchema->trigHash.count 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) + pSchema->idxHash.count 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) + pSchema->fkeyHash.count 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3MallocSize(pSchema->tblHash.ht); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3MallocSize(pSchema->trigHash.ht); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3MallocSize(pSchema->idxHash.ht); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3MallocSize(pSchema->fkeyHash.ht); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DeleteTable(db, (Table *)sqliteHashData(p)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->pnBytesFreed = 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeLeaveAll(db); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = 0; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = nByte; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** *pCurrent gets an accurate estimate of the amount of memory used 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to store all prepared statements. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** *pHighwater is set to zero. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_DBSTATUS_STMT_USED: { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Vdbe *pVdbe; /* Used to iterate through VMs */ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = 0; /* Used to accumulate return value */ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->pnBytesFreed = &nByte; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeDeleteObject(db, pVdbe); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->pnBytesFreed = 0; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pHighwater = 0; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pCurrent = nByte; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_ERROR; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 228