From 6789c52e5b9b79cc04ec0c0a497c21a757b64ac5 Mon Sep 17 00:00:00 2001
From: erthalion <9erthalion6@gmail.com>
Date: Sun, 10 Mar 2019 22:00:00 +0100
Subject: [PATCH] ArchiveEntry null handling

Use NULL as an empty value for owner, defn and dropStmt in ArchiveEntry.
---
 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 62bf1493aa..6273ce3dc1 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -1092,10 +1092,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)
@@ -3650,7 +3650,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);
 	}
 
@@ -3661,7 +3661,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 2015b735ae..e2cb54695f 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 4c98ae4d7f..6224d8409f 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2243,8 +2243,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,
@@ -2299,7 +2297,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);
 
@@ -3123,10 +3116,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);
 }
@@ -3151,10 +3142,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);
 }
@@ -3208,10 +3197,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);
@@ -3692,7 +3679,6 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
 									  .description = "ROW SECURITY",
 									  .section = SECTION_POST_DATA,
 									  .createStmt = query->data,
-									  .dropStmt = "",
 									  .deps = &(tbinfo->dobj.dumpId),
 									  .nDeps = 1));
 
@@ -4060,10 +4046,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);
@@ -9505,7 +9489,6 @@ dumpComment(Archive *fout, const char *type, const char *name,
 								  .description = "COMMENT",
 								  .section = SECTION_NONE,
 								  .createStmt = query->data,
-								  .dropStmt = "",
 								  .deps = &dumpId,
 								  .nDeps = 1));
 
@@ -9575,7 +9558,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
 									  .description = "COMMENT",
 									  .section = SECTION_NONE,
 									  .createStmt = query->data,
-									  .dropStmt = "",
 									  .deps = &(tbinfo->dobj.dumpId),
 									  .nDeps = 1));
 		}
@@ -9601,7 +9583,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
 									  .description = "COMMENT",
 									  .section = SECTION_NONE,
 									  .createStmt = query->data,
-									  .dropStmt = "",
 									  .deps = &(tbinfo->dobj.dumpId),
 									  .nDeps = 1));
 		}
@@ -9882,11 +9863,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
@@ -10091,7 +10069,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));
@@ -11235,7 +11212,6 @@ dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo)
 									  .description = "COMMENT",
 									  .section = SECTION_NONE,
 									  .createStmt = query->data,
-									  .dropStmt = "",
 									  .deps = &(tyinfo->dobj.dumpId),
 									  .nDeps = 1));
 		}
@@ -11291,8 +11267,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);
 }
@@ -12237,7 +12212,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));
@@ -12365,7 +12339,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,
@@ -12752,7 +12725,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));
@@ -14204,7 +14176,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));
@@ -14343,7 +14314,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));
@@ -14813,8 +14783,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);
@@ -14912,7 +14881,6 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
 								  .description = "ACL",
 								  .section = SECTION_NONE,
 								  .createStmt = sql->data,
-								  .dropStmt = "",
 								  .deps = &objDumpId,
 								  .nDeps = 1));
 		destroyPQExpBuffer(tag);
@@ -15002,7 +14970,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);
@@ -15086,7 +15053,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));
 	}
@@ -16454,10 +16420,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);
 	}
@@ -17087,7 +17051,6 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
 										  .description = "SEQUENCE OWNED BY",
 										  .section = SECTION_PRE_DATA,
 										  .createStmt = query->data,
-										  .dropStmt = "",
 										  .deps = &(tbinfo->dobj.dumpId),
 										  .nDeps = 1));
 		}
@@ -17156,7 +17119,6 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo)
 								  .description = "SEQUENCE SET",
 								  .section = SECTION_DATA,
 								  .createStmt = query->data,
-								  .dropStmt = "",
 								  .deps = &(tbinfo->dobj.dumpId),
 								  .nDeps = 1));
 
-- 
2.16.4

