aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2011-12-09 20:42:30 +0200
committerPeter Eisentraut <peter_e@gmx.net>2011-12-09 20:42:30 +0200
commit5bcf8ede45c780e4ac394397bd0413118f3a162f (patch)
tree69336b13a01a9e2bdc68e3145676d39bb511a65b /src/backend/commands
parent9f0d2bdc88630781485a17178e2b50e49ce70040 (diff)
downloadpostgresql-5bcf8ede45c780e4ac394397bd0413118f3a162f.tar.gz
postgresql-5bcf8ede45c780e4ac394397bd0413118f3a162f.zip
Add ALTER FOREIGN DATA WRAPPER / RENAME and ALTER SERVER / RENAME
Diffstat (limited to 'src/backend/commands')
-rw-r--r--src/backend/commands/alter.c8
-rw-r--r--src/backend/commands/foreigncmds.c76
2 files changed, 84 insertions, 0 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index eb0584e9910..f9be3a9a4ec 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -65,6 +65,14 @@ ExecRenameStmt(RenameStmt *stmt)
RenameDatabase(stmt->subname, stmt->newname);
break;
+ case OBJECT_FDW:
+ RenameForeignDataWrapper(stmt->subname, stmt->newname);
+ break;
+
+ case OBJECT_FOREIGN_SERVER:
+ RenameForeignServer(stmt->subname, stmt->newname);
+ break;
+
case OBJECT_FUNCTION:
RenameFunction(stmt->object, stmt->objarg, stmt->newname);
break;
diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c
index b30ff409235..5e58713da70 100644
--- a/src/backend/commands/foreigncmds.c
+++ b/src/backend/commands/foreigncmds.c
@@ -201,6 +201,82 @@ GetUserOidFromMapping(const char *username, bool missing_ok)
/*
+ * Rename foreign-data wrapper
+ */
+void
+RenameForeignDataWrapper(const char *oldname, const char *newname)
+{
+ HeapTuple tup;
+ Relation rel;
+
+ rel = heap_open(ForeignDataWrapperRelationId, RowExclusiveLock);
+
+ tup = SearchSysCacheCopy1(FOREIGNDATAWRAPPERNAME, CStringGetDatum(oldname));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("foreign-data wrapper \"%s\" does not exist", oldname)));
+
+ /* make sure the new name doesn't exist */
+ if (SearchSysCacheExists1(FOREIGNDATAWRAPPERNAME, CStringGetDatum(newname)))
+ ereport(ERROR,
+ (errcode(ERRCODE_DUPLICATE_OBJECT),
+ errmsg("foreign-data wrapper \"%s\" already exists", newname)));
+
+ /* must be owner of FDW */
+ if (!pg_foreign_data_wrapper_ownercheck(HeapTupleGetOid(tup), GetUserId()))
+ aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_FDW,
+ oldname);
+
+ /* rename */
+ namestrcpy(&(((Form_pg_foreign_data_wrapper) GETSTRUCT(tup))->fdwname), newname);
+ simple_heap_update(rel, &tup->t_self, tup);
+ CatalogUpdateIndexes(rel, tup);
+
+ heap_close(rel, NoLock);
+ heap_freetuple(tup);
+}
+
+
+/*
+ * Rename foreign server
+ */
+void
+RenameForeignServer(const char *oldname, const char *newname)
+{
+ HeapTuple tup;
+ Relation rel;
+
+ rel = heap_open(ForeignServerRelationId, RowExclusiveLock);
+
+ tup = SearchSysCacheCopy1(FOREIGNSERVERNAME, CStringGetDatum(oldname));
+ if (!HeapTupleIsValid(tup))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("server \"%s\" does not exist", oldname)));
+
+ /* make sure the new name doesn't exist */
+ if (SearchSysCacheExists1(FOREIGNSERVERNAME, CStringGetDatum(newname)))
+ ereport(ERROR,
+ (errcode(ERRCODE_DUPLICATE_OBJECT),
+ errmsg("server \"%s\" already exists", newname)));
+
+ /* must be owner of server */
+ if (!pg_foreign_server_ownercheck(HeapTupleGetOid(tup), GetUserId()))
+ aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_FOREIGN_SERVER,
+ oldname);
+
+ /* rename */
+ namestrcpy(&(((Form_pg_foreign_server) GETSTRUCT(tup))->srvname), newname);
+ simple_heap_update(rel, &tup->t_self, tup);
+ CatalogUpdateIndexes(rel, tup);
+
+ heap_close(rel, NoLock);
+ heap_freetuple(tup);
+}
+
+
+/*
* Change foreign-data wrapper owner.
*
* Allow this only for superusers; also the new owner must be a