Enhance the "PRAGMA cache_spill" statement to accept an integer argument which
is the threshold at which spilling will begin. FossilOrigin-Name: f79d264db24a470d1a4571e15a99cd3d68b5166c
This commit is contained in:
commit
c2e0dd4ddd
31
manifest
31
manifest
@ -1,5 +1,5 @@
|
||||
C Fix\sa\s#define\sin\sparse.y\sthat\sdisabled\sunused\scode\sin\sthe\sgenerated\sparser.
|
||||
D 2015-11-12T15:04:05.278
|
||||
C Enhance\sthe\s"PRAGMA\scache_spill"\sstatement\sto\saccept\san\sinteger\sargument\swhich\nis\sthe\sthreshold\sat\swhich\sspilling\swill\sbegin.
|
||||
D 2015-11-12T16:44:40.812
|
||||
F Makefile.in d828db6afa6c1fa060d01e33e4674408df1942a1
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc e928e68168df69b353300ac87c10105206653a03
|
||||
@ -282,8 +282,8 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240
|
||||
F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc
|
||||
F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d
|
||||
F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79
|
||||
F src/btree.c 9e5d713bf54be8bfcae9b60210173dd53570f56d
|
||||
F src/btree.h 1b8bf2818b5e256c25a5e09126720113b1d783da
|
||||
F src/btree.c d3bdd8462a86492e2ebc9aca4a0168429017de25
|
||||
F src/btree.h 2d76dee44704c47eed323356a758662724b674a0
|
||||
F src/btreeInt.h 3ab435ed27adea54d040584b0bcc488ee7db1e38
|
||||
F src/build.c ca574d33ffb1763cfd2979383f4d507095bfbe19
|
||||
F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
|
||||
@ -326,14 +326,14 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
||||
F src/os_unix.c cf72e06e15839ebe7121e01d3eebf256c039b0ca
|
||||
F src/os_win.c 1716291e5ec2dbfc5a1fe0b32182030f1f7d8acf
|
||||
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
|
||||
F src/pager.c ed5cff11793b6a4146582aabb29ed8613a6cf89e
|
||||
F src/pager.h 7fc069c07f3120ee466ff3d48a9d376974ebffa7
|
||||
F src/pager.c 18341e2b759b447cbc82fb9215d08d9c5864e92e
|
||||
F src/pager.h 87c4118a71ba3965184148b379a6d93179071091
|
||||
F src/parse.y aad5cc866dc23719f361fe7e0b8eaec8ce4861a4
|
||||
F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef
|
||||
F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9
|
||||
F src/pcache.c 73895411fa6b7bd6f0091212feabbe833b358d23
|
||||
F src/pcache.h 1ff11adce609ba7de139b6abfabaf9a2bac947b5
|
||||
F src/pcache1.c 902e1bc7bdaa81b40f8543407c5e2ac8ef4dc035
|
||||
F src/pragma.c 9dbb9ba2453d79bfc5905be0398aa30342b066bb
|
||||
F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a
|
||||
F src/pragma.c 56161e4aa4891a45b534f6516acb343df15a5120
|
||||
F src/pragma.h 31b110aaecb5603829c97747b99abfe491df5fa0
|
||||
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
||||
F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a
|
||||
F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
|
||||
@ -931,7 +931,7 @@ F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
|
||||
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
|
||||
F test/permutations.test 4ea119731c62d2f7d0aa86dd5b184cbb61ca411b
|
||||
F test/pragma.test a44253f911e7d50127d4a08f927f47c861a4c772
|
||||
F test/pragma2.test b5e2ce4c892afceb308c6ae6163a9099b2a0d8d7
|
||||
F test/pragma2.test a8e11a7a38e2a5053fe4b807fc806c937d9a7469
|
||||
F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c
|
||||
F test/printf.test b3ff34e73d59124140eaf89f7672e21bc2ca5fcc
|
||||
F test/printf2.test 0b61566dd1c0f0b802f59dffa228c5dc5aa6b054
|
||||
@ -1364,7 +1364,7 @@ F tool/mkkeywordhash.c 37f9c2e62c31384b697ede8825e2d344e98db22c
|
||||
F tool/mkopcodec.tcl edde8adc42621b5e598127f8cdc6d52cfe21f52b
|
||||
F tool/mkopcodeh.tcl e04177031532b7aa9379ded50e820231ac4abd6e
|
||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
|
||||
F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e
|
||||
F tool/mkpragmatab.tcl 473b6a156bc018d36aac5288d8479a879d570b93
|
||||
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
||||
F tool/mksqlite3c-noext.tcl 87240b09c20042999b41d5fabe091b7111287835
|
||||
F tool/mksqlite3c.tcl b66b4170f693602cd6985aed15d9509fe2f18c84
|
||||
@ -1402,7 +1402,8 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P ed24d302657e8495bef7f5ed698c7cca12717be9
|
||||
R d2bed45a676ff9fbad30132bc7912ff2
|
||||
P f84e3085c87cfffe4aba0eb4c4a3298b4027db83 9a431362dccbc9b8f93375f30a3b8955903cca79
|
||||
R 5f87cb60f8f27cae7787baa81cd88247
|
||||
T +closed 9a431362dccbc9b8f93375f30a3b8955903cca79
|
||||
U drh
|
||||
Z 9ab7252fe5fcd6a0ff588f1afe46df1d
|
||||
Z c0a66dbf9634d84e657f233ea4ee622f
|
||||
|
@ -1 +1 @@
|
||||
f84e3085c87cfffe4aba0eb4c4a3298b4027db83
|
||||
f79d264db24a470d1a4571e15a99cd3d68b5166c
|
38
src/btree.c
38
src/btree.c
@ -2556,19 +2556,11 @@ int sqlite3BtreeClose(Btree *p){
|
||||
}
|
||||
|
||||
/*
|
||||
** Change the limit on the number of pages allowed in the cache.
|
||||
**
|
||||
** The maximum number of cache pages is set to the absolute
|
||||
** value of mxPage. If mxPage is negative, the pager will
|
||||
** operate asynchronously - it will not stop to do fsync()s
|
||||
** to insure data is written to the disk surface before
|
||||
** continuing. Transactions still work if synchronous is off,
|
||||
** and the database cannot be corrupted if this program
|
||||
** crashes. But if the operating system crashes or there is
|
||||
** an abrupt power failure when synchronous is off, the database
|
||||
** could be left in an inconsistent and unrecoverable state.
|
||||
** Synchronous is on by default so database corruption is not
|
||||
** normally a worry.
|
||||
** Change the "soft" limit on the number of pages in the cache.
|
||||
** Unused and unmodified pages will be recycled when the number of
|
||||
** pages in the cache exceeds this soft limit. But the size of the
|
||||
** cache is allowed to grow larger than this limit if it contains
|
||||
** dirty pages or pages still in active use.
|
||||
*/
|
||||
int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){
|
||||
BtShared *pBt = p->pBt;
|
||||
@ -2579,6 +2571,26 @@ int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Change the "spill" limit on the number of pages in the cache.
|
||||
** If the number of pages exceeds this limit during a write transaction,
|
||||
** the pager might attempt to "spill" pages to the journal early in
|
||||
** order to free up memory.
|
||||
**
|
||||
** The value returned is the current spill size. If zero is passed
|
||||
** as an argument, no changes are made to the spill size setting, so
|
||||
** using mxPage of 0 is a way to query the current spill size.
|
||||
*/
|
||||
int sqlite3BtreeSetSpillSize(Btree *p, int mxPage){
|
||||
BtShared *pBt = p->pBt;
|
||||
int res;
|
||||
assert( sqlite3_mutex_held(p->db->mutex) );
|
||||
sqlite3BtreeEnter(p);
|
||||
res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage);
|
||||
sqlite3BtreeLeave(p);
|
||||
return res;
|
||||
}
|
||||
|
||||
#if SQLITE_MAX_MMAP_SIZE>0
|
||||
/*
|
||||
** Change the limit on the amount of the database file that may be
|
||||
|
@ -63,6 +63,7 @@ int sqlite3BtreeOpen(
|
||||
|
||||
int sqlite3BtreeClose(Btree*);
|
||||
int sqlite3BtreeSetCacheSize(Btree*,int);
|
||||
int sqlite3BtreeSetSpillSize(Btree*,int);
|
||||
#if SQLITE_MAX_MMAP_SIZE>0
|
||||
int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64);
|
||||
#endif
|
||||
|
11
src/pager.c
11
src/pager.c
@ -3392,12 +3392,21 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
|
||||
}
|
||||
|
||||
/*
|
||||
** Change the maximum number of in-memory pages that are allowed.
|
||||
** Change the maximum number of in-memory pages that are allowed
|
||||
** before attempting to recycle clean and unused pages.
|
||||
*/
|
||||
void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){
|
||||
sqlite3PcacheSetCachesize(pPager->pPCache, mxPage);
|
||||
}
|
||||
|
||||
/*
|
||||
** Change the maximum number of in-memory pages that are allowed
|
||||
** before attempting to spill pages to journal.
|
||||
*/
|
||||
int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){
|
||||
return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage);
|
||||
}
|
||||
|
||||
/*
|
||||
** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap.
|
||||
*/
|
||||
|
@ -123,6 +123,7 @@ void sqlite3PagerAlignReserve(Pager*,Pager*);
|
||||
#endif
|
||||
int sqlite3PagerMaxPageCount(Pager*, int);
|
||||
void sqlite3PagerSetCachesize(Pager*, int);
|
||||
int sqlite3PagerSetSpillsize(Pager*, int);
|
||||
void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64);
|
||||
void sqlite3PagerShrink(Pager*);
|
||||
void sqlite3PagerSetFlags(Pager*,unsigned);
|
||||
|
72
src/pcache.c
72
src/pcache.c
@ -21,6 +21,7 @@ struct PCache {
|
||||
PgHdr *pSynced; /* Last synced page in dirty page list */
|
||||
int nRefSum; /* Sum of ref counts over all pages */
|
||||
int szCache; /* Configured cache size */
|
||||
int szSpill; /* Size before spilling occurs */
|
||||
int szPage; /* Size of every page in this cache */
|
||||
int szExtra; /* Size of extra space for each page */
|
||||
u8 bPurgeable; /* True if pages are on backing store */
|
||||
@ -110,10 +111,8 @@ static void pcacheUnpin(PgHdr *p){
|
||||
}
|
||||
|
||||
/*
|
||||
** Compute the number of pages of cache requested. p->szCache is the
|
||||
** Compute the number of pages of cache requested. p->szCache is the
|
||||
** cache size requested by the "PRAGMA cache_size" statement.
|
||||
**
|
||||
**
|
||||
*/
|
||||
static int numberOfCachePages(PCache *p){
|
||||
if( p->szCache>=0 ){
|
||||
@ -176,6 +175,7 @@ int sqlite3PcacheOpen(
|
||||
p->xStress = xStress;
|
||||
p->pStress = pStress;
|
||||
p->szCache = 100;
|
||||
p->szSpill = 1;
|
||||
return sqlite3PcacheSetPageSize(p, szPage);
|
||||
}
|
||||
|
||||
@ -271,32 +271,33 @@ int sqlite3PcacheFetchStress(
|
||||
PgHdr *pPg;
|
||||
if( pCache->eCreate==2 ) return 0;
|
||||
|
||||
|
||||
/* Find a dirty page to write-out and recycle. First try to find a
|
||||
** page that does not require a journal-sync (one with PGHDR_NEED_SYNC
|
||||
** cleared), but if that is not possible settle for any other
|
||||
** unreferenced dirty page.
|
||||
*/
|
||||
for(pPg=pCache->pSynced;
|
||||
pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC));
|
||||
pPg=pPg->pDirtyPrev
|
||||
);
|
||||
pCache->pSynced = pPg;
|
||||
if( !pPg ){
|
||||
for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev);
|
||||
}
|
||||
if( pPg ){
|
||||
int rc;
|
||||
if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){
|
||||
/* Find a dirty page to write-out and recycle. First try to find a
|
||||
** page that does not require a journal-sync (one with PGHDR_NEED_SYNC
|
||||
** cleared), but if that is not possible settle for any other
|
||||
** unreferenced dirty page.
|
||||
*/
|
||||
for(pPg=pCache->pSynced;
|
||||
pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC));
|
||||
pPg=pPg->pDirtyPrev
|
||||
);
|
||||
pCache->pSynced = pPg;
|
||||
if( !pPg ){
|
||||
for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev);
|
||||
}
|
||||
if( pPg ){
|
||||
int rc;
|
||||
#ifdef SQLITE_LOG_CACHE_SPILL
|
||||
sqlite3_log(SQLITE_FULL,
|
||||
"spill page %d making room for %d - cache used: %d/%d",
|
||||
pPg->pgno, pgno,
|
||||
sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache),
|
||||
sqlite3_log(SQLITE_FULL,
|
||||
"spill page %d making room for %d - cache used: %d/%d",
|
||||
pPg->pgno, pgno,
|
||||
sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache),
|
||||
numberOfCachePages(pCache));
|
||||
#endif
|
||||
rc = pCache->xStress(pCache->pStress, pPg);
|
||||
if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
|
||||
return rc;
|
||||
rc = pCache->xStress(pCache->pStress, pPg);
|
||||
if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
}
|
||||
*ppPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2);
|
||||
@ -641,6 +642,25 @@ void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){
|
||||
numberOfCachePages(pCache));
|
||||
}
|
||||
|
||||
/*
|
||||
** Set the suggested cache-spill value. Make no changes if if the
|
||||
** argument is zero. Return the effective cache-spill size, which will
|
||||
** be the larger of the szSpill and szCache.
|
||||
*/
|
||||
int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){
|
||||
int res;
|
||||
assert( p->pCache!=0 );
|
||||
if( mxPage ){
|
||||
if( mxPage<0 ){
|
||||
mxPage = (int)((-1024*(i64)mxPage)/(p->szPage+p->szExtra));
|
||||
}
|
||||
p->szSpill = mxPage;
|
||||
}
|
||||
res = numberOfCachePages(p);
|
||||
if( res<p->szSpill ) res = p->szSpill;
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
** Free up as much memory as possible from the page cache.
|
||||
*/
|
||||
|
@ -146,6 +146,13 @@ void sqlite3PcacheSetCachesize(PCache *, int);
|
||||
int sqlite3PcacheGetCachesize(PCache *);
|
||||
#endif
|
||||
|
||||
/* Set or get the suggested spill-size for the specified pager-cache.
|
||||
**
|
||||
** The spill-size is the minimum number of pages in cache before the cache
|
||||
** will attempt to spill dirty pages by calling xStress.
|
||||
*/
|
||||
int sqlite3PcacheSetSpillsize(PCache *, int);
|
||||
|
||||
/* Free up as much memory as possible from the page cache */
|
||||
void sqlite3PcacheShrink(PCache*);
|
||||
|
||||
|
117
src/pragma.c
117
src/pragma.c
@ -279,7 +279,7 @@ const char *sqlite3JournalModename(int eMode){
|
||||
**
|
||||
** Pragmas are of this form:
|
||||
**
|
||||
** PRAGMA [database.]id [= value]
|
||||
** PRAGMA [schema.]id [= value]
|
||||
**
|
||||
** The identifier might also be a string. The value is a string, and
|
||||
** identifier, or a number. If minusFlag is true, then the value is
|
||||
@ -291,8 +291,8 @@ const char *sqlite3JournalModename(int eMode){
|
||||
*/
|
||||
void sqlite3Pragma(
|
||||
Parse *pParse,
|
||||
Token *pId1, /* First part of [database.]id field */
|
||||
Token *pId2, /* Second part of [database.]id field, or NULL */
|
||||
Token *pId1, /* First part of [schema.]id field */
|
||||
Token *pId2, /* Second part of [schema.]id field, or NULL */
|
||||
Token *pValue, /* Token for <value>, or NULL */
|
||||
int minusFlag /* True if a '-' sign preceded <value> */
|
||||
){
|
||||
@ -313,7 +313,7 @@ void sqlite3Pragma(
|
||||
sqlite3VdbeRunOnlyOnce(v);
|
||||
pParse->nMem = 2;
|
||||
|
||||
/* Interpret the [database.] part of the pragma statement. iDb is the
|
||||
/* Interpret the [schema.] part of the pragma statement. iDb is the
|
||||
** index of the database this pragma is being applied to in db.aDb[]. */
|
||||
iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId);
|
||||
if( iDb<0 ) return;
|
||||
@ -402,8 +402,8 @@ void sqlite3Pragma(
|
||||
|
||||
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
|
||||
/*
|
||||
** PRAGMA [database.]default_cache_size
|
||||
** PRAGMA [database.]default_cache_size=N
|
||||
** PRAGMA [schema.]default_cache_size
|
||||
** PRAGMA [schema.]default_cache_size=N
|
||||
**
|
||||
** The first form reports the current persistent setting for the
|
||||
** page cache size. The value returned is the maximum number of
|
||||
@ -454,8 +454,8 @@ void sqlite3Pragma(
|
||||
|
||||
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
|
||||
/*
|
||||
** PRAGMA [database.]page_size
|
||||
** PRAGMA [database.]page_size=N
|
||||
** PRAGMA [schema.]page_size
|
||||
** PRAGMA [schema.]page_size=N
|
||||
**
|
||||
** The first form reports the current setting for the
|
||||
** database page size in bytes. The second form sets the
|
||||
@ -481,8 +481,8 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]secure_delete
|
||||
** PRAGMA [database.]secure_delete=ON/OFF
|
||||
** PRAGMA [schema.]secure_delete
|
||||
** PRAGMA [schema.]secure_delete=ON/OFF
|
||||
**
|
||||
** The first form reports the current setting for the
|
||||
** secure_delete flag. The second form changes the secure_delete
|
||||
@ -507,8 +507,8 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]max_page_count
|
||||
** PRAGMA [database.]max_page_count=N
|
||||
** PRAGMA [schema.]max_page_count
|
||||
** PRAGMA [schema.]max_page_count=N
|
||||
**
|
||||
** The first form reports the current setting for the
|
||||
** maximum number of pages in the database file. The
|
||||
@ -519,7 +519,7 @@ void sqlite3Pragma(
|
||||
** change. The only purpose is to provide an easy way to test
|
||||
** the sqlite3AbsInt32() function.
|
||||
**
|
||||
** PRAGMA [database.]page_count
|
||||
** PRAGMA [schema.]page_count
|
||||
**
|
||||
** Return the number of pages in the specified database.
|
||||
*/
|
||||
@ -540,8 +540,8 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]locking_mode
|
||||
** PRAGMA [database.]locking_mode = (normal|exclusive)
|
||||
** PRAGMA [schema.]locking_mode
|
||||
** PRAGMA [schema.]locking_mode = (normal|exclusive)
|
||||
*/
|
||||
case PragTyp_LOCKING_MODE: {
|
||||
const char *zRet = "normal";
|
||||
@ -586,8 +586,8 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]journal_mode
|
||||
** PRAGMA [database.]journal_mode =
|
||||
** PRAGMA [schema.]journal_mode
|
||||
** PRAGMA [schema.]journal_mode =
|
||||
** (delete|persist|off|truncate|memory|wal|off)
|
||||
*/
|
||||
case PragTyp_JOURNAL_MODE: {
|
||||
@ -627,8 +627,8 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]journal_size_limit
|
||||
** PRAGMA [database.]journal_size_limit=N
|
||||
** PRAGMA [schema.]journal_size_limit
|
||||
** PRAGMA [schema.]journal_size_limit=N
|
||||
**
|
||||
** Get or set the size limit on rollback journal files.
|
||||
*/
|
||||
@ -647,8 +647,8 @@ void sqlite3Pragma(
|
||||
#endif /* SQLITE_OMIT_PAGER_PRAGMAS */
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]auto_vacuum
|
||||
** PRAGMA [database.]auto_vacuum=N
|
||||
** PRAGMA [schema.]auto_vacuum
|
||||
** PRAGMA [schema.]auto_vacuum=N
|
||||
**
|
||||
** Get or set the value of the database 'auto-vacuum' parameter.
|
||||
** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL
|
||||
@ -699,7 +699,7 @@ void sqlite3Pragma(
|
||||
#endif
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]incremental_vacuum(N)
|
||||
** PRAGMA [schema.]incremental_vacuum(N)
|
||||
**
|
||||
** Do N steps of incremental vacuuming on a database.
|
||||
*/
|
||||
@ -722,8 +722,8 @@ void sqlite3Pragma(
|
||||
|
||||
#ifndef SQLITE_OMIT_PAGER_PRAGMAS
|
||||
/*
|
||||
** PRAGMA [database.]cache_size
|
||||
** PRAGMA [database.]cache_size=N
|
||||
** PRAGMA [schema.]cache_size
|
||||
** PRAGMA [schema.]cache_size=N
|
||||
**
|
||||
** The first form reports the current local setting for the
|
||||
** page cache size. The second form sets the local
|
||||
@ -747,7 +747,50 @@ void sqlite3Pragma(
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]mmap_size(N)
|
||||
** PRAGMA [schema.]cache_spill
|
||||
** PRAGMA cache_spill=BOOLEAN
|
||||
** PRAGMA [schema.]cache_spill=N
|
||||
**
|
||||
** The first form reports the current local setting for the
|
||||
** page cache spill size. The second form turns cache spill on
|
||||
** or off. When turnning cache spill on, the size is set to the
|
||||
** current cache_size. The third form sets a spill size that
|
||||
** may be different form the cache size.
|
||||
** If N is positive then that is the
|
||||
** number of pages in the cache. If N is negative, then the
|
||||
** number of pages is adjusted so that the cache uses -N kibibytes
|
||||
** of memory.
|
||||
**
|
||||
** If the number of cache_spill pages is less then the number of
|
||||
** cache_size pages, no spilling occurs until the page count exceeds
|
||||
** the number of cache_size pages.
|
||||
**
|
||||
** The cache_spill=BOOLEAN setting applies to all attached schemas,
|
||||
** not just the schema specified.
|
||||
*/
|
||||
case PragTyp_CACHE_SPILL: {
|
||||
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
|
||||
if( !zRight ){
|
||||
returnSingleInt(v, "cache_spill",
|
||||
(db->flags & SQLITE_CacheSpill)==0 ? 0 :
|
||||
sqlite3BtreeSetSpillSize(pDb->pBt,0));
|
||||
}else{
|
||||
int size = 1;
|
||||
if( sqlite3GetInt32(zRight, &size) ){
|
||||
sqlite3BtreeSetSpillSize(pDb->pBt, size);
|
||||
}
|
||||
if( sqlite3GetBoolean(zRight, size!=0) ){
|
||||
db->flags |= SQLITE_CacheSpill;
|
||||
}else{
|
||||
db->flags &= ~SQLITE_CacheSpill;
|
||||
}
|
||||
setAllPagerFlags(db);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** PRAGMA [schema.]mmap_size(N)
|
||||
**
|
||||
** Used to set mapping size limit. The mapping size limit is
|
||||
** used to limit the aggregate size of all memory mapped regions of the
|
||||
@ -891,8 +934,8 @@ void sqlite3Pragma(
|
||||
|
||||
#if SQLITE_ENABLE_LOCKING_STYLE
|
||||
/*
|
||||
** PRAGMA [database.]lock_proxy_file
|
||||
** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path"
|
||||
** PRAGMA [schema.]lock_proxy_file
|
||||
** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path"
|
||||
**
|
||||
** Return or set the value of the lock_proxy_file flag. Changing
|
||||
** the value sets a specific file to be used for database access locks.
|
||||
@ -927,8 +970,8 @@ void sqlite3Pragma(
|
||||
#endif /* SQLITE_ENABLE_LOCKING_STYLE */
|
||||
|
||||
/*
|
||||
** PRAGMA [database.]synchronous
|
||||
** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL
|
||||
** PRAGMA [schema.]synchronous
|
||||
** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL
|
||||
**
|
||||
** Return or set the local value of the synchronous flag. Changing
|
||||
** the local value does not make changes to the disk file and the
|
||||
@ -1644,16 +1687,16 @@ void sqlite3Pragma(
|
||||
|
||||
#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
|
||||
/*
|
||||
** PRAGMA [database.]schema_version
|
||||
** PRAGMA [database.]schema_version = <integer>
|
||||
** PRAGMA [schema.]schema_version
|
||||
** PRAGMA [schema.]schema_version = <integer>
|
||||
**
|
||||
** PRAGMA [database.]user_version
|
||||
** PRAGMA [database.]user_version = <integer>
|
||||
** PRAGMA [schema.]user_version
|
||||
** PRAGMA [schema.]user_version = <integer>
|
||||
**
|
||||
** PRAGMA [database.]freelist_count = <integer>
|
||||
** PRAGMA [schema.]freelist_count = <integer>
|
||||
**
|
||||
** PRAGMA [database.]application_id
|
||||
** PRAGMA [database.]application_id = <integer>
|
||||
** PRAGMA [schema.]application_id
|
||||
** PRAGMA [schema.]application_id = <integer>
|
||||
**
|
||||
** The pragma's schema_version and user_version are used to set or get
|
||||
** the value of the schema-version and user-version, respectively. Both
|
||||
@ -1728,7 +1771,7 @@ void sqlite3Pragma(
|
||||
|
||||
#ifndef SQLITE_OMIT_WAL
|
||||
/*
|
||||
** PRAGMA [database.]wal_checkpoint = passive|full|restart|truncate
|
||||
** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate
|
||||
**
|
||||
** Checkpoint the database.
|
||||
*/
|
||||
|
79
src/pragma.h
79
src/pragma.h
@ -8,43 +8,44 @@
|
||||
#define PragTyp_FLAG 2
|
||||
#define PragTyp_BUSY_TIMEOUT 3
|
||||
#define PragTyp_CACHE_SIZE 4
|
||||
#define PragTyp_CASE_SENSITIVE_LIKE 5
|
||||
#define PragTyp_COLLATION_LIST 6
|
||||
#define PragTyp_COMPILE_OPTIONS 7
|
||||
#define PragTyp_DATA_STORE_DIRECTORY 8
|
||||
#define PragTyp_DATABASE_LIST 9
|
||||
#define PragTyp_DEFAULT_CACHE_SIZE 10
|
||||
#define PragTyp_ENCODING 11
|
||||
#define PragTyp_FOREIGN_KEY_CHECK 12
|
||||
#define PragTyp_FOREIGN_KEY_LIST 13
|
||||
#define PragTyp_INCREMENTAL_VACUUM 14
|
||||
#define PragTyp_INDEX_INFO 15
|
||||
#define PragTyp_INDEX_LIST 16
|
||||
#define PragTyp_INTEGRITY_CHECK 17
|
||||
#define PragTyp_JOURNAL_MODE 18
|
||||
#define PragTyp_JOURNAL_SIZE_LIMIT 19
|
||||
#define PragTyp_LOCK_PROXY_FILE 20
|
||||
#define PragTyp_LOCKING_MODE 21
|
||||
#define PragTyp_PAGE_COUNT 22
|
||||
#define PragTyp_MMAP_SIZE 23
|
||||
#define PragTyp_PAGE_SIZE 24
|
||||
#define PragTyp_SECURE_DELETE 25
|
||||
#define PragTyp_SHRINK_MEMORY 26
|
||||
#define PragTyp_SOFT_HEAP_LIMIT 27
|
||||
#define PragTyp_STATS 28
|
||||
#define PragTyp_SYNCHRONOUS 29
|
||||
#define PragTyp_TABLE_INFO 30
|
||||
#define PragTyp_TEMP_STORE 31
|
||||
#define PragTyp_TEMP_STORE_DIRECTORY 32
|
||||
#define PragTyp_THREADS 33
|
||||
#define PragTyp_WAL_AUTOCHECKPOINT 34
|
||||
#define PragTyp_WAL_CHECKPOINT 35
|
||||
#define PragTyp_ACTIVATE_EXTENSIONS 36
|
||||
#define PragTyp_HEXKEY 37
|
||||
#define PragTyp_KEY 38
|
||||
#define PragTyp_REKEY 39
|
||||
#define PragTyp_LOCK_STATUS 40
|
||||
#define PragTyp_PARSER_TRACE 41
|
||||
#define PragTyp_CACHE_SPILL 5
|
||||
#define PragTyp_CASE_SENSITIVE_LIKE 6
|
||||
#define PragTyp_COLLATION_LIST 7
|
||||
#define PragTyp_COMPILE_OPTIONS 8
|
||||
#define PragTyp_DATA_STORE_DIRECTORY 9
|
||||
#define PragTyp_DATABASE_LIST 10
|
||||
#define PragTyp_DEFAULT_CACHE_SIZE 11
|
||||
#define PragTyp_ENCODING 12
|
||||
#define PragTyp_FOREIGN_KEY_CHECK 13
|
||||
#define PragTyp_FOREIGN_KEY_LIST 14
|
||||
#define PragTyp_INCREMENTAL_VACUUM 15
|
||||
#define PragTyp_INDEX_INFO 16
|
||||
#define PragTyp_INDEX_LIST 17
|
||||
#define PragTyp_INTEGRITY_CHECK 18
|
||||
#define PragTyp_JOURNAL_MODE 19
|
||||
#define PragTyp_JOURNAL_SIZE_LIMIT 20
|
||||
#define PragTyp_LOCK_PROXY_FILE 21
|
||||
#define PragTyp_LOCKING_MODE 22
|
||||
#define PragTyp_PAGE_COUNT 23
|
||||
#define PragTyp_MMAP_SIZE 24
|
||||
#define PragTyp_PAGE_SIZE 25
|
||||
#define PragTyp_SECURE_DELETE 26
|
||||
#define PragTyp_SHRINK_MEMORY 27
|
||||
#define PragTyp_SOFT_HEAP_LIMIT 28
|
||||
#define PragTyp_STATS 29
|
||||
#define PragTyp_SYNCHRONOUS 30
|
||||
#define PragTyp_TABLE_INFO 31
|
||||
#define PragTyp_TEMP_STORE 32
|
||||
#define PragTyp_TEMP_STORE_DIRECTORY 33
|
||||
#define PragTyp_THREADS 34
|
||||
#define PragTyp_WAL_AUTOCHECKPOINT 35
|
||||
#define PragTyp_WAL_CHECKPOINT 36
|
||||
#define PragTyp_ACTIVATE_EXTENSIONS 37
|
||||
#define PragTyp_HEXKEY 38
|
||||
#define PragTyp_KEY 39
|
||||
#define PragTyp_REKEY 40
|
||||
#define PragTyp_LOCK_STATUS 41
|
||||
#define PragTyp_PARSER_TRACE 42
|
||||
#define PragFlag_NeedSchema 0x01
|
||||
#define PragFlag_ReadOnly 0x02
|
||||
static const struct sPragmaNames {
|
||||
@ -91,9 +92,9 @@ static const struct sPragmaNames {
|
||||
#endif
|
||||
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
|
||||
{ /* zName: */ "cache_spill",
|
||||
/* ePragTyp: */ PragTyp_FLAG,
|
||||
/* ePragTyp: */ PragTyp_CACHE_SPILL,
|
||||
/* ePragFlag: */ 0,
|
||||
/* iArg: */ SQLITE_CacheSpill },
|
||||
/* iArg: */ 0 },
|
||||
#endif
|
||||
{ /* zName: */ "case_sensitive_like",
|
||||
/* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE,
|
||||
|
@ -138,7 +138,7 @@ do_execsql_test pragma2-4.1 {
|
||||
PRAGMA cache_spill;
|
||||
PRAGMA main.cache_spill;
|
||||
PRAGMA temp.cache_spill;
|
||||
} {1 1 1}
|
||||
} {2000 2000 2000}
|
||||
do_execsql_test pragma2-4.2 {
|
||||
PRAGMA cache_spill=OFF;
|
||||
PRAGMA cache_spill;
|
||||
@ -178,21 +178,54 @@ do_test pragma2-4.4 {
|
||||
PRAGMA lock_status;
|
||||
}
|
||||
} {main exclusive temp unknown} ;# EXCLUSIVE lock due to cache spill
|
||||
do_test pragma2-4.5 {
|
||||
do_test pragma2-4.5.1 {
|
||||
db eval {
|
||||
COMMIT;
|
||||
ROLLBACK;
|
||||
PRAGMA cache_spill=OFF;
|
||||
PRAGMA Cache_Spill;
|
||||
BEGIN;
|
||||
UPDATE t1 SET c=c-1;
|
||||
UPDATE t1 SET c=c+1;
|
||||
PRAGMA lock_status;
|
||||
}
|
||||
} {main reserved temp unknown} ;# No cache spill, so no exclusive lock
|
||||
} {0 main reserved temp unknown} ;# No cache spill, so no exclusive lock
|
||||
do_test pragma2-4.5.2 {
|
||||
db eval {
|
||||
ROLLBACK;
|
||||
PRAGMA cache_spill=100000;
|
||||
PRAGMA cache_spill;
|
||||
BEGIN;
|
||||
UPDATE t1 SET c=c+1;
|
||||
PRAGMA lock_status;
|
||||
}
|
||||
} {100000 main reserved temp unknown} ;# Big spill threshold -> no excl lock
|
||||
do_test pragma2-4.5.3 {
|
||||
db eval {
|
||||
ROLLBACK;
|
||||
PRAGMA cache_spill=25;
|
||||
PRAGMA main.cache_spill;
|
||||
BEGIN;
|
||||
UPDATE t1 SET c=c+1;
|
||||
PRAGMA lock_status;
|
||||
}
|
||||
} {50 main exclusive temp unknown} ;# Small cache spill -> exclusive lock
|
||||
do_test pragma2-4.5.4 {
|
||||
db eval {
|
||||
ROLLBACK;
|
||||
PRAGMA cache_spill(-25);
|
||||
PRAGMA main.cache_spill;
|
||||
BEGIN;
|
||||
UPDATE t1 SET c=c+1;
|
||||
PRAGMA lock_status;
|
||||
}
|
||||
} {50 main exclusive temp unknown} ;# Small cache spill -> exclusive lock
|
||||
|
||||
|
||||
# Verify that newly attached databases inherit the cache_spill=OFF
|
||||
# setting.
|
||||
#
|
||||
do_execsql_test pragma2-4.6 {
|
||||
COMMIT;
|
||||
ROLLBACK;
|
||||
PRAGMA cache_spill=OFF;
|
||||
ATTACH 'test2.db' AS aux1;
|
||||
PRAGMA aux1.cache_size=50;
|
||||
BEGIN;
|
||||
@ -209,6 +242,26 @@ do_execsql_test pragma2-4.8 {
|
||||
UPDATE t2 SET c=c-1;
|
||||
PRAGMA lock_status;
|
||||
} {main unlocked temp unknown aux1 exclusive}
|
||||
db close
|
||||
forcedelete test.db
|
||||
sqlite3 db test.db
|
||||
|
||||
breakpoint
|
||||
do_execsql_test pragma2-5.1 {
|
||||
PRAGMA page_size=16384;
|
||||
CREATE TABLE t1(x);
|
||||
PRAGMA cache_size=2;
|
||||
PRAGMA cache_spill=YES;
|
||||
PRAGMA cache_spill;
|
||||
} {2}
|
||||
do_execsql_test pragma2-5.2 {
|
||||
PRAGMA cache_spill=NO;
|
||||
PRAGMA cache_spill;
|
||||
} {0}
|
||||
do_execsql_test pragma2-5.3 {
|
||||
PRAGMA cache_spill(-51);
|
||||
PRAGMA cache_spill;
|
||||
} {3}
|
||||
|
||||
test_restore_config_pagecache
|
||||
finish_test
|
||||
|
@ -47,8 +47,6 @@ set pragma_def {
|
||||
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
|
||||
|
||||
NAME: cache_spill
|
||||
TYPE: FLAG
|
||||
ARG: SQLITE_CacheSpill
|
||||
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
|
||||
|
||||
NAME: reverse_unordered_selects
|
||||
|
Loading…
Reference in New Issue
Block a user