Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita7ae1dc

Browse files
committed
pg_upgrade: prevent automatic oid assignment
Prevent automatic oid assignment when in binary upgrade mode. Alsothrow an error when contrib/pg_upgrade_support functions are called whennot in binary upgrade mode.This prevent automatically-assigned oids from conflicting with laterpre-assigned oids coming from the old cluster. It also makes sure oidsare preserved in call important cases.
1 parent73fe875 commita7ae1dc

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+
#defineCHECK_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
Oidtypoid=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
Oidtypoid=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
Oidtypoid=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
Oidreloid=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
Oidreloid=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
Oidreloid=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
Oidenumoid=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
Oidauthoid=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
DatumextCondition;
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
elseif (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-
elseif (IsBinaryUpgrade&&OidIsValid(binary_upgrade_next_pg_type_oid))
445+
elseif (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
Oidtype_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)

[8]ページ先頭

©2009-2025 Movatter.jp