diff --git a/manifest b/manifest index be60bc683a..63b68ba4be 100644 --- a/manifest +++ b/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) -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 @@ -32,7 +32,7 @@ F src/main.c 6e53c49a390fabd5fecce9e3b128c61c85208000 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 @@ -63,7 +63,7 @@ F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895 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 @@ -135,7 +135,7 @@ F www/speed.tcl da8afcc1d3ccc5696cfb388a68982bc3d9f7f00f 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 diff --git a/manifest.uuid b/manifest.uuid index 9ce633c340..3ecef882a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4debc8db929fdc201759ba211acdeadc4e30e8af \ No newline at end of file +7a24336d50e72006b2cc0e4feb292b946e79d5f3 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 79bb1e90b7..37d458b448 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** 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" @@ -114,6 +114,7 @@ struct Pager { 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 */ @@ -243,6 +244,10 @@ static int pager_unwritelock(Pager *pPager){ PgHdr *pPg; if( pPager->stateckptOpen ){ + sqliteOsClose(&pPager->cpfd); + pPager->ckptOpen = 0; + } sqliteOsClose(&pPager->jfd); pPager->journalOpen = 0; sqliteOsDelete(pPager->zJournal); @@ -391,7 +396,7 @@ static int pager_ckpt_playback(Pager *pPager){ /* 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 ){ @@ -528,6 +533,7 @@ int sqlitepager_open( pPager->fd = fd; pPager->journalOpen = 0; pPager->ckptOpen = 0; + pPager->ckptInUse = 0; pPager->nRef = 0; pPager->dbSize = -1; pPager->ckptSize = 0; @@ -614,9 +620,11 @@ int sqlitepager_close(Pager *pPager){ } 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; } @@ -1090,7 +1098,7 @@ int sqlitepager_write(void *pData){ ** 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; } @@ -1127,7 +1135,7 @@ int sqlitepager_write(void *pData){ 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; } @@ -1136,7 +1144,7 @@ int sqlitepager_write(void *pData){ /* 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 ){ @@ -1206,12 +1214,12 @@ void sqlitepager_dont_rollback(void *pData){ 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); @@ -1345,7 +1353,7 @@ int sqlitepager_ckpt_begin(Pager *pPager){ 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); @@ -1354,9 +1362,12 @@ int sqlitepager_ckpt_begin(Pager *pPager){ 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: @@ -1371,10 +1382,10 @@ 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){ @@ -1389,7 +1400,7 @@ int sqlitepager_ckpt_commit(Pager *pPager){ */ int sqlitepager_ckpt_rollback(Pager *pPager){ int rc; - if( pPager->ckptOpen ){ + if( pPager->ckptInUse ){ rc = pager_ckpt_playback(pPager); sqlitepager_ckpt_commit(pPager); }else{ diff --git a/test/expr.test b/test/expr.test index 799fd775b7..12d5a64c79 100644 --- a/test/expr.test +++ b/test/expr.test @@ -11,7 +11,7 @@ # 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 @@ -354,7 +354,9 @@ test_expr expr-case.10 {i1=3} \ {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