diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2003-06-27 14:45:32 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2003-06-27 14:45:32 +0000 |
commit | b256f2426433c56b4bea3a8102757749885b81ba (patch) | |
tree | bd2b9b75720dd850bffbf40bf3d2440b1639a904 /src/backend/commands/aggregatecmds.c | |
parent | 5bac7d11ddbf19688fd5da87ffbd991a1b06aa4a (diff) | |
download | postgresql-b256f2426433c56b4bea3a8102757749885b81ba.tar.gz postgresql-b256f2426433c56b4bea3a8102757749885b81ba.zip |
First batch of object rename commands.
Diffstat (limited to 'src/backend/commands/aggregatecmds.c')
-rw-r--r-- | src/backend/commands/aggregatecmds.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index bee50e686f0..1ea31a6a5a0 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/aggregatecmds.c,v 1.7 2003/06/25 21:30:26 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/aggregatecmds.c,v 1.8 2003/06/27 14:45:27 petere Exp $ * * DESCRIPTION * The "DefineFoo" routines take the parse tree and pick out the @@ -25,6 +25,7 @@ #include "access/heapam.h" #include "catalog/catname.h" #include "catalog/dependency.h" +#include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" @@ -193,3 +194,75 @@ RemoveAggregate(RemoveAggrStmt *stmt) performDeletion(&object, stmt->behavior); } + + +void +RenameAggregate(List *name, TypeName *basetype, const char *newname) +{ + Oid basetypeOid; + Oid procOid; + Oid namespaceOid; + Oid oid_array[FUNC_MAX_ARGS]; + HeapTuple tup; + Relation rel; + AclResult aclresult; + + /* + * if a basetype is passed in, then attempt to find an aggregate for + * that specific type. + * + * else attempt to find an aggregate with a basetype of ANYOID. This + * means that the aggregate is to apply to all basetypes (eg, COUNT). + */ + if (basetype) + basetypeOid = typenameTypeId(basetype); + else + basetypeOid = ANYOID; + + rel = heap_openr(ProcedureRelationName, RowExclusiveLock); + + procOid = find_aggregate_func("RenameAggregate", name, basetypeOid); + + tup = SearchSysCacheCopy(PROCOID, + ObjectIdGetDatum(procOid), + 0, 0, 0); + if (!HeapTupleIsValid(tup)) /* should not happen */ + elog(ERROR, "RenameAggregate: couldn't find pg_proc tuple for %s", + NameListToString(name)); + + namespaceOid = ((Form_pg_proc) GETSTRUCT(tup))->pronamespace; + + /* make sure the new name doesn't exist */ + MemSet(oid_array, 0, sizeof(oid_array)); + oid_array[0] = basetypeOid; + if (SearchSysCacheExists(PROCNAMENSP, + CStringGetDatum(newname), + Int16GetDatum(1), + PointerGetDatum(oid_array), + ObjectIdGetDatum(namespaceOid))) + { + if (basetypeOid == ANYOID) + elog(ERROR, "function %s(*) already exists in schema %s", + newname, get_namespace_name(namespaceOid)); + else + elog(ERROR, "function %s(%s) already exists in schema %s", + newname, format_type_be(basetypeOid), get_namespace_name(namespaceOid)); + } + + /* must be owner */ + if (!pg_proc_ownercheck(procOid, GetUserId())) + aclcheck_error(ACLCHECK_NOT_OWNER, NameListToString(name)); + + /* must have CREATE privilege on namespace */ + aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, get_namespace_name(namespaceOid)); + + /* rename */ + namestrcpy(&(((Form_pg_proc) GETSTRUCT(tup))->proname), newname); + simple_heap_update(rel, &tup->t_self, tup); + CatalogUpdateIndexes(rel, tup); + + heap_close(rel, NoLock); + heap_freetuple(tup); +} |