1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Add assert() statements to more tightly constrain the state of pager.c.

Remove the three pager*.test scripts since they violate the constraints
asserted above by modifying the state of the system in ways that it cannot
be modified in a live system. (CVS 6933)

FossilOrigin-Name: 3b6d370ed68eaf9636b26c7240a8b3a43d2edd70
This commit is contained in:
drh
2009-07-25 04:12:02 +00:00
parent d4e5cd05a4
commit 8a938f9808
6 changed files with 25 additions and 1096 deletions

View File

@@ -1,5 +1,5 @@
C Remove\stwo\smore\soverzealous\sassert()\sstatements.\s(CVS\s6932) 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-25T00:13:59 D 2009-07-25T04:12:02
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in df9359da7a726ccb67a45db905c5447d5c00c6ef F Makefile.in df9359da7a726ccb67a45db905c5447d5c00c6ef
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -147,7 +147,7 @@ F src/os_common.h 8c61457df58f1a4bd5f5adc3e90e01b37bf7afbc
F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5 F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5
F src/os_unix.c cdb2a08b9ce4aa13b3f7b91d4dd60fb48be9f56a F src/os_unix.c cdb2a08b9ce4aa13b3f7b91d4dd60fb48be9f56a
F src/os_win.c 725c38a524d168ce280446ad8761d731bc516405 F src/os_win.c 725c38a524d168ce280446ad8761d731bc516405
F src/pager.c c462bf6153c3c29da0ce723ac76c8fa76cbd6a9b F src/pager.c e26d9c5d881435b83551a07cd7e38396518582bc
F src/pager.h 11852d044c86cf5a9d6e34171fb0c4fcf1f6265f F src/pager.h 11852d044c86cf5a9d6e34171fb0c4fcf1f6265f
F src/parse.y bcd46d43fbd23a22b8c020a3eb1806b794794ed5 F src/parse.y bcd46d43fbd23a22b8c020a3eb1806b794794ed5
F src/pcache.c 1dae135b70a029f81ed66f6e9b5d0db91480d5d0 F src/pcache.c 1dae135b70a029f81ed66f6e9b5d0db91480d5d0
@@ -492,9 +492,6 @@ F test/notify2.test 195a467e021f74197be2c4fb02d6dee644b8d8db
F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82 F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82
F test/null.test a8b09b8ed87852742343b33441a9240022108993 F test/null.test a8b09b8ed87852742343b33441a9240022108993
F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec 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/pageropt.test 3ee6578891baaca967f0bd349e4abfa736229e1a
F test/pagesize.test 0d9ff3fedfce6e5ffe8fa7aca9b6d3433a2e843b F test/pagesize.test 0d9ff3fedfce6e5ffe8fa7aca9b6d3433a2e843b
F test/pcache.test eebc4420b37cb07733ae9b6e99c9da7c40dd6d58 F test/pcache.test eebc4420b37cb07733ae9b6e99c9da7c40dd6d58
@@ -741,7 +738,7 @@ 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 672f81d693a03f80f5ae60bfefacd8a349e76746 F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
P 4a924b475aa0f7f2f69caed0adc2e60d29c47f21 P 788aa9dde9e76f67f22c07a904faf03e97e032c6
R 69d11ad1bb13603103594d88d70fe872 R 4116dfd49c9a3af1d9a66719263f82dc
U drh U drh
Z e88cd7ec3be1e087035327e93db22707 Z 51e179b626e42eaf6ce7a289270b3c19

View File

@@ -1 +1 @@
788aa9dde9e76f67f22c07a904faf03e97e032c6 3b6d370ed68eaf9636b26c7240a8b3a43d2edd70

View File

