From 8f0ee46dcb9dcf522cfa6475479ac8d67a9078fc Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 3 Aug 2001 19:43:05 +0000
Subject: [PATCH] Fix pg_dump so that comments on views are dumped in the
 proper sequence. Dump the alignment and storage information for user-defined
 types (how'd that manage to slip through the cracks?), and don't dump 'shell'
 types that don't have typisdefined set.  Fix badly broken logic for
 dependencies of type definitions (did not work for more than one user-defined
 type...). Avoid memory leakage within pg_dump by being more careful to
 release storage used by PQExpBuffer objects.

---
 src/bin/pg_dump/pg_backup_db.c |  26 +++-
 src/bin/pg_dump/pg_dump.c      | 220 +++++++++++++++++++++++----------
 src/bin/pg_dump/pg_dump.h      |   5 +-
 3 files changed, 180 insertions(+), 71 deletions(-)

diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 51a05646cd1..fc5864bc693 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -5,7 +5,7 @@
  *	Implements the basic DB functions used by the archiver.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.21 2001/07/03 20:21:48 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.22 2001/08/03 19:43:05 tgl Exp $
  *
  * NOTES
  *
@@ -207,6 +207,8 @@ UserIsSuperuser(ArchiveHandle *AH, char *user)
 	}
 	PQclear(res);
 
+	destroyPQExpBuffer(qry);
+
 	return isSuper;
 }
 
@@ -678,7 +680,7 @@ ExecuteSqlCommandBuf(ArchiveHandle *AH, void *qryv, int bufLen)
 void
 FixupBlobRefs(ArchiveHandle *AH, char *tablename)
 {
-	PQExpBuffer tblQry = createPQExpBuffer();
+	PQExpBuffer tblQry;
 	PGresult   *res,
 			   *uRes;
 	int			i,
@@ -688,6 +690,8 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename)
 	if (strcmp(tablename, BLOB_XREF_TABLE) == 0)
 		return;
 
+	tblQry = createPQExpBuffer();
+
 	appendPQExpBuffer(tblQry, "SELECT a.attname FROM pg_class c, pg_attribute a, pg_type t "
 	 " WHERE a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid "
 			  " AND t.typname = 'oid' AND c.relname = '%s';", tablename);
@@ -699,10 +703,8 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename)
 
 	if ((n = PQntuples(res)) == 0)
 	{
-		/* We're done */
+		/* nothing to do */
 		ahlog(AH, 1, "no OID type columns in table %s\n", tablename);
-		PQclear(res);
-		return;
 	}
 
 	for (i = 0; i < n; i++)
@@ -741,7 +743,7 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename)
 	}
 
 	PQclear(res);
-
+	destroyPQExpBuffer(tblQry);
 }
 
 /**********
@@ -766,6 +768,8 @@ CreateBlobXrefTable(ArchiveHandle *AH)
 
 	appendPQExpBuffer(qry, "Create Unique Index %s_ix on %s(oldOid)", BLOB_XREF_TABLE, BLOB_XREF_TABLE);
 	ExecuteSqlCommand(AH, qry, "could not create index on BLOB cross reference table", true);
+
+	destroyPQExpBuffer(qry);
 }
 
 void
@@ -776,6 +780,8 @@ InsertBlobXref(ArchiveHandle *AH, int old, int new)
 	appendPQExpBuffer(qry, "Insert Into %s(oldOid, newOid) Values (%d, %d);", BLOB_XREF_TABLE, old, new);
 
 	ExecuteSqlCommand(AH, qry, "could not create BLOB cross reference entry", true);
+
+	destroyPQExpBuffer(qry);
 }
 
 void
@@ -787,6 +793,8 @@ StartTransaction(ArchiveHandle *AH)
 
 	ExecuteSqlCommand(AH, qry, "could not start database transaction", false);
 	AH->txActive = true;
+
+	destroyPQExpBuffer(qry);
 }
 
 void
@@ -799,6 +807,8 @@ StartTransactionXref(ArchiveHandle *AH)
 	ExecuteSqlCommand(AH, qry,
 					  "could not start transaction for BLOB cross references", true);
 	AH->blobTxActive = true;
+
+	destroyPQExpBuffer(qry);
 }
 
 void
@@ -810,6 +820,8 @@ CommitTransaction(ArchiveHandle *AH)
 
 	ExecuteSqlCommand(AH, qry, "could not commit database transaction", false);
 	AH->txActive = false;
+
+	destroyPQExpBuffer(qry);
 }
 
 void
@@ -821,4 +833,6 @@ CommitTransactionXref(ArchiveHandle *AH)
 
 	ExecuteSqlCommand(AH, qry, "could not commit transaction for BLOB cross references", true);
 	AH->blobTxActive = false;
+
+	destroyPQExpBuffer(qry);
 }
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 1a18bb223c4..c2bcbce4450 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.216 2001/07/29 22:12:23 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.217 2001/08/03 19:43:05 tgl Exp $
  *
  * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
  *
@@ -182,7 +182,8 @@ typedef enum _formatLiteralOptions
 	/* only checks for 'opts == CONV_ALL' anyway. */
 } formatLiteralOptions;
 
