PostgreSQL Source Code  git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
fdwapi.h File Reference
#include "access/parallel.h"
#include "nodes/execnodes.h"
#include "nodes/pathnodes.h"
Include dependency graph for fdwapi.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  FdwRoutine
 

Typedefs

typedef void(* GetForeignRelSize_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
 
typedef void(* GetForeignPaths_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
 
typedef ForeignScan *(* GetForeignPlan_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid, ForeignPath *best_path, List *tlist, List *scan_clauses, Plan *outer_plan)
 
typedef void(* BeginForeignScan_function) (ForeignScanState *node, int eflags)
 
typedef TupleTableSlot *(* IterateForeignScan_function) (ForeignScanState *node)
 
typedef bool(* RecheckForeignScan_function) (ForeignScanState *node, TupleTableSlot *slot)
 
typedef void(* ReScanForeignScan_function) (ForeignScanState *node)
 
typedef void(* EndForeignScan_function) (ForeignScanState *node)
 
typedef void(* GetForeignJoinPaths_function) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra)
 
typedef void(* GetForeignUpperPaths_function) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra)
 
typedef void(* AddForeignUpdateTargets_function) (PlannerInfo *root, Index rtindex, RangeTblEntry *target_rte, Relation target_relation)
 
typedef List *(* PlanForeignModify_function) (PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
 
typedef void(* BeginForeignModify_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, int eflags)
 
typedef TupleTableSlot *(* ExecForeignInsert_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
 
typedef TupleTableSlot **(* ExecForeignBatchInsert_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot **slots, TupleTableSlot **planSlots, int *numSlots)
 
typedef int(* GetForeignModifyBatchSize_function) (ResultRelInfo *rinfo)
 
typedef TupleTableSlot *(* ExecForeignUpdate_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
 
typedef TupleTableSlot *(* ExecForeignDelete_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
 
typedef void(* EndForeignModify_function) (EState *estate, ResultRelInfo *rinfo)
 
typedef void(* BeginForeignInsert_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo)
 
typedef void(* EndForeignInsert_function) (EState *estate, ResultRelInfo *rinfo)
 
typedef int(* IsForeignRelUpdatable_function) (Relation rel)
 
typedef bool(* PlanDirectModify_function) (PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
 
typedef void(* BeginDirectModify_function) (ForeignScanState *node, int eflags)
 
typedef TupleTableSlot *(* IterateDirectModify_function) (ForeignScanState *node)
 
typedef void(* EndDirectModify_function) (ForeignScanState *node)
 
typedef RowMarkType(* GetForeignRowMarkType_function) (RangeTblEntry *rte, LockClauseStrength strength)
 
typedef void(* RefetchForeignRow_function) (EState *estate, ExecRowMark *erm, Datum rowid, TupleTableSlot *slot, bool *updated)
 
typedef void(* ExplainForeignScan_function) (ForeignScanState *node, struct ExplainState *es)
 
typedef void(* ExplainForeignModify_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, struct ExplainState *es)
 
typedef void(* ExplainDirectModify_function) (ForeignScanState *node, struct ExplainState *es)
 
typedef int(* AcquireSampleRowsFunc) (Relation relation, int elevel, HeapTuple *rows, int targrows, double *totalrows, double *totaldeadrows)
 
typedef bool(* AnalyzeForeignTable_function) (Relation relation, AcquireSampleRowsFunc *func, BlockNumber *totalpages)
 
typedef List *(* ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt, Oid serverOid)
 
typedef void(* ExecForeignTruncate_function) (List *rels, DropBehavior behavior, bool restart_seqs)
 
typedef Size(* EstimateDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt)
 
typedef void(* InitializeDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt, void *coordinate)
 
typedef void(* ReInitializeDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt, void *coordinate)
 
typedef void(* InitializeWorkerForeignScan_function) (ForeignScanState *node, shm_toc *toc, void *coordinate)
 
typedef void(* ShutdownForeignScan_function) (ForeignScanState *node)
 
typedef bool(* IsForeignScanParallelSafe_function) (PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
 
typedef List *(* ReparameterizeForeignPathByChild_function) (PlannerInfo *root, List *fdw_private, RelOptInfo *child_rel)
 
typedef bool(* IsForeignPathAsyncCapable_function) (ForeignPath *path)
 
typedef void(* ForeignAsyncRequest_function) (AsyncRequest *areq)
 
typedef void(* ForeignAsyncConfigureWait_function) (AsyncRequest *areq)
 
typedef void(* ForeignAsyncNotify_function) (AsyncRequest *areq)
 
typedef struct FdwRoutine FdwRoutine
 

Functions

FdwRoutineGetFdwRoutine (Oid fdwhandler)
 
Oid GetForeignServerIdByRelId (Oid relid)
 
FdwRoutineGetFdwRoutineByServerId (Oid serverid)
 
FdwRoutineGetFdwRoutineByRelId (Oid relid)
 
FdwRoutineGetFdwRoutineForRelation (Relation relation, bool makecopy)
 
bool IsImportableForeignTable (const char *tablename, ImportForeignSchemaStmt *stmt)
 
PathGetExistingLocalJoinPath (RelOptInfo *joinrel)
 

Typedef Documentation

◆ AcquireSampleRowsFunc

typedef int(* AcquireSampleRowsFunc) (Relation relation, int elevel, HeapTuple *rows, int targrows, double *totalrows, double *totaldeadrows)

Definition at line 151 of file fdwapi.h.

◆ AddForeignUpdateTargets_function

typedef void(* AddForeignUpdateTargets_function) (PlannerInfo *root, Index rtindex, RangeTblEntry *target_rte, Relation target_relation)

Definition at line 68 of file fdwapi.h.

◆ AnalyzeForeignTable_function

typedef bool(* AnalyzeForeignTable_function) (Relation relation, AcquireSampleRowsFunc *func, BlockNumber *totalpages)

Definition at line 156 of file fdwapi.h.

◆ BeginDirectModify_function

typedef void(* BeginDirectModify_function) (ForeignScanState *node, int eflags)

Definition at line 123 of file fdwapi.h.

◆ BeginForeignInsert_function

typedef void(* BeginForeignInsert_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo)

Definition at line 110 of file fdwapi.h.

◆ BeginForeignModify_function

typedef void(* BeginForeignModify_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, int eflags)

Definition at line 78 of file fdwapi.h.

◆ BeginForeignScan_function

typedef void(* BeginForeignScan_function) (ForeignScanState *node, int eflags)

Definition at line 43 of file fdwapi.h.

◆ EndDirectModify_function

typedef void(* EndDirectModify_function) (ForeignScanState *node)

Definition at line 128 of file fdwapi.h.

◆ EndForeignInsert_function

typedef void(* EndForeignInsert_function) (EState *estate, ResultRelInfo *rinfo)

Definition at line 113 of file fdwapi.h.

◆ EndForeignModify_function

typedef void(* EndForeignModify_function) (EState *estate, ResultRelInfo *rinfo)

Definition at line 107 of file fdwapi.h.

◆ EndForeignScan_function

typedef void(* EndForeignScan_function) (ForeignScanState *node)

Definition at line 53 of file fdwapi.h.

◆ EstimateDSMForeignScan_function

typedef Size(* EstimateDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt)

Definition at line 167 of file fdwapi.h.

◆ ExecForeignBatchInsert_function

typedef TupleTableSlot**(* ExecForeignBatchInsert_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot **slots, TupleTableSlot **planSlots, int *numSlots)

Definition at line 89 of file fdwapi.h.

◆ ExecForeignDelete_function

typedef TupleTableSlot*(* ExecForeignDelete_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)

Definition at line 102 of file fdwapi.h.

◆ ExecForeignInsert_function

typedef TupleTableSlot*(* ExecForeignInsert_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)

Definition at line 84 of file fdwapi.h.

◆ ExecForeignTruncate_function

typedef void(* ExecForeignTruncate_function) (List *rels, DropBehavior behavior, bool restart_seqs)

Definition at line 163 of file fdwapi.h.

◆ ExecForeignUpdate_function

typedef TupleTableSlot*(* ExecForeignUpdate_function) (EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)

Definition at line 97 of file fdwapi.h.

◆ ExplainDirectModify_function

typedef void(* ExplainDirectModify_function) (ForeignScanState *node, struct ExplainState *es)

Definition at line 148 of file fdwapi.h.

◆ ExplainForeignModify_function

typedef void(* ExplainForeignModify_function) (ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, struct ExplainState *es)

Definition at line 142 of file fdwapi.h.

◆ ExplainForeignScan_function

typedef void(* ExplainForeignScan_function) (ForeignScanState *node, struct ExplainState *es)

Definition at line 139 of file fdwapi.h.

◆ FdwRoutine

typedef struct FdwRoutine FdwRoutine

◆ ForeignAsyncConfigureWait_function

typedef void(* ForeignAsyncConfigureWait_function) (AsyncRequest *areq)

Definition at line 190 of file fdwapi.h.

◆ ForeignAsyncNotify_function

typedef void(* ForeignAsyncNotify_function) (AsyncRequest *areq)

Definition at line 192 of file fdwapi.h.

◆ ForeignAsyncRequest_function

typedef void(* ForeignAsyncRequest_function) (AsyncRequest *areq)

Definition at line 188 of file fdwapi.h.

◆ GetForeignJoinPaths_function

typedef void(* GetForeignJoinPaths_function) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra)

Definition at line 55 of file fdwapi.h.

◆ GetForeignModifyBatchSize_function

typedef int(* GetForeignModifyBatchSize_function) (ResultRelInfo *rinfo)

Definition at line 95 of file fdwapi.h.

◆ GetForeignPaths_function

typedef void(* GetForeignPaths_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)

Definition at line 31 of file fdwapi.h.

◆ GetForeignPlan_function

typedef ForeignScan*(* GetForeignPlan_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid, ForeignPath *best_path, List *tlist, List *scan_clauses, Plan *outer_plan)

Definition at line 35 of file fdwapi.h.

◆ GetForeignRelSize_function

typedef void(* GetForeignRelSize_function) (PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)

Definition at line 27 of file fdwapi.h.

◆ GetForeignRowMarkType_function

typedef RowMarkType(* GetForeignRowMarkType_function) (RangeTblEntry *rte, LockClauseStrength strength)

Definition at line 130 of file fdwapi.h.

◆ GetForeignUpperPaths_function

typedef void(* GetForeignUpperPaths_function) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra)

Definition at line 62 of file fdwapi.h.

◆ ImportForeignSchema_function

typedef List*(* ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt, Oid serverOid)

Definition at line 160 of file fdwapi.h.

◆ InitializeDSMForeignScan_function

typedef void(* InitializeDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt, void *coordinate)

Definition at line 169 of file fdwapi.h.

◆ InitializeWorkerForeignScan_function

typedef void(* InitializeWorkerForeignScan_function) (ForeignScanState *node, shm_toc *toc, void *coordinate)

Definition at line 175 of file fdwapi.h.

◆ IsForeignPathAsyncCapable_function

typedef bool(* IsForeignPathAsyncCapable_function) (ForeignPath *path)

Definition at line 186 of file fdwapi.h.

◆ IsForeignRelUpdatable_function

typedef int(* IsForeignRelUpdatable_function) (Relation rel)

Definition at line 116 of file fdwapi.h.

◆ IsForeignScanParallelSafe_function

typedef bool(* IsForeignScanParallelSafe_function) (PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)

Definition at line 179 of file fdwapi.h.

◆ IterateDirectModify_function

typedef TupleTableSlot*(* IterateDirectModify_function) (ForeignScanState *node)

Definition at line 126 of file fdwapi.h.

◆ IterateForeignScan_function

typedef TupleTableSlot*(* IterateForeignScan_function) (ForeignScanState *node)

Definition at line 46 of file fdwapi.h.

◆ PlanDirectModify_function

typedef bool(* PlanDirectModify_function) (PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)

Definition at line 118 of file fdwapi.h.

◆ PlanForeignModify_function

typedef List*(* PlanForeignModify_function) (PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)

Definition at line 73 of file fdwapi.h.

◆ RecheckForeignScan_function

typedef bool(* RecheckForeignScan_function) (ForeignScanState *node, TupleTableSlot *slot)

Definition at line 48 of file fdwapi.h.

◆ RefetchForeignRow_function

typedef void(* RefetchForeignRow_function) (EState *estate, ExecRowMark *erm, Datum rowid, TupleTableSlot *slot, bool *updated)

Definition at line 133 of file fdwapi.h.

◆ ReInitializeDSMForeignScan_function

typedef void(* ReInitializeDSMForeignScan_function) (ForeignScanState *node, ParallelContext *pcxt, void *coordinate)

Definition at line 172 of file fdwapi.h.

◆ ReparameterizeForeignPathByChild_function

typedef List*(* ReparameterizeForeignPathByChild_function) (PlannerInfo *root, List *fdw_private, RelOptInfo *child_rel)

Definition at line 182 of file fdwapi.h.

◆ ReScanForeignScan_function

typedef void(* ReScanForeignScan_function) (ForeignScanState *node)

Definition at line 51 of file fdwapi.h.

◆ ShutdownForeignScan_function

typedef void(* ShutdownForeignScan_function) (ForeignScanState *node)

Definition at line 178 of file fdwapi.h.

Function Documentation

◆ GetExistingLocalJoinPath()

Path* GetExistingLocalJoinPath ( RelOptInfo joinrel)

Definition at line 741 of file foreign.c.

742 {
743  ListCell *lc;
744 
745  Assert(IS_JOIN_REL(joinrel));
746 
747  foreach(lc, joinrel->pathlist)
748  {
749  Path *path = (Path *) lfirst(lc);
750  JoinPath *joinpath = NULL;
751 
752  /* Skip parameterized paths. */
753  if (path->param_info != NULL)
754  continue;
755 
756  switch (path->pathtype)
757  {
758  case T_HashJoin:
759  {
760  HashPath *hash_path = makeNode(HashPath);
761 
762  memcpy(hash_path, path, sizeof(HashPath));
763  joinpath = (JoinPath *) hash_path;
764  }
765  break;
766 
767  case T_NestLoop:
768  {
769  NestPath *nest_path = makeNode(NestPath);
770 
771  memcpy(nest_path, path, sizeof(NestPath));
772  joinpath = (JoinPath *) nest_path;
773  }
774  break;
775 
776  case T_MergeJoin:
777  {
778  MergePath *merge_path = makeNode(MergePath);
779 
780  memcpy(merge_path, path, sizeof(MergePath));
781  joinpath = (JoinPath *) merge_path;
782  }
783  break;
784 
785  default:
786 
787  /*
788  * Just skip anything else. We don't know if corresponding
789  * plan would build the output row from whole-row references
790  * of base relations and execute the EPQ checks.
791  */
792  break;
793  }
794 
795  /* This path isn't good for us, check next. */
796  if (!joinpath)
797  continue;
798 
799  /*
800  * If either inner or outer path is a ForeignPath corresponding to a
801  * pushed down join, replace it with the fdw_outerpath, so that we
802  * maintain path for EPQ checks built entirely of local join
803  * strategies.
804  */
805  if (IsA(joinpath->outerjoinpath, ForeignPath))
806  {
807  ForeignPath *foreign_path;
808 
809  foreign_path = (ForeignPath *) joinpath->outerjoinpath;
810  if (IS_JOIN_REL(foreign_path->path.parent))
811  joinpath->outerjoinpath = foreign_path->fdw_outerpath;
812  }
813 
814  if (IsA(joinpath->innerjoinpath, ForeignPath))
815  {
816  ForeignPath *foreign_path;
817 
818  foreign_path = (ForeignPath *) joinpath->innerjoinpath;
819  if (IS_JOIN_REL(foreign_path->path.parent))
820  joinpath->innerjoinpath = foreign_path->fdw_outerpath;
821  }
822 
823  return (Path *) joinpath;
824  }
825  return NULL;
826 }
#define Assert(condition)
Definition: c.h:863
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:76
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
#define makeNode(_type_)
Definition: nodes.h:155
#define IS_JOIN_REL(rel)
Definition: pathnodes.h:844
#define lfirst(lc)
Definition: pg_list.h:172
Path * fdw_outerpath
Definition: pathnodes.h:1880
Path * outerjoinpath
Definition: pathnodes.h:2084
Path * innerjoinpath
Definition: pathnodes.h:2085
NodeTag pathtype
Definition: pathnodes.h:1635
List * pathlist
Definition: pathnodes.h:898

References Assert, ForeignPath::fdw_outerpath, if(), JoinPath::innerjoinpath, IS_JOIN_REL, IsA, lfirst, makeNode, JoinPath::outerjoinpath, ForeignPath::path, RelOptInfo::pathlist, and Path::pathtype.

Referenced by postgresGetForeignJoinPaths().

◆ GetFdwRoutine()

FdwRoutine* GetFdwRoutine ( Oid  fdwhandler)

Definition at line 325 of file foreign.c.

326 {
327  Datum datum;
328  FdwRoutine *routine;
329 
330  /* Check if the access to foreign tables is restricted */
332  {
333  /* there must not be built-in FDW handler */
334  ereport(ERROR,
335  (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
336  errmsg("access to non-system foreign table is restricted")));
337  }
338 
339  datum = OidFunctionCall0(fdwhandler);
340  routine = (FdwRoutine *) DatumGetPointer(datum);
341 
342  if (routine == NULL || !IsA(routine, FdwRoutine))
343  elog(ERROR, "foreign-data wrapper handler function %u did not return an FdwRoutine struct",
344  fdwhandler);
345 
346  return routine;
347 }
#define unlikely(x)
Definition: c.h:326
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define ereport(elevel,...)
Definition: elog.h:149
#define OidFunctionCall0(functionId)
Definition: fmgr.h:677
int restrict_nonsystem_relation_kind
Definition: postgres.c:107
uintptr_t Datum
Definition: postgres.h:64
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:312
#define RESTRICT_RELKIND_FOREIGN_TABLE
Definition: tcopprot.h:48

References DatumGetPointer(), elog, ereport, errcode(), errmsg(), ERROR, IsA, OidFunctionCall0, restrict_nonsystem_relation_kind, RESTRICT_RELKIND_FOREIGN_TABLE, and unlikely.

Referenced by GetFdwRoutineByServerId(), and ImportForeignSchema().

◆ GetFdwRoutineByRelId()

FdwRoutine* GetFdwRoutineByRelId ( Oid  relid)

Definition at line 419 of file foreign.c.

420 {
421  Oid serverid;
422 
423  /* Get server OID for the foreign table. */
424  serverid = GetForeignServerIdByRelId(relid);
425 
426  /* Now retrieve server's FdwRoutine struct. */
427  return GetFdwRoutineByServerId(serverid);
428 }
Oid GetForeignServerIdByRelId(Oid relid)
Definition: foreign.c:355
FdwRoutine * GetFdwRoutineByServerId(Oid serverid)
Definition: foreign.c:377
unsigned int Oid
Definition: postgres_ext.h:31

References GetFdwRoutineByServerId(), and GetForeignServerIdByRelId().

Referenced by GetFdwRoutineForRelation(), make_modifytable(), and select_rowmark_type().

◆ GetFdwRoutineByServerId()

FdwRoutine* GetFdwRoutineByServerId ( Oid  serverid)

Definition at line 377 of file foreign.c.

378 {
379  HeapTuple tp;
381  Form_pg_foreign_server serverform;
382  Oid fdwid;
383  Oid fdwhandler;
384 
385  /* Get foreign-data wrapper OID for the server. */
386  tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid));
387  if (!HeapTupleIsValid(tp))
388  elog(ERROR, "cache lookup failed for foreign server %u", serverid);
389  serverform = (Form_pg_foreign_server) GETSTRUCT(tp);
390  fdwid = serverform->srvfdw;
391  ReleaseSysCache(tp);
392 
393  /* Get handler function OID for the FDW. */
394  tp = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid));
395  if (!HeapTupleIsValid(tp))
396  elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid);
397  fdwform = (Form_pg_foreign_data_wrapper) GETSTRUCT(tp);
398  fdwhandler = fdwform->fdwhandler;
399 
400  /* Complain if FDW has been set to NO HANDLER. */
401  if (!OidIsValid(fdwhandler))
402  ereport(ERROR,
403  (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
404  errmsg("foreign-data wrapper \"%s\" has no handler",
405  NameStr(fdwform->fdwname))));
406 
407  ReleaseSysCache(tp);
408 
409  /* And finally, call the handler function. */
410  return GetFdwRoutine(fdwhandler);
411 }
#define NameStr(name)
Definition: c.h:751
#define OidIsValid(objectId)
Definition: c.h:780
FdwRoutine * GetFdwRoutine(Oid fdwhandler)
Definition: foreign.c:325
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define GETSTRUCT(TUP)
Definition: htup_details.h:653
FormData_pg_foreign_data_wrapper * Form_pg_foreign_data_wrapper
FormData_pg_foreign_server * Form_pg_foreign_server
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:252
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:221

