From fba6464f1555ec05029a58e2bf378ef83ce73172 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Sun, 1 Jul 2018 23:26:10 +0900 Subject: [PATCH 1/3] Extend lookup routines for FDW and foreign server with NULL handling The cache lookup routines for foreign-data wrappers and foreign servers are extended with an extra argument able to control if an error or a NULL object is returned to the caller in the event of an undefined object. This is added in a set of new routines to not impact unnecessrily any FPW plugins. --- doc/src/sgml/fdwhandler.sgml | 30 +++++++++++++++++++++++++++++ src/backend/foreign/foreign.c | 36 +++++++++++++++++++++++++++++++++-- src/include/foreign/foreign.h | 4 ++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml index 4ce88dd77c..a68e264261 100644 --- a/doc/src/sgml/fdwhandler.sgml +++ b/doc/src/sgml/fdwhandler.sgml @@ -1408,6 +1408,21 @@ ReparameterizeForeignPathByChild(PlannerInfo *root, List *fdw_private, ForeignDataWrapper * +GetForeignDataWrapperExtended(Oid fdwid, bool missing_ok); + + + This function returns a ForeignDataWrapper + object for the foreign-data wrapper with the given OID. A + ForeignDataWrapper object contains properties + of the FDW (see foreign/foreign.h for details). + If missing_ok is true, a NULL + result is returned to the caller instead of an error for an undefined + FDW. + + + + +ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid); @@ -1420,6 +1435,21 @@ GetForeignDataWrapper(Oid fdwid); ForeignServer * +GetForeignServerExtended(Oid serverid, bool missing_ok); + + + This function returns a ForeignServer object + for the foreign server with the given OID. A + ForeignServer object contains properties + of the server (see foreign/foreign.h for details). + If missing_ok is true, a NULL + result is returned to the caller instead of an error for an undefined + foreign server. + + + + +ForeignServer * GetForeignServer(Oid serverid); diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index eac78a5d31..01b5175e71 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -33,6 +33,18 @@ */ ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid) +{ + return GetForeignDataWrapperExtended(fdwid, false); +} + + +/* + * GetForeignDataWrapperExtended - look up the foreign-data wrapper + * by OID. If missing_ok is true, return NULL if the object cannot be + * found instead of raising an error. + */ +ForeignDataWrapper * +GetForeignDataWrapperExtended(Oid fdwid, bool missing_ok) { Form_pg_foreign_data_wrapper fdwform; ForeignDataWrapper *fdw; @@ -43,7 +55,11 @@ GetForeignDataWrapper(Oid fdwid) tp = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)); if (!HeapTupleIsValid(tp)) - elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid); + return NULL; + } fdwform = (Form_pg_foreign_data_wrapper) GETSTRUCT(tp); @@ -91,6 +107,18 @@ GetForeignDataWrapperByName(const char *fdwname, bool missing_ok) */ ForeignServer * GetForeignServer(Oid serverid) +{ + return GetForeignServerExtended(serverid, false); +} + + +/* + * GetForeignServerExtended - look up the foreign server definition. If + * missing_ok is true, return NULL if the object cannot be found instead + * of raising an error. + */ +ForeignServer * +GetForeignServerExtended(Oid serverid, bool missing_ok) { Form_pg_foreign_server serverform; ForeignServer *server; @@ -101,7 +129,11 @@ GetForeignServer(Oid serverid) tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)); if (!HeapTupleIsValid(tp)) - elog(ERROR, "cache lookup failed for foreign server %u", serverid); + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for foreign server %u", serverid); + return NULL; + } serverform = (Form_pg_foreign_server) GETSTRUCT(tp); diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h index 3ca12e64d2..5cc89e967c 100644 --- a/src/include/foreign/foreign.h +++ b/src/include/foreign/foreign.h @@ -70,9 +70,13 @@ typedef struct ForeignTable extern ForeignServer *GetForeignServer(Oid serverid); +extern ForeignServer *GetForeignServerExtended(Oid serverid, + bool missing_ok); extern ForeignServer *GetForeignServerByName(const char *name, bool missing_ok); extern UserMapping *GetUserMapping(Oid userid, Oid serverid); extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid); +extern ForeignDataWrapper *GetForeignDataWrapperExtended(Oid fdwid, + bool missing_ok); extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name, bool missing_ok); extern ForeignTable *GetForeignTable(Oid relid); -- 2.19.0