From: drh Date: Fri, 30 Mar 2007 16:01:55 +0000 (+0000) Subject: Always enable exclusive access mode for TEMP databases. This cannot be X-Git-Tag: version-3.6.10~2404 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=369339db34ac8594e654fd7370a62865c6a5f4da;p=thirdparty%2Fsqlite.git Always enable exclusive access mode for TEMP databases. This cannot be changed. The locking_mode pragma has not effect on the TEMP database. (CVS 3766) FossilOrigin-Name: 04d3b9098ed06d5be24253edde50ea61b4641df8 --- diff --git a/manifest b/manifest index 41abd6ef7e..d5c20eadf8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Coverage\simprovements\sfor\swhere.c.\s(CVS\s3765) -D 2007-03-30T14:56:35 +C Always\senable\sexclusive\saccess\smode\sfor\sTEMP\sdatabases.\s\sThis\scannot\sbe\nchanged.\s\sThe\slocking_mode\spragma\shas\snot\seffect\son\sthe\sTEMP\sdatabase.\s(CVS\s3766) +D 2007-03-30T16:01:55 F Makefile.in 2f2c3bf69faf0ae7b8e8af4f94f1986849034530 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -86,7 +86,7 @@ F src/os_unix.c 4291be23eec73d1ec04010ae702364b781b5f773 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e F src/os_win.c c3a8403ea28bbb89d6507fa984c5919bd3fe7539 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c 08e997b91657fd82dc19c1d06f965eeaaa2de7f5 +F src/pager.c ae0b1e1ae9b3f7fc725b6c92cf10f2a582006e44 F src/pager.h e79a24cf200b8771366217f5bca414f5b7823f42 F src/parse.y 207ab04273ae13aa4a729b96008d294d5f334ab3 F src/pragma.c 8fd4f98822007a8d2c34e235ad3c35f1d77b3e51 @@ -200,9 +200,9 @@ F test/distinctagg.test 2b89d1c5220d966a30ba4b40430338669301188b F test/enc.test 7a03417a1051fe8bc6c7641cf4c8c3f7e0066d52 F test/enc2.test 45710bacfa9df29720bc84c067dfdf8c8ddfb797 F test/enc3.test 890508efff6677345e93bf2a8adb0489b30df030 -F test/exclusive.test 83871f52ab1015dc1bfbf86b96e2ece29094d129 +F test/exclusive.test 6748eb0539c4652d596971584c50200729e57dbe F test/exclusive2.test 187993598a83257f4a1126a40d89144c01965500 -F test/exclusive3.test f2d1d0ab2a83bb8326dea516e1c99b833f44d8f8 +F test/exclusive3.test 0e49c35b7e7cb8e7280b4ce3f0359d30b207d2ff F test/expr.test c78843f730ccbe973d0c2ad1c99978f936893131 F test/fkey1.test 153004438d51e6769fb1ce165f6313972d6263ce F test/format4.test bf3bed3b13c63abfb3cfec232597a319a31d0bcc @@ -447,7 +447,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 7e0aa964129612e2bad6fa45139d124f19cacd48 -R b56988b2a4f41fbf2d60eaa052f1ee98 -U danielk1977 -Z fce1180f998fc1408b89d9fcea97a6fe +P df64894bacd8023cf3c5939f062c8463ff5cdc04 +R 46ff3e411333d7c07ca010df4bca596d +U drh +Z 515593da6a50233962143dfb23c8bb25 diff --git a/manifest.uuid b/manifest.uuid index 9ba3d78945..d851b0fd95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df64894bacd8023cf3c5939f062c8463ff5cdc04 \ No newline at end of file +04d3b9098ed06d5be24253edde50ea61b4641df8 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index dc681a8dee..927a5b5e58 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.308 2007/03/30 14:46:01 drh Exp $ +** @(#) $Id: pager.c,v 1.309 2007/03/30 16:01:55 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -85,21 +85,24 @@ ** PAGER_SYNCED The pager moves to this state from PAGER_EXCLUSIVE ** after all dirty pages have been written to the ** database file and the file has been synced to -** disk. All that remains to do is to remove the -** journal file and the transaction will be -** committed. +** disk. All that remains to do is to remove or +** truncate the journal file and the transaction +** will be committed. ** ** The page cache comes up in PAGER_UNLOCK. The first time a ** sqlite3PagerGet() occurs, the state transitions to PAGER_SHARED. ** After all pages have been released using sqlite_page_unref(), ** the state transitions back to PAGER_UNLOCK. The first time ** that sqlite3PagerWrite() is called, the state transitions to -** PAGER_RESERVED. (Note that sqlite_page_write() can only be +** PAGER_RESERVED. (Note that sqlite3PagerWrite() can only be ** called on an outstanding page which means that the pager must ** be in PAGER_SHARED before it transitions to PAGER_RESERVED.) -** The transition to PAGER_EXCLUSIVE occurs when before any changes -** are made to the database file. After an sqlite3PagerRollback() -** or sqlite_pager_commit(), the state goes back to PAGER_SHARED. +** PAGER_RESERVED means that there is an open rollback journal. +** The transition to PAGER_EXCLUSIVE occurs before any changes +** are made to the database file, though writes to the rollback +** journal occurs with just PAGER_RESERVED. After an sqlite3PagerRollback() +** or sqlite3PagerCommitPhaseTwo(), the state can go back to PAGER_SHARED, +** or it can stay at PAGER_EXCLUSIVE if we are in exclusive access mode. */ #define PAGER_UNLOCK 0 #define PAGER_SHARED 1 /* same as SHARED_LOCK */ @@ -1781,6 +1784,10 @@ int sqlite3PagerOpen( /* pPager->state = PAGER_UNLOCK; */ /* pPager->errMask = 0; */ pPager->tempFile = tempFile; + assert( tempFile==PAGER_LOCKINGMODE_NORMAL + || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); + pPager->exclusiveMode = tempFile; pPager->memDb = memDb; pPager->readOnly = readOnly; /* pPager->needSync = 0; */ @@ -3192,12 +3199,13 @@ int sqlite3PagerBegin(DbPage *pPg, int exFlag){ */ assert( pPager->nRec==0 ); assert( pPager->origDbSize==0 ); + assert( pPager->aInJournal==0 ); sqlite3PagerPagecount(pPager); - pPager->origDbSize = pPager->dbSize; pPager->aInJournal = sqliteMalloc( pPager->dbSize/8 + 1 ); if( !pPager->aInJournal ){ rc = SQLITE_NOMEM; }else{ + pPager->origDbSize = pPager->dbSize; rc = writeJournalHdr(pPager); } } @@ -4173,7 +4181,12 @@ void *sqlite3PagerGetExtra(DbPage *pPg){ ** locking-mode. */ int sqlite3PagerLockingMode(Pager *pPager, int eMode){ - if( eMode>=0 ){ + assert( eMode==PAGER_LOCKINGMODE_QUERY + || eMode==PAGER_LOCKINGMODE_NORMAL + || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); + assert( PAGER_LOCKINGMODE_QUERY<0 ); + assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); + if( eMode>=0 && !pPager->tempFile ){ pPager->exclusiveMode = eMode; } return (int)pPager->exclusiveMode; diff --git a/test/exclusive.test b/test/exclusive.test index aff4e8313d..4f92dcbfde 100644 --- a/test/exclusive.test +++ b/test/exclusive.test @@ -12,7 +12,7 @@ # of these tests is exclusive access mode (i.e. the thing activated by # "PRAGMA locking_mode = EXCLUSIVE"). # -# $Id: exclusive.test,v 1.3 2007/03/26 10:27:19 danielk1977 Exp $ +# $Id: exclusive.test,v 1.4 2007/03/30 16:01:55 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -36,8 +36,9 @@ do_test exclusive-1.0 { execsql { pragma locking_mode; pragma main.locking_mode; + pragma temp.locking_mode; } -} {normal normal} +} {normal normal exclusive} do_test exclusive-1.1 { execsql { pragma locking_mode = exclusive; @@ -47,8 +48,9 @@ do_test exclusive-1.2 { execsql { pragma locking_mode; pragma main.locking_mode; + pragma temp.locking_mode; } -} {exclusive exclusive} +} {exclusive exclusive exclusive} do_test exclusive-1.3 { execsql { pragma locking_mode = normal; @@ -58,8 +60,9 @@ do_test exclusive-1.4 { execsql { pragma locking_mode; pragma main.locking_mode; + pragma temp.locking_mode; } -} {normal normal} +} {normal normal exclusive} do_test exclusive-1.5 { execsql { pragma locking_mode = invalid; @@ -69,8 +72,9 @@ do_test exclusive-1.6 { execsql { pragma locking_mode; pragma main.locking_mode; + pragma temp.locking_mode; } -} {normal normal} +} {normal normal exclusive} do_test exclusive-1.7 { execsql { pragma locking_mode = exclusive; @@ -87,9 +91,10 @@ do_test exclusive-1.8 { } execsql { pragma main.locking_mode; + pragma temp.locking_mode; pragma aux.locking_mode; } -} {normal exclusive} +} {normal exclusive exclusive} do_test exclusive-1.9 { execsql { pragma locking_mode; @@ -121,21 +126,23 @@ do_test exclusive-1.12 { } execsql { pragma main.locking_mode; + pragma temp.locking_mode; pragma aux.locking_mode; pragma aux2.locking_mode; } -} {normal normal normal} +} {normal exclusive normal normal} do_test exclusive-1.13 { execsql { ATTACH 'test4.db' as aux3; } execsql { pragma main.locking_mode; + pragma temp.locking_mode; pragma aux.locking_mode; pragma aux2.locking_mode; pragma aux3.locking_mode; } -} {normal normal normal normal} +} {normal exclusive normal normal normal} do_test exclusive-1.99 { execsql { @@ -367,7 +374,14 @@ do_test exclusive-4.5 { # Tests exclusive-5.X - test that statement journals are truncated # instead of deleted when in exclusive access mode. # -#set sqlite_os_trace 1 + +# Close and reopen the database so that the temp database is no +# longer active. +# +db close +sqlite db test.db + + do_test exclusive-5.0 { execsql { CREATE TABLE abc(a UNIQUE, b UNIQUE, c UNIQUE); @@ -422,4 +436,3 @@ do_test exclusive-5.7 { } {1} finish_test - diff --git a/test/exclusive3.test b/test/exclusive3.test index f94e120341..941f61be69 100644 --- a/test/exclusive3.test +++ b/test/exclusive3.test @@ -1,4 +1,4 @@ -# 2001 September 15 +# 2007 March 26 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: @@ -9,10 +9,10 @@ # #*********************************************************************** # -# This file runs the tests in the file ioerr.test with auto-vacuum enabled -# databases. +# This file runs the tests in the file ioerr.test with +# exclusive access mode enabled. # -# $Id: exclusive3.test,v 1.2 2007/03/27 16:19:52 danielk1977 Exp $ +# $Id: exclusive3.test,v 1.3 2007/03/30 16:01:55 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -57,4 +57,3 @@ rename really_finish_test2 finish_test rename do_test "" rename really_do_test do_test finish_test -