References elog, ereport, errcode(), errmsg(), ERROR, GetFdwRoutine(), GETSTRUCT, HeapTupleIsValid, NameStr, ObjectIdGetDatum(), OidIsValid, ReleaseSysCache(), and SearchSysCache1().

Referenced by ExecInitForeignScan(), ExecuteTruncateGuts(), GetFdwRoutineByRelId(), and truncate_check_rel().

◆ GetFdwRoutineForRelation()

FdwRoutine* GetFdwRoutineForRelation ( Relation  relation,
bool  makecopy 
)

Definition at line 442 of file foreign.c.

443 {
444  FdwRoutine *fdwroutine;
445  FdwRoutine *cfdwroutine;
446 
447  if (relation->rd_fdwroutine == NULL)
448  {
449  /* Get the info by consulting the catalogs and the FDW code */
450  fdwroutine = GetFdwRoutineByRelId(RelationGetRelid(relation));
451 
452  /* Save the data for later reuse in CacheMemoryContext */
454  sizeof(FdwRoutine));
455  memcpy(cfdwroutine, fdwroutine, sizeof(FdwRoutine));
456  relation->rd_fdwroutine = cfdwroutine;
457 
458  /* Give back the locally palloc'd copy regardless of makecopy */
459  return fdwroutine;
460  }
461 
462  /* We have valid cached data --- does the caller want a copy? */
463  if (makecopy)
464  {
465  fdwroutine = (FdwRoutine *) palloc(sizeof(FdwRoutine));
466  memcpy(fdwroutine, relation->rd_fdwroutine, sizeof(FdwRoutine));
467  return fdwroutine;
468  }
469 
470  /* Only a short-lived reference is needed, so just hand back cached copy */
471  return relation->rd_fdwroutine;
472 }
FdwRoutine * GetFdwRoutineByRelId(Oid relid)
Definition: foreign.c:419
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1181
MemoryContext CacheMemoryContext
Definition: mcxt.c:152
void * palloc(Size size)
Definition: mcxt.c:1317
#define RelationGetRelid(relation)
Definition: rel.h:505
struct FdwRoutine * rd_fdwroutine
Definition: rel.h:240

References CacheMemoryContext, GetFdwRoutineByRelId(), MemoryContextAlloc(), palloc(), RelationData::rd_fdwroutine, and RelationGetRelid.

Referenced by acquire_inherited_sample_rows(), add_row_identity_columns(), analyze_rel(), CheckValidRowMarkRel(), EvalPlanQualFetchRowMark(), ExecInitForeignScan(), ExecLockRows(), get_relation_info(), InitResultRelInfo(), and relation_is_updatable().

◆ GetForeignServerIdByRelId()

Oid GetForeignServerIdByRelId ( Oid  relid)

Definition at line 355 of file foreign.c.

356 {
357  HeapTuple tp;
358  Form_pg_foreign_table tableform;
359  Oid serverid;
360 
361  tp = SearchSysCache1(FOREIGNTABLEREL, ObjectIdGetDatum(relid));
362  if (!HeapTupleIsValid(tp))
363  elog(ERROR, "cache lookup failed for foreign table %u", relid);
364  tableform = (Form_pg_foreign_table) GETSTRUCT(tp);
365  serverid = tableform->ftserver;
366  ReleaseSysCache(tp);
367 
368  return serverid;
369 }
FormData_pg_foreign_table * Form_pg_foreign_table

References elog, ERROR, GETSTRUCT, HeapTupleIsValid, ObjectIdGetDatum(), ReleaseSysCache(), and SearchSysCache1().

Referenced by ExecuteTruncateGuts(), get_relation_info(), GetFdwRoutineByRelId(), and truncate_check_rel().

◆ IsImportableForeignTable()

bool IsImportableForeignTable ( const char *  tablename,
ImportForeignSchemaStmt stmt 
)

Definition at line 482 of file foreign.c.

484 {
485  ListCell *lc;
486 
487  switch (stmt->list_type)
488  {
490  return true;
491 
493  foreach(lc, stmt->table_list)
494  {
495  RangeVar *rv = (RangeVar *) lfirst(lc);
496 
497  if (strcmp(tablename, rv->relname) == 0)
498  return true;
499  }
500  return false;
501 
503  foreach(lc, stmt->table_list)
504  {
505  RangeVar *rv = (RangeVar *) lfirst(lc);
506 
507  if (strcmp(tablename, rv->relname) == 0)
508  return false;
509  }
510  return true;
511  }
512  return false; /* shouldn't get here */
513 }
#define stmt
Definition: indent_codes.h:59
@ FDW_IMPORT_SCHEMA_LIMIT_TO
Definition: parsenodes.h:2966
@ FDW_IMPORT_SCHEMA_ALL
Definition: parsenodes.h:2965
@ FDW_IMPORT_SCHEMA_EXCEPT
Definition: parsenodes.h:2967
char * relname
Definition: primnodes.h:82

References FDW_IMPORT_SCHEMA_ALL, FDW_IMPORT_SCHEMA_EXCEPT, FDW_IMPORT_SCHEMA_LIMIT_TO, lfirst, RangeVar::relname, and stmt.

Referenced by ImportForeignSchema().