From 15d108059ddb3b9bce8b9ac21a323848e27cf7b0 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Fri, 12 Jun 2020 11:49:02 +0900 Subject: [PATCH v32 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 2140151a6a..7c9899f14d 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 eb7103fd3b..ec024fa106 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 e2d2a77ca4..1d0b408163 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