diff options
Diffstat (limited to 'src/backend/commands/alter.c')
-rw-r--r-- | src/backend/commands/alter.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 6f27a492d09..feb5517a288 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -60,6 +60,7 @@ #include "miscadmin.h" #include "parser/parse_func.h" #include "rewrite/rewriteDefine.h" +#include "storage/lmgr.h" #include "tcop/utility.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -947,7 +948,9 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) Oid old_ownerId; Oid namespaceId = InvalidOid; - oldtup = get_catalog_object_by_oid(rel, Anum_oid, objectId); + /* Search tuple and lock it. */ + oldtup = + get_catalog_object_by_oid_extended(rel, Anum_oid, objectId, true); if (oldtup == NULL) elog(ERROR, "cache lookup failed for object %u of catalog \"%s\"", objectId, RelationGetRelationName(rel)); @@ -1046,6 +1049,8 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) /* Perform actual update */ CatalogTupleUpdate(rel, &newtup->t_self, newtup); + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* * Update owner dependency reference. When working on a large object, * we have to translate back to the OID conventionally used for LOs' @@ -1063,6 +1068,8 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) } else { + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* * No need to change anything. But when working on a large object, we * have to translate back to the OID conventionally used for LOs' |