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