diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2011-12-09 20:42:30 +0200 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2011-12-09 20:42:30 +0200 |
commit | 5bcf8ede45c780e4ac394397bd0413118f3a162f (patch) | |
tree | 69336b13a01a9e2bdc68e3145676d39bb511a65b /src/backend/commands | |
parent | 9f0d2bdc88630781485a17178e2b50e49ce70040 (diff) | |
download | postgresql-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.c | 8 | ||||
-rw-r--r-- | src/backend/commands/foreigncmds.c | 76 |
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 |