summaryrefslogtreecommitdiff
path: root/src/backend/commands/conversioncmds.c
diff options
context:
space:
mode:
authorPeter Eisentraut2003-06-27 14:45:32 +0000
committerPeter Eisentraut2003-06-27 14:45:32 +0000
commitb256f2426433c56b4bea3a8102757749885b81ba (patch)
treebd2b9b75720dd850bffbf40bf3d2440b1639a904 /src/backend/commands/conversioncmds.c
parent5bac7d11ddbf19688fd5da87ffbd991a1b06aa4a (diff)
First batch of object rename commands.
Diffstat (limited to 'src/backend/commands/conversioncmds.c')
-rw-r--r--src/backend/commands/conversioncmds.c62
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);
+}