diff options
author | Tom Lane | 2008-06-08 21:10:05 +0000 |
---|---|---|
committer | Tom Lane | 2008-06-08 21:10:05 +0000 |
commit | 977fa0ecb25de0e8ae33c43b3363ff66cc7c7868 (patch) | |
tree | 9f778620a987507506e3f9d7b158ee0feb88b7bf | |
parent | 01494ff6ea836f21e3348af2b43fb0f9abed556d (diff) |
ALTER AGGREGATE OWNER seems to have been missed by the last couple of
patches that dealt with object ownership. It wasn't updating pg_shdepend
nor adjusting the aggregate's ACL. In 8.2 and up, fix this permanently
by making it use AlterFunctionOwner_oid. In 8.1, the function code wasn't
factored that way, so just copy and paste.
-rw-r--r-- | src/backend/commands/aggregatecmds.c | 52 |
1 files changed, 2 insertions, 50 deletions
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index f3eeedd2cb..b61187a826 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -318,58 +318,10 @@ void AlterAggregateOwner(List *name, List *args, Oid newOwnerId) { Oid procOid; - HeapTuple tup; - Form_pg_proc procForm; - Relation rel; - AclResult aclresult; - - rel = heap_open(ProcedureRelationId, RowExclusiveLock); /* Look up function and make sure it's an aggregate */ procOid = LookupAggNameTypeNames(name, args, false); - tup = SearchSysCacheCopy(PROCOID, - ObjectIdGetDatum(procOid), - 0, 0, 0); - if (!HeapTupleIsValid(tup)) /* should not happen */ - elog(ERROR, "cache lookup failed for function %u", procOid); - procForm = (Form_pg_proc) GETSTRUCT(tup); - - /* - * If the new owner is the same as the existing owner, consider the - * command to have succeeded. This is for dump restoration purposes. - */ - if (procForm->proowner != newOwnerId) - { - /* Superusers can always do it */ - if (!superuser()) - { - /* Otherwise, must be owner of the existing object */ - if (!pg_proc_ownercheck(procOid, GetUserId())) - aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC, - NameListToString(name)); - - /* Must be able to become new owner */ - check_is_member_of_role(GetUserId(), newOwnerId); - - /* New owner must have CREATE privilege on namespace */ - aclresult = pg_namespace_aclcheck(procForm->pronamespace, - newOwnerId, - ACL_CREATE); - if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, ACL_KIND_NAMESPACE, - get_namespace_name(procForm->pronamespace)); - } - - /* - * Modify the owner --- okay to scribble on tup because it's a copy - */ - procForm->proowner = newOwnerId; - - simple_heap_update(rel, &tup->t_self, tup); - CatalogUpdateIndexes(rel, tup); - } - - heap_close(rel, NoLock); - heap_freetuple(tup); + /* The rest is just like a function */ + AlterFunctionOwner_oid(procOid, newOwnerId); } |