diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index ca4b15ef2f862df7272a628185837dfd45819c26..f3bcba9143044348a97ae0ce41a47b0667e83651 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -12,7 +12,7 @@
  *	by PostgreSQL
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.513 2009/01/06 18:01:57 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.514 2009/01/18 20:44:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1008,28 +1008,39 @@ selectDumpableTable(TableInfo *tbinfo)
 /*
  * selectDumpableType: policy-setting subroutine
  *		Mark a type as to be dumped or not
+ *
+ * If it's a table's rowtype or an autogenerated array type, we also apply a
+ * special type code to facilitate sorting into the desired order.  (We don't
+ * want to consider those to be ordinary types because that would bring tables
+ * up into the datatype part of the dump order.)  Those tests should be made
+ * first to ensure the objType change is applied regardless of namespace etc.
  */
 static void
 selectDumpableType(TypeInfo *tinfo)
 {
-	/* Dump only types in dumpable namespaces */
-	if (!tinfo->dobj.namespace->dobj.dump)
+	/* skip complex types, except for standalone composite types */
+	if (OidIsValid(tinfo->typrelid) &&
+		tinfo->typrelkind != RELKIND_COMPOSITE_TYPE)
+	{
 		tinfo->dobj.dump = false;
+		tinfo->dobj.objType = DO_DUMMY_TYPE;
+	}
 
-	/* skip complex types, except for standalone composite types */
-	/* (note: this test should now be unnecessary) */
-	else if (OidIsValid(tinfo->typrelid) &&
-			 tinfo->typrelkind != RELKIND_COMPOSITE_TYPE)
+	/* skip auto-generated array types */
+	else if (tinfo->isArray)
+	{
+		tinfo->dobj.dump = false;
+		tinfo->dobj.objType = DO_DUMMY_TYPE;
+	}
+
+	/* dump only types in dumpable namespaces */
+	else if (!tinfo->dobj.namespace->dobj.dump)
 		tinfo->dobj.dump = false;
 
 	/* skip undefined placeholder types */
 	else if (!tinfo->isDefined)
 		tinfo->dobj.dump = false;
 
-	/* skip auto-generated array types */
-	else if (tinfo->isArray)
-		tinfo->dobj.dump = false;
-
 	else
 		tinfo->dobj.dump = true;
 }
@@ -2310,16 +2321,6 @@ getTypes(int *numTypes)
 		tinfo[i].typtype = *PQgetvalue(res, i, i_typtype);
 		tinfo[i].shellType = NULL;
 
-		/*
-		 * If it's a table's rowtype, use special type code to facilitate
-		 * sorting into the desired order.	(We don't want to consider it an
-		 * ordinary type because that would bring the table up into the
-		 * datatype part of the dump order.)
-		 */
-		if (OidIsValid(tinfo[i].typrelid) &&
-			tinfo[i].typrelkind != RELKIND_COMPOSITE_TYPE)
-			tinfo[i].dobj.objType = DO_TABLE_TYPE;
-
 		if (strcmp(PQgetvalue(res, i, i_typisdefined), "t") == 0)
 			tinfo[i].isDefined = true;
 		else
@@ -5836,8 +5837,8 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj)
 		case DO_TABLE_DATA:
 			dumpTableData(fout, (TableDataInfo *) dobj);
 			break;
-		case DO_TABLE_TYPE:
-			/* table rowtypes are never dumped separately */
+		case DO_DUMMY_TYPE:
+			/* table rowtypes and array types are never dumped separately */
 			break;
 		case DO_TSPARSER:
 			dumpTSParser(fout, (TSParserInfo *) dobj);
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 0e938c851ecebdac1880870a02eeea81d9959e54..d77d7d32ad58a55d70c7f95d9efb1bfda4799a6e 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-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.146 2009/01/07 03:39:33 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.147 2009/01/18 20:44:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -107,7 +107,7 @@ typedef enum
 	DO_PROCLANG,
 	DO_CAST,
 	DO_TABLE_DATA,
-	DO_TABLE_TYPE,
+	DO_DUMMY_TYPE,
 	DO_TSPARSER,
 	DO_TSDICT,
 	DO_TSTEMPLATE,
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index db08442de1f6e99f58021a0023c0ebdc290b1dcf..76484dde3e7185dc523fcb43d126c6755cd87019 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump_sort.c,v 1.23 2009/01/01 17:23:54 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump_sort.c,v 1.24 2009/01/18 20:44:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,7 +22,9 @@ static const char *modulename = gettext_noop("sorter");
  * Sort priority for object types when dumping a pre-7.3 database.
  * Objects are sorted by priority levels, and within an equal priority level
  * by OID.	(This is a relatively crude hack to provide semi-reasonable
- * behavior for old databases without full dependency info.)
+ * behavior for old databases without full dependency info.)  Note: text
+ * search and foreign-data objects can't really happen here, so the rather
+ * bogus priorities for them don't matter.
  */
 static const int oldObjectTypePriority[] =
 {
@@ -45,7 +47,7 @@ static const int oldObjectTypePriority[] =
 	2,							/* DO_PROCLANG */
 	2,							/* DO_CAST */
 	9,							/* DO_TABLE_DATA */
-	7,							/* DO_TABLE_TYPE */
+	7,							/* DO_DUMMY_TYPE */
 	3,							/* DO_TSPARSER */
 	4,							/* DO_TSDICT */
 	3,							/* DO_TSTEMPLATE */
@@ -71,25 +73,25 @@ static const int newObjectTypePriority[] =
 	7,							/* DO_OPCLASS */
 	7,							/* DO_OPFAMILY */
 	9,							/* DO_CONVERSION */
-	10,							/* DO_TABLE */
-	12,							/* DO_ATTRDEF */
-	17,							/* DO_INDEX */
-	18,							/* DO_RULE */
-	19,							/* DO_TRIGGER */
-	16,							/* DO_CONSTRAINT */
-	20,							/* DO_FK_CONSTRAINT */
+	16,							/* DO_TABLE */
+	18,							/* DO_ATTRDEF */
+	23,							/* DO_INDEX */
+	24,							/* DO_RULE */
+	25,							/* DO_TRIGGER */
+	22,							/* DO_CONSTRAINT */
+	26,							/* DO_FK_CONSTRAINT */
 	2,							/* DO_PROCLANG */
 	8,							/* DO_CAST */
-	13,							/* DO_TABLE_DATA */
-	11,							/* DO_TABLE_TYPE */
-	5,							/* DO_TSPARSER */
-	6,							/* DO_TSDICT */
-	5,							/* DO_TSTEMPLATE */
-	7,							/* DO_TSCONFIG */
-	3,							/* DO_FDW */
-	4,							/* DO_FOREIGN_SERVER */
-	14,							/* DO_BLOBS */
-	15							/* DO_BLOB_COMMENTS */
+	19,							/* DO_TABLE_DATA */
+	17,							/* DO_DUMMY_TYPE */
+	10,							/* DO_TSPARSER */
+	12,							/* DO_TSDICT */
+	11,							/* DO_TSTEMPLATE */
+	13,							/* DO_TSCONFIG */
+	14,							/* DO_FDW */
+	15,							/* DO_FOREIGN_SERVER */
+	20,							/* DO_BLOBS */
+	21							/* DO_BLOB_COMMENTS */
 };
 
 
@@ -1102,9 +1104,9 @@ describeDumpableObject(DumpableObject *obj, char *buf, int bufsize)
 					 "TABLE DATA %s  (ID %d OID %u)",
 					 obj->name, obj->dumpId, obj->catId.oid);
 			return;
-		case DO_TABLE_TYPE:
+		case DO_DUMMY_TYPE:
 			snprintf(buf, bufsize,
-					 "TABLE TYPE %s  (ID %d OID %u)",
+					 "DUMMY TYPE %s  (ID %d OID %u)",
 					 obj->name, obj->dumpId, obj->catId.oid);
 			return;
 		case DO_TSPARSER: