-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
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
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
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
-788aa9dde9e76f67f22c07a904faf03e97e032c6
\ No newline at end of file
+3b6d370ed68eaf9636b26c7240a8b3a43d2edd70
\ No newline at end of file
** 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"
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 ){
pPager->nSubRec++;
assert( pPager->nSavepoint>0 );
rc = addToSavepointBitvecs(pPager, pPg->pgno);
- testcase( rc!=SQLITE_OK );
}
return rc;
}
** executed.
*/
if( rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg) ){
+assert(0);
rc = subjournalPage(pPg);
}
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);
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{
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;
}
** 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;
** 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 );
}
for(ii=nCurrent; ii<nSavepoint; ii++){
assert( pPager->dbSizeValid );
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);
+++ /dev/null
-# 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
+++ /dev/null
-# 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
+++ /dev/null
-# 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