diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 1d10204c7cd118b5ef87a886742976bf63941995..6bcfb9777fead1a128b9a9be7ca72d50cf2aa32c 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -672,7 +672,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 { diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index e47e207c8a96ef1316a4242eeaf0f2fb8844d0b3..1600c0e8f43e7cb89a642667b95eeb831a367836 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -425,9 +425,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; @@ -511,9 +516,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 { diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 15db8b803d4893ffb3b00ac28552f0a47fae0a60..672d7f6f0ef00c20aeb44c574ecce2d2a0531696 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1415,7 +1415,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