0001-Extend-lookup-routines-for-FDW-and-foreign-server-wi.patch
text/x-diff
Filename: 0001-Extend-lookup-routines-for-FDW-and-foreign-server-wi.patch
Type: text/x-diff
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Extend lookup routines for FDW and foreign server with NULL handling
| File | + | − |
|---|---|---|
| doc/src/sgml/fdwhandler.sgml | 30 | 0 |
| src/backend/foreign/foreign.c | 34 | 2 |
| src/include/foreign/foreign.h | 4 | 0 |
From fba6464f1555ec05029a58e2bf378ef83ce73172 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
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,
<para>
<programlisting>
ForeignDataWrapper *
+GetForeignDataWrapperExtended(Oid fdwid, bool missing_ok);
+</programlisting>
+
+ This function returns a <structname>ForeignDataWrapper</structname>
+ object for the foreign-data wrapper with the given OID. A
+ <structname>ForeignDataWrapper</structname> object contains properties
+ of the FDW (see <filename>foreign/foreign.h</filename> for details).
+ If <literal>missing_ok</literal> is true, a <literal>NULL</literal>
+ result is returned to the caller instead of an error for an undefined
+ FDW.
+ </para>
+
+ <para>
+<programlisting>
+ForeignDataWrapper *
GetForeignDataWrapper(Oid fdwid);
</programlisting>
@@ -1420,6 +1435,21 @@ GetForeignDataWrapper(Oid fdwid);
<para>
<programlisting>
ForeignServer *
+GetForeignServerExtended(Oid serverid, bool missing_ok);
+</programlisting>
+
+ This function returns a <structname>ForeignServer</structname> object
+ for the foreign server with the given OID. A
+ <structname>ForeignServer</structname> object contains properties
+ of the server (see <filename>foreign/foreign.h</filename> for details).
+ If <literal>missing_ok</literal> is true, a <literal>NULL</literal>
+ result is returned to the caller instead of an error for an undefined
+ foreign server.
+ </para>
+
+ <para>
+<programlisting>
+ForeignServer *
GetForeignServer(Oid serverid);
</programlisting>
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