diff options
| author | Peter Eisentraut | 2003-06-27 14:45:32 +0000 |
|---|---|---|
| committer | Peter Eisentraut | 2003-06-27 14:45:32 +0000 |
| commit | b256f2426433c56b4bea3a8102757749885b81ba (patch) | |
| tree | bd2b9b75720dd850bffbf40bf3d2440b1639a904 /src/backend/commands/conversioncmds.c | |
| parent | 5bac7d11ddbf19688fd5da87ffbd991a1b06aa4a (diff) | |
First batch of object rename commands.
Diffstat (limited to 'src/backend/commands/conversioncmds.c')
| -rw-r--r-- | src/backend/commands/conversioncmds.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index 6115b0e12e5..2d2fd66c4b3 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -8,14 +8,17 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/conversioncmds.c,v 1.5 2002/11/02 02:33:03 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/conversioncmds.c,v 1.6 2003/06/27 14:45:27 petere Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" #include "catalog/pg_conversion.h" +#include "access/heapam.h" #include "catalog/catalog.h" +#include "catalog/catname.h" +#include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "mb/pg_wchar.h" @@ -23,7 +26,9 @@ #include "miscadmin.h" #include "parser/parse_func.h" #include "utils/acl.h" +#include "utils/builtins.h" #include "utils/lsyscache.h" +#include "utils/syscache.h" /* @@ -98,3 +103,58 @@ DropConversionCommand(List *name, DropBehavior behavior) ConversionDrop(conversionOid, behavior); } + +/* + * Rename conversion + */ +void +RenameConversion(List *name, const char *newname) +{ + Oid conversionOid; + Oid namespaceOid; + HeapTuple tup; + Relation rel; + AclResult aclresult; + + rel = heap_openr(ConversionRelationName, RowExclusiveLock); + + conversionOid = FindConversionByName(name); + if (!OidIsValid(conversionOid)) + elog(ERROR, "conversion %s not found", NameListToString(name)); + + tup = SearchSysCacheCopy(CONOID, + ObjectIdGetDatum(conversionOid), + 0, 0, 0); + if (!HeapTupleIsValid(tup)) /* should not happen */ + elog(ERROR, "couldn't find pg_conversion tuple for %s", + NameListToString(name)); + + namespaceOid = ((Form_pg_conversion) GETSTRUCT(tup))->connamespace; + + /* make sure the new name doesn't exist */ + if (SearchSysCacheExists(CONNAMENSP, + CStringGetDatum(newname), + ObjectIdGetDatum(namespaceOid), + 0, 0)) + { + elog(ERROR, "conversion %s already exists in schema %s", + newname, get_namespace_name(namespaceOid)); + } + + /* must be owner */ + if (!superuser() && ((Form_pg_conversion) GETSTRUCT(tup))->conowner != 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_conversion) GETSTRUCT(tup))->conname), newname); + simple_heap_update(rel, &tup->t_self, tup); + CatalogUpdateIndexes(rel, tup); + + heap_close(rel, NoLock); + heap_freetuple(tup); +} |
