From: Shigeru Hanada Date: Tue, 18 Jan 2011 10:51:34 +0000 (+0900) Subject: Add catalog lookup function for pg_foreign_table. X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=830170525e225400e7d6dddf5cb01be9fc1a69e7;p=users%2Fhanada%2Fpostgres.git Add catalog lookup function for pg_foreign_table. --- diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index 9a0f847f93..6cfddf317a 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -16,6 +16,7 @@ #include "catalog/namespace.h" #include "catalog/pg_foreign_data_wrapper.h" #include "catalog/pg_foreign_server.h" +#include "catalog/pg_foreign_table.h" #include "catalog/pg_type.h" #include "catalog/pg_user_mapping.h" #include "foreign/foreign.h" @@ -249,6 +250,45 @@ GetUserMapping(Oid userid, Oid serverid) } +/* + * GetForeignTable - look up the foreign table definition by relation oid. + */ +ForeignTable * +GetForeignTable(Oid relid) +{ + Form_pg_foreign_table tableform; + ForeignTable *ft; + HeapTuple tp; + Datum datum; + bool isnull; + + tp = SearchSysCache(FOREIGNTABLEREL, + ObjectIdGetDatum(relid), + 0, 0, 0); + + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for foreign table %u", relid); + + tableform = (Form_pg_foreign_table) GETSTRUCT(tp); + + ft = palloc(sizeof(ForeignTable)); + ft->relid = relid; + ft->serverid = tableform->ftserver; + + /* Extract the ftoptions */ + datum = SysCacheGetAttr(FOREIGNTABLEREL, + tp, + Anum_pg_foreign_table_ftoptions, + &isnull); + + /* untransformRelOptions does exactly what we want - avoid duplication */ + ft->options = untransformRelOptions(datum); + ReleaseSysCache(tp); + + return ft; +} + + /* * deflist_to_tuplestore - Helper function to convert DefElem list to * tuplestore usable in SRF. diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h index 2d1495cfe1..f3037a442a 100644 --- a/src/include/foreign/foreign.h +++ b/src/include/foreign/foreign.h @@ -59,6 +59,12 @@ typedef struct UserMapping List *options; /* useoptions as DefElem list */ } UserMapping; +typedef struct ForeignTable +{ + Oid relid; /* relation Oid */ + Oid serverid; /* server Oid */ + List *options; /* ftoptions as DefElem list */ +} ForeignTable; extern ForeignServer *GetForeignServer(Oid serverid); extern ForeignServer *GetForeignServerByName(const char *name, bool missing_ok); @@ -68,5 +74,6 @@ extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid); extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name, bool missing_ok); extern Oid GetForeignDataWrapperOidByName(const char *name, bool missing_ok); +extern ForeignTable *GetForeignTable(Oid relid); #endif /* FOREIGN_H */