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/functioncmds.c | |
parent | 5bac7d11ddbf19688fd5da87ffbd991a1b06aa4a (diff) | |
download | postgresql-b256f2426433c56b4bea3a8102757749885b81ba.tar.gz postgresql-b256f2426433c56b4bea3a8102757749885b81ba.zip |
First batch of object rename commands.
Diffstat (limited to 'src/backend/commands/functioncmds.c')
-rw-r--r-- | src/backend/commands/functioncmds.c | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index a0943993c16..47ac67b9dcd 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.25 2003/02/01 22:09:26 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.26 2003/06/27 14:45:27 petere Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -592,6 +592,72 @@ RemoveFunctionById(Oid funcOid) /* + * Rename function + */ +void +RenameFunction(List *name, List *argtypes, const char *newname) +{ + Oid procOid; + Oid namespaceOid; + Oid oid_array[FUNC_MAX_ARGS]; + HeapTuple tup; + Relation rel; + AclResult aclresult; + int16 nargs; + + rel = heap_openr(ProcedureRelationName, RowExclusiveLock); + + procOid = LookupFuncNameTypeNames(name, argtypes, "RenameFunction"); + + tup = SearchSysCacheCopy(PROCOID, + ObjectIdGetDatum(procOid), + 0, 0, 0); + if (!HeapTupleIsValid(tup)) /* should not happen */ + elog(ERROR, "RenameFunction: couldn't find pg_proc tuple for %s", + NameListToString(name)); + + if (((Form_pg_proc) GETSTRUCT(tup))->proisagg) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION), + errmsg("%s is an aggregate function", NameListToString(name)), + errhint("Use ALTER AGGREGATE to rename aggregate functions."))); + + namespaceOid = ((Form_pg_proc) GETSTRUCT(tup))->pronamespace; + + /* make sure the new name doesn't exist */ + nargs = compute_parameter_types(argtypes, ((Form_pg_proc) GETSTRUCT(tup))->prolang, oid_array); + if (SearchSysCacheExists(PROCNAMENSP, + CStringGetDatum(newname), + Int16GetDatum(nargs), + PointerGetDatum(oid_array), + ObjectIdGetDatum(namespaceOid))) + { + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION), + errmsg("function %s with the same argument types already exists in schema %s", + newname, 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); +} + + +/* * SetFunctionReturnType - change declared return type of a function * * This is presently only used for adjusting legacy functions that return |