BufFileSeek's behavior at segment boundaries wasn't what
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 19 Oct 1999 02:34:45 +0000 (02:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 19 Oct 1999 02:34:45 +0000 (02:34 +0000)
logfile.c wanted ... seems easier to fix BufFileSeek.

src/backend/storage/file/buffile.c

index 452e3a187dfdd612c01b4accb8e42e719aa93f99..2dafe08c5d99515216818cf416d2ba6119e38373 100644 (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;