From 4110a07c3b6a0f83431c8a9848522e85654394f3 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Fri, 12 Jun 2020 11:49:02 +0900 Subject: [PATCH v30 03/11] Recreate RemoveForeignServerById() This commit recreates RemoveForeignServerById that was removed by b1d32d3e3. This is necessary for follow up commit that checks if the foreign server has prepared transaction or not when removing. Co-authored-by: Masahiko Sawada, Ashutosh Bapat --- src/backend/catalog/dependency.c | 5 ++++- src/backend/commands/foreigncmds.c | 22 ++++++++++++++++++++++ src/include/commands/defrem.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 119006159b..e97870ce8c 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -1549,6 +1549,10 @@ doDeletion(const ObjectAddress *object, int flags) RemovePublicationRelById(object->objectId); break; + case OCLASS_FOREIGN_SERVER: + RemoveForeignServerById(object->objectId); + break; + case OCLASS_CAST: case OCLASS_COLLATION: case OCLASS_CONVERSION: @@ -1563,7 +1567,6 @@ doDeletion(const ObjectAddress *object, int flags) case OCLASS_TSDICT: case OCLASS_TSTEMPLATE: case OCLASS_FDW: - case OCLASS_FOREIGN_SERVER: case OCLASS_USER_MAPPING: case OCLASS_DEFACL: case OCLASS_EVENT_TRIGGER: diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index de31ddd1f3..c002a61794 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -1060,6 +1060,28 @@ AlterForeignServer(AlterForeignServerStmt *stmt) return address; } +/* + * Drop foreign server by OID + */ +void +RemoveForeignServerById(Oid srvId) +{ + HeapTuple tp; + Relation rel; + + rel = table_open(ForeignServerRelationId, RowExclusiveLock); + + tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(srvId)); + + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for foreign server %u", srvId); + + CatalogTupleDelete(rel, &tp->t_self); + + ReleaseSysCache(tp); + + table_close(rel, RowExclusiveLock); +} /* * Common routine to check permission for user-mapping-related DDL diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 1133ae1143..02449ef7ed 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -129,6 +129,7 @@ extern ObjectAddress CreateForeignDataWrapper(CreateFdwStmt *stmt); extern ObjectAddress AlterForeignDataWrapper(AlterFdwStmt *stmt); extern ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt); extern ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt); +extern void RemoveForeignServerById(Oid srvId); extern ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt); extern ObjectAddress AlterUserMapping(AlterUserMappingStmt *stmt); extern Oid RemoveUserMapping(DropUserMappingStmt *stmt); -- 2.27.0