]> granicus.if.org Git - postgresql/commitdiff
Fix pg_restore's processing of old-style BLOB COMMENTS data.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 13 Jun 2014 00:14:32 +0000 (20:14 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 13 Jun 2014 00:14:32 +0000 (20:14 -0400)
Prior to 9.0, pg_dump handled comments on large objects by dumping a bunch
of COMMENT commands into a single BLOB COMMENTS archive object.  With
sufficiently many such comments, some of the commands would likely get
split across bufferloads when restoring, causing failures in
direct-to-database restores (though no problem would be evident in text
output).  This is the same type of issue we have with table data dumped as
INSERT commands, and it can be fixed in the same way, by using a mini SQL
lexer to figure out where the command boundaries are.  Fortunately, the
COMMENT commands are no more complex to lex than INSERTs, so we can just
re-use the existing lexer for INSERTs.

Per bug #10611 from Jacek Zalewski.  Back-patch to all active branches.

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_backup_db.c
src/bin/pg_dump/pg_dump.c

index e782438a86eb8da77e606d403bfa0bca4c752a4f..f6fbf4442da2f8f5af083a5767a50b4c4db5215d 100644 (file)
@@ -696,7 +696,13 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
 
                                        _selectOutputSchema(AH, "pg_catalog");
 
+                                       /* Send BLOB COMMENTS data to ExecuteSimpleCommands() */
+                                       if (strcmp(te->desc, "BLOB COMMENTS") == 0)
+                                               AH->outputKind = OUTPUT_OTHERDATA;
+
                                        (*AH->PrintTocDataPtr) (AH, te, ropt);
+
+                                       AH->outputKind = OUTPUT_SQLCMDS;
                                }
                                else
                                {
index 762a9a8781b2dd84a43989694f6f4d2b26bb22e1..4d1d14f19b185c76700a221a1a14e15906212bb8 100644 (file)
@@ -428,9 +428,14 @@ ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc)
  * identifiers, so that we can recognize statement-terminating semicolons.
  * We assume that INSERT data will not contain SQL comments, E'' literals,
  * or dollar-quoted strings, so this is much simpler than a full SQL lexer.
+ *
+ * Note: when restoring from a pre-9.0 dump file, this code is also used to
+ * process BLOB COMMENTS data, which has the same problem of containing
+ * multiple SQL commands that might be split across bufferloads.  Fortunately,
+ * that data won't contain anything complicated to lex either.
  */
 static void
-ExecuteInsertCommands(ArchiveHandle *AH, const char *buf, size_t bufLen)
+ExecuteSimpleCommands(ArchiveHandle *AH, const char *buf, size_t bufLen)
 {
        const char *qry = buf;
        const char *eos = buf + bufLen;
@@ -514,9 +519,10 @@ ExecuteSqlCommandBuf(ArchiveHandle *AH, const char *buf, size_t bufLen)
        else if (AH->outputKind == OUTPUT_OTHERDATA)
        {
                /*
-                * Table data expressed as INSERT commands.
+                * Table data expressed as INSERT commands; or, in old dump files,
+                * BLOB COMMENTS data (which is expressed as COMMENT ON commands).
                 */
-               ExecuteInsertCommands(AH, buf, bufLen);
+               ExecuteSimpleCommands(AH, buf, bufLen);
        }
        else
        {
index 67a93a305dd404a3552e5d984f0c84b1c9fbb21f..799637d62e1d718ab92d2347e4f678dd58fe8ad6 100644 (file)
@@ -1549,7 +1549,7 @@ dumpTableData_copy(Archive *fout, void *dcontext)
  *
  * Caution: when we restore from an archive file direct to database, the
  * INSERT commands emitted by this function have to be parsed by
- * pg_backup_db.c's ExecuteInsertCommands(), which will not handle comments,
+ * pg_backup_db.c's ExecuteSimpleCommands(), which will not handle comments,
  * E'' strings, or dollar-quoted strings.  So don't emit anything like that.
  */
 static int