diff --git a/manifest b/manifest index 495e715e66..3c10bc3c41 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\stwo\smore\soverzealous\sassert()\sstatements.\s(CVS\s6932) -D 2009-07-25T00:13:59 +C Add\sassert()\sstatements\sto\smore\stightly\sconstrain\sthe\sstate\sof\spager.c.\nRemove\sthe\sthree\spager*.test\sscripts\ssince\sthey\sviolate\sthe\sconstraints\nasserted\sabove\sby\smodifying\sthe\sstate\sof\sthe\ssystem\sin\sways\sthat\sit\scannot\nbe\smodified\sin\sa\slive\ssystem.\s(CVS\s6933) +D 2009-07-25T04:12:02 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in df9359da7a726ccb67a45db905c5447d5c00c6ef F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -147,7 +147,7 @@ F src/os_common.h 8c61457df58f1a4bd5f5adc3e90e01b37bf7afbc F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5 F src/os_unix.c cdb2a08b9ce4aa13b3f7b91d4dd60fb48be9f56a F src/os_win.c 725c38a524d168ce280446ad8761d731bc516405 -F src/pager.c c462bf6153c3c29da0ce723ac76c8fa76cbd6a9b +F src/pager.c e26d9c5d881435b83551a07cd7e38396518582bc F src/pager.h 11852d044c86cf5a9d6e34171fb0c4fcf1f6265f F src/parse.y bcd46d43fbd23a22b8c020a3eb1806b794794ed5 F src/pcache.c 1dae135b70a029f81ed66f6e9b5d0db91480d5d0 @@ -492,9 +492,6 @@ F test/notify2.test 195a467e021f74197be2c4fb02d6dee644b8d8db F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82 F test/null.test a8b09b8ed87852742343b33441a9240022108993 F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec -F test/pager.test 2d0abb66c8967ffac4558c0530b31c28706b5e64 -F test/pager2.test d4b7f6b70ff018b9995e622a32526b275f515042 -F test/pager3.test 2323bf27fd5bd887b580247e5bce500ceee994b4 F test/pageropt.test 3ee6578891baaca967f0bd349e4abfa736229e1a F test/pagesize.test 0d9ff3fedfce6e5ffe8fa7aca9b6d3433a2e843b F test/pcache.test eebc4420b37cb07733ae9b6e99c9da7c40dd6d58 @@ -741,7 +738,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746 -P 4a924b475aa0f7f2f69caed0adc2e60d29c47f21 -R 69d11ad1bb13603103594d88d70fe872 +P 788aa9dde9e76f67f22c07a904faf03e97e032c6 +R 4116dfd49c9a3af1d9a66719263f82dc U drh -Z e88cd7ec3be1e087035327e93db22707 +Z 51e179b626e42eaf6ce7a289270b3c19 diff --git a/manifest.uuid b/manifest.uuid index 487108c643..2b5cda4c4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -788aa9dde9e76f67f22c07a904faf03e97e032c6 \ No newline at end of file +3b6d370ed68eaf9636b26c7240a8b3a43d2edd70 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 28e100ff87..7998b6bd5f 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.619 2009/07/25 00:13:59 drh Exp $ +** @(#) $Id: pager.c,v 1.620 2009/07/25 04:12:02 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -2410,9 +2410,9 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize, int nReserve){ if( rc==SQLITE_OK ){ u16 pageSize = *pPageSize; assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); - if( pageSize && pageSize!=pPager->pageSize - && (pPager->memDb==0 || pPager->dbSize==0) + if( (pPager->memDb==0 || pPager->dbSize==0) && sqlite3PcacheRefCount(pPager->pPCache)==0 + && pageSize && pageSize!=pPager->pageSize ){ char *pNew = (char *)sqlite3PageMalloc(pageSize); if( !pNew ){ @@ -2988,7 +2988,6 @@ static int subjournalPage(PgHdr *pPg){ pPager->nSubRec++; assert( pPager->nSavepoint>0 ); rc = addToSavepointBitvecs(pPager, pPg->pgno); - testcase( rc!=SQLITE_OK ); } return rc; } @@ -3077,6 +3076,7 @@ static int pagerStress(void *p, PgHdr *pPg){ ** executed. */ if( rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg) ){ +assert(0); rc = subjournalPage(pPg); } @@ -3418,6 +3418,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ assert( pPager->useJournal ); assert( isOpen(pPager->fd) ); assert( !isOpen(pPager->jfd) ); + assert( pPager->state <= PAGER_SHARED ); *pExists = 0; rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); @@ -3446,13 +3447,9 @@ static int hasHotJournal(Pager *pPager, int *pExists){ if( rc==SQLITE_OK ){ if( nPage==0 ){ sqlite3BeginBenignMalloc(); - if( pPager->state>=PAGER_RESERVED - || sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){ + if( sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){ sqlite3OsDelete(pVfs, pPager->zJournal, 0); - assert( pPager->state>=PAGER_SHARED ); - if( pPager->state==PAGER_SHARED ){ - sqlite3OsUnlock(pPager->fd, SHARED_LOCK); - } + sqlite3OsUnlock(pPager->fd, SHARED_LOCK); } sqlite3EndBenignMalloc(); }else{ @@ -3574,12 +3571,15 @@ int sqlite3PagerSharedLock(Pager *pPager){ int rc = SQLITE_OK; /* Return code */ int isErrorReset = 0; /* True if recovering from error state */ - /* If this database has no outstanding page references and is in an - ** error-state, this is a chance to clear the error. Discard the - ** contents of the pager-cache and rollback any hot journal in the - ** file-system. + /* This routine is only called from b-tree and only when there are no + ** outstanding pages */ + assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); + + /* If this database is in an error-state, now is a chance to clear + ** the error. Discard the contents of the pager-cache and rollback + ** any hot journal in the file-system. */ - if( !MEMDB && sqlite3PcacheRefCount(pPager->pPCache)==0 && pPager->errCode ){ + if( !MEMDB && pPager->errCode ){ if( isOpen(pPager->jfd) || pPager->zJournal ){ isErrorReset = 1; } @@ -3615,6 +3615,7 @@ int sqlite3PagerSharedLock(Pager *pPager){ ** database file, then it either needs to be played back or deleted. */ if( !isErrorReset ){ + assert( pPager->state <= PAGER_SHARED ); rc = hasHotJournal(pPager, &isHotJournal); if( rc!=SQLITE_OK ){ goto failed; @@ -3891,7 +3892,7 @@ int sqlite3PagerAcquire( ** a bit in a bit vector. */ sqlite3BeginBenignMalloc(); - if( ALWAYS(pgno<=pPager->dbOrigSize) ){ + if( pgno<=pPager->dbOrigSize ){ TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); testcase( rc==SQLITE_NOMEM ); } @@ -4948,7 +4949,7 @@ int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ for(ii=nCurrent; iidbSizeValid ); aNew[ii].nOrig = pPager->dbSize; - if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ + if( isOpen(pPager->jfd) && ALWAYS(pPager->journalOff>0) ){ aNew[ii].iOffset = pPager->journalOff; }else{ aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); diff --git a/test/pager.test b/test/pager.test deleted file mode 100644 index 48a4830638..0000000000 --- a/test/pager.test +++ /dev/null @@ -1,582 +0,0 @@ -# 2001 September 15 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# This file implements regression tests for SQLite library. The -# focus of this script is page cache subsystem. -# -# $Id: pager.test,v 1.36 2009/07/24 16:32:01 drh Exp $ - - -set testdir [file dirname $argv0] -source $testdir/tester.tcl - -if {[info commands pager_open]!=""} { -db close - -# Basic sanity check. Open and close a pager. -# -do_test pager-1.0 { - catch {file delete -force ptf1.db} - catch {file delete -force ptf1.db-journal} - set v [catch { - set ::p1 [pager_open ptf1.db 10] - } msg] -} {0} -do_test pager-1.1 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0} -do_test pager-1.2 { - pager_pagecount $::p1 -} {0} -do_test pager-1.3 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0} -do_test pager-1.4 { - pager_close $::p1 -} {} - -# Try to write a few pages. -# -do_test pager-2.1 { - set v [catch { - set ::p1 [pager_open ptf1.db 10] - } msg] -} {0} -#do_test pager-2.2 { -# set v [catch { -# set ::g1 [page_get $::p1 0] -# } msg] -# lappend v $msg -#} {1 SQLITE_ERROR} -#do_test pager-2.3.1 { -# set ::gx [page_lookup $::p1 1] -#} {} -do_test pager-2.3.2 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0} -do_test pager-2.3.3 { - set v [catch { - set ::g1 [page_get $::p1 1] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager-2.3.3 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.3.4 { - set ::gx [page_lookup $::p1 1] - expr {$::gx!=""} -} {1} -do_test pager-2.3.5 { - page_unref $::gx - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.3.6 { - expr {$::g1==$::gx} -} {1} -do_test pager-2.3.7 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.4 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.5 { - pager_pagecount $::p1 -} {0} -do_test pager-2.6 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.7 { - page_number $::g1 -} {1} -do_test pager-2.8 { - page_read $::g1 -} {} -do_test pager-2.9 { - page_unref $::g1 -} {} - -# Update 24/03/2007: Even though the ref-count has dropped to zero, the -# pager-cache still contains some pages. Previously, it was always true -# that if there were no references to a pager it was empty. -do_test pager-2.10 { - pager_stats $::p1 -} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0} -do_test pager-2.11 { - set ::g1 [page_get $::p1 1] - expr {$::g1!=0} -} {1} -do_test pager-2.12 { - page_number $::g1 -} {1} -do_test pager-2.13 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 1 miss 1 ovfl 0} -do_test pager-2.14 { - set v [catch { - page_write $::g1 "Page-One" - } msg] - lappend v $msg -} {0 {}} -do_test pager-2.15 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 1 state 2 err 0 hit 1 miss 1 ovfl 0} -do_test pager-2.16 { - page_read $::g1 -} {Page-One} -do_test pager-2.17 { - set v [catch { - pager_commit $::p1 - } msg] - lappend v $msg -} {0 {}} -do_test pager-2.20 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size -1 state 1 err 0 hit 2 miss 1 ovfl 0} -do_test pager-2.19 { - pager_pagecount $::p1 -} {1} -do_test pager-2.21 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 1 state 1 err 0 hit 2 miss 1 ovfl 0} -do_test pager-2.22 { - page_unref $::g1 -} {} -do_test pager-2.23 { - pager_stats $::p1 -} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 2 miss 1 ovfl 0} -do_test pager-2.24 { - set v [catch { - page_get $::p1 1 - } ::g1] - if {$v} {lappend v $::g1} - set v -} {0} -do_test pager-2.25 { - page_read $::g1 -} {Page-One} -do_test pager-2.26 { - set v [catch { - page_write $::g1 {page-one} - } msg] - lappend v $msg -} {0 {}} -do_test pager-2.27 { - page_read $::g1 -} {page-one} -do_test pager-2.28 { - set v [catch { - pager_rollback $::p1 - } msg] - lappend v $msg -} {0 {}} -do_test pager-2.29 { - page_unref $::g1 - set ::g1 [page_get $::p1 1] - page_read $::g1 -} {Page-One} -do_test pager-2.99 { - page_unref $::g1 - pager_close $::p1 -} {} - -do_test pager-3.1 { - set v [catch { - set ::p1 [pager_open ptf1.db 15] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager-3.2 { - pager_pagecount $::p1 -} {1} -do_test pager-3.3 { - set v [catch { - set ::g(1) [page_get $::p1 1] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager-3.4 { - page_read $::g(1) -} {Page-One} -do_test pager-3.5 { - for {set i 2} {$i<=20} {incr i} { - set gx [page_get $::p1 $i] - page_write $gx "Page-$i" - page_unref $gx - } - pager_commit $::p1 - page_unref $::g(1) -} {} -for {set i 2} {$i<=20} {incr i} { - do_test pager-3.6.[expr {$i-1}] [subst { - set gx \[page_get $::p1 $i\] - set v \[page_read \$gx\] - page_unref \$gx - set v - }] "Page-$i" -} -for {set i 1} {$i<=20} {incr i} { - regsub -all CNT { - set ::g1 [page_get $::p1 CNT] - set ::g2 [page_get $::p1 CNT] - set ::vx [page_read $::g2] - expr {$::g1==$::g2} - } $i body; - do_test pager-3.7.$i.1 $body {1} - regsub -all CNT { - page_unref $::g2 - set vy [page_read $::g1] - expr {$vy==$::vx} - } $i body; - do_test pager-3.7.$i.2 $body {1} - regsub -all CNT { - page_unref $::g1 - set gx [page_get $::p1 CNT] - set vy [page_read $gx] - page_unref $gx - expr {$vy==$::vx} - } $i body; - do_test pager-3.7.$i.3 $body {1} -} -do_test pager-3.99 { - pager_close $::p1 -} {} - -# tests of the checkpoint mechanism and api -# -do_test pager-4.0 { - set v [catch { - file delete -force ptf1.db - set ::p1 [pager_open ptf1.db 15] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager-4.1 { - set g1 [page_get $::p1 1] - page_write $g1 "Page-1 v0" - for {set i 2} {$i<=20} {incr i} { - set gx [page_get $::p1 $i] - page_write $gx "Page-$i v0" - page_unref $gx - } - pager_commit $::p1 -} {} -for {set i 1} {$i<=20} {incr i} { - do_test pager-4.2.$i { - set gx [page_get $p1 $i] - set v [page_read $gx] - page_unref $gx - set v - } "Page-$i v0" -} -do_test pager-4.3 { - lrange [pager_stats $::p1] 0 1 -} {ref 1} -do_test pager-4.4 { - lrange [pager_stats $::p1] 8 9 -} {state 1} - -for {set i 1} {$i<20} {incr i} { - do_test pager-4.5.$i.0 { - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v[expr {$i-1}]" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager-4.5.$i.1 { - page_write $g1 "Page-1 v$i" - lrange [pager_stats $p1] 8 9 - } {state 2} - do_test pager-4.5.$i.2 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager-4.5.$i.3 { - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v$i" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager-4.5.$i.4 { - pager_rollback $p1 - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v[expr {$i-1}]" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager-4.5.$i.5 { - page_write $g1 "Page-1 v$i" - lrange [pager_stats $p1] 8 9 - } {state 2} - do_test pager-4.5.$i.6 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager-4.5.$i.7 { - pager_stmt_rollback $p1 - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - if {$j<=$i || $i==1} { - set shouldbe "Page-$j v$i" - } else { - set shouldbe "Page-$j v[expr {$i-1}]" - } - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager-4.5.$i.8 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager-4.5.$i.9 { - pager_stmt_commit $p1 - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v$i" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager-4.5.$i.10 { - pager_commit $p1 - lrange [pager_stats $p1] 8 9 - } {state 1} -} - -# Test that nothing bad happens when sqlite3pager_set_cachesize() is -# called with a negative argument. -do_test pager-4.6.1 { - pager_close [pager_open ptf2.db -15] -} {} - -# Test truncate on an in-memory database is Ok. -ifcapable memorydb { - do_test pager-4.6.2 { - set ::p2 [pager_open :memory: 10] - pager_truncate $::p2 0 - } {} - do_test pager-4.6.3 { - set page1 [page_get $::p2 1] - for {set i 1} {$i<5} {incr i} { - set p [page_get $::p2 $i] - page_write $p "Page $i" - pager_commit $::p2 - page_unref $p - } - page_unref $page1 - pager_truncate $::p2 3 - } {} - do_test pager-4.6.4 { - pager_close $::p2 - } {} -} - -do_test pager-4.99 { - page_unref $::g1 - pager_close $::p1 -} {} - - - - file delete -force ptf1.db - -} ;# end if( not mem: and has pager_open command ); - -if 0 { -# Ticket #615: an assertion fault inside the pager. It is a benign -# fault, but we might as well test for it. -# -do_test pager-5.1 { - sqlite3 db test.db - execsql { - BEGIN; - CREATE TABLE t1(x); - PRAGMA synchronous=off; - COMMIT; - } -} {} -} - -# The following tests cover rolling back hot journal files. -# They can't be run on windows because the windows version of -# SQLite holds a mandatory exclusive lock on journal files it has open. -# -# They cannot be run during the journaltest permutation because -# "PRAGMA synchronous = 0" is used. -# -if {$tcl_platform(platform)!="windows" && ( - 0 == [info exists ::permutations_test_prefix] - || $::permutations_test_prefix ne "journaltest" -)} { -do_test pager-6.1 { - file delete -force test2.db - file delete -force test2.db-journal - sqlite3 db2 test2.db - execsql { - PRAGMA synchronous = 0; - CREATE TABLE abc(a, b, c); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - INSERT INTO abc VALUES(1, 2, randstr(200,200)); - BEGIN; - UPDATE abc SET c = randstr(200,200); - } db2 - copy_file test2.db test.db - copy_file test2.db-journal test.db-journal - - set f [open test.db-journal a] - fconfigure $f -encoding binary - seek $f [expr [file size test.db-journal] - 1032] start - puts -nonewline $f "\00\00\00\00" - close $f - - sqlite3 db test.db - execsql { - SELECT sql FROM sqlite_master - } -} {{CREATE TABLE abc(a, b, c)}} - -do_test pager-6.2 { - copy_file test2.db test.db - copy_file test2.db-journal test.db-journal - - set f [open test.db-journal a] - fconfigure $f -encoding binary - seek $f [expr [file size test.db-journal] - 1032] start - puts -nonewline $f "\00\00\00\FF" - close $f - - sqlite3 db test.db - execsql { - SELECT sql FROM sqlite_master - } -} {{CREATE TABLE abc(a, b, c)}} - -do_test pager-6.3 { - copy_file test2.db test.db - copy_file test2.db-journal test.db-journal - - set f [open test.db-journal a] - fconfigure $f -encoding binary - seek $f [expr [file size test.db-journal] - 4] start - puts -nonewline $f "\00\00\00\00" - close $f - - sqlite3 db test.db - execsql { - SELECT sql FROM sqlite_master - } -} {{CREATE TABLE abc(a, b, c)}} - -do_test pager-6.4.1 { - execsql { - BEGIN; - SELECT sql FROM sqlite_master; - } - copy_file test2.db-journal test.db-journal; - sqlite3 db3 test.db - catchsql { - BEGIN; - SELECT sql FROM sqlite_master; - } db3; -} {1 {database is locked}} -do_test pager-6.4.2 { - file delete -force test.db-journal - catchsql { - SELECT sql FROM sqlite_master; - } db3; -} {0 {{CREATE TABLE abc(a, b, c)}}} -do_test pager-6.4.3 { - db3 close - execsql { - COMMIT; - } -} {} - -do_test pager-6.5 { - copy_file test2.db test.db - copy_file test2.db-journal test.db-journal - - set f [open test.db-journal a] - fconfigure $f -encoding binary - puts -nonewline $f "hello" - puts -nonewline $f "\x00\x00\x00\x05\x01\x02\x03\x04" - puts -nonewline $f "\xd9\xd5\x05\xf9\x20\xa1\x63\xd7" - close $f - - sqlite3 db test.db - execsql { - SELECT sql FROM sqlite_master - } -} {{CREATE TABLE abc(a, b, c)}} - -do_test pager-6.5 { - db2 close -} {} -} -finish_test diff --git a/test/pager2.test b/test/pager2.test deleted file mode 100644 index 3d4057c862..0000000000 --- a/test/pager2.test +++ /dev/null @@ -1,414 +0,0 @@ -# 2001 September 15 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# This file implements regression tests for SQLite library. The -# focus of this script is page cache subsystem. -# -# $Id: pager2.test,v 1.9 2008/12/30 17:55:00 drh Exp $ - - -set testdir [file dirname $argv0] -source $testdir/tester.tcl - -# Don't run this test file if the pager test interface [pager_open] is not -# available, or the library was compiled without in-memory database support. -# -if {[info commands pager_open]!=""} { -ifcapable memorydb { -db close - -# Basic sanity check. Open and close a pager. -# -do_test pager2-1.0 { - set v [catch { - set ::p1 [pager_open :memory: 10] - } msg] -} {0} -do_test pager2-1.1 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} -do_test pager2-1.2 { - pager_pagecount $::p1 -} {0} -do_test pager2-1.3 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} -do_test pager2-1.4 { - pager_close $::p1 -} {} - -# Try to write a few pages. -# -do_test pager2-2.1 { - set v [catch { - set ::p1 [pager_open :memory: 10] - } msg] -} {0} -#do_test pager2-2.2 { -# set v [catch { -# set ::g1 [page_get $::p1 0] -# } msg] -# lappend v $msg -#} {1 SQLITE_ERROR} -do_test pager2-2.3.1 { - set ::gx [page_lookup $::p1 1] -} {} -do_test pager2-2.3.2 { - pager_stats $::p1 -} {ref 0 page 0 max 10 size 0 state 4 err 0 hit 0 miss 0 ovfl 0} -do_test pager2-2.3.3 { - set v [catch { - set ::g1 [page_get $::p1 1] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager2-2.3.3 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.3.4 { - set ::gx [page_lookup $::p1 1] - page_unref $::gx - expr {$::gx!=""} -} {1} -do_test pager2-2.3.5 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.3.6 { - expr {$::g1==$::gx} -} {1} -do_test pager2-2.3.7 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.4 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.5 { - pager_pagecount $::p1 -} {0} -do_test pager2-2.6 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.7 { - page_number $::g1 -} {1} -do_test pager2-2.8 { - page_read $::g1 -} {} -do_test pager2-2.9 { - page_unref $::g1 -} {} -do_test pager2-2.10 { - pager_stats $::p1 -} {ref 0 page 1 max 10 size 0 state 4 err 0 hit 0 miss 1 ovfl 0} -do_test pager2-2.11 { - set ::g1 [page_get $::p1 1] - expr {$::g1!=0} -} {1} -do_test pager2-2.12 { - page_number $::g1 -} {1} -do_test pager2-2.13 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 0 state 4 err 0 hit 1 miss 1 ovfl 0} -do_test pager2-2.14 { - set v [catch { - page_write $::g1 "Page-One" - } msg] - lappend v $msg -} {0 {}} -do_test pager2-2.15 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} -do_test pager2-2.16 { - page_read $::g1 -} {Page-One} -do_test pager2-2.17 { - set v [catch { - pager_commit $::p1 - } msg] - lappend v $msg -} {0 {}} -do_test pager2-2.20 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} -do_test pager2-2.19 { - pager_pagecount $::p1 -} {1} -do_test pager2-2.21 { - pager_stats $::p1 -} {ref 1 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} -do_test pager2-2.22 { - page_unref $::g1 -} {} -do_test pager2-2.23 { - pager_stats $::p1 -} {ref 0 page 1 max 10 size 1 state 4 err 0 hit 1 miss 1 ovfl 0} -do_test pager2-2.24 { - set v [catch { - page_get $::p1 1 - } ::g1] - if {$v} {lappend v $::g1} - set v -} {0} -do_test pager2-2.25 { - page_read $::g1 -} {Page-One} -do_test pager2-2.26 { - set v [catch { - page_write $::g1 {page-one} - } msg] - lappend v $msg -} {0 {}} -do_test pager2-2.27 { - page_read $::g1 -} {page-one} -do_test pager2-2.28 { - set v [catch { - pager_rollback $::p1 - } msg] - lappend v $msg -} {0 {}} -do_test pager2-2.29 { - page_unref $::g1 - set ::g1 [page_get $::p1 1] - page_read $::g1 -} {Page-One} -do_test pager2-2.99 { - page_unref $::g1 -} {} - -#do_test pager2-3.1 { -# set v [catch { -# set ::p1 [pager_open :memory: 15] -# } msg] -# if {$v} {lappend v $msg} -# set v -#} {0} -do_test pager2-3.2 { - pager_pagecount $::p1 -} {1} -do_test pager2-3.3 { - set v [catch { - set ::g(1) [page_get $::p1 1] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager2-3.4 { - page_read $::g(1) -} {Page-One} -do_test pager2-3.5 { - for {set i 2} {$i<=20} {incr i} { - set gx [page_get $::p1 $i] - page_write $gx "Page-$i" - page_unref $gx - } - pager_commit $::p1 - page_unref $::g(1) -} {} -for {set i 2} {$i<=20} {incr i} { - set page1 [page_get $::p1 1] - do_test pager2-3.6.[expr {$i-1}] [subst { - set gx \[page_get $::p1 $i\] - set v \[page_read \$gx\] - page_unref \$gx - set v - }] "Page-$i" - page_unref $page1 -} -for {set i 1} {$i<=20} {incr i} { - set page1 [page_get $::p1 1] - regsub -all CNT { - set ::g1 [page_get $::p1 CNT] - set ::g2 [page_get $::p1 CNT] - set ::vx [page_read $::g2] - expr {$::g1==$::g2} - } $i body; - do_test pager2-3.7.$i.1 $body {1} - regsub -all CNT { - page_unref $::g2 - set vy [page_read $::g1] - expr {$vy==$::vx} - } $i body; - do_test pager2-3.7.$i.2 $body {1} - regsub -all CNT { - page_unref $::g1 - set gx [page_get $::p1 CNT] - set vy [page_read $gx] - page_unref $gx - expr {$vy==$::vx} - } $i body; - do_test pager2-3.7.$i.3 $body {1} - page_unref $page1 -} -do_test pager2-3.99 { - pager_close $::p1 -} {} - -# tests of the checkpoint mechanism and api -# -do_test pager2-4.0 { - set v [catch { - set ::p1 [pager_open :memory: 15] - } msg] - if {$v} {lappend v $msg} - set v -} {0} -do_test pager2-4.1 { - set g1 [page_get $::p1 1] - page_write $g1 "Page-1 v0" - for {set i 2} {$i<=20} {incr i} { - set gx [page_get $::p1 $i] - page_write $gx "Page-$i v0" - page_unref $gx - } - pager_commit $::p1 -} {} -for {set i 1} {$i<=20} {incr i} { - do_test pager2-4.2.$i { - set gx [page_get $p1 $i] - set v [page_read $gx] - page_unref $gx - set v - } "Page-$i v0" -} -do_test pager2-4.3 { - lrange [pager_stats $::p1] 0 1 -} {ref 1} -do_test pager2-4.4 { - lrange [pager_stats $::p1] 8 9 -} {state 4} - -for {set i 1} {$i<20} {incr i} { - do_test pager2-4.5.$i.0 { - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v[expr {$i-1}]" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager2-4.5.$i.1 { - page_write $g1 "Page-1 v$i" - lrange [pager_stats $p1] 8 9 - } {state 4} - do_test pager2-4.5.$i.2 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager2-4.5.$i.3 { - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v$i" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager2-4.5.$i.4 { - pager_rollback $p1 - set res {} - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v[expr {$i-1}]" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager2-4.5.$i.5 { - page_write $g1 "Page-1 v$i" - lrange [pager_stats $p1] 8 9 - } {state 4} - do_test pager2-4.5.$i.6 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager2-4.5.$i.7 { - pager_stmt_rollback $p1 - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - if {$j<=$i || $i==1} { - set shouldbe "Page-$j v$i" - } else { - set shouldbe "Page-$j v[expr {$i-1}]" - } - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager2-4.5.$i.8 { - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - page_write $gx "Page-$j v$i" - page_unref $gx - if {$j==$i} { - pager_stmt_begin $p1 - } - } - } {} - do_test pager2-4.5.$i.9 { - pager_stmt_commit $p1 - for {set j 2} {$j<=20} {incr j} { - set gx [page_get $p1 $j] - set value [page_read $gx] - page_unref $gx - set shouldbe "Page-$j v$i" - if {$value!=$shouldbe} { - lappend res $value $shouldbe - } - } - set res - } {} - do_test pager2-4.5.$i.10 { - pager_commit $p1 - lrange [pager_stats $p1] 8 9 - } {state 4} -} - -do_test pager2-4.99 { - page_unref $::g1 - pager_close $::p1 -} {} - -} ;# ifcapable inmemory -} ;# end if( has pager_open command ); - - -finish_test diff --git a/test/pager3.test b/test/pager3.test deleted file mode 100644 index 59a97c52bb..0000000000 --- a/test/pager3.test +++ /dev/null @@ -1,73 +0,0 @@ -# 2001 September 15 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# This file implements regression tests for SQLite library. The -# focus of this script is page cache subsystem. -# -# $Id: pager3.test,v 1.3 2005/03/29 03:11:00 danielk1977 Exp $ - - -set testdir [file dirname $argv0] -source $testdir/tester.tcl - -# This test makes sure the database file is truncated back to the correct -# length on a rollback. -# -# After some preliminary setup, a transaction is start at NOTE (1). -# The create table on the following line allocates an additional page -# at the end of the database file. But that page is not written because -# the database still has a RESERVED lock, not an EXCLUSIVE lock. The -# new page is held in memory and the size of the file is unchanged. -# The insert at NOTE (2) begins adding additional pages. Then it hits -# a constraint error and aborts. The abort causes sqlite3OsTruncate() -# to be called to restore the file to the same length as it was after -# the create table. But the create table results had not yet been -# written so the file is actually lengthened by this truncate. Finally, -# the rollback at NOTE (3) is called to undo all the changes since the -# begin. This rollback should truncate the database again. -# -# This test was added because the second truncate at NOTE (3) was not -# occurring on early versions of SQLite 3.0. -# -ifcapable tempdb { - do_test pager3-1.1 { - execsql { - create table t1(a unique, b); - insert into t1 values(1, 'abcdefghijklmnopqrstuvwxyz'); - insert into t1 values(2, 'abcdefghijklmnopqrstuvwxyz'); - update t1 set b=b||a||b; - update t1 set b=b||a||b; - update t1 set b=b||a||b; - update t1 set b=b||a||b; - update t1 set b=b||a||b; - update t1 set b=b||a||b; - create temp table t2 as select * from t1; - begin; ------- NOTE (1) - create table t3(x); - } - catchsql { - insert into t1 select 4-a, b from t2; ----- NOTE (2) - } - execsql { - rollback; ------- NOTE (3) - } - db close - sqlite3 db test.db - set r ok - ifcapable {integrityck} { - set r [execsql { - pragma integrity_check; - }] - } - set r - } ok -} - -finish_test