PostgreSQL Source Code  git master
fdwapi.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * fdwapi.h
4  * API for foreign-data wrappers
5  *
6  * Copyright (c) 2010-2017, PostgreSQL Global Development Group
7  *
8  * src/include/foreign/fdwapi.h
9  *
10  *-------------------------------------------------------------------------
11  */
12 #ifndef FDWAPI_H
13 #define FDWAPI_H
14 
15 #include "access/parallel.h"
16 #include "nodes/execnodes.h"
17 #include "nodes/relation.h"
18 
19 /* To avoid including explain.h here, reference ExplainState thus: */
20 struct ExplainState;
21 
22 
23 /*
24  * Callback function signatures --- see fdwhandler.sgml for more info.
25  */
26 
27 typedef void (*GetForeignRelSize_function) (PlannerInfo *root,
28  RelOptInfo *baserel,
29  Oid foreigntableid);
30 
31 typedef void (*GetForeignPaths_function) (PlannerInfo *root,
32  RelOptInfo *baserel,
33  Oid foreigntableid);
34 
35 typedef ForeignScan *(*GetForeignPlan_function) (PlannerInfo *root,
36  RelOptInfo *baserel,
37  Oid foreigntableid,
38  ForeignPath *best_path,
39  List *tlist,
40  List *scan_clauses,
41  Plan *outer_plan);
42 
44  int eflags);
45 
46 typedef TupleTableSlot *(*IterateForeignScan_function) (ForeignScanState *node);
47 
49  TupleTableSlot *slot);
50 
52 
53 typedef void (*EndForeignScan_function) (ForeignScanState *node);
54 
56  RelOptInfo *joinrel,
57  RelOptInfo *outerrel,
58  RelOptInfo *innerrel,
59  JoinType jointype,
60  JoinPathExtraData *extra);
61 
63  UpperRelationKind stage,
64  RelOptInfo *input_rel,
65  RelOptInfo *output_rel);
66 
67 typedef void (*AddForeignUpdateTargets_function) (Query *parsetree,
68  RangeTblEntry *target_rte,
69  Relation target_relation);
70 
71 typedef List *(*PlanForeignModify_function) (PlannerInfo *root,
72  ModifyTable *plan,
73  Index resultRelation,
74  int subplan_index);
75 
77  ResultRelInfo *rinfo,
78  List *fdw_private,
79  int subplan_index,
80  int eflags);
81 
82 typedef TupleTableSlot *(*ExecForeignInsert_function) (EState *estate,
83  ResultRelInfo *rinfo,
84  TupleTableSlot *slot,
85  TupleTableSlot *planSlot);
86 
87 typedef TupleTableSlot *(*ExecForeignUpdate_function) (EState *estate,
88  ResultRelInfo *rinfo,
89  TupleTableSlot *slot,
90  TupleTableSlot *planSlot);
91 
92 typedef TupleTableSlot *(*ExecForeignDelete_function) (EState *estate,
93  ResultRelInfo *rinfo,
94  TupleTableSlot *slot,
95  TupleTableSlot *planSlot);
96 
97 typedef void (*EndForeignModify_function) (EState *estate,
98  ResultRelInfo *rinfo);
99 
101 
103  ModifyTable *plan,
104  Index resultRelation,
105  int subplan_index);
106 
108  int eflags);
109 
110 typedef TupleTableSlot *(*IterateDirectModify_function) (ForeignScanState *node);
111 
113 
115  LockClauseStrength strength);
116 
118  ExecRowMark *erm,
119  Datum rowid,
120  bool *updated);
121 
123  struct ExplainState *es);
124 
126  ResultRelInfo *rinfo,
127  List *fdw_private,
128  int subplan_index,
129  struct ExplainState *es);
130 
132  struct ExplainState *es);
133 
134 typedef int (*AcquireSampleRowsFunc) (Relation relation, int elevel,
135  HeapTuple *rows, int targrows,
136  double *totalrows,
137  double *totaldeadrows);
138 
140  AcquireSampleRowsFunc *func,
141  BlockNumber *totalpages);
142 
143 typedef List *(*ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt,
144  Oid serverOid);
145 
147  ParallelContext *pcxt);
149  ParallelContext *pcxt,
150  void *coordinate);
152  ParallelContext *pcxt,
153  void *coordinate);
155  shm_toc *toc,
156  void *coordinate);
159  RelOptInfo *rel,
160  RangeTblEntry *rte);
161 typedef List *(*ReparameterizeForeignPathByChild_function) (PlannerInfo *root,
162  List *fdw_private,
163  RelOptInfo *child_rel);
164 
165 /*
166  * FdwRoutine is the struct returned by a foreign-data wrapper's handler
167  * function. It provides pointers to the callback functions needed by the
168  * planner and executor.
169  *
170  * More function pointers are likely to be added in the future. Therefore
171  * it's recommended that the handler initialize the struct with
172  * makeNode(FdwRoutine) so that all fields are set to NULL. This will
173  * ensure that no fields are accidentally left undefined.
174  */
175 typedef struct FdwRoutine
176 {
178 
179  /* Functions for scanning foreign tables */
187 
188  /*
189  * Remaining functions are optional. Set the pointer to NULL for any that
190  * are not provided.
191  */
192 
193  /* Functions for remote-join planning */
195 
196  /* Functions for remote upper-relation (post scan/join) planning */
198 
199  /* Functions for updating foreign tables */
212 
213  /* Functions for SELECT FOR UPDATE/SHARE row locking */
217 
218  /* Support functions for EXPLAIN */
222 
223  /* Support functions for ANALYZE */
225 
226  /* Support functions for IMPORT FOREIGN SCHEMA */
228 
229  /* Support functions for parallelism under Gather node */
236 
237  /* Support functions for path reparameterization. */
239 } FdwRoutine;
240 
241 
242 /* Functions in foreign/foreign.c */
243 extern FdwRoutine *GetFdwRoutine(Oid fdwhandler);
244 extern Oid GetForeignServerIdByRelId(Oid relid);
245 extern FdwRoutine *GetFdwRoutineByServerId(Oid serverid);
246 extern FdwRoutine *GetFdwRoutineByRelId(Oid relid);
247 extern FdwRoutine *GetFdwRoutineForRelation(Relation relation, bool makecopy);
248 extern bool IsImportableForeignTable(const char *tablename,
250 extern Path *GetExistingLocalJoinPath(RelOptInfo *joinrel);
251 
252 #endif /* FDWAPI_H */
GetForeignPlan_function GetForeignPlan
Definition: fdwapi.h:182
BeginForeignScan_function BeginForeignScan
Definition: fdwapi.h:183
GetForeignUpperPaths_function GetForeignUpperPaths
Definition: fdwapi.h:197
ExecForeignDelete_function ExecForeignDelete
Definition: fdwapi.h:205
EndDirectModify_function EndDirectModify
Definition: fdwapi.h:211
void(* GetForeignJoinPaths_function)(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra)
Definition: fdwapi.h:55
HeapTupleData * HeapTuple
Definition: htup.h:70
void(* EndForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:53
EstimateDSMForeignScan_function EstimateDSMForeignScan
Definition: fdwapi.h:231
Path * GetExistingLocalJoinPath(RelOptInfo *joinrel)
Definition: foreign.c:716
ExplainForeignScan_function ExplainForeignScan
Definition: fdwapi.h:219
Size(* EstimateDSMForeignScan_function)(ForeignScanState *node, ParallelContext *pcxt)
Definition: fdwapi.h:146
AnalyzeForeignTable_function AnalyzeForeignTable
Definition: fdwapi.h:224
InitializeWorkerForeignScan_function InitializeWorkerForeignScan
Definition: fdwapi.h:234
void(* AddForeignUpdateTargets_function)(Query *parsetree, RangeTblEntry *target_rte, Relation target_relation)
Definition: fdwapi.h:67
FdwRoutine * GetFdwRoutineForRelation(Relation relation, bool makecopy)
Definition: foreign.c:395
ExecForeignInsert_function ExecForeignInsert
Definition: fdwapi.h:203
FdwRoutine * GetFdwRoutine(Oid fdwhandler)
Definition: foreign.c:287
void(* EndForeignModify_function)(EState *estate, ResultRelInfo *rinfo)
Definition: fdwapi.h:97
void(* BeginForeignScan_function)(ForeignScanState *node, int eflags)
Definition: fdwapi.h:43
uint32 BlockNumber
Definition: block.h:31
void(* ExplainDirectModify_function)(ForeignScanState *node, struct ExplainState *es)
Definition: fdwapi.h:131
void(* ReInitializeDSMForeignScan_function)(ForeignScanState *node, ParallelContext *pcxt, void *coordinate)
Definition: fdwapi.h:151
bool(* RecheckForeignScan_function)(ForeignScanState *node, TupleTableSlot *slot)
Definition: fdwapi.h:48
unsigned int Oid
Definition: postgres_ext.h:31
NodeTag
Definition: nodes.h:26
UpperRelationKind
Definition: relation.h:71
bool IsImportableForeignTable(const char *tablename, ImportForeignSchemaStmt *stmt)
Definition: foreign.c:435
AddForeignUpdateTargets_function AddForeignUpdateTargets
Definition: fdwapi.h:200
char bool
Definition: c.h:247
JoinType
Definition: nodes.h:674
List *(* PlanForeignModify_function)(PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
Definition: fdwapi.h:71
RecheckForeignScan_function RecheckForeignScan
Definition: fdwapi.h:216
IterateDirectModify_function IterateDirectModify
Definition: fdwapi.h:210
int(* IsForeignRelUpdatable_function)(Relation rel)
Definition: fdwapi.h:100
ForeignScan *(* GetForeignPlan_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid, ForeignPath *best_path, List *tlist, List *scan_clauses, Plan *outer_plan)
Definition: fdwapi.h:35
void(* BeginDirectModify_function)(ForeignScanState *node, int eflags)
Definition: fdwapi.h:107
NodeTag type
Definition: fdwapi.h:177
IsForeignScanParallelSafe_function IsForeignScanParallelSafe
Definition: fdwapi.h:230
void(* GetForeignRelSize_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
Definition: fdwapi.h:27
void(* GetForeignPaths_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
Definition: fdwapi.h:31
GetForeignJoinPaths_function GetForeignJoinPaths
Definition: fdwapi.h:194
TupleTableSlot *(* ExecForeignDelete_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:92
TupleTableSlot *(* ExecForeignInsert_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:82
GetForeignRelSize_function GetForeignRelSize
Definition: fdwapi.h:180
EndForeignScan_function EndForeignScan
Definition: fdwapi.h:186
ExplainDirectModify_function ExplainDirectModify
Definition: fdwapi.h:221
void(* EndDirectModify_function)(ForeignScanState *node)
Definition: fdwapi.h:112
bool(* IsForeignScanParallelSafe_function)(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
Definition: fdwapi.h:158
void(* BeginForeignModify_function)(ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, int eflags)
Definition: fdwapi.h:76
ImportForeignSchema_function ImportForeignSchema
Definition: fdwapi.h:227
PlanForeignModify_function PlanForeignModify
Definition: fdwapi.h:201
EndForeignModify_function EndForeignModify
Definition: fdwapi.h:206
TupleTableSlot *(* IterateForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:46
GetForeignPaths_function GetForeignPaths
Definition: fdwapi.h:181
PlanDirectModify_function PlanDirectModify
Definition: fdwapi.h:208
FdwRoutine * GetFdwRoutineByRelId(Oid relid)
Definition: foreign.c:372
static int elevel
Definition: vacuumlazy.c:136
BeginDirectModify_function BeginDirectModify
Definition: fdwapi.h:209
LockClauseStrength
Definition: lockoptions.h:21
uintptr_t Datum
Definition: postgres.h:372
HeapTuple(* RefetchForeignRow_function)(EState *estate, ExecRowMark *erm, Datum rowid, bool *updated)
Definition: fdwapi.h:117
GetForeignRowMarkType_function GetForeignRowMarkType
Definition: fdwapi.h:214
unsigned int Index
Definition: c.h:413
InitializeDSMForeignScan_function InitializeDSMForeignScan
Definition: fdwapi.h:232
bool(* PlanDirectModify_function)(PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
Definition: fdwapi.h:102
ExecForeignUpdate_function ExecForeignUpdate
Definition: fdwapi.h:204
void(* ExplainForeignScan_function)(ForeignScanState *node, struct ExplainState *es)
Definition: fdwapi.h:122
ReScanForeignScan_function ReScanForeignScan
Definition: fdwapi.h:185
bool(* AnalyzeForeignTable_function)(Relation relation, AcquireSampleRowsFunc *func, BlockNumber *totalpages)
Definition: fdwapi.h:139
List *(* ImportForeignSchema_function)(ImportForeignSchemaStmt *stmt, Oid serverOid)
Definition: fdwapi.h:143
IterateForeignScan_function IterateForeignScan
Definition: fdwapi.h:184
size_t Size
Definition: c.h:404
void(* ReScanForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:51
RowMarkType
Definition: plannodes.h:963
FdwRoutine * GetFdwRoutineByServerId(Oid serverid)
Definition: foreign.c:330
TupleTableSlot *(* IterateDirectModify_function)(ForeignScanState *node)
Definition: fdwapi.h:110
struct FdwRoutine FdwRoutine
void(* InitializeWorkerForeignScan_function)(ForeignScanState *node, shm_toc *toc, void *coordinate)
Definition: fdwapi.h:154
ReInitializeDSMForeignScan_function ReInitializeDSMForeignScan
Definition: fdwapi.h:233
ShutdownForeignScan_function ShutdownForeignScan
Definition: fdwapi.h:235
int(* AcquireSampleRowsFunc)(Relation relation, int elevel, HeapTuple *rows, int targrows, double *totalrows, double *totaldeadrows)
Definition: fdwapi.h:134
void(* GetForeignUpperPaths_function)(PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel)
Definition: fdwapi.h:62
void(* InitializeDSMForeignScan_function)(ForeignScanState *node, ParallelContext *pcxt, void *coordinate)
Definition: fdwapi.h:148
RowMarkType(* GetForeignRowMarkType_function)(RangeTblEntry *rte, LockClauseStrength strength)
Definition: fdwapi.h:114
ExplainForeignModify_function ExplainForeignModify
Definition: fdwapi.h:220
IsForeignRelUpdatable_function IsForeignRelUpdatable
Definition: fdwapi.h:207
Oid GetForeignServerIdByRelId(Oid relid)
Definition: foreign.c:308
List *(* ReparameterizeForeignPathByChild_function)(PlannerInfo *root, List *fdw_private, RelOptInfo *child_rel)
Definition: fdwapi.h:161
void(* ShutdownForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:157
BeginForeignModify_function BeginForeignModify
Definition: fdwapi.h:202
Definition: pg_list.h:45
void(* ExplainForeignModify_function)(ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, struct ExplainState *es)
Definition: fdwapi.h:125
TupleTableSlot *(* ExecForeignUpdate_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:87
RefetchForeignRow_function RefetchForeignRow
Definition: fdwapi.h:215
ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild
Definition: fdwapi.h:238