mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Fix the crash-followed-by-corruption bug revealed by savepoint4.test. This is actually the same bug as was fixed by (6043). The fix was not entirely correct. (CVS 6047)
FossilOrigin-Name: 688336266f0aa5630f4f550ae3787a64f39f9cfa
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Specify\stype\s"void"\sin\sthe\sparameter\slist\sof\sfunctions\sthat\stake\sno\sparameters.\nTickets\s#3545\sand\s#3546.\s(CVS\s6046)
|
C Fix\sthe\scrash-followed-by-corruption\sbug\srevealed\sby\ssavepoint4.test.\sThis\sis\sactually\sthe\ssame\sbug\sas\swas\sfixed\sby\s(6043).\sThe\sfix\swas\snot\sentirely\scorrect.\s(CVS\s6047)
|
||||||
D 2008-12-20T02:14:40
|
D 2008-12-20T08:39:57
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in f7e4c81c347b04f7b0f1c1b081a168645d7b8af7
|
F Makefile.in f7e4c81c347b04f7b0f1c1b081a168645d7b8af7
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@@ -142,7 +142,7 @@ F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60
|
|||||||
F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5
|
F src/os_os2.c bed77dc26e3a95ce4a204936b9a1ca6fe612fcc5
|
||||||
F src/os_unix.c 96b4a6e87335ba943455740f311b4dfb63f26756
|
F src/os_unix.c 96b4a6e87335ba943455740f311b4dfb63f26756
|
||||||
F src/os_win.c 496e3ceb499aedc63622a89ef76f7af2dd902709
|
F src/os_win.c 496e3ceb499aedc63622a89ef76f7af2dd902709
|
||||||
F src/pager.c 7760272fb2c508ab5db63790f76e5a6be5e29932
|
F src/pager.c 5c2b49c37db966bc312ff28d296767961fb894c3
|
||||||
F src/pager.h 7191294438881eb4d13eedade97891e8dc993905
|
F src/pager.h 7191294438881eb4d13eedade97891e8dc993905
|
||||||
F src/parse.y 4d0e33a702dc3ea7b69d8ae1914b3fbd32e46057
|
F src/parse.y 4d0e33a702dc3ea7b69d8ae1914b3fbd32e46057
|
||||||
F src/pcache.c 16dc8da6e6ba6250f8dfd9ee46036db1cbceedc6
|
F src/pcache.c 16dc8da6e6ba6250f8dfd9ee46036db1cbceedc6
|
||||||
@@ -494,7 +494,7 @@ F test/safety.test b69e2b2dd5d52a3f78e216967086884bbc1a09c6
|
|||||||
F test/savepoint.test 24b7d67971c0b7a8d22ba1cabbfd846e72f21594
|
F test/savepoint.test 24b7d67971c0b7a8d22ba1cabbfd846e72f21594
|
||||||
F test/savepoint2.test 65fed3f179cff053e0a75864b1afc13e100fce1f
|
F test/savepoint2.test 65fed3f179cff053e0a75864b1afc13e100fce1f
|
||||||
F test/savepoint3.test b3c9aa5af3f777ccb8b9e15597c75c93eb5bc369
|
F test/savepoint3.test b3c9aa5af3f777ccb8b9e15597c75c93eb5bc369
|
||||||
F test/savepoint4.test 1dfe4e6a089a44e50bdfaa5a723603d0973eb1a8
|
F test/savepoint4.test fd8850063e3c40565545f5c291e7f79a30591670
|
||||||
F test/schema.test a8b000723375fd42c68d310091bdbd744fde647c
|
F test/schema.test a8b000723375fd42c68d310091bdbd744fde647c
|
||||||
F test/schema2.test 35e1c9696443d6694c8980c411497c2b5190d32e
|
F test/schema2.test 35e1c9696443d6694c8980c411497c2b5190d32e
|
||||||
F test/select1.test d0a4cad954fd41c030ec16ffbd2d08a4c0548742
|
F test/select1.test d0a4cad954fd41c030ec16ffbd2d08a4c0548742
|
||||||
@@ -683,7 +683,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
|
|||||||
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
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
|
||||||
P c3f7aa019c613e18457f090685725dd8a6a336b9
|
P c2228bd14ae54b17450f64357bf835d08c447250
|
||||||
R 16eef696dadb8073a93238b891b414de
|
R 28745131c68a85233646b348f37f710b
|
||||||
U drh
|
U danielk1977
|
||||||
Z d9f46a7642ed6f6a261b7f5c413722a9
|
Z 253416ea7a2eb467e71f6f982fcd03e8
|
||||||
|
@@ -1 +1 @@
|
|||||||
c2228bd14ae54b17450f64357bf835d08c447250
|
688336266f0aa5630f4f550ae3787a64f39f9cfa
|
22
src/pager.c
22
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.518 2008/12/19 16:31:11 danielk1977 Exp $
|
** @(#) $Id: pager.c,v 1.519 2008/12/20 08:39:57 danielk1977 Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef SQLITE_OMIT_DISKIO
|
#ifndef SQLITE_OMIT_DISKIO
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
@@ -1142,6 +1142,7 @@ static int pager_playback_one_page(
|
|||||||
Pager *pPager, /* The pager being played back */
|
Pager *pPager, /* The pager being played back */
|
||||||
int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */
|
int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */
|
||||||
i64 offset, /* Offset of record to playback */
|
i64 offset, /* Offset of record to playback */
|
||||||
|
int isSavepnt, /* True for a savepoint rollback */
|
||||||
Bitvec *pDone /* Bitvec of pages already played back */
|
Bitvec *pDone /* Bitvec of pages already played back */
|
||||||
){
|
){
|
||||||
int rc;
|
int rc;
|
||||||
@@ -1154,6 +1155,7 @@ static int pager_playback_one_page(
|
|||||||
/* The temp storage must be allocated at this point */
|
/* The temp storage must be allocated at this point */
|
||||||
assert( aData );
|
assert( aData );
|
||||||
assert( isMainJrnl || pDone );
|
assert( isMainJrnl || pDone );
|
||||||
|
assert( isSavepnt || pDone==0 );
|
||||||
|
|
||||||
rc = read32bits(jfd, offset, &pgno);
|
rc = read32bits(jfd, offset, &pgno);
|
||||||
if( rc!=SQLITE_OK ) return rc;
|
if( rc!=SQLITE_OK ) return rc;
|
||||||
@@ -1176,7 +1178,7 @@ static int pager_playback_one_page(
|
|||||||
rc = read32bits(jfd, offset+pPager->pageSize+4, &cksum);
|
rc = read32bits(jfd, offset+pPager->pageSize+4, &cksum);
|
||||||
if( rc ) return rc;
|
if( rc ) return rc;
|
||||||
pPager->journalOff += 4;
|
pPager->journalOff += 4;
|
||||||
if( !pDone && pager_cksum(pPager, aData)!=cksum ){
|
if( !isSavepnt && pager_cksum(pPager, aData)!=cksum ){
|
||||||
return SQLITE_DONE;
|
return SQLITE_DONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1219,8 +1221,10 @@ static int pager_playback_one_page(
|
|||||||
** Do not attempt to write if database file has never been opened.
|
** Do not attempt to write if database file has never been opened.
|
||||||
*/
|
*/
|
||||||
pPg = pager_lookup(pPager, pgno);
|
pPg = pager_lookup(pPager, pgno);
|
||||||
PAGERTRACE4("PLAYBACK %d page %d hash(%08x)\n",
|
PAGERTRACE5("PLAYBACK %d page %d hash(%08x) %s\n",
|
||||||
PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData));
|
PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData),
|
||||||
|
(isMainJrnl?"main-journal":"sub-journal")
|
||||||
|
);
|
||||||
if( (pPager->state>=PAGER_EXCLUSIVE)
|
if( (pPager->state>=PAGER_EXCLUSIVE)
|
||||||
&& (pPg==0 || 0==(pPg->flags&PGHDR_NEED_SYNC))
|
&& (pPg==0 || 0==(pPg->flags&PGHDR_NEED_SYNC))
|
||||||
&& (pPager->fd->pMethods)
|
&& (pPager->fd->pMethods)
|
||||||
@@ -1241,7 +1245,7 @@ static int pager_playback_one_page(
|
|||||||
if( pPager->xReiniter ){
|
if( pPager->xReiniter ){
|
||||||
pPager->xReiniter(pPg);
|
pPager->xReiniter(pPg);
|
||||||
}
|
}
|
||||||
if( isMainJrnl && (!pDone || pPager->journalOff<=pPager->journalHdr) ){
|
if( isMainJrnl && (!isSavepnt || pPager->journalOff<=pPager->journalHdr) ){
|
||||||
/* If the contents of this page were just restored from the main
|
/* If the contents of this page were just restored from the main
|
||||||
** journal file, then its content must be as they were when the
|
** journal file, then its content must be as they were when the
|
||||||
** transaction was first opened. In this case we can mark the page
|
** transaction was first opened. In this case we can mark the page
|
||||||
@@ -1585,7 +1589,7 @@ static int pager_playback(Pager *pPager, int isHot){
|
|||||||
/* Copy original pages out of the journal and back into the database file.
|
/* Copy original pages out of the journal and back into the database file.
|
||||||
*/
|
*/
|
||||||
for(u=0; u<nRec; u++){
|
for(u=0; u<nRec; u++){
|
||||||
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, 0);
|
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, 0, 0);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
if( rc==SQLITE_DONE ){
|
if( rc==SQLITE_DONE ){
|
||||||
rc = SQLITE_OK;
|
rc = SQLITE_OK;
|
||||||
@@ -1663,7 +1667,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
|
|||||||
iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
|
iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
|
||||||
pPager->journalOff = pSavepoint->iOffset;
|
pPager->journalOff = pSavepoint->iOffset;
|
||||||
while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
|
while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
|
||||||
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, pDone);
|
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, 1, pDone);
|
||||||
assert( rc!=SQLITE_DONE );
|
assert( rc!=SQLITE_DONE );
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@@ -1678,7 +1682,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
|
|||||||
nJRec = (szJ - pPager->journalOff) / (pPager->pageSize+8);
|
nJRec = (szJ - pPager->journalOff) / (pPager->pageSize+8);
|
||||||
}
|
}
|
||||||
for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){
|
for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){
|
||||||
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, pDone);
|
rc = pager_playback_one_page(pPager, 1, pPager->journalOff, 1, pDone);
|
||||||
assert( rc!=SQLITE_DONE );
|
assert( rc!=SQLITE_DONE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1688,7 +1692,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
|
|||||||
if( pSavepoint ){
|
if( pSavepoint ){
|
||||||
for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->stmtNRec; ii++){
|
for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->stmtNRec; ii++){
|
||||||
i64 offset = ii*(4+pPager->pageSize);
|
i64 offset = ii*(4+pPager->pageSize);
|
||||||
rc = pager_playback_one_page(pPager, 0, offset, pDone);
|
rc = pager_playback_one_page(pPager, 0, offset, 1, pDone);
|
||||||
assert( rc!=SQLITE_DONE );
|
assert( rc!=SQLITE_DONE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
#
|
#
|
||||||
#***********************************************************************
|
#***********************************************************************
|
||||||
#
|
#
|
||||||
# $Id: savepoint4.test,v 1.2 2008/12/19 18:45:53 danielk1977 Exp $
|
# $Id: savepoint4.test,v 1.3 2008/12/20 08:39:57 danielk1977 Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@@ -19,8 +19,7 @@ proc signature {} {
|
|||||||
return [db eval {SELECT count(*), md5sum(x) FROM t1}]
|
return [db eval {SELECT count(*), md5sum(x) FROM t1}]
|
||||||
}
|
}
|
||||||
|
|
||||||
set ITERATIONS 3
|
set ITERATIONS 25
|
||||||
|
|
||||||
expr srand(0)
|
expr srand(0)
|
||||||
|
|
||||||
do_test savepoint4-1 {
|
do_test savepoint4-1 {
|
||||||
|
Reference in New Issue
Block a user