From 7fcdb5e002145ec95b2bebb4c125751be66c4d1a Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 26 Apr 2019 12:03:59 -0400 Subject: [PATCH] pg_dump: store unused attribs as NULL instead of '\0' Commit f831d4accda0 changed pg_dump to emit (and pg_restore to understand) NULLs for unused members in ArchiveEntry structs, as a side effect of some code beautification. That broke pg_restore of dumps generated with older pg_dump, however, so it was reverted in 19455c9f5606. Since the archiver version number has been bumped in 3b925e905de3, we can put it back. Author: Dmitry Dolgov Discussion: https://postgr.es/m/CA+q6zcXx0XHqLsFJLaUU2j5BDiBAHig=YRoBC_YVq7VJGvzBEA@mail.gmail.com --- src/bin/pg_dump/pg_backup_archiver.c | 11 +++--- src/bin/pg_dump/pg_backup_archiver.h | 7 +--- src/bin/pg_dump/pg_dump.c | 56 +++++----------------------- 3 files changed, 16 insertions(+), 58 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index fc1d822244..821fb4def0 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -1087,10 +1087,10 @@ ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId, newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL; newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL; newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL; - newToc->owner = pg_strdup(opts->owner); + newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL; newToc->desc = pg_strdup(opts->description); - newToc->defn = pg_strdup(opts->createStmt); - newToc->dropStmt = pg_strdup(opts->dropStmt); + newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL; + newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL; newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL; if (opts->nDeps > 0) @@ -3621,7 +3621,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) } else { - if (strlen(te->defn) > 0) + if (te->defn && strlen(te->defn) > 0) ahprintf(AH, "%s\n\n", te->defn); } @@ -3632,7 +3632,8 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) * with DROP commands must appear in one list or the other. */ if (!ropt->noOwner && !ropt->use_setsessauth && - strlen(te->owner) > 0 && strlen(te->dropStmt) > 0) + te->owner && strlen(te->owner) > 0 && + te->dropStmt && strlen(te->dropStmt) > 0) { if (strcmp(te->desc, "AGGREGATE") == 0 || strcmp(te->desc, "BLOB") == 0 || diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index fe72d5b13b..f3905c00fd 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -96,12 +96,7 @@ typedef z_stream *z_streamp; * behavior */ #define K_VERS_1_14 MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */ -/* - * Current archive version number (the format we can output) - * - * Note: If you update the current archive version, consider - * https://postgr.es/m/20190227123217.GA27552@alvherre.pgsql - */ +/* Current archive version number (the format we can output) */ #define K_VERS_MAJOR 1 #define K_VERS_MINOR 14 #define K_VERS_REV 0 diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 6521e14f49..bfc9a32afe 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2244,8 +2244,6 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo) .owner = tbinfo->rolname, .description = "TABLE DATA", .section = SECTION_DATA, - .createStmt = "", - .dropStmt = "", .copyStmt = copyStmt, .deps = &(tbinfo->dobj.dumpId), .nDeps = 1, @@ -2300,7 +2298,6 @@ refreshMatViewData(Archive *fout, TableDataInfo *tdinfo) .description = "MATERIALIZED VIEW DATA", .section = SECTION_POST_DATA, .createStmt = q->data, - .dropStmt = "", .deps = tdinfo->dobj.dependencies, .nDeps = tdinfo->dobj.nDeps)); @@ -2865,7 +2862,6 @@ dumpDatabase(Archive *fout) .description = "COMMENT", .section = SECTION_NONE, .createStmt = dbQry->data, - .dropStmt = "", .deps = &dbDumpId, .nDeps = 1)); } @@ -2895,7 +2891,6 @@ dumpDatabase(Archive *fout) .description = "SECURITY LABEL", .section = SECTION_NONE, .createStmt = seclabelQry->data, - .dropStmt = "", .deps = &dbDumpId, .nDeps = 1)); destroyPQExpBuffer(seclabelQry); @@ -3012,10 +3007,8 @@ dumpDatabase(Archive *fout) ArchiveEntry(fout, nilCatalogId, createDumpId(), ARCHIVE_OPTS(.tag = "pg_largeobject", .description = "pg_largeobject", - .owner = "", .section = SECTION_PRE_DATA, - .createStmt = loOutQry->data, - .dropStmt = "")); + .createStmt = loOutQry->data)); PQclear(lo_res); @@ -3122,10 +3115,8 @@ dumpEncoding(Archive *AH) ArchiveEntry(AH, nilCatalogId, createDumpId(), ARCHIVE_OPTS(.tag = "ENCODING", .description = "ENCODING", - .owner = "", .section = SECTION_PRE_DATA, - .createStmt = qry->data, - .dropStmt = "")); + .createStmt = qry->data)); destroyPQExpBuffer(qry); } @@ -3149,10 +3140,8 @@ dumpStdStrings(Archive *AH) ArchiveEntry(AH, nilCatalogId, createDumpId(), ARCHIVE_OPTS(.tag = "STDSTRINGS", .description = "STDSTRINGS", - .owner = "", .section = SECTION_PRE_DATA, - .createStmt = qry->data, - .dropStmt = "")); + .createStmt = qry->data)); destroyPQExpBuffer(qry); } @@ -3205,10 +3194,8 @@ dumpSearchPath(Archive *AH) ArchiveEntry(AH, nilCatalogId, createDumpId(), ARCHIVE_OPTS(.tag = "SEARCHPATH", .description = "SEARCHPATH", - .owner = "", .section = SECTION_PRE_DATA, - .createStmt = qry->data, - .dropStmt = "")); + .createStmt = qry->data)); /* Also save it in AH->searchpath, in case we're doing plain text dump */ AH->searchpath = pg_strdup(qry->data); @@ -3684,7 +3671,6 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo) .description = "ROW SECURITY", .section = SECTION_POST_DATA, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); @@ -4051,10 +4037,8 @@ dumpPublicationTable(Archive *fout, PublicationRelInfo *pubrinfo) ARCHIVE_OPTS(.tag = tag, .namespace = tbinfo->dobj.namespace->dobj.name, .description = "PUBLICATION TABLE", - .owner = "", .section = SECTION_POST_DATA, - .createStmt = query->data, - .dropStmt = "")); + .createStmt = query->data)); free(tag); destroyPQExpBuffer(query); @@ -9502,7 +9486,6 @@ dumpComment(Archive *fout, const char *type, const char *name, .description = "COMMENT", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &dumpId, .nDeps = 1)); @@ -9572,7 +9555,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, .description = "COMMENT", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); } @@ -9598,7 +9580,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, .description = "COMMENT", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); } @@ -9879,11 +9860,8 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj) te = ArchiveEntry(fout, dobj->catId, dobj->dumpId, ARCHIVE_OPTS(.tag = dobj->name, .description = "BLOBS", - .owner = "", .section = SECTION_DATA, - .dumpFn = dumpBlobs, - .createStmt = "", - .dropStmt = "")); + .dumpFn = dumpBlobs)); /* * Set the TocEntry's dataLength in case we are doing a @@ -10088,7 +10066,6 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo) ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId, ARCHIVE_OPTS(.tag = extinfo->dobj.name, .description = "EXTENSION", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = q->data, .dropStmt = delq->data)); @@ -11232,7 +11209,6 @@ dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo) .description = "COMMENT", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &(tyinfo->dobj.dumpId), .nDeps = 1)); } @@ -11288,8 +11264,7 @@ dumpShellType(Archive *fout, ShellTypeInfo *stinfo) .owner = stinfo->baseType->rolname, .description = "SHELL TYPE", .section = SECTION_PRE_DATA, - .createStmt = q->data, - .dropStmt = "")); + .createStmt = q->data)); destroyPQExpBuffer(q); } @@ -12234,7 +12209,6 @@ dumpCast(Archive *fout, CastInfo *cast) ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId, ARCHIVE_OPTS(.tag = labelq->data, .description = "CAST", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = defqry->data, .dropStmt = delqry->data)); @@ -12362,7 +12336,6 @@ dumpTransform(Archive *fout, TransformInfo *transform) ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId, ARCHIVE_OPTS(.tag = labelq->data, .description = "TRANSFORM", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = defqry->data, .dropStmt = delqry->data, @@ -12749,7 +12722,6 @@ dumpAccessMethod(Archive *fout, AccessMethodInfo *aminfo) ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId, ARCHIVE_OPTS(.tag = aminfo->dobj.name, .description = "ACCESS METHOD", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = q->data, .dropStmt = delq->data)); @@ -14211,7 +14183,6 @@ dumpTSParser(Archive *fout, TSParserInfo *prsinfo) ARCHIVE_OPTS(.tag = prsinfo->dobj.name, .namespace = prsinfo->dobj.namespace->dobj.name, .description = "TEXT SEARCH PARSER", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = q->data, .dropStmt = delq->data)); @@ -14350,7 +14321,6 @@ dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo) ARCHIVE_OPTS(.tag = tmplinfo->dobj.name, .namespace = tmplinfo->dobj.namespace->dobj.name, .description = "TEXT SEARCH TEMPLATE", - .owner = "", .section = SECTION_PRE_DATA, .createStmt = q->data, .dropStmt = delq->data)); @@ -14819,8 +14789,7 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo) .owner = daclinfo->defaclrole, .description = "DEFAULT ACL", .section = SECTION_POST_DATA, - .createStmt = q->data, - .dropStmt = "")); + .createStmt = q->data)); destroyPQExpBuffer(tag); destroyPQExpBuffer(q); @@ -14916,7 +14885,6 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId, .description = "ACL", .section = SECTION_NONE, .createStmt = sql->data, - .dropStmt = "", .deps = &objDumpId, .nDeps = 1)); destroyPQExpBuffer(tag); @@ -15006,7 +14974,6 @@ dumpSecLabel(Archive *fout, const char *type, const char *name, .description = "SECURITY LABEL", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &dumpId, .nDeps = 1)); destroyPQExpBuffer(tag); @@ -15090,7 +15057,6 @@ dumpTableSecLabel(Archive *fout, TableInfo *tbinfo, const char *reltypename) .description = "SECURITY LABEL", .section = SECTION_NONE, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); } @@ -16438,10 +16404,8 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo) ARCHIVE_OPTS(.tag = attachinfo->dobj.name, .namespace = attachinfo->dobj.namespace->dobj.name, .description = "INDEX ATTACH", - .owner = "", .section = SECTION_POST_DATA, - .createStmt = q->data, - .dropStmt = "")); + .createStmt = q->data)); destroyPQExpBuffer(q); } @@ -17071,7 +17035,6 @@ dumpSequence(Archive *fout, TableInfo *tbinfo) .description = "SEQUENCE OWNED BY", .section = SECTION_PRE_DATA, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); } @@ -17140,7 +17103,6 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo) .description = "SEQUENCE SET", .section = SECTION_DATA, .createStmt = query->data, - .dropStmt = "", .deps = &(tbinfo->dobj.dumpId), .nDeps = 1)); -- 2.39.5