*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.30.2.1 2005/11/22 18:23:06 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.30.2.2 2008/06/08 21:10:05 tgl Exp $
*
* DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the
*/
if (procForm->proowner != newOwnerId)
{
+ Datum repl_val[Natts_pg_proc];
+ char repl_null[Natts_pg_proc];
+ char repl_repl[Natts_pg_proc];
+ Acl *newAcl;
+ Datum aclDatum;
+ bool isNull;
+ HeapTuple newtuple;
+
/* Superusers can always do it */
if (!superuser())
{
get_namespace_name(procForm->pronamespace));
}
+ memset(repl_null, ' ', sizeof(repl_null));
+ memset(repl_repl, ' ', sizeof(repl_repl));
+
+ repl_repl[Anum_pg_proc_proowner - 1] = 'r';
+ repl_val[Anum_pg_proc_proowner - 1] = ObjectIdGetDatum(newOwnerId);
+
/*
- * Modify the owner --- okay to scribble on tup because it's a copy
+ * Determine the modified ACL for the new owner. This is only
+ * necessary when the ACL is non-null.
*/
- procForm->proowner = newOwnerId;
+ aclDatum = SysCacheGetAttr(PROCOID, tup,
+ Anum_pg_proc_proacl,
+ &isNull);
+ if (!isNull)
+ {
+ newAcl = aclnewowner(DatumGetAclP(aclDatum),
+ procForm->proowner, newOwnerId);
+ repl_repl[Anum_pg_proc_proacl - 1] = 'r';
+ repl_val[Anum_pg_proc_proacl - 1] = PointerGetDatum(newAcl);
+ }
+
+ newtuple = heap_modifytuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
+
+ simple_heap_update(rel, &newtuple->t_self, newtuple);
+ CatalogUpdateIndexes(rel, newtuple);
+
+ heap_freetuple(newtuple);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
+ /* Update owner dependency reference */
+ changeDependencyOnOwner(ProcedureRelationId, procOid, newOwnerId);
}
heap_close(rel, NoLock);