]> git.ipfire.org Git - thirdparty/postgresql.git/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: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');
        }