@@ -158,6 +158,7 @@ static void dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo);
158
158
static void dumpBaseType (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
159
159
static void dumpEnumType (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
160
160
static void dumpRangeType (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
161
+ static void dumpUndefinedType (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
161
162
static void dumpDomain (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
162
163
static void dumpCompositeType (Archive * fout , DumpOptions * dopt , TypeInfo * tyinfo );
163
164
static void dumpCompositeTypeColComments (Archive * fout , TypeInfo * tyinfo );
@@ -1329,11 +1330,6 @@ selectDumpableType(TypeInfo *tyinfo)
1329
1330
/* dump only types in dumpable namespaces */
1330
1331
if (!tyinfo -> dobj .namespace -> dobj .dump )
1331
1332
tyinfo -> dobj .dump = false;
1332
-
1333
- /* skip undefined placeholder types */
1334
- else if (!tyinfo -> isDefined )
1335
- tyinfo -> dobj .dump = false;
1336
-
1337
1333
else
1338
1334
tyinfo -> dobj .dump = true;
1339
1335
}
@@ -3707,7 +3703,7 @@ getTypes(Archive *fout, int *numTypes)
3707
3703
}
3708
3704
}
3709
3705
3710
- if (strlen (tyinfo [i ].rolname ) == 0 && tyinfo [ i ]. isDefined )
3706
+ if (strlen (tyinfo [i ].rolname ) == 0 )
3711
3707
write_msg (NULL , "WARNING: owner of data type \"%s\" appears to be invalid\n" ,
3712
3708
tyinfo [i ].dobj .name );
3713
3709
}
@@ -8554,6 +8550,8 @@ dumpType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
8554
8550
dumpEnumType (fout , dopt , tyinfo );
8555
8551
else if (tyinfo -> typtype == TYPTYPE_RANGE )
8556
8552
dumpRangeType (fout , dopt , tyinfo );
8553
+ else if (tyinfo -> typtype == TYPTYPE_PSEUDO && !tyinfo -> isDefined )
8554
+ dumpUndefinedType (fout , dopt , tyinfo );
8557
8555
else
8558
8556
write_msg (NULL , "WARNING: typtype of data type \"%s\" appears to be invalid\n" ,
8559
8557
tyinfo -> dobj .name );
@@ -8820,6 +8818,73 @@ dumpRangeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo)
8820
8818
destroyPQExpBuffer (query );
8821
8819
}
8822
8820
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
+
8823
8888
/*
8824
8889
* dumpBaseType
8825
8890
* writes out to fout the queries to recreate a user-defined base type
0 commit comments