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

Lines changed: 17 additions & 0 deletions
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

Lines changed: 7 additions & 5 deletions
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

Lines changed: 7 additions & 6 deletions
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

Lines changed: 6 additions & 1 deletion
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

Lines changed: 13 additions & 3 deletions
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

Lines changed: 5 additions & 1 deletion
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

Lines changed: 7 additions & 2 deletions
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

Lines changed: 7 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy