Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5538807fdb |
@@ -1,5 +1,5 @@
|
||||
C Minor\scomment\schange\sin\sthe\sdescription\sof\sthe\sdifferent\smemory\sallocator\noptions.\s\sNo\schanges\sto\scode.
|
||||
D 2011-09-19T20:56:59.410
|
||||
C Add\sSQLITE_STMTSTATUS_CACHE_HIT/MISS\sand\sSQLITE_DB_STATUS_CACHE_HIT/MISS.\sFor\squerying\sthe\snumber\sof\spager\scache\shits\sand\smisses\son\sa\sstatement\sor\sconnection\sbasis.
|
||||
D 2011-09-20T15:53:02.536
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@@ -167,8 +167,8 @@ F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
|
||||
F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
|
||||
F src/os_unix.c 10e0c4dcdbec8d4189890fdf3e71b32efae194e3
|
||||
F src/os_win.c 0fc0f46c94b0385a940b0ee32992a833019a5985
|
||||
F src/pager.c 15d10371e2d560b68870a9ccec022ad8f01e70a2
|
||||
F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1
|
||||
F src/pager.c eb09ad62fe7f5c50f8bf3a9da8fb2c9eaefb7f7e
|
||||
F src/pager.h f79a313fd2f4f1687ed1a567a472d9111b27b7e0
|
||||
F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
|
||||
F src/pcache.c 49e718c095810c6b3334e3a6d89970aceaddefce
|
||||
F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
|
||||
@@ -181,14 +181,14 @@ F src/resolve.c 36368f44569208fa074e61f4dd0b6c4fb60ca2b4
|
||||
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
||||
F src/select.c d9b7d20b0365f80761846f00ef3638d4b33eeaf2
|
||||
F src/shell.c 13fe2aeddc3cc90d6a273831d1f63736d1596f81
|
||||
F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb
|
||||
F src/sqlite.h.in 91ee83afc6afafb080c735830fe11713c676e7b5
|
||||
F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93
|
||||
F src/sqliteInt.h 76d81cd9da0618b231398bfcf90556e971972fca
|
||||
F src/sqliteInt.h c5c2a76ef6810363e7954ba2718c0e3484283004
|
||||
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
|
||||
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
|
||||
F src/status.c 5bd4b18b7a2eba11dd9355fe97f211abe9292da7
|
||||
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
||||
F src/tclsqlite.c 3ef1dda2f1dc207c792eaadebf9d8adc44648581
|
||||
F src/test1.c 0f41b7c67719207a5de24b009e172c4dcf189827
|
||||
F src/test1.c b5a5d3a84d1ff1386b80af58e8b33ffe7882fa95
|
||||
F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31
|
||||
F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432
|
||||
F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7
|
||||
@@ -212,7 +212,7 @@ F src/test_intarray.c d879bbf8e4ce085ab966d1f3c896a7c8b4f5fc99
|
||||
F src/test_intarray.h 489edb9068bb926583445cb02589344961054207
|
||||
F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff
|
||||
F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e
|
||||
F src/test_malloc.c 91d5cf1751d3e563754fd183da1c020727b5480e
|
||||
F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5
|
||||
F src/test_multiplex.c 3fc368022c46fe44ec22c5e1ed727223a54a6a1d
|
||||
F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d
|
||||
F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e
|
||||
@@ -238,12 +238,12 @@ F src/update.c 74a6cfb34e9732c1e2a86278b229913b4b51eeec
|
||||
F src/utf.c c53eb7404b3eb5c1cbb5655c6a7a0e0ce6bd50f0
|
||||
F src/util.c 06302ffd2b80408d4f6c7af71f7090e0cf8d8ff7
|
||||
F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
|
||||
F src/vdbe.c 60340bfb23f456ea0791cb28262a887363773371
|
||||
F src/vdbe.c f5de15d69f48725ff1355bd67ce574b06d676317
|
||||
F src/vdbe.h f0725ee997db869ecae5bb70a71612aabeca7755
|
||||
F src/vdbeInt.h 693d6ac6810298fc6b4c503cfbe3f99a240f40af
|
||||
F src/vdbeInt.h 425674f4c1095916b303aecd0cbe3b49e70968a3
|
||||
F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98
|
||||
F src/vdbeaux.c 49be7a5ce6a1b7df9ef5791133c3e4e6ab2a1ffe
|
||||
F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb
|
||||
F src/vdbeblob.c 099469943d139a3c26b5dfbcec39b7df45b3d4c6
|
||||
F src/vdbemem.c 5e6effb96dd53d233361cbfaa3f0a43b9af689e9
|
||||
F src/vdbesort.c 468d43c057063e54da4f1988b38b4f46d60e7790
|
||||
F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114
|
||||
@@ -686,6 +686,7 @@ F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b
|
||||
F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298
|
||||
F test/stat.test 0997f6a57a35866b14111ed361ed8851ce7978ae
|
||||
F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
|
||||
F test/stmtstatus.test b0053dcf3c212e445bfd628085621f553b5f9802
|
||||
F test/subquery.test b524f57c9574b2c0347045b4510ef795d4686796
|
||||
F test/subquery2.test edcad5c118f0531c2e21bf16a09bbb105252d4cd
|
||||
F test/subselect.test d24fd8757daf97dafd2e889c73ea4c4272dcf4e4
|
||||
@@ -963,7 +964,10 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
|
||||
F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
|
||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||
F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
|
||||
P 3e0da808d2f5b4d12046e05980ca04578f581177
|
||||
R 8185767b36f8ee5089cf1856ba34ec13
|
||||
U drh
|
||||
Z dd5a6c14bafead231702b31c9079bdda
|
||||
P 36be31ff0af7f811fe2c6f7e26f058cffb7257e1
|
||||
R c1bb1f12d126dc2d8c9aa6eee1c61a0f
|
||||
T *branch * cache-stats
|
||||
T *sym-cache-stats *
|
||||
T -sym-trunk *
|
||||
U dan
|
||||
Z aeeb2a46c16689ae0a5797bce6e52d63
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
36be31ff0af7f811fe2c6f7e26f058cffb7257e1
|
||||
892723575c033ed3f02cf6ea61e08f039b9a0c40
|
||||
+15
-4
@@ -670,8 +670,8 @@ struct Pager {
|
||||
char *zJournal; /* Name of the journal file */
|
||||
int (*xBusyHandler)(void*); /* Function to call when busy */
|
||||
void *pBusyHandlerArg; /* Context argument for xBusyHandler */
|
||||
int nHit, nMiss; /* Total cache hits and misses */
|
||||
#ifdef SQLITE_TEST
|
||||
int nHit, nMiss; /* Cache hits and missing */
|
||||
int nRead, nWrite; /* Database pages read/written */
|
||||
#endif
|
||||
void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */
|
||||
@@ -4169,7 +4169,7 @@ static int pagerStress(void *p, PgHdr *pPg){
|
||||
**
|
||||
** Spilling is also prohibited when in an error state since that could
|
||||
** lead to database corruption. In the current implementaton it
|
||||
** is impossible for sqlite3PCacheFetch() to be called with createFlag==1
|
||||
** is impossible for sqlite3PcacheFetch() to be called with createFlag==1
|
||||
** while in the error state, hence it is impossible for this routine to
|
||||
** be called in the error state. Nevertheless, we include a NEVER()
|
||||
** test for the error state as a safeguard against future changes.
|
||||
@@ -5005,14 +5005,13 @@ int sqlite3PagerAcquire(
|
||||
/* In this case the pcache already contains an initialized copy of
|
||||
** the page. Return without further ado. */
|
||||
assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) );
|
||||
PAGER_INCR(pPager->nHit);
|
||||
pPager->nHit++;
|
||||
return SQLITE_OK;
|
||||
|
||||
}else{
|
||||
/* The pager cache has created a new page. Its content needs to
|
||||
** be initialized. */
|
||||
|
||||
PAGER_INCR(pPager->nMiss);
|
||||
pPg = *ppPage;
|
||||
pPg->pPager = pPager;
|
||||
|
||||
@@ -5048,6 +5047,7 @@ int sqlite3PagerAcquire(
|
||||
IOTRACE(("ZERO %p %d\n", pPager, pgno));
|
||||
}else{
|
||||
assert( pPg->pPager==pPager );
|
||||
pPager->nMiss++;
|
||||
rc = readDbPage(pPg);
|
||||
if( rc!=SQLITE_OK ){
|
||||
goto pager_acquire_err;
|
||||
@@ -6082,6 +6082,17 @@ int *sqlite3PagerStats(Pager *pPager){
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
** This function is used to access the cache hit/miss counts maintained
|
||||
** by the Pager object. Before returning, *pnHit is incremented by the
|
||||
** total number of cache-hits that have occurred since the pager was
|
||||
** created, and *pnMiss is incremented by the total number of misses.
|
||||
*/
|
||||
void sqlite3PagerCacheStats(Pager *pPager, int *pnHit, int *pnMiss){
|
||||
*pnHit += pPager->nHit;
|
||||
*pnMiss += pPager->nMiss;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return true if this is an in-memory pager.
|
||||
*/
|
||||
|
||||
@@ -155,6 +155,7 @@ const char *sqlite3PagerJournalname(Pager*);
|
||||
int sqlite3PagerNosync(Pager*);
|
||||
void *sqlite3PagerTempSpace(Pager*);
|
||||
int sqlite3PagerIsMemdb(Pager*);
|
||||
void sqlite3PagerCacheStats(Pager *, int *, int *);
|
||||
|
||||
/* Functions used to truncate the database file. */
|
||||
void sqlite3PagerTruncateImage(Pager*,Pgno);
|
||||
|
||||
+25
-1
@@ -5810,6 +5810,18 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg);
|
||||
** the database connection.)^
|
||||
** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(<dt>SQLITE_DBSTATUS_CACHE_HIT</dt>
|
||||
** <dd>This parameter returns the number of pager cache hits that have
|
||||
** occurred. ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT
|
||||
** is always 0.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(<dt>SQLITE_DBSTATUS_CACHE_MISS</dt>
|
||||
** <dd>This parameter returns the number of pager cache misses that have
|
||||
** occurred. ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS
|
||||
** is always 0.
|
||||
** </dd>
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_DBSTATUS_LOOKASIDE_USED 0
|
||||
@@ -5819,7 +5831,9 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg);
|
||||
#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4
|
||||
#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5
|
||||
#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6
|
||||
#define SQLITE_DBSTATUS_MAX 6 /* Largest defined DBSTATUS */
|
||||
#define SQLITE_DBSTATUS_CACHE_HIT 7
|
||||
#define SQLITE_DBSTATUS_CACHE_MISS 8
|
||||
#define SQLITE_DBSTATUS_MAX 8 /* Largest defined DBSTATUS */
|
||||
|
||||
|
||||
/*
|
||||
@@ -5874,11 +5888,21 @@ int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
|
||||
** improvement performance by adding permanent indices that do not
|
||||
** need to be reinitialized each time the statement is run.</dd>
|
||||
**
|
||||
** [[SQLITE_STMTSTATUS_CACHE_HIT]] <dt>SQLITE_STMTSTATUS_CACHE_HIT</dt>
|
||||
** <dd>^This is the number of pager cache hits encountered during execution of
|
||||
** the statement.</dd>
|
||||
**
|
||||
** [[SQLITE_STMTSTATUS_CACHE_MISS]] <dt>SQLITE_STMTSTATUS_CACHE_MISS</dt>
|
||||
** <dd>^This is the number of pager cache misses encountered during execution
|
||||
** of the statement.</dd>
|
||||
**
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1
|
||||
#define SQLITE_STMTSTATUS_SORT 2
|
||||
#define SQLITE_STMTSTATUS_AUTOINDEX 3
|
||||
#define SQLITE_STMTSTATUS_CACHE_HIT 4
|
||||
#define SQLITE_STMTSTATUS_CACHE_MISS 5
|
||||
|
||||
/*
|
||||
** CAPI3REF: Custom Page Cache Object
|
||||
|
||||
@@ -893,6 +893,7 @@ struct sqlite3 {
|
||||
u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */
|
||||
i64 nDeferredCons; /* Net deferred constraints this transaction. */
|
||||
int *pnBytesFreed; /* If not NULL, increment this in DbFree() */
|
||||
int aHitMiss[2]; /* DBSTATUS_CACHEHIT and CACHEMISS stats */
|
||||
|
||||
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
|
||||
/* The following variables are all protected by the STATIC_MASTER
|
||||
|
||||
@@ -218,6 +218,22 @@ int sqlite3_db_status(
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** Set *pCurrent to the total cache hits or misses encountered by the
|
||||
** database connection since the last reset. *pHighwater is always set to
|
||||
** zero.
|
||||
*/
|
||||
case SQLITE_DBSTATUS_CACHE_HIT:
|
||||
case SQLITE_DBSTATUS_CACHE_MISS: {
|
||||
assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 );
|
||||
*pHighwater = 0;
|
||||
*pCurrent = db->aHitMiss[op-SQLITE_DBSTATUS_CACHE_HIT];
|
||||
if( resetFlag ){
|
||||
db->aHitMiss[op-SQLITE_DBSTATUS_CACHE_HIT] = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
rc = SQLITE_ERROR;
|
||||
}
|
||||
|
||||
@@ -2250,6 +2250,8 @@ static int test_stmt_status(
|
||||
{ "SQLITE_STMTSTATUS_FULLSCAN_STEP", SQLITE_STMTSTATUS_FULLSCAN_STEP },
|
||||
{ "SQLITE_STMTSTATUS_SORT", SQLITE_STMTSTATUS_SORT },
|
||||
{ "SQLITE_STMTSTATUS_AUTOINDEX", SQLITE_STMTSTATUS_AUTOINDEX },
|
||||
{ "SQLITE_STMTSTATUS_CACHE_HIT", SQLITE_STMTSTATUS_CACHE_HIT },
|
||||
{ "SQLITE_STMTSTATUS_CACHE_MISS", SQLITE_STMTSTATUS_CACHE_MISS },
|
||||
};
|
||||
if( objc!=4 ){
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "STMT PARAMETER RESETFLAG");
|
||||
|
||||
+4
-2
@@ -1325,11 +1325,13 @@ static int test_db_status(
|
||||
{ "STMT_USED", SQLITE_DBSTATUS_STMT_USED },
|
||||
{ "LOOKASIDE_HIT", SQLITE_DBSTATUS_LOOKASIDE_HIT },
|
||||
{ "LOOKASIDE_MISS_SIZE", SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE },
|
||||
{ "LOOKASIDE_MISS_FULL", SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL }
|
||||
{ "LOOKASIDE_MISS_FULL", SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL },
|
||||
{ "CACHE_HIT", SQLITE_DBSTATUS_CACHE_HIT },
|
||||
{ "CACHE_MISS", SQLITE_DBSTATUS_CACHE_MISS }
|
||||
};
|
||||
Tcl_Obj *pResult;
|
||||
if( objc!=4 ){
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "PARAMETER RESETFLAG");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "DB PARAMETER RESETFLAG");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
|
||||
|
||||
+34
@@ -518,6 +518,27 @@ static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
|
||||
pVtab->zErrMsg = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** Call sqlite3PagerCacheStats() on all database pagers used by the VM
|
||||
** passed as the first argument, incrementing *pnHit and *pnMiss for
|
||||
** with each call.
|
||||
*/
|
||||
static void vdbeCacheStats(Vdbe *p, int *pnHit, int *pnMiss){
|
||||
int i;
|
||||
yDbMask mask;
|
||||
sqlite3 *db;
|
||||
Db *aDb;
|
||||
int nDb;
|
||||
if( p->lockMask==0 ) return; /* The common case */
|
||||
db = p->db;
|
||||
aDb = db->aDb;
|
||||
nDb = db->nDb;
|
||||
for(i=0, mask=1; i<nDb; i++, mask += mask){
|
||||
if( i!=1 && (mask & p->lockMask)!=0 && ALWAYS(aDb[i].pBt!=0) ){
|
||||
sqlite3PagerCacheStats(sqlite3BtreePager(aDb[i].pBt), pnHit, pnMiss);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Execute as much of a VDBE program as we can then return.
|
||||
@@ -576,10 +597,13 @@ int sqlite3VdbeExec(
|
||||
u64 start; /* CPU clock count at start of opcode */
|
||||
int origPc; /* Program counter at start of opcode */
|
||||
#endif
|
||||
int nHit = 0; /* Cache hits for this call */
|
||||
int nMiss = 0; /* Cache misses for this call */
|
||||
/*** INSERT STACK UNION HERE ***/
|
||||
|
||||
assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
|
||||
sqlite3VdbeEnter(p);
|
||||
vdbeCacheStats(p, &nHit, &nMiss);
|
||||
if( p->rc==SQLITE_NOMEM ){
|
||||
/* This happens if a malloc() inside a call to sqlite3_column_text() or
|
||||
** sqlite3_column_text16() failed. */
|
||||
@@ -6112,6 +6136,16 @@ vdbe_error_halt:
|
||||
** top. */
|
||||
vdbe_return:
|
||||
db->lastRowid = lastRowid;
|
||||
|
||||
/* Update the statement and database cache hit/miss statistics. */
|
||||
nHit = -nHit;
|
||||
nMiss = -nMiss;
|
||||
vdbeCacheStats(p, &nHit, &nMiss);
|
||||
p->aCounter[SQLITE_STMTSTATUS_CACHE_HIT-1] += nHit;
|
||||
p->aCounter[SQLITE_STMTSTATUS_CACHE_MISS-1] += nMiss;
|
||||
db->aHitMiss[0] += nHit;
|
||||
db->aHitMiss[1] += nMiss;
|
||||
|
||||
sqlite3VdbeLeave(p);
|
||||
return rc;
|
||||
|
||||
|
||||
+1
-1
@@ -310,7 +310,7 @@ struct Vdbe {
|
||||
yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */
|
||||
yDbMask lockMask; /* Subset of btreeMask that requires a lock */
|
||||
int iStatement; /* Statement number (or 0 if has not opened stmt) */
|
||||
int aCounter[3]; /* Counters used by sqlite3_stmt_status() */
|
||||
int aCounter[5]; /* Counters used by sqlite3_stmt_status() */
|
||||
#ifndef SQLITE_OMIT_TRACE
|
||||
i64 startTime; /* Time when query started - used for profiling */
|
||||
#endif
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "sqliteInt.h"
|
||||
#include "vdbeInt.h"
|
||||
#include "btreeInt.h"
|
||||
|
||||
#ifndef SQLITE_OMIT_INCRBLOB
|
||||
|
||||
@@ -384,9 +385,17 @@ static int blobReadWrite(
|
||||
/* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is
|
||||
** returned, clean-up the statement handle.
|
||||
*/
|
||||
Pager *pPager = p->pCsr->pBt->pPager;
|
||||
int nHit = 0;
|
||||
int nMiss = 0;
|
||||
|
||||
assert( db == v->db );
|
||||
sqlite3BtreeEnterCursor(p->pCsr);
|
||||
sqlite3PagerCacheStats(pPager, &nHit, &nMiss);
|
||||
rc = xCall(p->pCsr, iOffset+p->iOffset, n, z);
|
||||
db->aHitMiss[0] -= nHit;
|
||||
db->aHitMiss[1] -= nMiss;
|
||||
sqlite3PagerCacheStats(pPager, &db->aHitMiss[0], &db->aHitMiss[1]);
|
||||
sqlite3BtreeLeaveCursor(p->pCsr);
|
||||
if( rc==SQLITE_ABORT ){
|
||||
sqlite3VdbeFinalize(v);
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# 2011 September 20
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
# Tests for the sqlite3_stmt_status() function
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
set ::testprefix stmtstatus
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
PRAGMA page_size = 1024;
|
||||
PRAGMA auto_vacuum = 0;
|
||||
|
||||
CREATE TABLE t1(a PRIMARY KEY, b);
|
||||
INSERT INTO t1 VALUES(1, randomblob(600));
|
||||
INSERT INTO t1 VALUES(2, randomblob(600));
|
||||
INSERT INTO t1 VALUES(3, randomblob(600));
|
||||
}
|
||||
|
||||
proc stmt_hit_miss {stmt {reset 0}} {
|
||||
list [sqlite3_stmt_status $stmt SQLITE_STMTSTATUS_CACHE_HIT $reset] \
|
||||
[sqlite3_stmt_status $stmt SQLITE_STMTSTATUS_CACHE_MISS $reset]
|
||||
}
|
||||
|
||||
do_test 1.1 {
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
expr {[file size test.db] / 1024}
|
||||
} 6
|
||||
|
||||
do_test 1.2 {
|
||||
set ::stmt [sqlite3_prepare_v2 db "SELECT b FROM t1 WHERE a=2" -1 dummy]
|
||||
stmt_hit_miss $::stmt
|
||||
} {0 0}
|
||||
|
||||
breakpoint
|
||||
do_test 1.3 {
|
||||
sqlite3_step $::stmt
|
||||
sqlite3_reset $::stmt
|
||||
} SQLITE_OK
|
||||
do_test 1.4 { stmt_hit_miss $::stmt } {1 3}
|
||||
do_test 1.5 {
|
||||
sqlite3_step $::stmt
|
||||
sqlite3_reset $::stmt
|
||||
} SQLITE_OK
|
||||
do_test 1.6 { stmt_hit_miss $::stmt } {5 3}
|
||||
do_test 1.7 { stmt_hit_miss $::stmt 0 } {5 3}
|
||||
do_test 1.8 { stmt_hit_miss $::stmt 1 } {5 3}
|
||||
do_test 1.9 { stmt_hit_miss $::stmt 0 } {0 0}
|
||||
do_test 1.10 { sqlite3_finalize $::stmt } SQLITE_OK
|
||||
|
||||
do_test 1.11 { sqlite3_db_status db CACHE_HIT 0 } {0 6 0}
|
||||
do_test 1.12 { sqlite3_db_status db CACHE_MISS 0 } {0 3 0}
|
||||
do_test 1.13 { sqlite3_db_status db CACHE_HIT 1 } {0 6 0}
|
||||
do_test 1.14 { sqlite3_db_status db CACHE_MISS 1 } {0 3 0}
|
||||
do_test 1.15 { sqlite3_db_status db CACHE_HIT 0 } {0 0 0}
|
||||
do_test 1.16 { sqlite3_db_status db CACHE_MISS 0 } {0 0 0}
|
||||
|
||||
do_test 1.17 {
|
||||
set fd [db incrblob main t1 b 1]
|
||||
set len [string length [read $fd]]
|
||||
close $fd
|
||||
set len
|
||||
} 600
|
||||
do_test 1.18 { sqlite3_db_status db CACHE_HIT 0 } {0 2 0}
|
||||
do_test 1.19 { sqlite3_db_status db CACHE_MISS 0 } {0 1 0}
|
||||
|
||||
|
||||
finish_test
|
||||
Reference in New Issue
Block a user