From: dan Date: Tue, 20 Sep 2011 15:53:02 +0000 (+0000) Subject: Add SQLITE_STMTSTATUS_CACHE_HIT/MISS and SQLITE_DB_STATUS_CACHE_HIT/MISS. For queryin... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5538807fdb812c84a2dbaaea16a71ef81228ec93;p=thirdparty%2Fsqlite.git Add SQLITE_STMTSTATUS_CACHE_HIT/MISS and SQLITE_DB_STATUS_CACHE_HIT/MISS. For querying the number of pager cache hits and misses on a statement or connection basis. FossilOrigin-Name: 892723575c033ed3f02cf6ea61e08f039b9a0c40 --- diff --git a/manifest b/manifest index 95538b272e..13020f3692 100644 --- a/manifest +++ b/manifest @@ -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 diff --git a/manifest.uuid b/manifest.uuid index f3b3da0f66..4dc667cb3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36be31ff0af7f811fe2c6f7e26f058cffb7257e1 \ No newline at end of file +892723575c033ed3f02cf6ea61e08f039b9a0c40 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index f8d3ba9989..0aaf6fcc0e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -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. */ diff --git a/src/pager.h b/src/pager.h index eab7ddaf80..daddccf828 100644 --- a/src/pager.h +++ b/src/pager.h @@ -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); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index ba5c20265f..eedfb0180b 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -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. ** +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
SQLITE_DBSTATUS_CACHE_HIT
+**
This parameter returns the number of pager cache hits that have +** occurred. ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
SQLITE_DBSTATUS_CACHE_MISS
+**
This parameter returns the number of pager cache misses that have +** occurred. ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
** */ #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. ** +** [[SQLITE_STMTSTATUS_CACHE_HIT]]
SQLITE_STMTSTATUS_CACHE_HIT
+**
^This is the number of pager cache hits encountered during execution of +** the statement.
+** +** [[SQLITE_STMTSTATUS_CACHE_MISS]]
SQLITE_STMTSTATUS_CACHE_MISS
+**
^This is the number of pager cache misses encountered during execution +** of the statement.
+** ** */ #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 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f0fc6abf2a..ee4153f464 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 diff --git a/src/status.c b/src/status.c index b8c1d58df7..796325fcd8 100644 --- a/src/status.c +++ b/src/status.c @@ -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; } diff --git a/src/test1.c b/src/test1.c index 26342522c5..81c3d3ffe7 100644 --- a/src/test1.c +++ b/src/test1.c @@ -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"); diff --git a/src/test_malloc.c b/src/test_malloc.c index 46ec94d327..e955d57900 100644 --- a/src/test_malloc.c +++ b/src/test_malloc.c @@ -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; diff --git a/src/vdbe.c b/src/vdbe.c index 4f7fd6bbeb..a267d6d84f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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; ilockMask)!=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; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 7fbd5693fb..26c1ea23f1 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -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 diff --git a/src/vdbeblob.c b/src/vdbeblob.c index ae77a47ba3..44f0e6baf6 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -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); diff --git a/test/stmtstatus.test b/test/stmtstatus.test new file mode 100644 index 0000000000..7faca79642 --- /dev/null +++ b/test/stmtstatus.test @@ -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