Skip to content
Snippets Groups Projects
Commit 42b991fd authored by Tom Lane's avatar Tom Lane
Browse files

BufFileSeek's behavior at segment boundaries wasn't what

logfile.c wanted ... seems easier to fix BufFileSeek.
parent d357c967
Branches
Tags
No related merge requests found
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment