pg_restore failed on tar-format archives if they contained large objects
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 1 Nov 2006 15:59:31 +0000 (15:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 1 Nov 2006 15:59:31 +0000 (15:59 +0000)
(blobs) with comments, per bug #2727 from Konstantin Pelepelin.
Mea culpa for not having tested this case.
Back-patch to 8.1; prior branches don't dump blob comments at all.

src/bin/pg_dump/pg_backup_tar.c

index fbbe00b6af52598f00f523d7126460f14dd50d21..b50919f3f5ab4d7ae4e2b78c61e6c1863cfd3293 100644 (file)
@@ -16,7 +16,7 @@
  *
  *
  * IDENTIFICATION
- *     $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.49.2.2 2006/06/27 02:56:46 momjian Exp $
+ *     $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.49.2.3 2006/11/01 15:59:31 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -701,6 +701,7 @@ _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
    lclContext *ctx = (lclContext *) AH->formatData;
    TAR_MEMBER *th;
    size_t      cnt;
+   bool        foundBlob = false;
    char        buf[4096];
 
    StartRestoreBlobs(AH);
@@ -725,10 +726,22 @@ _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
                    ahwrite(buf, 1, cnt, AH);
                }
                EndRestoreBlob(AH, oid);
+               foundBlob = true;
            }
+           tarClose(AH, th);
+       }
+       else
+       {
+           tarClose(AH, th);
+           /*
+            * Once we have found the first blob, stop at the first
+            * non-blob entry (which will be 'blobs.toc').  This coding would
+            * eat all the rest of the archive if there are no blobs ... but
+            * this function shouldn't be called at all in that case.
+            */
+           if (foundBlob)
+               break;
        }
-
-       tarClose(AH, th);
 
        th = tarOpen(AH, NULL, 'r');
    }