BufFileSeek's behavior at segment boundaries wasn't what

logfile.c wanted ... seems easier to fix BufFileSeek.
This commit is contained in:
Tom Lane 1999-10-19 02:34:45 +00:00
parent d357c96789
commit 42b991fd1f
1 changed files with 26 additions and 13 deletions

View File

@ -6,7 +6,7 @@
* Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/file/buffile.c,v 1.2 1999/10/16 19:49:26 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/file/buffile.c,v 1.3 1999/10/19 02:34:45 tgl Exp $
*
* NOTES:
*
@ -434,8 +434,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
switch (whence)
{
case SEEK_SET:
if (fileno < 0 || fileno >= file->numFiles ||
offset < 0)
if (fileno < 0)
return EOF;
newFile = fileno;
newOffset = offset;
@ -443,7 +442,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
case SEEK_CUR:
/*
* Relative seek considers only the signed offset, ignoring fileno.
* Note that large offsets (> 1 gig) risk overflow.
* Note that large offsets (> 1 gig) risk overflow in this add...
*/
newFile = file->curFile;
newOffset = (file->curOffset + file->pos) + offset;
@ -463,15 +462,6 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
return EOF;
newOffset += MAX_PHYSICAL_FILESIZE;
}
if (file->isTemp)
{
while (newOffset > MAX_PHYSICAL_FILESIZE)
{
if (++newFile >= file->numFiles)
return EOF;
newOffset -= MAX_PHYSICAL_FILESIZE;
}
}
if (newFile == file->curFile &&
newOffset >= file->curOffset &&
newOffset <= file->curOffset + file->nbytes)
@ -488,6 +478,29 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
/* Otherwise, must reposition buffer, so flush any dirty data */
if (BufFileFlush(file) != 0)
return EOF;
/*
* At this point and no sooner, check for seek past last segment.
* The above flush could have created a new segment, so
* checking sooner would not work (at least not with this code).
*/
if (file->isTemp)
{
/* convert seek to "start of next seg" to "end of last seg" */
if (newFile == file->numFiles && newOffset == 0)
{
newFile--;
newOffset = MAX_PHYSICAL_FILESIZE;
}
while (newOffset > MAX_PHYSICAL_FILESIZE)
{
if (++newFile >= file->numFiles)
return EOF;
newOffset -= MAX_PHYSICAL_FILESIZE;
}
}
if (newFile >= file->numFiles)
return EOF;
/* Seek is OK! */
file->curFile = newFile;
file->curOffset = newOffset;
file->pos = 0;