-static void dumpComment(Archive *outfile, const char *target, const char *oid);
+static void dumpComment(Archive *outfile, const char *target, const char *oid,
+						const char *((*deps)[]));
 static void dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool dataOnly);
 static void dumpACL(Archive *fout, TableInfo tbinfo);
 static void dumpTriggers(Archive *fout, const char *tablename,
@@ -571,6 +572,7 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv)
 		archprintf(fout, ");\n");
 	}
 	PQclear(res);
+	destroyPQExpBuffer(q);
 	return 1;
 }
 
@@ -1202,6 +1204,10 @@ dumpDatabase(Archive *AH)
 
 	PQclear(res);
 
+	destroyPQExpBuffer(dbQry);
+	destroyPQExpBuffer(delQry);
+	destroyPQExpBuffer(creaQry);
+
 	return 1;
 }
 
@@ -1298,6 +1304,9 @@ dumpBlobs(Archive *AH, char *junkOid, void *junkVal)
 		}
 	} while (PQntuples(res) > 0);
 
+	destroyPQExpBuffer(oidQry);
+	destroyPQExpBuffer(oidFetchQry);
+
 	return 1;
 }
 
@@ -1331,7 +1340,10 @@ getTypes(int *numTypes)
 	int			i_typdelim;
 	int			i_typdefault;
 	int			i_typrelid;
+	int			i_typalign;
+	int			i_typstorage;
 	int			i_typbyval;
+	int			i_typisdefined;
 	int			i_usename;
 	int			i_typedefn;
 
@@ -1340,9 +1352,7 @@ getTypes(int *numTypes)
 	/*
 	 * we include even the built-in types because those may be used as
 	 * array elements by user-defined types
-	 */
-
-	/*
+	 *
 	 * we filter out the built-in types when we dump out the types
 	 */
 
