-C Bug\sfix:\sbad\scode\swas\sgenerated\sfor\swhen\sthe\sfirst\soperand\sof\sa\sCASE\nwas\sNULL.\s(CVS\s598)
-D 2002-05-30T02:35:12
+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-30T12:27:03
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
F Makefile.template 4e11752e0b5c7a043ca50af4296ec562857ba495
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
F src/md5.c 0ae1f3e2cac92d06fc6246d1b4b8f61a2fe66d3b
F src/os.c 9cc40c5384baba4a85e160e67807645ca98ba3cc
F src/os.h 4a361fccfbc4e7609b3e1557f604f94c1e96ad10
-F src/pager.c ba5740104cc27b342cd43eebfdc44d60f64a3ded
+F src/pager.c 1e41053c949cea1f09d8dafada5fe8f90785e650
F src/pager.h 6fddfddd3b73aa8abc081b973886320e3c614f0e
F src/parse.y c681da701bf142967325b8791f22418e2d81552d
F src/printf.c d8032ee18b860c812eeff596c9bebfdacb7930fd
F test/conflict.test 5149646703d3930c9111068b5cda7e2e938476e3
F test/copy.test b3cefcb520c64d7e7dfedbab06b4d4c31fa5b99a
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
-F test/expr.test ff6fceb9958f94ae3ca23dcc47aff7830b8131bc
+F test/expr.test 6a863adedb51b07fec745319aa6a1f939fbe0579
F test/func.test 628ab513b0d9c54251a63e026a26b7b4347e54ab
F test/in.test c09312672e3f0709fa02c8e2e9cd8fb4bd6269aa
F test/index.test c8a471243bbf878974b99baf5badd59407237cf3
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P 19ae12bef210ae5fe171f10833faa38d640c129f
-R 1129c1b4d523e26221972965ea9f1b0e
+P 4debc8db929fdc201759ba211acdeadc4e30e8af
+R d3c150a342080a50caa6809fc7ad7e65
U drh
-Z 13527e062fc395d3f1e89758ab03474f
+Z 7c9293e04df21e05a0d63344cf0a4066
** file simultaneously, or one process from reading the database while
** 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 "pager.h"
int nHit, nMiss, nOvfl; /* Cache hits, missing, and LRU overflows */
u8 journalOpen; /* True if journal file descriptors is valid */
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 state; /* SQLITE_UNLOCK, _READLOCK or _WRITELOCK */
u8 errMask; /* One of several kinds of errors */
PgHdr *pPg;
if( pPager->state<SQLITE_WRITELOCK ) return SQLITE_OK;
sqlitepager_ckpt_commit(pPager);
+ if( pPager->ckptOpen ){
+ sqliteOsClose(&pPager->cpfd);
+ pPager->ckptOpen = 0;
+ }
sqliteOsClose(&pPager->jfd);
pPager->journalOpen = 0;
sqliteOsDelete(pPager->zJournal);
/* Figure out how many records are in the checkpoint journal.
*/
- assert( pPager->ckptOpen && pPager->journalOpen );
+ assert( pPager->ckptInUse && pPager->journalOpen );
sqliteOsSeek(&pPager->cpfd, 0);
rc = sqliteOsFileSize(&pPager->cpfd, &nRec);
if( rc!=SQLITE_OK ){
pPager->fd = fd;
pPager->journalOpen = 0;
pPager->ckptOpen = 0;
+ pPager->ckptInUse = 0;
pPager->nRef = 0;
pPager->dbSize = -1;
pPager->ckptSize = 0;
}
sqliteOsClose(&pPager->fd);
assert( pPager->journalOpen==0 );
- if( pPager->tempFile ){
- /* sqliteOsDelete(pPager->zFilename); */
- }
+ /* Temp files are automatically deleted by the OS
+ ** if( pPager->tempFile ){
+ ** sqliteOsDelete(pPager->zFilename);
+ ** }
+ */
sqliteFree(pPager);
return SQLITE_OK;
}
** to the journal then we can return right away.
*/
pPg->dirty = 1;
- if( pPg->inJournal && (pPg->inCkpt || pPager->ckptOpen==0) ){
+ if( pPg->inJournal && (pPg->inCkpt || pPager->ckptInUse==0) ){
pPager->dirtyFile = 1;
return SQLITE_OK;
}
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
pPager->needSync = !pPager->noSync;
pPg->inJournal = 1;
- if( pPager->ckptOpen ){
+ if( pPager->ckptInUse ){
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
pPg->inCkpt = 1;
}
/* If the checkpoint journal is open and the page is not in it,
** 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 );
rc = sqliteOsWrite(&pPager->cpfd, &pPg->pgno, sizeof(Pgno));
if( rc==SQLITE_OK ){
assert( pPager->aInJournal!=0 );
pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7);
pPg->inJournal = 1;
- if( pPager->ckptOpen ){
+ if( pPager->ckptInUse ){
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
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( pPager->aInCkpt!=0 );
pPager->aInCkpt[pPg->pgno/8] |= 1<<(pPg->pgno&7);
int rc;
char zTemp[SQLITE_TEMPNAME_SIZE];
assert( pPager->journalOpen );
- assert( !pPager->ckptOpen );
+ assert( !pPager->ckptInUse );
pPager->aInCkpt = sqliteMalloc( pPager->dbSize/8 + 1 );
if( pPager->aInCkpt==0 ){
sqliteOsReadLock(&pPager->fd);
rc = sqliteOsFileSize(&pPager->jfd, &pPager->ckptJSize);
if( rc ) goto ckpt_begin_failed;
pPager->ckptSize = pPager->dbSize;
- rc = sqlitepager_opentemp(zTemp, &pPager->cpfd);
- if( rc ) goto ckpt_begin_failed;
- pPager->ckptOpen = 1;
+ if( !pPager->ckptOpen ){
+ rc = sqlitepager_opentemp(zTemp, &pPager->cpfd);
+ if( rc ) goto ckpt_begin_failed;
+ pPager->ckptOpen = 1;
+ }
+ pPager->ckptInUse = 1;
return SQLITE_OK;
ckpt_begin_failed:
** Commit a checkpoint.
*/
int sqlitepager_ckpt_commit(Pager *pPager){
- if( pPager->ckptOpen ){
+ if( pPager->ckptInUse ){
PgHdr *pPg;
- sqliteOsClose(&pPager->cpfd);
- pPager->ckptOpen = 0;
+ sqliteOsTruncate(&pPager->cpfd, 0);
+ pPager->ckptInUse = 0;
sqliteFree( pPager->aInCkpt );
pPager->aInCkpt = 0;
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
*/
int sqlitepager_ckpt_rollback(Pager *pPager){
int rc;
- if( pPager->ckptOpen ){
+ if( pPager->ckptInUse ){
rc = pager_ckpt_playback(pPager);
sqlitepager_ckpt_commit(pPager);
}else{
# This file implements regression tests for SQLite library. The
# 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]
source $testdir/tester.tcl
{CASE i1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' END} {{}}
test_expr expr-case.11 {i1=null} \
{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'
WHEN i1 < 10 THEN 'medium'
WHEN i1 < 15 THEN 'high' ELSE 'error' END} medium