diff options
Diffstat (limited to 'src/backend/commands/alter.c')
-rw-r--r-- | src/backend/commands/alter.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index e95dc31bde3..cbe02853b04 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -929,9 +929,8 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) classId = address.classId; /* - * XXX - get_object_address returns Oid of pg_largeobject - * catalog for OBJECT_LARGEOBJECT because of historical - * reasons. Fix up it here. + * For large objects, the catalog to modify is + * pg_largeobject_metadata */ if (classId == LargeObjectRelationId) classId = LargeObjectMetadataRelationId; @@ -1075,9 +1074,14 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) /* Perform actual update */ CatalogTupleUpdate(rel, &newtup->t_self, newtup); - /* Update owner dependency reference */ + /* + * Update owner dependency reference. When working on a large object, + * we have to translate back to the OID conventionally used for LOs' + * classId. + */ if (classId == LargeObjectMetadataRelationId) classId = LargeObjectRelationId; + changeDependencyOnOwner(classId, objectId, new_ownerId); /* Release memory */ @@ -1085,6 +1089,16 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) pfree(nulls); pfree(replaces); } + else + { + /* + * No need to change anything. But when working on a large object, we + * have to translate back to the OID conventionally used for LOs' + * classId, or the post-alter hook (if any) will get confused. + */ + if (classId == LargeObjectMetadataRelationId) + classId = LargeObjectRelationId; + } InvokeObjectPostAlterHook(classId, objectId, 0); } |