ALTER AGGREGATE OWNER seems to have been missed by the last couple of
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Jun 2008 21:10:05 +0000 (21:10 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Jun 2008 21:10:05 +0000 (21:10 +0000)
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.

src/backend/commands/aggregatecmds.c

index f3eeedd2cbf4737999e8216067855ce56396f2db..b61187a826a215a038afb3b1b35f42e5f147f24d 100644 (file)
@@ -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);
 }