mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Once it is opened, leave the checkpoint journal file open for the
duration of a transaction, rather than closing it and reopening it for each statement. (Ticket #53) (CVS 599) FossilOrigin-Name: 7a24336d50e72006b2cc0e4feb292b946e79d5f3
This commit is contained in:
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
|||||||
C Bug\sfix:\sbad\scode\swas\sgenerated\sfor\swhen\sthe\sfirst\soperand\sof\sa\sCASE\nwas\sNULL.\s(CVS\s598)
|
C Once\sit\sis\sopened,\sleave\sthe\scheckpoint\sjournal\sfile\sopen\sfor\sthe\nduration\sof\sa\stransaction,\srather\sthan\sclosing\sit\sand\sreopening\sit\nfor\seach\sstatement.\s\s(Ticket\s#53)\s(CVS\s599)
|
||||||
D 2002-05-30T02:35:12
|
D 2002-05-30T12:27:03
|
||||||
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
|
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
|
||||||
F Makefile.template 4e11752e0b5c7a043ca50af4296ec562857ba495
|
F Makefile.template 4e11752e0b5c7a043ca50af4296ec562857ba495
|
||||||
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
|
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
|
||||||
@ -32,7 +32,7 @@ F src/main.c 6e53c49a390fabd5fecce9e3b128c61c85208000
|
|||||||
F src/md5.c 0ae1f3e2cac92d06fc6246d1b4b8f61a2fe66d3b
|
F src/md5.c 0ae1f3e2cac92d06fc6246d1b4b8f61a2fe66d3b
|
||||||
F src/os.c 9cc40c5384baba4a85e160e67807645ca98ba3cc
|
F src/os.c 9cc40c5384baba4a85e160e67807645ca98ba3cc
|
||||||
F src/os.h 4a361fccfbc4e7609b3e1557f604f94c1e96ad10
|
F src/os.h 4a361fccfbc4e7609b3e1557f604f94c1e96ad10
|
||||||
F src/pager.c ba5740104cc27b342cd43eebfdc44d60f64a3ded
|
F src/pager.c 1e41053c949cea1f09d8dafada5fe8f90785e650
|
||||||
F src/pager.h 6fddfddd3b73aa8abc081b973886320e3c614f0e
|
F src/pager.h 6fddfddd3b73aa8abc081b973886320e3c614f0e
|
||||||
F src/parse.y c681da701bf142967325b8791f22418e2d81552d
|
F src/parse.y c681da701bf142967325b8791f22418e2d81552d
|
||||||
F src/printf.c d8032ee18b860c812eeff596c9bebfdacb7930fd
|
F src/printf.c d8032ee18b860c812eeff596c9bebfdacb7930fd
|
||||||
@ -63,7 +63,7 @@ F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895
|
|||||||
F test/conflict.test 5149646703d3930c9111068b5cda7e2e938476e3
|
F test/conflict.test 5149646703d3930c9111068b5cda7e2e938476e3
|
||||||
F test/copy.test b3cefcb520c64d7e7dfedbab06b4d4c31fa5b99a
|
F test/copy.test b3cefcb520c64d7e7dfedbab06b4d4c31fa5b99a
|
||||||
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
|
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
|
||||||
F test/expr.test ff6fceb9958f94ae3ca23dcc47aff7830b8131bc
|
F test/expr.test 6a863adedb51b07fec745319aa6a1f939fbe0579
|
||||||
F test/func.test 628ab513b0d9c54251a63e026a26b7b4347e54ab
|
F test/func.test 628ab513b0d9c54251a63e026a26b7b4347e54ab
|
||||||
F test/in.test c09312672e3f0709fa02c8e2e9cd8fb4bd6269aa
|
F test/in.test c09312672e3f0709fa02c8e2e9cd8fb4bd6269aa
|
||||||
F test/index.test c8a471243bbf878974b99baf5badd59407237cf3
|
F test/index.test c8a471243bbf878974b99baf5badd59407237cf3
|
||||||
@ -135,7 +135,7 @@ F www/speed.tcl da8afcc1d3ccc5696cfb388a68982bc3d9f7f00f
|
|||||||
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
|
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
|
||||||
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
|
||||||
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
||||||
P 19ae12bef210ae5fe171f10833faa38d640c129f
|
P 4debc8db929fdc201759ba211acdeadc4e30e8af
|
||||||
R 1129c1b4d523e26221972965ea9f1b0e
|
R d3c150a342080a50caa6809fc7ad7e65
|
||||||
U drh
|
U drh
|
||||||
Z 13527e062fc395d3f1e89758ab03474f
|
Z 7c9293e04df21e05a0d63344cf0a4066
|
||||||
|
@ -1 +1 @@
|
|||||||
4debc8db929fdc201759ba211acdeadc4e30e8af
|
7a24336d50e72006b2cc0e4feb292b946e79d5f3
|
47
src/pager.c
47
src/pager.c
@ -18,7 +18,7 @@
|
|||||||
** file simultaneously, or one process from reading the database while
|
** file simultaneously, or one process from reading the database while
|
||||||
** another is writing.
|
** another is writing.
|
||||||
**
|
**
|
||||||
** @(#) $Id: pager.c,v 1.45 2002/04/18 01:56:58 drh Exp $
|
** @(#) $Id: pager.c,v 1.46 2002/05/30 12:27:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "pager.h"
|
#include "pager.h"
|
||||||
@ -114,6 +114,7 @@ struct Pager {
|
|||||||
int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */
|
int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */
|
||||||
u8 journalOpen; /* True if journal file descriptors is valid */
|
u8 journalOpen; /* True if journal file descriptors is valid */
|
||||||
u8 ckptOpen; /* True if the checkpoint journal is open */
|
u8 ckptOpen; /* True if the checkpoint journal is open */
|
||||||
|
u8 ckptInUse; /* True we are in a checkpoint */
|
||||||
u8 noSync; /* Do not sync the journal if true */
|
u8 noSync; /* Do not sync the journal if true */
|
||||||
u8 state; /* SQLITE_UNLOCK, _READLOCK or _WRITELOCK */
|
u8 state; /* SQLITE_UNLOCK, _READLOCK or _WRITELOCK */
|
||||||
u8 errMask; /* One of several kinds of errors */
|
u8 errMask; /* One of several kinds of errors */
|
||||||
@ -243,6 +244,10 @@ static int pager_unwritelock(Pager *pPager){
|
|||||||
PgHdr *pPg;
|
PgHdr *pPg;
|
||||||
if( pPager->state<SQLITE_WRITELOCK ) return SQLITE_OK;
|
if( pPager->state<SQLITE_WRITELOCK ) return SQLITE_OK;
|
||||||
sqlitepager_ckpt_commit(pPager);
|
sqlitepager_ckpt_commit(pPager);
|
||||||
|
if( pPager->ckptOpen ){
|
||||||
|
sqliteOsClose(&pPager->cpfd);
|
||||||
|
pPager->ckptOpen = 0;
|
||||||
|
}
|
||||||
sqliteOsClose(&pPager->jfd);
|
sqliteOsClose(&pPager->jfd);
|
||||||
pPager->journalOpen = 0;
|
pPager->journalOpen = 0;
|
||||||
sqliteOsDelete(pPager->zJournal);
|
sqliteOsDelete(pPager->zJournal);
|
||||||
@ -391,7 +396,7 @@ static int pager_ckpt_playback(Pager *pPager){
|
|||||||
|
|
||||||
/* Figure out how many records are in the checkpoint journal.
|
/* Figure out how many records are in the checkpoint journal.
|
||||||
*/
|
*/
|
||||||
assert( pPager->ckptOpen && pPager->journalOpen );
|
assert( pPager->ckptInUse && pPager->journalOpen );
|
||||||
sqliteOsSeek(&pPager->cpfd, 0);
|
sqliteOsSeek(&pPager->cpfd, 0);
|
||||||
rc = sqliteOsFileSize(&pPager->cpfd, &nRec);
|
rc = sqliteOsFileSize(&pPager->cpfd, &nRec);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
@ -528,6 +533,7 @@ int sqlitepager_open(
|
|||||||
pPager->fd = fd;
|
pPager->fd = fd;
|
||||||
pPager->journalOpen = 0;
|
pPager->journalOpen = 0;
|
||||||
pPager->ckptOpen = 0;
|
pPager->ckptOpen = 0;
|
||||||
|
pPager->ckptInUse = 0;
|
||||||
pPager->nRef = 0;
|
pPager->nRef = 0;
|
||||||
pPager->dbSize = -1;
|
pPager->dbSize = -1;
|
||||||
pPager->ckptSize = 0;
|
pPager->ckptSize = 0;
|
||||||
@ -614,9 +620,11 @@ int sqlitepager_close(Pager *pPager){
|
|||||||
}
|
}
|
||||||
sqliteOsClose(&pPager->fd);
|
sqliteOsClose(&pPager->fd);
|
||||||
assert( pPager->journalOpen==0 );
|
assert( pPager->journalOpen==0 );
|
||||||
if( pPager->tempFile ){
|
/* Temp files are automatically deleted by the OS
|
||||||
/* sqliteOsDelete(pPager->zFilename); */
|
** if( pPager->tempFile ){
|
||||||
}
|
** sqliteOsDelete(pPager->zFilename);
|
||||||
|
** }
|
||||||
|
*/
|
||||||
sqliteFree(pPager);
|
sqliteFree(pPager);
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
@ -1090,7 +1098,7 @@ int sqlitepager_write(void *pData){
|
|||||||
** to the journal then we can return right away.
|
** to the journal then we can return right away.
|
||||||
*/
|
*/
|
||||||
pPg->dirty = 1;
|
pPg->dirty = 1;
|
||||||
if( pPg->inJournal && (pPg->inCkpt || pPager->ckptOpen==0) ){
|
if( pPg->inJournal && (pPg->inCkpt || pPager->ckptInUse==0) ){
|
||||||
pPager->dirtyFile = 1;
|
pPager->dirtyFile = 1;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
@ -1127,7 +1135,7 @@ int sqlitepager_write(void *pData){
|
|||||||
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
||||||
pPager->needSync = !pPager->noSync;
|
pPager->needSync = !pPager->noSync;
|
||||||
pPg->inJournal = 1;
|
pPg->inJournal = 1;
|
||||||
if( pPager->ckptOpen ){
|
if( pPager->ckptInUse ){
|
||||||
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
||||||
pPg->inCkpt = 1;
|
pPg->inCkpt = 1;
|
||||||
}
|
}
|
||||||
@ -1136,7 +1144,7 @@ int sqlitepager_write(void *pData){
|
|||||||
/* If the checkpoint journal is open and the page is not in it,
|
/* If the checkpoint journal is open and the page is not in it,
|
||||||
** then write the current page to the checkpoint journal.
|
** then write the current page to the checkpoint journal.
|
||||||
*/
|
*/
|
||||||
if( pPager->ckptOpen && !pPg->inCkpt && (int)pPg->pgno<=pPager->ckptSize ){
|
if( pPager->ckptInUse && !pPg->inCkpt && (int)pPg->pgno<=pPager->ckptSize ){
|
||||||
assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize );
|
assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize );
|
||||||
rc = sqliteOsWrite(&pPager->cpfd, &pPg->pgno, sizeof(Pgno));
|
rc = sqliteOsWrite(&pPager->cpfd, &pPg->pgno, sizeof(Pgno));
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
@ -1206,12 +1214,12 @@ void sqlitepager_dont_rollback(void *pData){
|
|||||||
assert( pPager->aInJournal!=0 );
|
assert( pPager->aInJournal!=0 );
|
||||||
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
||||||
pPg->inJournal = 1;
|
pPg->inJournal = 1;
|
||||||
if( pPager->ckptOpen ){
|
if( pPager->ckptInUse ){
|
||||||
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
||||||
pPg->inCkpt = 1;
|
pPg->inCkpt = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pPager->ckptOpen && !pPg->inCkpt && (int)pPg->pgno<=pPager->ckptSize ){
|
if( pPager->ckptInUse && !pPg->inCkpt && (int)pPg->pgno<=pPager->ckptSize ){
|
||||||
assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize );
|
assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize );
|
||||||
assert( pPager->aInCkpt!=0 );
|
assert( pPager->aInCkpt!=0 );
|
||||||
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
|
||||||
@ -1345,7 +1353,7 @@ int sqlitepager_ckpt_begin(Pager *pPager){
|
|||||||
int rc;
|
int rc;
|
||||||
char zTemp[SQLITE_TEMPNAME_SIZE];
|
char zTemp[SQLITE_TEMPNAME_SIZE];
|
||||||
assert( pPager->journalOpen );
|
assert( pPager->journalOpen );
|
||||||
assert( !pPager->ckptOpen );
|
assert( !pPager->ckptInUse );
|
||||||
pPager->aInCkpt = sqliteMalloc( pPager->dbSize/8 + 1 );
|
pPager->aInCkpt = sqliteMalloc( pPager->dbSize/8 + 1 );
|
||||||
if( pPager->aInCkpt==0 ){
|
if( pPager->aInCkpt==0 ){
|
||||||
sqliteOsReadLock(&pPager->fd);
|
sqliteOsReadLock(&pPager->fd);
|
||||||
@ -1354,9 +1362,12 @@ int sqlitepager_ckpt_begin(Pager *pPager){
|
|||||||
rc = sqliteOsFileSize(&pPager->jfd, &pPager->ckptJSize);
|
rc = sqliteOsFileSize(&pPager->jfd, &pPager->ckptJSize);
|
||||||
if( rc ) goto ckpt_begin_failed;
|
if( rc ) goto ckpt_begin_failed;
|
||||||
pPager->ckptSize = pPager->dbSize;
|
pPager->ckptSize = pPager->dbSize;
|
||||||
rc = sqlitepager_opentemp(zTemp, &pPager->cpfd);
|
if( !pPager->ckptOpen ){
|
||||||
if( rc ) goto ckpt_begin_failed;
|
rc = sqlitepager_opentemp(zTemp, &pPager->cpfd);
|
||||||
pPager->ckptOpen = 1;
|
if( rc ) goto ckpt_begin_failed;
|
||||||
|
pPager->ckptOpen = 1;
|
||||||
|
}
|
||||||
|
pPager->ckptInUse = 1;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
|
|
||||||
ckpt_begin_failed:
|
ckpt_begin_failed:
|
||||||
@ -1371,10 +1382,10 @@ ckpt_begin_failed:
|
|||||||
** Commit a checkpoint.
|
** Commit a checkpoint.
|
||||||
*/
|
*/
|
||||||
int sqlitepager_ckpt_commit(Pager *pPager){
|
int sqlitepager_ckpt_commit(Pager *pPager){
|
||||||
if( pPager->ckptOpen ){
|
if( pPager->ckptInUse ){
|
||||||
PgHdr *pPg;
|
PgHdr *pPg;
|
||||||
sqliteOsClose(&pPager->cpfd);
|
sqliteOsTruncate(&pPager->cpfd, 0);
|
||||||
pPager->ckptOpen = 0;
|
pPager->ckptInUse = 0;
|
||||||
sqliteFree( pPager->aInCkpt );
|
sqliteFree( pPager->aInCkpt );
|
||||||
pPager->aInCkpt = 0;
|
pPager->aInCkpt = 0;
|
||||||
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
|
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
|
||||||
@ -1389,7 +1400,7 @@ int sqlitepager_ckpt_commit(Pager *pPager){
|
|||||||
*/
|
*/
|
||||||
int sqlitepager_ckpt_rollback(Pager *pPager){
|
int sqlitepager_ckpt_rollback(Pager *pPager){
|
||||||
int rc;
|
int rc;
|
||||||
if( pPager->ckptOpen ){
|
if( pPager->ckptInUse ){
|
||||||
rc = pager_ckpt_playback(pPager);
|
rc = pager_ckpt_playback(pPager);
|
||||||
sqlitepager_ckpt_commit(pPager);
|
sqlitepager_ckpt_commit(pPager);
|
||||||
}else{
|
}else{
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
# This file implements regression tests for SQLite library. The
|
# This file implements regression tests for SQLite library. The
|
||||||
# focus of this file is testing expressions.
|
# focus of this file is testing expressions.
|
||||||
#
|
#
|
||||||
# $Id: expr.test,v 1.22 2002/05/30 02:35:12 drh Exp $
|
# $Id: expr.test,v 1.23 2002/05/30 12:27:03 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -354,7 +354,9 @@ test_expr expr-case.10 {i1=3} \
|
|||||||
{CASE i1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' END} {{}}
|
{CASE i1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' END} {{}}
|
||||||
test_expr expr-case.11 {i1=null} \
|
test_expr expr-case.11 {i1=null} \
|
||||||
{CASE i1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 3 END} {{}}
|
{CASE i1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 3 END} {{}}
|
||||||
test_expr expr-case.12 {i1=7} \
|
test_expr expr-case.12 {i1=1} \
|
||||||
|
{CASE i1 WHEN 1 THEN null WHEN 2 THEN 'two' ELSE 3 END} {{}}
|
||||||
|
test_expr expr-case.13 {i1=7} \
|
||||||
{ CASE WHEN i1 < 5 THEN 'low'
|
{ CASE WHEN i1 < 5 THEN 'low'
|
||||||
WHEN i1 < 10 THEN 'medium'
|
WHEN i1 < 10 THEN 'medium'
|
||||||
WHEN i1 < 15 THEN 'high' ELSE 'error' END} medium
|
WHEN i1 < 15 THEN 'high' ELSE 'error' END} medium
|
||||||
|
Reference in New Issue
Block a user