@@ -158,6 +158,7 @@ static void dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
158158static void dumpBaseType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
159159static void dumpEnumType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
160160static void dumpRangeType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
161+ static void dumpUndefinedType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
161162static void dumpDomain (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
162163static void dumpCompositeType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo );
163164static void dumpCompositeTypeColComments (Archive * fout ,TypeInfo * tyinfo );
@@ -1329,11 +1330,6 @@ selectDumpableType(TypeInfo *tyinfo)
13291330/* dump only types in dumpable namespaces */
13301331if (!tyinfo -> dobj .namespace -> dobj .dump )
13311332tyinfo -> dobj .dump = false;
1332-
1333- /* skip undefined placeholder types */
1334- else if (!tyinfo -> isDefined )
1335- tyinfo -> dobj .dump = false;
1336-
13371333else
13381334tyinfo -> dobj .dump = true;
13391335}
@@ -3707,7 +3703,7 @@ getTypes(Archive *fout, int *numTypes)
37073703}
37083704}
37093705
3710- if (strlen (tyinfo [i ].rolname )== 0 && tyinfo [ i ]. isDefined )
3706+ if (strlen (tyinfo [i ].rolname )== 0 )
37113707write_msg (NULL ,"WARNING: owner of data type \"%s\" appears to be invalid\n" ,
37123708tyinfo [i ].dobj .name );
37133709}
@@ -8554,6 +8550,8 @@ dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
85548550dumpEnumType (fout ,dopt ,tyinfo );
85558551else if (tyinfo -> typtype == TYPTYPE_RANGE )
85568552dumpRangeType (fout ,dopt ,tyinfo );
8553+ else if (tyinfo -> typtype == TYPTYPE_PSEUDO && !tyinfo -> isDefined )
8554+ dumpUndefinedType (fout ,dopt ,tyinfo );
85578555else
85588556write_msg (NULL ,"WARNING: typtype of data type \"%s\" appears to be invalid\n" ,
85598557tyinfo -> dobj .name );
@@ -8820,6 +8818,73 @@ dumpRangeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
88208818destroyPQExpBuffer (query );
88218819}
88228820
8821+ /*
8822+ * dumpUndefinedType
8823+ * writes out to fout the queries to recreate a !typisdefined type
8824+ *
8825+ * This is a shell type, but we use different terminology to distinguish
8826+ * this case from where we have to emit a shell type definition to break
8827+ * circular dependencies. An undefined type shouldn't ever have anything
8828+ * depending on it.
8829+ */
8830+ static void
8831+ dumpUndefinedType (Archive * fout ,DumpOptions * dopt ,TypeInfo * tyinfo )
8832+ {
8833+ PQExpBuffer q = createPQExpBuffer ();
8834+ PQExpBuffer delq = createPQExpBuffer ();
8835+ PQExpBuffer labelq = createPQExpBuffer ();
8836+ char * qtypname ;
8837+
8838+ qtypname = pg_strdup (fmtId (tyinfo -> dobj .name ));
8839+
8840+ /*
8841+ * DROP must be fully qualified in case same name appears in pg_catalog.
8842+ */
8843+ appendPQExpBuffer (delq ,"DROP TYPE %s." ,
8844+ fmtId (tyinfo -> dobj .namespace -> dobj .name ));
8845+ appendPQExpBuffer (delq ,"%s;\n" ,
8846+ qtypname );
8847+
8848+ if (dopt -> binary_upgrade )
8849+ binary_upgrade_set_type_oids_by_type_oid (fout ,
8850+ q ,tyinfo -> dobj .catId .oid );
8851+
8852+ appendPQExpBuffer (q ,"CREATE TYPE %s;\n" ,
8853+ qtypname );
8854+
8855+ appendPQExpBuffer (labelq ,"TYPE %s" ,qtypname );
8856+
8857+ if (dopt -> binary_upgrade )
8858+ binary_upgrade_extension_member (q ,& tyinfo -> dobj ,labelq -> data );
8859+
8860+ ArchiveEntry (fout ,tyinfo -> dobj .catId ,tyinfo -> dobj .dumpId ,
8861+ tyinfo -> dobj .name ,
8862+ tyinfo -> dobj .namespace -> dobj .name ,
8863+ NULL ,
8864+ tyinfo -> rolname , false,
8865+ "TYPE" ,SECTION_PRE_DATA ,
8866+ q -> data ,delq -> data ,NULL ,
8867+ NULL ,0 ,
8868+ NULL ,NULL );
8869+
8870+ /* Dump Type Comments and Security Labels */
8871+ dumpComment (fout ,dopt ,labelq -> data ,
8872+ tyinfo -> dobj .namespace -> dobj .name ,tyinfo -> rolname ,
8873+ tyinfo -> dobj .catId ,0 ,tyinfo -> dobj .dumpId );
8874+ dumpSecLabel (fout ,dopt ,labelq -> data ,
8875+ tyinfo -> dobj .namespace -> dobj .name ,tyinfo -> rolname ,
8876+ tyinfo -> dobj .catId ,0 ,tyinfo -> dobj .dumpId );
8877+
8878+ dumpACL (fout ,dopt ,tyinfo -> dobj .catId ,tyinfo -> dobj .dumpId ,"TYPE" ,
8879+ qtypname ,NULL ,tyinfo -> dobj .name ,
8880+ tyinfo -> dobj .namespace -> dobj .name ,
8881+ tyinfo -> rolname ,tyinfo -> typacl );
8882+
8883+ destroyPQExpBuffer (q );
8884+ destroyPQExpBuffer (delq );
8885+ destroyPQExpBuffer (labelq );
8886+ }
8887+
88238888/*
88248889 * dumpBaseType
88258890 * writes out to fout the queries to recreate a user-defined base type