]> granicus.if.org Git - postgresql/commitdiff
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:26 +0000 (15:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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');
        }