pg_restore failed on tar-format archives if they contained large objects
authorTom Lane
Wed, 1 Nov 2006 15:59:26 +0000 (15:59 +0000)
committerTom Lane
Wed, 1 Nov 2006 15:59:26 +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 51d783b1a5132458105930b5c0e9fc912d7444a1..71bf13c52962bb648386ff05fa9ff1a908ceef29 100644 (file)
@@ -16,7 +16,7 @@
  *
  *
  * IDENTIFICATION
- *     $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.55 2006/10/04 00:30:05 momjian Exp $
+ *     $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.56 2006/11/01 15:59:26 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');
    }