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:09:48 +0000 (21:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Jun 2008 21:09:48 +0000 (21:09 +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 7fe655cad35f30d5073dd29f36b8bcfa6bdb7e5f..a8c9f1199e44fc19ac4df32663d9735eb600d108 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.45 2008/01/01 19:45:48 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.46 2008/06/08 21:09:48 tgl Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -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);
 }