diff --git a/manifest b/manifest index 048deaa0a7..ffb15ffc68 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,5 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -C Remove\sglobal\svariables\swhen\scompiled\swith\sSQLITE_OMIT_WSD -D 2010-06-03T12:09:52 +C Delay\sopening\sthe\ssub-journal\suntil\sSQLite\sactually\sneeds\sto\swrite\sdata\sto\sit. +D 2010-06-03T12:35:28 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -157,7 +154,7 @@ F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 665876d5eec7585226b0a1cf5e18098de2b2da19 F src/os_unix.c 8fa4eeb27c54f26e9ce01bead2fa117fadea1526 F src/os_win.c f815403c51a2adad30244374c801dd7fd2734567 -F src/pager.c 1eca1ede7d455a356524834f590546110c3b1a64 +F src/pager.c bd9647a741d1905a2a46cc79126ca2d720f33f5d F src/pager.h 76466c3a5af56943537f68b1f16567101a0cd1d0 F src/parse.y ace5c7a125d9f2a410e431ee3209034105045f7e F src/pcache.c ace8f6a5ecd4711cc66a1b23053be7109bd437cf @@ -598,7 +595,7 @@ F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/sqllimits1.test e90a0ed94452076f6a10209d378e06b5f75ef0a0 -F test/stmt.test ac97e59879fd3bd52ecd60ef4efb03ba16292829 +F test/stmt.test 7915bd3e8380b956c095f40f41a775a30716e649 F test/subquery.test b524f57c9574b2c0347045b4510ef795d4686796 F test/subselect.test d24fd8757daf97dafd2e889c73ea4c4272dcf4e4 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a @@ -606,7 +603,7 @@ F test/sync.test ded6b39d8d8ca3c0c5518516c6371b3316d3e3a3 F test/table.test 04ba066432430657712d167ebf28080fe878d305 F test/tableapi.test 7262a8cbaa9965d429f1cbd2747edc185fa56516 F test/tclsqlite.test 013133fa83128569c6fb8a7a48dc7c4507e6ff1c -F test/tempdb.test 1bf52da28a9c24e29717362a87722dff08feb72b +F test/tempdb.test a1182f2b9a8bd7b208ba9797f9e9a2bcdd811ae8 F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05 F test/tester.tcl 7cc3517ad2158c5b72b90684116a400404a3b66f @@ -770,7 +767,7 @@ F test/walbak.test e7650a26eb4b8abeca9b145b1af1e63026dde432 F test/walcksum.test 4efa8fb88c32bed8288ea4385a9cc113a5c8f0bf F test/walcrash.test f6d5fb2bb108876f04848720a488065d9deef69f F test/walcrash2.test 14585ad1a2c85da2de721caa3b4deeea55213008 -F test/walfault.test 058c9e2829fc5e3e01ae4984980a6da9af15368a +F test/walfault.test 0cd672eb059d98ef07714f64371fd7d4d1ebb642 F test/walhook.test 67e675127f4acb72f061a12667ce6e5460b06b78 F test/walmode.test 6ca9d710cc9f6545b913abcded6d6b0b15641048 F test/walslow.test d21625e2e99e11c032ce949e8a94661576548933 @@ -818,14 +815,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P ac0de2f39e948f3b00e96eebf56ebee70472020d -R 2471c301986d2b1b4e5a7fb5b19f3e34 -U drh -Z ad4e60ef77cb53f3a930937718481e1b ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQFMB5uToxKgR168RlERAtsiAJ0VpOsSRORCjjWUhDUeQ1w5dXjvDwCfU7hM -XwNgzrRAo3TBeSKSA2lj8rY= -=avrR ------END PGP SIGNATURE----- +P dd10a547f10364058025c48b28d8fd240bf46aff +R 5a3453abb346b5d651cf46a168ba79fc +U dan +Z ad1006f09932fe90a8f3d7feb00d5c69 diff --git a/manifest.uuid b/manifest.uuid index 51a8dde607..4bb17eab32 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd10a547f10364058025c48b28d8fd240bf46aff \ No newline at end of file +c43deb33ae5f191ea2e054181759beeeb9ea71bf \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3dbc01f2a9..95930c576e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3407,6 +3407,26 @@ static int pager_write_pagelist(PgHdr *pList){ return rc; } +/* +** Ensure that the sub-journal file is open. If it is already open, this +** function is a no-op. +** +** SQLITE_OK is returned if everything goes according to plan. An +** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() +** fails. +*/ +static int openSubJournal(Pager *pPager){ + int rc = SQLITE_OK; + if( !isOpen(pPager->sjfd) ){ + if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ + sqlite3MemJournalOpen(pPager->sjfd); + }else{ + rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL); + } + } + return rc; +} + /* ** Append a record of the current state of page pPg to the sub-journal. ** It is the callers responsibility to use subjRequiresPage() to check @@ -3423,21 +3443,31 @@ static int pager_write_pagelist(PgHdr *pList){ static int subjournalPage(PgHdr *pPg){ int rc = SQLITE_OK; Pager *pPager = pPg->pPager; - if( isOpen(pPager->sjfd) ){ - void *pData = pPg->pData; - i64 offset = pPager->nSubRec*(4+pPager->pageSize); - char *pData2; + if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ - CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); - PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); - + /* Open the sub-journal, if it has not already been opened */ + assert( pPager->useJournal ); + assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); + assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); assert( pagerUseWal(pPager) || pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); - rc = write32bits(pPager->sjfd, offset, pPg->pgno); + rc = openSubJournal(pPager); + + /* If the sub-journal was opened successfully (or was already open), + ** write the journal record into the file. */ if( rc==SQLITE_OK ){ - rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + void *pData = pPg->pData; + i64 offset = pPager->nSubRec*(4+pPager->pageSize); + char *pData2; + + CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); + PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); + rc = write32bits(pPager->sjfd, offset, pPg->pgno); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); + } } } if( rc==SQLITE_OK ){ @@ -4400,27 +4430,6 @@ void sqlite3PagerUnref(DbPage *pPg){ } } -/* -** If the main journal file has already been opened, ensure that the -** sub-journal file is open too. If the main journal is not open, -** this function is a no-op. -** -** SQLITE_OK is returned if everything goes according to plan. -** An SQLITE_IOERR_XXX error code is returned if a call to -** sqlite3OsOpen() fails. -*/ -static int openSubJournal(Pager *pPager){ - int rc = SQLITE_OK; - if( (pagerUseWal(pPager) || isOpen(pPager->jfd)) && !isOpen(pPager->sjfd) ){ - if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ - sqlite3MemJournalOpen(pPager->sjfd); - }else{ - rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL); - } - } - return rc; -} - /* ** This function is called at the start of every write transaction. ** There must already be a RESERVED or EXCLUSIVE lock on the database @@ -4503,9 +4512,6 @@ static int pager_open_journal(Pager *pPager){ pPager->journalHdr = 0; rc = writeJournalHdr(pPager); } - if( rc==SQLITE_OK && pPager->nSavepoint ){ - rc = openSubJournal(pPager); - } if( rc!=SQLITE_OK ){ sqlite3BitvecDestroy(pPager->pInJournal); @@ -5469,9 +5475,6 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ pPager->nSavepoint = ii+1; } assert( pPager->nSavepoint==nSavepoint ); - - /* Open the sub-journal, if it is not already opened. */ - rc = openSubJournal(pPager); assertTruncateConstraint(pPager); } diff --git a/test/stmt.test b/test/stmt.test index 45e9ac5371..482a7d4a3a 100644 --- a/test/stmt.test +++ b/test/stmt.test @@ -50,12 +50,16 @@ do_test stmt-1.5 { execsql COMMIT set sqlite_open_file_count } {1} -do_test stmt-1.6 { +do_test stmt-1.6.1 { execsql { BEGIN; INSERT INTO t1 SELECT a+2, b+2 FROM t1; } set sqlite_open_file_count +} {2} +do_test stmt-1.6.2 { + execsql { INSERT INTO t1 SELECT a+4, b+4 FROM t1 } + set sqlite_open_file_count } {3} do_test stmt-1.7 { execsql COMMIT @@ -73,13 +77,20 @@ proc filecount {testname sql expected} { }] $expected] } -filecount stmt-2.1 { INSERT INTO t1 VALUES(5, 5) } 2 -filecount stmt-2.2 { REPLACE INTO t1 VALUES(5, 5) } 2 -filecount stmt-2.3 { INSERT INTO t1 SELECT 5, 5 } 3 +filecount stmt-2.1 { INSERT INTO t1 VALUES(9, 9) } 2 +filecount stmt-2.2 { REPLACE INTO t1 VALUES(9, 9) } 2 +filecount stmt-2.3 { INSERT INTO t1 SELECT 9, 9 } 2 +filecount stmt-2.4 { + INSERT INTO t1 SELECT 9, 9; + INSERT INTO t1 SELECT 10, 10; +} 3 -do_test stmt-2.4 { +do_test stmt-2.5 { execsql { CREATE INDEX i1 ON t1(b) } } {} -filecount stmt-2.5 { REPLACE INTO t1 VALUES(5, 5) } 3 +filecount stmt-2.6 { + REPLACE INTO t1 VALUES(5, 5); + REPLACE INTO t1 VALUES(5, 5); +} 3 finish_test diff --git a/test/tempdb.test b/test/tempdb.test index a8915cda18..6483ecab6e 100644 --- a/test/tempdb.test +++ b/test/tempdb.test @@ -74,6 +74,7 @@ do_test tempdb-2.2 { BEGIN; INSERT INTO t1 VALUES(1, 2, 3); INSERT INTO t1 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); INSERT INTO t2 SELECT * FROM t1; } catchsql { INSERT INTO t1 SELECT * FROM t2 } diff --git a/test/walfault.test b/test/walfault.test index edb78358e7..28be17e52d 100644 --- a/test/walfault.test +++ b/test/walfault.test @@ -27,8 +27,7 @@ ifcapable !wal {finish_test ; return } # statement immediately after creating a new database. # do_test walfault-1-pre-1 { - db close - file delete -force test.db test.db-wal test.db-journal + faultsim_delete_and_reopen faultsim_save_and_close } {} do_faultsim_test walfault-1 -prep { @@ -109,7 +108,6 @@ do_test walfault-3-pre-1 { db close faultsim_save_and_close } {} - do_faultsim_test walfault-3 -prep { faultsim_restore_and_reopen } -body { @@ -121,7 +119,9 @@ do_faultsim_test walfault-3 -prep { faultsim_test_result {0 {}} } -file delete -force test.db test.db-wal test.db-journal +#-------------------------------------------------------------------------- +# +faultsim_delete_and_reopen faultsim_save_and_close do_faultsim_test walfault-4 -prep { faultsim_restore_and_reopen @@ -138,10 +138,10 @@ do_faultsim_test walfault-4 -prep { faultsim_integrity_check } +#-------------------------------------------------------------------------- +# do_test walfault-5-pre-1 { - catch { db close } - file delete -force test.db test.db-wal test.db-journal - sqlite3 db test.db + faultsim_delete_and_reopen execsql { PRAGMA page_size = 512; PRAGMA journal_mode = WAL; @@ -179,11 +179,10 @@ do_faultsim_test walfault-5 -faults shmerr* -prep { faultsim_integrity_check } - +#-------------------------------------------------------------------------- +# do_test walfault-6-pre-1 { - catch { db close } - file delete -force test.db test.db-wal test.db-journal - sqlite3 db test.db + faultsim_delete_and_reopen execsql { PRAGMA page_size = 512; PRAGMA journal_mode = WAL; @@ -221,6 +220,8 @@ do_faultsim_test walfault-6 -faults shmerr* -prep { if {$n != 16384 && $n != 0} { error "Incorrect number of rows: $n" } } +#-------------------------------------------------------------------------- +# do_test walfault-7-pre-1 { faultsim_delete_and_reopen execsql { @@ -246,6 +247,8 @@ do_faultsim_test walfault-7 -prep { if {$n != 4 && $n != 0} { error "Incorrect number of rows: $n" } } +#-------------------------------------------------------------------------- +# do_test walfault-8-pre-1 { faultsim_delete_and_reopen execsql { @@ -279,6 +282,8 @@ do_faultsim_test walfault-8 -prep { if {$n != 1} { error "Incorrect number of rows: $n" } } +#-------------------------------------------------------------------------- +# do_test walfault-9-pre-1 { faultsim_delete_and_reopen execsql { @@ -328,7 +333,7 @@ do_faultsim_test walfault-9 -prep { # # This test case tests the outcome of an IO error in step 2. # -proc shmfault_vfs_cb_6 {method args} { +proc walfault_10_vfs_cb {method args} { switch -- $::shm_state { 0 { return SQLITE_OK } 1 { @@ -347,10 +352,10 @@ proc shmfault_vfs_cb_6 {method args} { } return SQLITE_OK } -do_test walfault-shm-6.1 { +do_test walfault-10.1 { set ::shm_state 0 testvfs tvfs - tvfs script shmfault_vfs_cb_6 + tvfs script walfault_10_vfs_cb sqlite3 db test.db -vfs tvfs sqlite3 db2 test.db -vfs tvfs @@ -362,7 +367,7 @@ do_test walfault-shm-6.1 { INSERT INTO t1 VALUES(randomblob(900)); } } {wal 0} -do_test walfault-shm-6.2 { +do_test walfault-10.2 { execsql { PRAGMA wal_autocheckpoint = 0; BEGIN; @@ -383,7 +388,7 @@ do_test walfault-shm-6.2 { COMMIT; } db2 } {0} -do_test walfault-shm-6.3 { +do_test walfault-10.3 { set ::shm_state 1 catchsql { PRAGMA wal_checkpoint } db2 } {1 {disk I/O error}}