Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a7ae1dc

Browse files
committed
pg_upgrade: prevent automatic oid assignment
Prevent automatic oid assignment when in binary upgrade mode. Also throw an error when contrib/pg_upgrade_support functions are called when not in binary upgrade mode. This prevent automatically-assigned oids from conflicting with later pre-assigned oids coming from the old cluster. It also makes sure oids are preserved in call important cases.
1 parent 73fe875 commit a7ae1dc

File tree

8 files changed

+69
-20
lines changed

8 files changed

+69
-20
lines changed

contrib/pg_upgrade_support/pg_upgrade_support.c

+17
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,20 @@ PG_FUNCTION_INFO_V1(set_next_pg_authid_oid);
3838

3939
PG_FUNCTION_INFO_V1(create_empty_extension);
4040

41+
#define CHECK_IS_BINARY_UPGRADE \
42+
do { \
43+
if (!IsBinaryUpgrade) \
44+
ereport(ERROR, \
45+
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), \
46+
(errmsg("function can only be called when server is in binary upgrade mode")))); \
47+
} while (0)
4148

4249
Datum
4350
set_next_pg_type_oid(PG_FUNCTION_ARGS)
4451
{
4552
Oid typoid = PG_GETARG_OID(0);
4653

54+
CHECK_IS_BINARY_UPGRADE;
4755
binary_upgrade_next_pg_type_oid = typoid;
4856

4957
PG_RETURN_VOID();
@@ -54,6 +62,7 @@ set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
5462
{
5563
Oid typoid = PG_GETARG_OID(0);
5664

65+
CHECK_IS_BINARY_UPGRADE;
5766
binary_upgrade_next_array_pg_type_oid = typoid;
5867

5968
PG_RETURN_VOID();
@@ -64,6 +73,7 @@ set_next_toast_pg_type_oid(PG_FUNCTION_ARGS)
6473
{
6574
Oid typoid = PG_GETARG_OID(0);
6675

76+
CHECK_IS_BINARY_UPGRADE;
6777
binary_upgrade_next_toast_pg_type_oid = typoid;
6878

6979
PG_RETURN_VOID();
@@ -74,6 +84,7 @@ set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
7484
{
7585
Oid reloid = PG_GETARG_OID(0);
7686

87+
CHECK_IS_BINARY_UPGRADE;
7788
binary_upgrade_next_heap_pg_class_oid = reloid;
7889

7990
PG_RETURN_VOID();
@@ -84,6 +95,7 @@ set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
8495
{
8596
Oid reloid = PG_GETARG_OID(0);
8697

98+
CHECK_IS_BINARY_UPGRADE;
8799
binary_upgrade_next_index_pg_class_oid = reloid;
88100

89101
PG_RETURN_VOID();
@@ -94,6 +106,7 @@ set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
94106
{
95107
Oid reloid = PG_GETARG_OID(0);
96108

109+
CHECK_IS_BINARY_UPGRADE;
97110
binary_upgrade_next_toast_pg_class_oid = reloid;
98111

99112
PG_RETURN_VOID();
@@ -104,6 +117,7 @@ set_next_pg_enum_oid(PG_FUNCTION_ARGS)
104117
{
105118
Oid enumoid = PG_GETARG_OID(0);
106119

120+
CHECK_IS_BINARY_UPGRADE;
107121
binary_upgrade_next_pg_enum_oid = enumoid;
108122

109123
PG_RETURN_VOID();
@@ -114,6 +128,7 @@ set_next_pg_authid_oid(PG_FUNCTION_ARGS)
114128
{
115129
Oid authoid = PG_GETARG_OID(0);
116130

131+
CHECK_IS_BINARY_UPGRADE;
117132
binary_upgrade_next_pg_authid_oid = authoid;
118133
PG_RETURN_VOID();
119134
}
@@ -129,6 +144,8 @@ create_empty_extension(PG_FUNCTION_ARGS)
129144
Datum extCondition;
130145
List *requiredExtensions;
131146

147+
CHECK_IS_BINARY_UPGRADE;
148+
132149
if (PG_ARGISNULL(4))
133150
extConfig = PointerGetDatum(NULL);
134151
else

src/backend/catalog/heap.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -1088,19 +1088,21 @@ heap_create_with_catalog(const char *relname,
10881088
*/
10891089
if (!OidIsValid(relid))
10901090
{
1091-
/*
1092-
* Use binary-upgrade override for pg_class.oid/relfilenode, if
1093-
* supplied.
1094-
*/
1091+
/* Use binary-upgrade override for pg_class.oid/relfilenode? */
10951092
if (IsBinaryUpgrade &&
1096-
OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
10971093
(relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
10981094
relkind == RELKIND_VIEW || relkind == RELKIND_MATVIEW ||
10991095
relkind == RELKIND_COMPOSITE_TYPE || relkind == RELKIND_FOREIGN_TABLE))
11001096
{
1097+
if (!OidIsValid(binary_upgrade_next_heap_pg_class_oid))
1098+
ereport(ERROR,
1099+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1100+
errmsg("pg_class heap OID value not set when in binary upgrade mode")));
1101+
11011102
relid = binary_upgrade_next_heap_pg_class_oid;
11021103
binary_upgrade_next_heap_pg_class_oid = InvalidOid;
11031104
}
1105+
/* There might be no TOAST table, so we have to test for it. */
11041106
else if (IsBinaryUpgrade &&
11051107
OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
11061108
relkind == RELKIND_TOASTVALUE)

src/backend/catalog/index.c

+7-6
Original file line numberDiff line numberDiff line change
@@ -796,13 +796,14 @@ index_create(Relation heapRelation,
796796
*/
797797
if (!OidIsValid(indexRelationId))
798798
{
799-
/*
800-
* Use binary-upgrade override for pg_class.oid/relfilenode, if
801-
* supplied.
802-
*/
803-
if (IsBinaryUpgrade &&
804-
OidIsValid(binary_upgrade_next_index_pg_class_oid))
799+
/* Use binary-upgrade override for pg_class.oid/relfilenode? */
800+
if (IsBinaryUpgrade)
805801
{
802+
if (!OidIsValid(binary_upgrade_next_index_pg_class_oid))
803+
ereport(ERROR,
804+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
805+
errmsg("pg_class index OID value not set when in binary upgrade mode")));
806+
806807
indexRelationId = binary_upgrade_next_index_pg_class_oid;
807808
binary_upgrade_next_index_pg_class_oid = InvalidOid;
808809
}

src/backend/catalog/pg_enum.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,13 @@ AddEnumLabel(Oid enumTypeOid,
341341
}
342342

343343
/* Get a new OID for the new label */
344-
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_enum_oid))
344+
if (IsBinaryUpgrade)
345345
{
346+
if (!OidIsValid(binary_upgrade_next_pg_enum_oid))
347+
ereport(ERROR,
348+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
349+
errmsg("pg_enum OID value not set when in binary upgrade mode")));
350+
346351
/*
347352
* Use binary-upgrade override for pg_enum.oid, if supplied. During
348353
* binary upgrade, all pg_enum.oid's are set this way so they are

src/backend/catalog/pg_type.c

+13-3
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,14 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
126126
*/
127127
tup = heap_form_tuple(tupDesc, values, nulls);
128128

129-
/* Use binary-upgrade override for pg_type.oid, if supplied. */
130-
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
129+
/* Use binary-upgrade override for pg_type.oid? */
130+
if (IsBinaryUpgrade)
131131
{
132+
if (!OidIsValid(binary_upgrade_next_pg_type_oid))
133+
ereport(ERROR,
134+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
135+
errmsg("pg_type OID value not set when in binary upgrade mode")));
136+
132137
HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
133138
binary_upgrade_next_pg_type_oid = InvalidOid;
134139
}
@@ -437,8 +442,13 @@ TypeCreate(Oid newTypeOid,
437442
if (OidIsValid(newTypeOid))
438443
HeapTupleSetOid(tup, newTypeOid);
439444
/* Use binary-upgrade override for pg_type.oid, if supplied. */
440-
else if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_type_oid))
445+
else if (IsBinaryUpgrade)
441446
{
447+
if (!OidIsValid(binary_upgrade_next_pg_type_oid))
448+
ereport(ERROR,
449+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
450+
errmsg("pg_type OID value not set when in binary upgrade mode")));
451+
442452
HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
443453
binary_upgrade_next_pg_type_oid = InvalidOid;
444454
}

src/backend/catalog/toasting.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,11 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
259259
else
260260
namespaceid = PG_TOAST_NAMESPACE;
261261

262-
/* Use binary-upgrade override for pg_type.oid, if supplied. */
262+
/*
263+
* Use binary-upgrade override for pg_type.oid, if supplied. We might
264+
* be in the post-schema-restore phase where we are doing ALTER TABLE
265+
* to create TOAST tables that didn't exist in the old cluster.
266+
*/
263267
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_toast_pg_type_oid))
264268
{
265269
toast_typid = binary_upgrade_next_toast_pg_type_oid;

src/backend/commands/typecmds.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -1986,9 +1986,14 @@ AssignTypeArrayOid(void)
19861986
{
19871987
Oid type_array_oid;
19881988

1989-
/* Use binary-upgrade override for pg_type.typarray, if supplied. */
1990-
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_array_pg_type_oid))
1989+
/* Use binary-upgrade override for pg_type.typarray? */
1990+
if (IsBinaryUpgrade)
19911991
{
1992+
if (!OidIsValid(binary_upgrade_next_array_pg_type_oid))
1993+
ereport(ERROR,
1994+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1995+
errmsg("pg_type array OID value not set when in binary upgrade mode")));
1996+
19921997
type_array_oid = binary_upgrade_next_array_pg_type_oid;
19931998
binary_upgrade_next_array_pg_type_oid = InvalidOid;
19941999
}

src/backend/commands/user.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,15 @@ CreateRole(CreateRoleStmt *stmt)
379379

380380
/*
381381
* pg_largeobject_metadata contains pg_authid.oid's, so we use the
382-
* binary-upgrade override, if specified.
382+
* binary-upgrade override.
383383
*/
384-
if (IsBinaryUpgrade && OidIsValid(binary_upgrade_next_pg_authid_oid))
384+
if (IsBinaryUpgrade)
385385
{
386+
if (!OidIsValid(binary_upgrade_next_pg_authid_oid))
387+
ereport(ERROR,
388+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
389+
errmsg("pg_authid OID value not set when in binary upgrade mode")));
390+
386391
HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
387392
binary_upgrade_next_pg_authid_oid = InvalidOid;
388393
}

0 commit comments

Comments
 (0)