@@ -253,7 +253,9 @@ static void dumpDatabase(Archive *AH);
253
253
static void dumpEncoding(Archive *AH);
254
254
static void dumpStdStrings(Archive *AH);
255
255
static void binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
256
- PQExpBuffer upgrade_buffer, Oid pg_type_oid);
256
+ PQExpBuffer upgrade_buffer,
257
+ Oid pg_type_oid,
258
+ bool force_array_type);
257
259
static bool binary_upgrade_set_type_oids_by_rel_oid(Archive *fout,
258
260
PQExpBuffer upgrade_buffer, Oid pg_rel_oid);
259
261
static void binary_upgrade_set_pg_class_oids(Archive *fout,
@@ -3949,10 +3951,11 @@ dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
3949
3951
static void
3950
3952
binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
3951
3953
PQExpBuffer upgrade_buffer,
3952
- Oid pg_type_oid)
3954
+ Oid pg_type_oid,
3955
+ bool force_array_type)
3953
3956
{
3954
3957
PQExpBuffer upgrade_query = createPQExpBuffer();
3955
- PGresult *upgrade_res ;
3958
+ PGresult *res ;
3956
3959
Oid pg_type_array_oid;
3957
3960
3958
3961
appendPQExpBufferStr(upgrade_buffer, "\n-- For binary upgrade, must preserve pg_type oid\n");
@@ -3964,12 +3967,43 @@ binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
3964
3967
appendPQExpBuffer(upgrade_query,
3965
3968
"SELECT typarray "
3966
3969
"FROM pg_catalog.pg_type "
3967
- "WHERE pg_type. oid = '%u'::pg_catalog.oid;",
3970
+ "WHERE oid = '%u'::pg_catalog.oid;",
3968
3971
pg_type_oid);
3969
3972
3970
- upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
3973
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
3974
+
3975
+ pg_type_array_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typarray")));
3971
3976
3972
- pg_type_array_oid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "typarray")));
3977
+ PQclear(res);
3978
+
3979
+ if (!OidIsValid(pg_type_array_oid) && force_array_type)
3980
+ {
3981
+ /*
3982
+ * If the old version didn't assign an array type, but the new version
3983
+ * does, we must select an unused type OID to assign. This currently
3984
+ * only happens for domains, when upgrading pre-v11 to v11 and up.
3985
+ *
3986
+ * Note: local state here is kind of ugly, but we must have some,
3987
+ * since we mustn't choose the same unused OID more than once.
3988
+ */
3989
+ static Oid next_possible_free_oid = FirstNormalObjectId;
3990
+ bool is_dup;
3991
+
3992
+ do
3993
+ {
3994
+ ++next_possible_free_oid;
3995
+ printfPQExpBuffer(upgrade_query,
3996
+ "SELECT EXISTS(SELECT 1 "
3997
+ "FROM pg_catalog.pg_type "
3998
+ "WHERE oid = '%u'::pg_catalog.oid);",
3999
+ next_possible_free_oid);
4000
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
4001
+ is_dup = (PQgetvalue(res, 0, 0)[0] == 't');
4002
+ PQclear(res);
4003
+ } while (is_dup);
4004
+
4005
+ pg_type_array_oid = next_possible_free_oid;
4006
+ }
3973
4007
3974
4008
if (OidIsValid(pg_type_array_oid))
3975
4009
{
@@ -3980,7 +4014,6 @@ binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
3980
4014
pg_type_array_oid);
3981
4015
}
3982
4016
3983
- PQclear(upgrade_res);
3984
4017
destroyPQExpBuffer(upgrade_query);
3985
4018
}
3986
4019
@@ -4008,7 +4041,7 @@ binary_upgrade_set_type_oids_by_rel_oid(Archive *fout,
4008
4041
pg_type_oid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "crel")));
4009
4042
4010
4043
binary_upgrade_set_type_oids_by_type_oid(fout, upgrade_buffer,
4011
- pg_type_oid);
4044
+ pg_type_oid, false );
4012
4045
4013
4046
if (!PQgetisnull(upgrade_res, 0, PQfnumber(upgrade_res, "trel")))
4014
4047
{
@@ -9840,7 +9873,8 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
9840
9873
9841
9874
if (dopt->binary_upgrade)
9842
9875
binary_upgrade_set_type_oids_by_type_oid(fout, q,
9843
- tyinfo->dobj.catId.oid);
9876
+ tyinfo->dobj.catId.oid,
9877
+ false);
9844
9878
9845
9879
appendPQExpBuffer(q, "CREATE TYPE %s AS ENUM (",
9846
9880
qtypname);
@@ -9976,8 +10010,9 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
9976
10010
qtypname);
9977
10011
9978
10012
if (dopt->binary_upgrade)
9979
- binary_upgrade_set_type_oids_by_type_oid(fout,
9980
- q, tyinfo->dobj.catId.oid);
10013
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
10014
+ tyinfo->dobj.catId.oid,
10015
+ false);
9981
10016
9982
10017
appendPQExpBuffer(q, "CREATE TYPE %s AS RANGE (",
9983
10018
qtypname);
@@ -10091,8 +10126,9 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
10091
10126
qtypname);
10092
10127
10093
10128
if (dopt->binary_upgrade)
10094
- binary_upgrade_set_type_oids_by_type_oid(fout,
10095
- q, tyinfo->dobj.catId.oid);
10129
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
10130
+ tyinfo->dobj.catId.oid,
10131
+ false);
10096
10132
10097
10133
appendPQExpBuffer(q, "CREATE TYPE %s;\n",
10098
10134
qtypname);
@@ -10296,10 +10332,14 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
10296
10332
appendPQExpBuffer(delq, "%s CASCADE;\n",
10297
10333
qtypname);
10298
10334
10299
- /* We might already have a shell type, but setting pg_type_oid is harmless */
10335
+ /*
10336
+ * We might already have a shell type, but setting pg_type_oid is
10337
+ * harmless, and in any case we'd better set the array type OID.
10338
+ */
10300
10339
if (dopt->binary_upgrade)
10301
10340
binary_upgrade_set_type_oids_by_type_oid(fout, q,
10302
- tyinfo->dobj.catId.oid);
10341
+ tyinfo->dobj.catId.oid,
10342
+ false);
10303
10343
10304
10344
appendPQExpBuffer(q,
10305
10345
"CREATE TYPE %s (\n"
@@ -10490,7 +10530,8 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
10490
10530
10491
10531
if (dopt->binary_upgrade)
10492
10532
binary_upgrade_set_type_oids_by_type_oid(fout, q,
10493
- tyinfo->dobj.catId.oid);
10533
+ tyinfo->dobj.catId.oid,
10534
+ true); /* force array type */
10494
10535
10495
10536
qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
10496
10537
@@ -10692,7 +10733,8 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
10692
10733
if (dopt->binary_upgrade)
10693
10734
{
10694
10735
binary_upgrade_set_type_oids_by_type_oid(fout, q,
10695
- tyinfo->dobj.catId.oid);
10736
+ tyinfo->dobj.catId.oid,
10737
+ false);
10696
10738
binary_upgrade_set_pg_class_oids(fout, q, tyinfo->typrelid, false);
10697
10739
}
10698
10740
@@ -10967,7 +11009,8 @@ dumpShellType(Archive *fout, ShellTypeInfo *stinfo)
10967
11009
10968
11010
if (dopt->binary_upgrade)
10969
11011
binary_upgrade_set_type_oids_by_type_oid(fout, q,
10970
- stinfo->baseType->dobj.catId.oid);
11012
+ stinfo->baseType->dobj.catId.oid,
11013
+ false);
10971
11014
10972
11015
appendPQExpBuffer(q, "CREATE TYPE %s;\n",
10973
11016
fmtId(stinfo->dobj.name));
0 commit comments