diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index 61171c7079c..5a733585490 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -123,6 +123,9 @@ GetSubscription(Oid subid, bool missing_ok, bool aclcheck) if (OidIsValid(subform->subserver)) { AclResult aclresult; + ForeignServer *server; + + server = GetForeignServer(subform->subserver); /* recheck ACL if requested */ if (aclcheck) @@ -136,11 +139,11 @@ GetSubscription(Oid subid, bool missing_ok, bool aclcheck) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("subscription owner \"%s\" does not have permission on foreign server \"%s\"", GetUserNameFromId(subform->subowner, false), - ForeignServerName(subform->subserver)))); + server->servername))); } sub->conninfo = ForeignServerConnectionString(subform->subowner, - subform->subserver); + server); } else { diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 724637cff5b..7375e214cb4 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -753,7 +753,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, GetUserMapping(owner, server->serverid); serverid = server->serverid; - conninfo = ForeignServerConnectionString(owner, serverid); + conninfo = ForeignServerConnectionString(owner, server); } else { @@ -1841,13 +1841,13 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("subscription owner \"%s\" does not have permission on foreign server \"%s\"", GetUserNameFromId(form->subowner, false), - ForeignServerName(new_server->serverid))); + new_server->servername)); /* make sure a user mapping exists */ GetUserMapping(form->subowner, new_server->serverid); conninfo = ForeignServerConnectionString(form->subowner, - new_server->serverid); + new_server); /* Load the library providing us libpq calls. */ load_file("libpqwalreceiver", false); @@ -2250,7 +2250,9 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) if (OidIsValid(form->subserver)) { AclResult aclresult; + ForeignServer *server; + server = GetForeignServer(form->subserver); aclresult = object_aclcheck(ForeignServerRelationId, form->subserver, form->subowner, ACL_USAGE); if (aclresult != ACLCHECK_OK) @@ -2263,12 +2265,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) */ err = psprintf(_("subscription owner \"%s\" does not have permission on foreign server \"%s\""), GetUserNameFromId(form->subowner, false), - ForeignServerName(form->subserver)); + server->servername); conninfo = NULL; } else conninfo = ForeignServerConnectionString(form->subowner, - form->subserver); + server); } else { @@ -2593,18 +2595,18 @@ AlterSubscriptionOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) */ if (OidIsValid(form->subserver)) { - Oid serverid = form->subserver; + ForeignServer *server = GetForeignServer(form->subserver); - aclresult = object_aclcheck(ForeignServerRelationId, serverid, newOwnerId, ACL_USAGE); + aclresult = object_aclcheck(ForeignServerRelationId, server->serverid, newOwnerId, ACL_USAGE); if (aclresult != ACLCHECK_OK) ereport(ERROR, errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("new subscription owner \"%s\" does not have permission on foreign server \"%s\"", GetUserNameFromId(newOwnerId, false), - ForeignServerName(serverid))); + server->servername)); /* make sure a user mapping exists */ - GetUserMapping(newOwnerId, serverid); + GetUserMapping(newOwnerId, server->serverid); } form->subowner = newOwnerId; diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index 1b53ca306a0..005282f17f6 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -178,31 +178,6 @@ GetForeignServerExtended(Oid serverid, bits16 flags) } -/* - * ForeignServerName - get name of foreign server. - */ -char * -ForeignServerName(Oid serverid) -{ - Form_pg_foreign_server serverform; - char *servername; - HeapTuple tp; - - tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)); - - if (!HeapTupleIsValid(tp)) - elog(ERROR, "cache lookup failed for foreign server %u", serverid); - - serverform = (Form_pg_foreign_server) GETSTRUCT(tp); - - servername = pstrdup(NameStr(serverform->srvname)); - - ReleaseSysCache(tp); - - return servername; -} - - /* * GetForeignServerByName - look up the foreign server definition by name. */ @@ -224,13 +199,11 @@ GetForeignServerByName(const char *srvname, bool missing_ok) * NB: leaks into CurrentMemoryContext. */ char * -ForeignServerConnectionString(Oid userid, Oid serverid) +ForeignServerConnectionString(Oid userid, ForeignServer *server) { - ForeignServer *server; ForeignDataWrapper *fdw; Datum connection_datum; - server = GetForeignServer(serverid); fdw = GetForeignDataWrapper(server->fdwid); if (!OidIsValid(fdw->fdwconnection)) @@ -242,7 +215,7 @@ ForeignServerConnectionString(Oid userid, Oid serverid) connection_datum = OidFunctionCall3(fdw->fdwconnection, ObjectIdGetDatum(userid), - ObjectIdGetDatum(serverid), + ObjectIdGetDatum(server->serverid), PointerGetDatum(NULL)); return text_to_cstring(DatumGetTextPP(connection_datum)); diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h index 65ed9a7f987..564c3cc1b7f 100644 --- a/src/include/foreign/foreign.h +++ b/src/include/foreign/foreign.h @@ -66,12 +66,12 @@ typedef struct ForeignTable extern ForeignServer *GetForeignServer(Oid serverid); -extern char *ForeignServerName(Oid serverid); extern ForeignServer *GetForeignServerExtended(Oid serverid, bits16 flags); extern ForeignServer *GetForeignServerByName(const char *srvname, bool missing_ok); -extern char *ForeignServerConnectionString(Oid userid, Oid serverid); +extern char *ForeignServerConnectionString(Oid userid, + ForeignServer *server); extern UserMapping *GetUserMapping(Oid userid, Oid serverid); extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid); extern ForeignDataWrapper *GetForeignDataWrapperExtended(Oid fdwid,