]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Once it is opened, leave the checkpoint journal file open for the
authordrh <drh@noemail.net>
Thu, 30 May 2002 12:27:03 +0000 (12:27 +0000)
committerdrh <drh@noemail.net>
Thu, 30 May 2002 12:27:03 +0000 (12:27 +0000)
duration of a transaction, rather than closing it and reopening it
for each statement.  (Ticket #53) (CVS 599)

FossilOrigin-Name: 7a24336d50e72006b2cc0e4feb292b946e79d5f3

manifest
manifest.uuid
src/pager.c
test/expr.test

index be60bc683a1b36d4d08991d8102854db1859ffd6..63b68ba4be8ae109022cedac1f767fa1288e0d7a 100644 (file)
--- 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
index 9ce633c340507b5c16653d6ce11ce9dffbf79cca..3ecef882a713eedb164b3af30cafb7d57f6818e8 100644 (file)
@@ -1 +1 @@
-4debc8db929fdc201759ba211acdeadc4e30e8af
\ No newline at end of file
+7a24336d50e72006b2cc0e4feb292b946e79d5f3
\ No newline at end of file
index 79bb1e90b7b75095547c7f01383664c27fb91164..37d458b44883e1c40111b0c5b355228f7bf8f96f 100644 (file)
@@ -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->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);
@@ -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{
index 799fd775b797cc52205200229dc3bada4aaac4d2..12d5a64c791ae9f00fdf50394a0686b242854adc 100644 (file)
@@ -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