mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Revert to 9.6 treatment of ALTER TYPE enumtype ADD VALUE.
This reverts commit15bc038f9
, along with the followon commits1635e80d3
and984c92074
that tried to clean up the problems exposed by bug #14825. The result was incomplete because it failed to address parallel-query requirements. With 10.0 release so close upon us, now does not seem like the time to be adding more code to fix that. I hope we can un-revert this code and add the missing parallel query support during the v11 cycle. Back-patch to v10. Discussion: https://postgr.es/m/20170922185904.1448.16585@wrigleys.postgresql.org
This commit is contained in:
@ -1222,10 +1222,10 @@ DefineEnum(CreateEnumStmt *stmt)
|
||||
|
||||
/*
|
||||
* AlterEnum
|
||||
* Adds a new label to an existing enum.
|
||||
* ALTER TYPE on an enum.
|
||||
*/
|
||||
ObjectAddress
|
||||
AlterEnum(AlterEnumStmt *stmt)
|
||||
AlterEnum(AlterEnumStmt *stmt, bool isTopLevel)
|
||||
{
|
||||
Oid enum_type_oid;
|
||||
TypeName *typename;
|
||||
@ -1243,8 +1243,6 @@ AlterEnum(AlterEnumStmt *stmt)
|
||||
/* Check it's an enum and check user has permission to ALTER the enum */
|
||||
checkEnumOwner(tup);
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
if (stmt->oldVal)
|
||||
{
|
||||
/* Rename an existing label */
|
||||
@ -1253,6 +1251,27 @@ AlterEnum(AlterEnumStmt *stmt)
|
||||
else
|
||||
{
|
||||
/* Add a new label */
|
||||
|
||||
/*
|
||||
* Ordinarily we disallow adding values within transaction blocks,
|
||||
* because we can't cope with enum OID values getting into indexes and
|
||||
* then having their defining pg_enum entries go away. However, it's
|
||||
* okay if the enum type was created in the current transaction, since
|
||||
* then there can be no such indexes that wouldn't themselves go away
|
||||
* on rollback. (We support this case because pg_dump
|
||||
* --binary-upgrade needs it.) We test this by seeing if the pg_type
|
||||
* row has xmin == current XID and is not HEAP_UPDATED. If it is
|
||||
* HEAP_UPDATED, we can't be sure whether the type was created or only
|
||||
* modified in this xact. So we are disallowing some cases that could
|
||||
* theoretically be safe; but fortunately pg_dump only needs the
|
||||
* simplest case.
|
||||
*/
|
||||
if (HeapTupleHeaderGetXmin(tup->t_data) == GetCurrentTransactionId() &&
|
||||
!(tup->t_data->t_infomask & HEAP_UPDATED))
|
||||
/* safe to do inside transaction block */ ;
|
||||
else
|
||||
PreventTransactionChain(isTopLevel, "ALTER TYPE ... ADD");
|
||||
|
||||
AddEnumLabel(enum_type_oid, stmt->newVal,
|
||||
stmt->newValNeighbor, stmt->newValIsAfter,
|
||||
stmt->skipIfNewValExists);
|
||||
@ -1262,6 +1281,8 @@ AlterEnum(AlterEnumStmt *stmt)
|
||||
|
||||
ObjectAddressSet(address, TypeRelationId, enum_type_oid);
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
||||
return address;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user