@@ -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 */
13301331 if (!tyinfo -> dobj .namespace -> dobj .dump )
13311332 tyinfo -> dobj .dump = false;
1332-
1333- /* skip undefined placeholder types */
1334- else if (!tyinfo -> isDefined )
1335- tyinfo -> dobj .dump = false;
1336-
13371333 else
13381334 tyinfo -> 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 )
37113707 write_msg (NULL , "WARNING: owner of data type \"%s\" appears to be invalid\n" ,
37123708 tyinfo [i ].dobj .name );
37133709 }
@@ -8554,6 +8550,8 @@ dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
85548550 dumpEnumType (fout , dopt , tyinfo );
85558551 else if (tyinfo -> typtype == TYPTYPE_RANGE )
85568552 dumpRangeType (fout , dopt , tyinfo );
8553+ else if (tyinfo -> typtype == TYPTYPE_PSEUDO && !tyinfo -> isDefined )
8554+ dumpUndefinedType (fout , dopt , tyinfo );
85578555 else
85588556 write_msg (NULL , "WARNING: typtype of data type \"%s\" appears to be invalid\n" ,
85598557 tyinfo -> dobj .name );
@@ -8820,6 +8818,73 @@ dumpRangeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
88208818 destroyPQExpBuffer (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
0 commit comments