diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 51a05646cd1e097588da295e33df06dcdb0fe0ce..fc5864bc693bbff3d5259b13df786f1bfbef0af1 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 1a18bb223c4c425972fb68e623a2f642589f0fb4..c2bcbce44500cb4e457fb7d9d37568d7eb2a94e8 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 180b7f87efb3d76ba70d03df78fb68857df5be2e..5ddbcf3631753b5534e4d0ff60f01b665c9bcdb0 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