@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while ** file simultaneously, or one process from reading the database while
** another is writing. ** 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 #ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -2410,9 +2410,9 @@ int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize, int nReserve){
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
u16 pageSize = *pPageSize; u16 pageSize = *pPageSize;
assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
if( pageSize && pageSize!=pPager->pageSize if( (pPager->memDb==0 || pPager->dbSize==0)
&& (pPager->memDb==0 || pPager->dbSize==0)
&& sqlite3PcacheRefCount(pPager->pPCache)==0 && sqlite3PcacheRefCount(pPager->pPCache)==0
&& pageSize && pageSize!=pPager->pageSize
){ ){
char *pNew = (char *)sqlite3PageMalloc(pageSize); char *pNew = (char *)sqlite3PageMalloc(pageSize);
if( !pNew ){ if( !pNew ){
@@ -2988,7 +2988,6 @@ static int subjournalPage(PgHdr *pPg){
pPager->nSubRec++; pPager->nSubRec++;
assert( pPager->nSavepoint>0 ); assert( pPager->nSavepoint>0 );
rc = addToSavepointBitvecs(pPager, pPg->pgno); rc = addToSavepointBitvecs(pPager, pPg->pgno);
testcase( rc!=SQLITE_OK );
} }
return rc; return rc;
} }
@@ -3077,6 +3076,7 @@ static int pagerStress(void *p, PgHdr *pPg){
** executed. ** executed.
*/ */
if( rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg) ){ if( rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg) ){
assert(0);
rc = subjournalPage(pPg); rc = subjournalPage(pPg);
} }
@@ -3418,6 +3418,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){
assert( pPager->useJournal ); assert( pPager->useJournal );
assert( isOpen(pPager->fd) ); assert( isOpen(pPager->fd) );
assert( !isOpen(pPager->jfd) ); assert( !isOpen(pPager->jfd) );
assert( pPager->state <= PAGER_SHARED );
*pExists = 0; *pExists = 0;
rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists);
@@ -3446,14 +3447,10 @@ static int hasHotJournal(Pager *pPager, int *pExists){
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
if( nPage==0 ){ if( nPage==0 ){
sqlite3BeginBenignMalloc(); sqlite3BeginBenignMalloc();
if( pPager->state>=PAGER_RESERVED if( sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){
|| sqlite3OsLock(pPager->fd, RESERVED_LOCK)==SQLITE_OK ){
sqlite3OsDelete(pVfs, pPager->zJournal, 0); 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(); sqlite3EndBenignMalloc();
}else{ }else{
/* The journal file exists and no other connection has a reserved /* The journal file exists and no other connection has a reserved
@@ -3574,12 +3571,15 @@ int sqlite3PagerSharedLock(Pager *pPager){
int rc = SQLITE_OK; /* Return code */ int rc = SQLITE_OK; /* Return code */
int isErrorReset = 0; /* True if recovering from error state */ int isErrorReset = 0; /* True if recovering from error state */
/* If this database has no outstanding page references and is in an /* This routine is only called from b-tree and only when there are no
** error-state, this is a chance to clear the error. Discard the ** outstanding pages */
** contents of the pager-cache and rollback any hot journal in the assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
** file-system.
/* 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 ){ if( isOpen(pPager->jfd) || pPager->zJournal ){
isErrorReset = 1; isErrorReset = 1;
} }
@@ -3615,6 +3615,7 @@ int sqlite3PagerSharedLock(Pager *pPager){
** database file, then it either needs to be played back or deleted. ** database file, then it either needs to be played back or deleted.
*/ */
if( !isErrorReset ){ if( !isErrorReset ){
assert( pPager->state <= PAGER_SHARED );
rc = hasHotJournal(pPager, &isHotJournal); rc = hasHotJournal(pPager, &isHotJournal);
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
goto failed; goto failed;
@@ -3891,7 +3892,7 @@ int sqlite3PagerAcquire(
** a bit in a bit vector. ** a bit in a bit vector.
*/ */
sqlite3BeginBenignMalloc(); sqlite3BeginBenignMalloc();
if( ALWAYS(pgno<=pPager->dbOrigSize) ){ if( pgno<=pPager->dbOrigSize ){
TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno);
testcase( rc==SQLITE_NOMEM ); testcase( rc==SQLITE_NOMEM );
} }
@@ -4948,7 +4949,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) && pPager->journalOff>0 ){ if( isOpen(pPager->jfd) && ALWAYS(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);

View File

@@ -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

View File

@@ -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

View File

@@ -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