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:
15
manifest
15
manifest
@@ -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
|
||||||
|
@@ -1 +1 @@
|
|||||||
788aa9dde9e76f67f22c07a904faf03e97e032c6
|
3b6d370ed68eaf9636b26c7240a8b3a43d2edd70
|
35
src/pager.c
35
src/pager.c
@@ -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,13 +3447,9 @@ 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 );
|
sqlite3OsUnlock(pPager->fd, SHARED_LOCK);
|
||||||
if( pPager->state==PAGER_SHARED ){
|
|
||||||
sqlite3OsUnlock(pPager->fd, SHARED_LOCK);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sqlite3EndBenignMalloc();
|
sqlite3EndBenignMalloc();
|
||||||
}else{
|
}else{
|
||||||
@@ -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);
|
||||||
|
582
test/pager.test
582
test/pager.test
@@ -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
|
|
414
test/pager2.test
414
test/pager2.test
@@ -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
|
|
@@ -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
|
|
Reference in New Issue
Block a user