From 42b991fd1f951374fb37bd1b9844faf16c74a38e Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 19 Oct 1999 02:34:45 +0000
Subject: [PATCH] BufFileSeek's behavior at segment boundaries wasn't what
 logfile.c wanted ... seems easier to fix BufFileSeek.

---
 src/backend/storage/file/buffile.c | 39 ++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c
index 452e3a187df..2dafe08c5d9 100644
--- a/src/backend/storage/file/buffile.c
+++ b/src/backend/storage/file/buffile.c
@@ -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;
-- 
GitLab