mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-10 01:02:56 +03:00
Do create, open, or initialize the rollback journal until something actually
needs to be written into the journal. That way, expensive filesystem operations are avoided if the transaction ends up being a no-op. FossilOrigin-Name: b78e58ae1570ab4d66a69db445a752c6456038a0
This commit is contained in:
28
manifest
28
manifest
@@ -1,5 +1,8 @@
|
|||||||
C Rewrite\sa\scouple\sof\squeries\sused\sinternally\sby\sFTS3\sto\stake\sadvantage\sof\sthe\s"SELECT\smax(x)\sFROM\s..."\soptimization.
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
D 2010-03-19T06:59:19
|
Hash: SHA1
|
||||||
|
|
||||||
|
C Do\screate,\sopen,\sor\sinitialize\sthe\srollback\sjournal\suntil\ssomething\sactually\nneeds\sto\sbe\swritten\sinto\sthe\sjournal.\s\sThat\sway,\sexpensive\sfilesystem\noperations\sare\savoided\sif\sthe\stransaction\sends\sup\sbeing\sa\sno-op.
|
||||||
|
D 2010-03-19T15:48:14
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
|
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@@ -152,7 +155,7 @@ F src/os_common.h 240c88b163b02c21a9f21f87d49678a0aa21ff30
|
|||||||
F src/os_os2.c 75a8c7b9a00a2cf1a65f9fa4afbc27d46634bb2f
|
F src/os_os2.c 75a8c7b9a00a2cf1a65f9fa4afbc27d46634bb2f
|
||||||
F src/os_unix.c 148d2f625db3727250c0b880481ae7630b6d0eb0
|
F src/os_unix.c 148d2f625db3727250c0b880481ae7630b6d0eb0
|
||||||
F src/os_win.c 1c7453c2df4dab26d90ff6f91272aea18bcf7053
|
F src/os_win.c 1c7453c2df4dab26d90ff6f91272aea18bcf7053
|
||||||
F src/pager.c db7a3988cd5958011c3bce4ed1b788c40107628a
|
F src/pager.c 8e5cefa30e46da6824cb7c6f092b3894b4c3b7bf
|
||||||
F src/pager.h ef8a2cf10084f60ab45ee2dfded8bf8b0c655ddf
|
F src/pager.h ef8a2cf10084f60ab45ee2dfded8bf8b0c655ddf
|
||||||
F src/parse.y ace5c7a125d9f2a410e431ee3209034105045f7e
|
F src/parse.y ace5c7a125d9f2a410e431ee3209034105045f7e
|
||||||
F src/pcache.c 4956b41d6ba913f7a8a56fbf32be78caed0e45c2
|
F src/pcache.c 4956b41d6ba913f7a8a56fbf32be78caed0e45c2
|
||||||
@@ -457,7 +460,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
|
|||||||
F test/join5.test 86675fc2919269aa923c84dd00ee4249b97990fe
|
F test/join5.test 86675fc2919269aa923c84dd00ee4249b97990fe
|
||||||
F test/join6.test bf82cf3f979e9eade83ad0d056a66c5ed71d1901
|
F test/join6.test bf82cf3f979e9eade83ad0d056a66c5ed71d1901
|
||||||
F test/journal1.test 36f2d1bb9bf03f790f43fbdb439e44c0657fab19
|
F test/journal1.test 36f2d1bb9bf03f790f43fbdb439e44c0657fab19
|
||||||
F test/jrnlmode.test a765844f22b3f6d72d78a68d5decd26c64bb859c
|
F test/jrnlmode.test a7407c0f193696f0ef303c663916c89e3bc4605d
|
||||||
F test/jrnlmode2.test fe79ea1f0375c926b8de0362ddf94f34a64135fd
|
F test/jrnlmode2.test fe79ea1f0375c926b8de0362ddf94f34a64135fd
|
||||||
F test/jrnlmode3.test cfcdb12b90e640a23b92785a002d96c0624c8710
|
F test/jrnlmode3.test cfcdb12b90e640a23b92785a002d96c0624c8710
|
||||||
F test/keyword1.test a2400977a2e4fde43bf33754c2929fda34dbca05
|
F test/keyword1.test a2400977a2e4fde43bf33754c2929fda34dbca05
|
||||||
@@ -507,7 +510,7 @@ F test/memsubsys2.test 72a731225997ad5e8df89fdbeae9224616b6aecc
|
|||||||
F test/minmax.test 722d80816f7e096bf2c04f4111f1a6c1ba65453d
|
F test/minmax.test 722d80816f7e096bf2c04f4111f1a6c1ba65453d
|
||||||
F test/minmax2.test 33504c01a03bd99226144e4b03f7631a274d66e0
|
F test/minmax2.test 33504c01a03bd99226144e4b03f7631a274d66e0
|
||||||
F test/minmax3.test a38686c33b07d595e98a2fc6d3aa84a5e886a972
|
F test/minmax3.test a38686c33b07d595e98a2fc6d3aa84a5e886a972
|
||||||
F test/misc1.test 1b89c02c4a33b49dee4cd1d20d161aaaba719075
|
F test/misc1.test e56baf44656dd68d6475a4b44521045a60241e9b
|
||||||
F test/misc2.test a628db7b03e18973e5d446c67696b03de718c9fd
|
F test/misc2.test a628db7b03e18973e5d446c67696b03de718c9fd
|
||||||
F test/misc3.test 72c5dc87a78e7865c5ec7a969fc572913dbe96b6
|
F test/misc3.test 72c5dc87a78e7865c5ec7a969fc572913dbe96b6
|
||||||
F test/misc4.test 91e8ed25c092c2bb4e0bb01864631e2930f8d7de
|
F test/misc4.test 91e8ed25c092c2bb4e0bb01864631e2930f8d7de
|
||||||
@@ -793,7 +796,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 39b34ac4a7bd06144b3630c0ad71bad0615418b6
|
P b7e42ae77443b33e0ab83265064830594094dc7c
|
||||||
R 0beeb22a2bd626a841f0cfea3315c725
|
R dfec378b8748bf5ce92e741ebb2a5676
|
||||||
U dan
|
U drh
|
||||||
Z 78efa9b25fddb1d945403b19c00fb61f
|
Z f8af9d6e06b574d3c55a4284484dcb07
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||||
|
|
||||||
|
iD8DBQFLo5zBoxKgR168RlERAsHsAJ9MbPKPBalfwi46+MveEw5XQfUkFACeJa58
|
||||||
|
S6m/QgLe0r+Ynag8entdHnE=
|
||||||
|
=P1LI
|
||||||
|
-----END PGP SIGNATURE-----
|
||||||
|
@@ -1 +1 @@
|
|||||||
b7e42ae77443b33e0ab83265064830594094dc7c
|
b78e58ae1570ab4d66a69db445a752c6456038a0
|
34
src/pager.c
34
src/pager.c
@@ -1315,11 +1315,11 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
|
|||||||
sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
|
sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sqlite3PcacheCleanAll(pPager->pPCache);
|
|
||||||
sqlite3BitvecDestroy(pPager->pInJournal);
|
sqlite3BitvecDestroy(pPager->pInJournal);
|
||||||
pPager->pInJournal = 0;
|
pPager->pInJournal = 0;
|
||||||
pPager->nRec = 0;
|
pPager->nRec = 0;
|
||||||
}
|
}
|
||||||
|
sqlite3PcacheCleanAll(pPager->pPCache);
|
||||||
|
|
||||||
if( !pPager->exclusiveMode ){
|
if( !pPager->exclusiveMode ){
|
||||||
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
|
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
|
||||||
@@ -4106,12 +4106,11 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the required locks were successfully obtained, open the journal
|
/* No need to open the journal file at this time. It will be
|
||||||
** file and write the first journal-header to it.
|
** opened before it is written to. If we defer opening the journal,
|
||||||
|
** we might save the work of creating a file if the transaction
|
||||||
|
** ends up being a no-op.
|
||||||
*/
|
*/
|
||||||
if( rc==SQLITE_OK && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
|
|
||||||
rc = pager_open_journal(pPager);
|
|
||||||
}
|
|
||||||
}else if( isOpen(pPager->jfd) && pPager->journalOff==0 ){
|
}else if( isOpen(pPager->jfd) && pPager->journalOff==0 ){
|
||||||
/* This happens when the pager was in exclusive-access mode the last
|
/* This happens when the pager was in exclusive-access mode the last
|
||||||
** time a (read or write) transaction was successfully concluded
|
** time a (read or write) transaction was successfully concluded
|
||||||
@@ -4126,7 +4125,6 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
|
|||||||
}
|
}
|
||||||
|
|
||||||
PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
|
PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
|
||||||
assert( !isOpen(pPager->jfd) || pPager->journalOff>0 || rc!=SQLITE_OK );
|
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
assert( !pPager->dbModified );
|
assert( !pPager->dbModified );
|
||||||
/* Ignore any IO error that occurs within pager_end_transaction(). The
|
/* Ignore any IO error that occurs within pager_end_transaction(). The
|
||||||
@@ -4182,11 +4180,11 @@ static int pager_write(PgHdr *pPg){
|
|||||||
** or both.
|
** or both.
|
||||||
**
|
**
|
||||||
** Higher level routines should have already started a transaction,
|
** Higher level routines should have already started a transaction,
|
||||||
** which means they have acquired the necessary locks and opened
|
** which means they have acquired the necessary locks but the rollback
|
||||||
** a rollback journal. Double-check to makes sure this is the case.
|
** journal might not yet be open.
|
||||||
*/
|
*/
|
||||||
rc = sqlite3PagerBegin(pPager, 0, pPager->subjInMemory);
|
rc = sqlite3PagerBegin(pPager, 0, pPager->subjInMemory);
|
||||||
if( NEVER(rc!=SQLITE_OK) ){
|
if( rc!=SQLITE_OK ){
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
|
if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
|
||||||
@@ -4921,11 +4919,6 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
|
|||||||
int ii; /* Iterator variable */
|
int ii; /* Iterator variable */
|
||||||
PagerSavepoint *aNew; /* New Pager.aSavepoint array */
|
PagerSavepoint *aNew; /* New Pager.aSavepoint array */
|
||||||
|
|
||||||
/* Either there is no active journal or the sub-journal is open or
|
|
||||||
** the journal is always stored in memory */
|
|
||||||
assert( pPager->nSavepoint==0 || isOpen(pPager->sjfd) ||
|
|
||||||
pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
|
|
||||||
|
|
||||||
/* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
|
/* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
|
||||||
** if the allocation fails. Otherwise, zero the new portion in case a
|
** if the allocation fails. Otherwise, zero the new portion in case a
|
||||||
** malloc failure occurs while populating it in the for(...) loop below.
|
** malloc failure occurs while populating it in the for(...) loop below.
|
||||||
@@ -4944,7 +4937,7 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
|
|||||||
for(ii=nCurrent; ii<nSavepoint; ii++){
|
for(ii=nCurrent; ii<nSavepoint; ii++){
|
||||||
assert( pPager->dbSizeValid );
|
assert( pPager->dbSizeValid );
|
||||||
aNew[ii].nOrig = pPager->dbSize;
|
aNew[ii].nOrig = pPager->dbSize;
|
||||||
if( isOpen(pPager->jfd) && ALWAYS(pPager->journalOff>0) ){
|
if( isOpen(pPager->jfd) && pPager->journalOff>0 ){
|
||||||
aNew[ii].iOffset = pPager->journalOff;
|
aNew[ii].iOffset = pPager->journalOff;
|
||||||
}else{
|
}else{
|
||||||
aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
|
aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
|
||||||
@@ -5337,6 +5330,15 @@ int sqlite3PagerJournalMode(Pager *pPager, int eMode){
|
|||||||
if( isOpen(pPager->jfd) ){
|
if( isOpen(pPager->jfd) ){
|
||||||
sqlite3OsClose(pPager->jfd);
|
sqlite3OsClose(pPager->jfd);
|
||||||
}
|
}
|
||||||
|
assert( (PAGER_JOURNALMODE_TRUNCATE & 1)==1 );
|
||||||
|
assert( (PAGER_JOURNALMODE_PERSIST & 1)==1 );
|
||||||
|
assert( (PAGER_JOURNALMODE_DELETE & 1)==0 );
|
||||||
|
assert( (PAGER_JOURNALMODE_MEMORY & 1)==0 );
|
||||||
|
assert( (PAGER_JOURNALMODE_OFF & 1)==0 );
|
||||||
|
if( (pPager->journalMode & 1)==1 && (eMode & 1)==0
|
||||||
|
&& !pPager->exclusiveMode ){
|
||||||
|
sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
|
||||||
|
}
|
||||||
pPager->journalMode = (u8)eMode;
|
pPager->journalMode = (u8)eMode;
|
||||||
}
|
}
|
||||||
return (int)pPager->journalMode;
|
return (int)pPager->journalMode;
|
||||||
|
@@ -484,7 +484,7 @@ ifcapable pragma {
|
|||||||
INSERT INTO t4 VALUES(3, 4);
|
INSERT INTO t4 VALUES(3, 4);
|
||||||
}
|
}
|
||||||
file exists test.db-journal
|
file exists test.db-journal
|
||||||
} {1}
|
} {0}
|
||||||
do_test jrnlmode-6.7 {
|
do_test jrnlmode-6.7 {
|
||||||
execsql {
|
execsql {
|
||||||
COMMIT;
|
COMMIT;
|
||||||
@@ -493,11 +493,11 @@ ifcapable pragma {
|
|||||||
} {1 2 3 4}
|
} {1 2 3 4}
|
||||||
do_test jrnlmode-6.8 {
|
do_test jrnlmode-6.8 {
|
||||||
file exists test.db-journal
|
file exists test.db-journal
|
||||||
} {1}
|
} {0}
|
||||||
do_test jrnlmode-6.9 {
|
do_test jrnlmode-6.9 {
|
||||||
execsql {
|
execsql {
|
||||||
PRAGMA journal_mode = DELETE;
|
PRAGMA journal_mode = DELETE;
|
||||||
BEGIN IMMEDIATE; COMMIT;
|
BEGIN IMMEDIATE; INSERT INTO t4 VALUES(1,2); COMMIT;
|
||||||
}
|
}
|
||||||
file exists test.db-journal
|
file exists test.db-journal
|
||||||
} {0}
|
} {0}
|
||||||
|
@@ -481,8 +481,12 @@ do_test misc1-14.1 {
|
|||||||
execsql {BEGIN}
|
execsql {BEGIN}
|
||||||
file exists ./test.db-journal
|
file exists ./test.db-journal
|
||||||
} {0}
|
} {0}
|
||||||
do_test misc1-14.2 {
|
do_test misc1-14.2a {
|
||||||
execsql {UPDATE t1 SET a=0 WHERE 0}
|
execsql {UPDATE t1 SET a=a||'x' WHERE 0}
|
||||||
|
file exists ../test.db-journal
|
||||||
|
} {0}
|
||||||
|
do_test misc1-14.2b {
|
||||||
|
execsql {UPDATE t1 SET a=a||'y' WHERE 1}
|
||||||
file exists ../test.db-journal
|
file exists ../test.db-journal
|
||||||
} {1}
|
} {1}
|
||||||
do_test misc1-14.3 {
|
do_test misc1-14.3 {
|
||||||
|
Reference in New Issue
Block a user