@@ -1350,14 +1360,14 @@ getTypes(int *numTypes)
 	{
 		appendPQExpBuffer(query, "SELECT pg_type.oid, typowner, typname, typlen, typprtlen, "
 						"typinput, typoutput, typreceive, typsend, typelem, typdelim, "
-						"typdefault, typrelid, typbyval, "
+						"typdefault, typrelid, typalign, 'p'::char as typstorage, typbyval, typisdefined, "
 						"(select usename from pg_user where typowner = usesysid) as usename, "
 						"typname as typedefn "
 						"from pg_type");
 	} else {
 		appendPQExpBuffer(query, "SELECT pg_type.oid, typowner, typname, typlen, typprtlen, "
 						"typinput, typoutput, typreceive, typsend, typelem, typdelim, "
-						"typdefault, typrelid, typbyval, "
+						"typdefault, typrelid, typalign, typstorage, typbyval, typisdefined, "
 						"(select usename from pg_user where typowner = usesysid) as usename, "
 						"format_type(pg_type.oid, NULL) as typedefn "
 						"from pg_type");
@@ -1388,7 +1398,10 @@ getTypes(int *numTypes)
 	i_typdelim = PQfnumber(res, "typdelim");
 	i_typdefault = PQfnumber(res, "typdefault");
 	i_typrelid = PQfnumber(res, "typrelid");
+	i_typalign = PQfnumber(res, "typalign");
+	i_typstorage = PQfnumber(res, "typstorage");
 	i_typbyval = PQfnumber(res, "typbyval");
+	i_typisdefined = PQfnumber(res, "typisdefined");
 	i_usename = PQfnumber(res, "usename");
 	i_typedefn = PQfnumber(res, "typedefn");
 
@@ -1407,6 +1420,8 @@ getTypes(int *numTypes)
 		tinfo[i].typdelim = strdup(PQgetvalue(res, i, i_typdelim));
 		tinfo[i].typdefault = strdup(PQgetvalue(res, i, i_typdefault));
 		tinfo[i].typrelid = strdup(PQgetvalue(res, i, i_typrelid));
+		tinfo[i].typalign = strdup(PQgetvalue(res, i, i_typalign));
+		tinfo[i].typstorage = strdup(PQgetvalue(res, i, i_typstorage));
 		tinfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
 		tinfo[i].typedefn = strdup(PQgetvalue(res, i, i_typedefn));
 
@@ -1427,12 +1442,19 @@ getTypes(int *numTypes)
 			tinfo[i].isArray = 1;
 		else
 			tinfo[i].isArray = 0;
+
+		if (strcmp(PQgetvalue(res, i, i_typisdefined), "f") == 0)
+			tinfo[i].isDefined = 0;
+		else
+			tinfo[i].isDefined = 1;
 	}
 
 	*numTypes = ntups;
 
 	PQclear(res);
 
+	destroyPQExpBuffer(query);
+
 	return tinfo;
 }
 
@@ -1534,6 +1556,8 @@ getOperators(int *numOprs)
 
 	PQclear(res);
 
+	destroyPQExpBuffer(query);
+
 	return oprinfo;
 }
 
@@ -1570,8 +1594,14 @@ clearTypeInfo(TypeInfo *tp, int numTypes)
 			free(tp[i].typdefault);
 		if (tp[i].typrelid)
 			free(tp[i].typrelid);
+		if (tp[i].typalign)
+			free(tp[i].typalign);
+		if (tp[i].typstorage)
+			free(tp[i].typstorage);
 		if (tp[i].usename)
 			free(tp[i].usename);
+		if (tp[i].typedefn)
+			free(tp[i].typedefn);
 	}
 	free(tp);
 }
@@ -1893,6 +1923,8 @@ getAggregates(int *numAggs)
 
 	PQclear(res);
 
+	destroyPQExpBuffer(query);
+
 	return agginfo;
 }
 
@@ -2014,8 +2046,9 @@ getFuncs(int *numFuncs)
 
 	PQclear(res);
 
-	return finfo;
+	destroyPQExpBuffer(query);
 
+	return finfo;
 }
 
 /*
@@ -2610,8 +2643,10 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
 
 	PQclear(res);
 
-	return tblinfo;
+	destroyPQExpBuffer(query);
+	destroyPQExpBuffer(delqry);
 
+	return tblinfo;
 }
 
 /*
@@ -2664,6 +2699,9 @@ getInherits(int *numInherits)
 	}
 
 	PQclear(res);
+
+	destroyPQExpBuffer(query);
+
 	return inhinfo;
 }
 
@@ -2695,7 +2733,6 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
 
 	for (i = 0; i < numTables; i++)
 	{
-
 		if (tblinfo[i].sequence)
 			continue;
 
@@ -2831,6 +2868,8 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
 		}
 		PQclear(res);
 	}
+
+	destroyPQExpBuffer(q);
 }
 
 
@@ -2937,6 +2976,9 @@ getIndexes(int *numIndexes)
 		indinfo[i].indhaspred = strdup(PQgetvalue(res, i, i_indhaspred));
 	}
 	PQclear(res);
+
+	destroyPQExpBuffer(query);
+
 	return indinfo;
 }
 
@@ -2947,16 +2989,17 @@ getIndexes(int *numIndexes)
  * oid handed to this routine. The routine takes a constant character
  * string for the target part of the object and the oid of the object
  * whose comments are to be dumped. It is perfectly acceptable
- * to hand an oid to this routine which has not been commented. In
- * addition, the routine takes the stdio FILE handle to which the
- * output should be written.
+ * to hand an oid to this routine which has not been commented.  Additional
+ * dependencies can be passed for the comment, too --- this is needed for
+ * VIEWs, whose comments are filed under the table OID but which are dumped
+ * in order by their rule OID.
  *------------------------------------------------------------------
 */
 
 static void
-dumpComment(Archive *fout, const char *target, const char *oid)
+dumpComment(Archive *fout, const char *target, const char *oid,
+			const char *((*deps)[]))
 {
-
 	PGresult   *res;
 	PQExpBuffer query;
 	int			i_description;
@@ -2991,7 +3034,8 @@ dumpComment(Archive *fout, const char *target, const char *oid)
 		formatStringLiteral(query, PQgetvalue(res, 0, i_description), PASS_LFTAB);
 		appendPQExpBuffer(query, ";\n");
 
-		ArchiveEntry(fout, oid, target, "COMMENT", NULL, query->data, "" /* Del */ ,
+		ArchiveEntry(fout, oid, target, "COMMENT", deps,
+					 query->data, "" /* Del */ ,
 					 "" /* Copy */ , "" /* Owner */ , NULL, NULL);
 
 	}
@@ -2999,7 +3043,7 @@ dumpComment(Archive *fout, const char *target, const char *oid)
 	/*** Clear the statement buffer and return ***/
 
 	PQclear(res);
-
+	destroyPQExpBuffer(query);
 }
 
 /*------------------------------------------------------------------
@@ -3015,7 +3059,6 @@ dumpComment(Archive *fout, const char *target, const char *oid)
 void
 dumpDBComment(Archive *fout)
 {
-
 	PGresult   *res;
 	PQExpBuffer query;
 	int			i_oid;
@@ -3043,13 +3086,13 @@ dumpDBComment(Archive *fout)
 		i_oid = PQfnumber(res, "oid");
 		resetPQExpBuffer(query);
 		appendPQExpBuffer(query, "DATABASE %s", fmtId(PQdb(g_conn), force_quotes));
-		dumpComment(fout, query->data, PQgetvalue(res, 0, i_oid));
+		dumpComment(fout, query->data, PQgetvalue(res, 0, i_oid), NULL);
 	}
 
 	/*** Clear the statement buffer and return ***/
 
 	PQclear(res);
-
+	destroyPQExpBuffer(query);
 }
 
 /*
@@ -3066,13 +3109,10 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 	PQExpBuffer delq = createPQExpBuffer();
 	int			funcInd;
 	const char *((*deps)[]);
-	int			depIdx = 0;
-
-	deps = malloc(sizeof(char*) * 10);
+	int			depIdx;
 
 	for (i = 0; i < numTypes; i++)
 	{
-
 		/* skip all the builtin types */
 		if (atooid(tinfo[i].oid) <= g_last_builtin_oid)
 			continue;
@@ -3081,11 +3121,18 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 		if (atoi(tinfo[i].typrelid) != 0)
 			continue;
 
+		/* skip undefined placeholder types */
+		if (!tinfo[i].isDefined)
+			continue;
+
 		/* skip all array types that start w/ underscore */
 		if ((tinfo[i].typname[0] == '_') &&
 			(strcmp(tinfo[i].typinput, "array_in") == 0))
 			continue;
 
+		deps = malloc(sizeof(char*) * 10);
+		depIdx = 0;
+
 		/*
 		 * before we create a type, we need to create the input and output
 		 * functions for it, if they haven't been created already
@@ -3104,6 +3151,7 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 			dumpOneFunc(fout, finfo, funcInd, tinfo, numTypes);
 		}
 
+		resetPQExpBuffer(delq);
 		appendPQExpBuffer(delq, "DROP TYPE %s;\n", fmtId(tinfo[i].typname, force_quotes));
 
 		resetPQExpBuffer(q);
@@ -3133,8 +3181,6 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 			{
 				write_msg(NULL, "notice: array type %s - type for elements (oid %s) is not dumped\n",
 						  tinfo[i].typname, tinfo[i].typelem);
-				resetPQExpBuffer(q);
-				resetPQExpBuffer(delq);
 				continue;
 			}
 
@@ -3143,8 +3189,24 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 
 			(*deps)[depIdx++] = strdup(tinfo[i].typelem);
 		}
+
+		/* XXX these are all the aligns currently handled by DefineType */
+		if (strcmp(tinfo[i].typalign, "i") == 0)
+			appendPQExpBuffer(q, ", alignment = int4");
+		else if (strcmp(tinfo[i].typalign, "d") == 0)
+			appendPQExpBuffer(q, ", alignment = double");
+
+		if (strcmp(tinfo[i].typstorage, "p") == 0)
+			appendPQExpBuffer(q, ", storage = plain");
+		if (strcmp(tinfo[i].typstorage, "e") == 0)
+			appendPQExpBuffer(q, ", storage = external");
+		if (strcmp(tinfo[i].typstorage, "x") == 0)
+			appendPQExpBuffer(q, ", storage = extended");
+		if (strcmp(tinfo[i].typstorage, "m") == 0)
+			appendPQExpBuffer(q, ", storage = main");
+
 		if (tinfo[i].passedbyvalue)
-			appendPQExpBuffer(q, ",passedbyvalue);\n");
+			appendPQExpBuffer(q, ", passedbyvalue);\n");
 		else
 			appendPQExpBuffer(q, ");\n");
 
@@ -3156,13 +3218,13 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
 		/*** Dump Type Comments ***/
 
 		resetPQExpBuffer(q);
-		resetPQExpBuffer(delq);
 
 		appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo[i].typname, force_quotes));
-		dumpComment(fout, q->data, tinfo[i].oid);
-
-		resetPQExpBuffer(q);
+		dumpComment(fout, q->data, tinfo[i].oid, NULL);
 	}
+
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(delq);
 }
 
 /*
@@ -3258,6 +3320,9 @@ dumpProcLangs(Archive *fout, FuncInfo *finfo, int numFuncs,
 
 	PQclear(res);
 
+	destroyPQExpBuffer(query);
+	destroyPQExpBuffer(defqry);
+	destroyPQExpBuffer(delqry);
 }
 
 /*
@@ -3290,11 +3355,11 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
 	PQExpBuffer fn = createPQExpBuffer();
 	PQExpBuffer delqry = createPQExpBuffer();
 	PQExpBuffer fnlist = createPQExpBuffer();
-	int			j;
 	PQExpBuffer asPart = createPQExpBuffer();
 	char		func_lang[NAMEDATALEN + 1];
 	PGresult   *res;
 	int			nlangs;
+	int			j;
 	int			i_lanname;
 	char		query[256];
 
@@ -3304,9 +3369,9 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
 	char	   *rettypename;
 
 	if (finfo[i].dumped)
-		return;
-	else
-		finfo[i].dumped = 1;
+		goto done;
+
+	finfo[i].dumped = 1;
 
 	/* becomeUser(fout, finfo[i].usename); */
 
@@ -3370,12 +3435,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
 
 			write_msg(NULL, "reason: data type name of argument %d (oid %s) not found\n",
 					   j, finfo[i].argtypes[j]);
-			resetPQExpBuffer(q);
-			resetPQExpBuffer(fn);
-			resetPQExpBuffer(delqry);
-			resetPQExpBuffer(fnlist);
-			resetPQExpBuffer(asPart);
-			return;
+			goto done;
 		}
 
 		appendPQExpBuffer(fn, "%s%s",
@@ -3399,12 +3459,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
 
 		write_msg(NULL, "reason: name of return data type (oid %s) not found\n",
 				  finfo[i].prorettype);
-		resetPQExpBuffer(q);
-		resetPQExpBuffer(fn);
-		resetPQExpBuffer(delqry);
-		resetPQExpBuffer(fnlist);
-		resetPQExpBuffer(asPart);
-		return;
+		goto done;
 	}
 
 	resetPQExpBuffer(q);
@@ -3445,8 +3500,14 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
 	appendPQExpBuffer(q, "FUNCTION %s ",
 					  fmtId(finfo[i].proname, force_quotes));
 	appendPQExpBuffer(q, "( %s )", fnlist->data);
-	dumpComment(fout, q->data, finfo[i].oid);
-
+	dumpComment(fout, q->data, finfo[i].oid, NULL);
+
+done:
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(fn);
+	destroyPQExpBuffer(delqry);
+	destroyPQExpBuffer(fnlist);
+	destroyPQExpBuffer(asPart);
 }
 
 /*
@@ -3617,6 +3678,17 @@ dumpOprs(Archive *fout, OprInfo *oprinfo, int numOperators,
 		ArchiveEntry(fout, oprinfo[i].oid, oprinfo[i].oprname, "OPERATOR", NULL,
 				q->data, delq->data, "", oprinfo[i].usename, NULL, NULL);
 	}
+
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(delq);
+	destroyPQExpBuffer(leftarg);
+	destroyPQExpBuffer(rightarg);
+	destroyPQExpBuffer(commutator);
+	destroyPQExpBuffer(negator);
+	destroyPQExpBuffer(restrictor);
+	destroyPQExpBuffer(join);
+	destroyPQExpBuffer(sort1);
+	destroyPQExpBuffer(sort2);
 }
 
 /*
@@ -3723,9 +3795,13 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
 		resetPQExpBuffer(q);
 		appendPQExpBuffer(q, "AGGREGATE %s %s", agginfo[i].aggname,
 						  findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype, zeroAsOpaque + useBaseTypeName));
-		dumpComment(fout, q->data, agginfo[i].oid);
-
+		dumpComment(fout, q->data, agginfo[i].oid, NULL);
 	}
+
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(delq);
+	destroyPQExpBuffer(aggSig);
+	destroyPQExpBuffer(details);
 }
 
 /*
@@ -3981,6 +4057,7 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
 	int			actual_atts;	/* number of attrs in this CREATE statment */
 	char	   *reltypename;
 	char	   *objoid;
+	const char *((*commentDeps)[]);
 
 	/* First - dump SEQUENCEs */
 	if (tablename && strlen(tablename) > 0)
@@ -4023,12 +4100,15 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
 				objoid = tblinfo[i].viewoid;
 				appendPQExpBuffer(delq, "DROP VIEW %s;\n", fmtId(tblinfo[i].relname, force_quotes));
 				appendPQExpBuffer(q, "CREATE VIEW %s as %s\n", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef);
-
+				commentDeps = malloc(sizeof(char*) * 2);
+				(*commentDeps)[0] = strdup(objoid);
+				(*commentDeps)[1] = NULL; /* end of list */
 			}
 			else
 			{
 				reltypename = "TABLE";
 				objoid = tblinfo[i].oid;
+				commentDeps = NULL;
 				parentRels = tblinfo[i].parentRels;
 				numParents = tblinfo[i].numParents;
 
@@ -4148,17 +4228,20 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
 				appendPQExpBuffer(q, "COLUMN %s", fmtId(tblinfo[i].relname, force_quotes));
 				appendPQExpBuffer(q, ".");
 				appendPQExpBuffer(q, "%s", fmtId(tblinfo[i].attnames[j], force_quotes));
-				dumpComment(fout, q->data, tblinfo[i].attoids[j]);
+				dumpComment(fout, q->data, tblinfo[i].attoids[j], NULL);
 			}
 
 			/* Dump Table Comments */
 
 			resetPQExpBuffer(q);
 			appendPQExpBuffer(q, "%s %s", reltypename, fmtId(tblinfo[i].relname, force_quotes));
-			dumpComment(fout, q->data, tblinfo[i].oid);
+			dumpComment(fout, q->data, tblinfo[i].oid, commentDeps);
 
 		}
 	}
+
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(delq);
 }
 
 static PQExpBuffer
@@ -4237,16 +4320,15 @@ dumpIndexes(Archive *fout, IndInfo *indinfo, int numIndexes,
 				k;
 	int			tableInd;
 	PQExpBuffer attlist = createPQExpBuffer();
+	PQExpBuffer q = createPQExpBuffer();
+	PQExpBuffer delq = createPQExpBuffer();
+	PQExpBuffer id1 = createPQExpBuffer();
+	PQExpBuffer id2 = createPQExpBuffer();
 	char	   *classname[INDEX_MAX_KEYS];
 	char	   *funcname;		/* the name of the function to comput the
 								 * index key from */
 	int			indclass;
 	int			nclass;
-
-	PQExpBuffer q = createPQExpBuffer(),
-				delq = createPQExpBuffer(),
-				id1 = createPQExpBuffer(),
-				id2 = createPQExpBuffer();
 	PGresult   *res;
 
 	for (i = 0; i < numIndexes; i++)
@@ -4475,11 +4557,16 @@ dumpIndexes(Archive *fout, IndInfo *indinfo, int numIndexes,
 			/* Dump Index Comments */
 			resetPQExpBuffer(q);
 			appendPQExpBuffer(q, "INDEX %s", id1->data);
-			dumpComment(fout, q->data, indinfo[i].indexreloid);
+			dumpComment(fout, q->data, indinfo[i].indexreloid, NULL);
 
 		}
 	}
 
+	destroyPQExpBuffer(attlist);
+	destroyPQExpBuffer(q);
+	destroyPQExpBuffer(delq);
+	destroyPQExpBuffer(id1);
+	destroyPQExpBuffer(id2);
 }
 
 /*
@@ -4640,6 +4727,7 @@ findLastBuiltinOid_V71(const char *dbname)
 	}
 	last_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "datlastsysoid")));
 	PQclear(res);
+	destroyPQExpBuffer(query);
 	return last_oid;
 }
 
@@ -4722,7 +4810,6 @@ dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool
 		exit_nicely();
 	}
 
-
 	last = atoi(PQgetvalue(res, 0, 1));
 	incby = atoi(PQgetvalue(res, 0, 2));
 	maxv = atoi(PQgetvalue(res, 0, 3));
@@ -4779,8 +4866,11 @@ dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool
 
 		resetPQExpBuffer(query);
 		appendPQExpBuffer(query, "SEQUENCE %s", fmtId(tbinfo.relname, force_quotes));
-		dumpComment(fout, query->data, tbinfo.oid);
+		dumpComment(fout, query->data, tbinfo.oid, NULL);
 	}
+
+	destroyPQExpBuffer(query);
+	destroyPQExpBuffer(delqry);
 }
 
 
@@ -4804,7 +4894,7 @@ dumpTriggers(Archive *fout, const char *tablename,
 			ArchiveEntry(fout, tblinfo[i].triggers[j].oid, tblinfo[i].triggers[j].tgname,
 				   "TRIGGER", NULL, tblinfo[i].triggers[j].tgsrc, "", "",
 						 tblinfo[i].usename, NULL, NULL);
-			dumpComment(fout, tblinfo[i].triggers[j].tgcomment, tblinfo[i].triggers[j].oid);
+			dumpComment(fout, tblinfo[i].triggers[j].tgcomment, tblinfo[i].triggers[j].oid, NULL);
 		}
 	}
 }
@@ -4883,10 +4973,12 @@ dumpRules(Archive *fout, const char *tablename,
 
 			resetPQExpBuffer(query);
 			appendPQExpBuffer(query, "RULE %s", fmtId(PQgetvalue(res, i, i_rulename), force_quotes));
-			dumpComment(fout, query->data, PQgetvalue(res, i, i_oid));
+			dumpComment(fout, query->data, PQgetvalue(res, i, i_oid), NULL);
 
 		}
 
 		PQclear(res);
 	}
+
+	destroyPQExpBuffer(query);
 }
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 180b7f87efb..5ddbcf36317 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_dump.h,v 1.67 2001/07/17 00:30:35 tgl Exp $
+ * $Id: pg_dump.h,v 1.68 2001/08/03 19:43:05 tgl Exp $
  *
  * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
  *
@@ -49,10 +49,13 @@ typedef struct _typeInfo
 	char	   *typdelim;
 	char	   *typdefault;
 	char	   *typrelid;
+	char	   *typalign;
+	char	   *typstorage;
 	char	   *usename;
 	char	   *typedefn;
 	int			passedbyvalue;
 	int			isArray;
+	int			isDefined;
 } TypeInfo;
 
 typedef struct _funcInfo
-- 
GitLab