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
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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: * NOTES:
* *
...@@ -434,8 +434,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence) ...@@ -434,8 +434,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
switch (whence) switch (whence)
{ {
case SEEK_SET: case SEEK_SET:
if (fileno < 0 || fileno >= file->numFiles || if (fileno < 0)
offset < 0)
return EOF; return EOF;
newFile = fileno; newFile = fileno;
newOffset = offset; newOffset = offset;
...@@ -443,7 +442,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence) ...@@ -443,7 +442,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
case SEEK_CUR: case SEEK_CUR:
/* /*
* Relative seek considers only the signed offset, ignoring fileno. * 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; newFile = file->curFile;
newOffset = (file->curOffset + file->pos) + offset; newOffset = (file->curOffset + file->pos) + offset;
...@@ -463,15 +462,6 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence) ...@@ -463,15 +462,6 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
return EOF; return EOF;
newOffset += MAX_PHYSICAL_FILESIZE; 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 && if (newFile == file->curFile &&
newOffset >= file->curOffset && newOffset >= file->curOffset &&
newOffset <= file->curOffset + file->nbytes) newOffset <= file->curOffset + file->nbytes)
...@@ -488,6 +478,29 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence) ...@@ -488,6 +478,29 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
/* Otherwise, must reposition buffer, so flush any dirty data */ /* Otherwise, must reposition buffer, so flush any dirty data */
if (BufFileFlush(file) != 0) if (BufFileFlush(file) != 0)
return EOF; 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->curFile = newFile;
file->curOffset = newOffset; file->curOffset = newOffset;
file->pos = 0; file->pos = 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment