PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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-2016, 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  RelOptInfo *scan_join_rel);
64 
65 typedef void (*AddForeignUpdateTargets_function) (Query *parsetree,
66  RangeTblEntry *target_rte,
67  Relation target_relation);
68 
69 typedef List *(*PlanForeignModify_function) (PlannerInfo *root,
70  ModifyTable *plan,
71  Index resultRelation,
72  int subplan_index);
73 
75  ResultRelInfo *rinfo,
76  List *fdw_private,
77  int subplan_index,
78  int eflags);
79 
80 typedef TupleTableSlot *(*ExecForeignInsert_function) (EState *estate,
81  ResultRelInfo *rinfo,
82  TupleTableSlot *slot,
83  TupleTableSlot *planSlot);
84 
85 typedef TupleTableSlot *(*ExecForeignUpdate_function) (EState *estate,
86  ResultRelInfo *rinfo,
87  TupleTableSlot *slot,
88  TupleTableSlot *planSlot);
89 
90 typedef TupleTableSlot *(*ExecForeignDelete_function) (EState *estate,
91  ResultRelInfo *rinfo,
92  TupleTableSlot *slot,
93  TupleTableSlot *planSlot);
94 
95 typedef void (*EndForeignModify_function) (EState *estate,
96  ResultRelInfo *rinfo);
97 
99 
101  ModifyTable *plan,
102  Index resultRelation,
103  int subplan_index);
104 
106  int eflags);
107 
108 typedef TupleTableSlot *(*IterateDirectModify_function) (ForeignScanState *node);
109 
111 
113  LockClauseStrength strength);
114 
116  ExecRowMark *erm,
117  Datum rowid,
118  bool *updated);
119 
121  struct ExplainState *es);
122 
124  ResultRelInfo *rinfo,
125  List *fdw_private,
126  int subplan_index,
127  struct ExplainState *es);
128 
130  struct ExplainState *es);
131 
132 typedef int (*AcquireSampleRowsFunc) (Relation relation, int elevel,
133  HeapTuple *rows, int targrows,
134  double *totalrows,
135  double *totaldeadrows);
136 
138  AcquireSampleRowsFunc *func,
139  BlockNumber *totalpages);
140 
141 typedef List *(*ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt,
142  Oid serverOid);
143 
145  ParallelContext *pcxt);
147  ParallelContext *pcxt,
148  void *coordinate);
150  shm_toc *toc,
151  void *coordinate);
153  RelOptInfo *rel,
154  RangeTblEntry *rte);
155 
156 /*
157  * FdwRoutine is the struct returned by a foreign-data wrapper's handler
158  * function. It provides pointers to the callback functions needed by the
159  * planner and executor.
160  *
161  * More function pointers are likely to be added in the future. Therefore
162  * it's recommended that the handler initialize the struct with
163  * makeNode(FdwRoutine) so that all fields are set to NULL. This will
164  * ensure that no fields are accidentally left undefined.
165  */
166 typedef struct FdwRoutine
167 {
169 
170  /* Functions for scanning foreign tables */
178 
179  /*
180  * Remaining functions are optional. Set the pointer to NULL for any that
181  * are not provided.
182  */
183 
184  /* Functions for remote-join planning */
186 
187  /* Functions for remote upper-relation (post scan/join) planning */
189 
190  /* Functions for updating foreign tables */
203 
204  /* Functions for SELECT FOR UPDATE/SHARE row locking */
208 
209  /* Support functions for EXPLAIN */
213 
214  /* Support functions for ANALYZE */
216 
217  /* Support functions for IMPORT FOREIGN SCHEMA */
219 
220  /* Support functions for parallelism under Gather node */
225 } FdwRoutine;
226 
227 
228 /* Functions in foreign/foreign.c */
229 extern FdwRoutine *GetFdwRoutine(Oid fdwhandler);
230 extern Oid GetForeignServerIdByRelId(Oid relid);
231 extern FdwRoutine *GetFdwRoutineByServerId(Oid serverid);
232 extern FdwRoutine *GetFdwRoutineByRelId(Oid relid);
233 extern FdwRoutine *GetFdwRoutineForRelation(Relation relation, bool makecopy);
234 extern bool IsImportableForeignTable(const char *tablename,
236 extern Path *GetExistingLocalJoinPath(RelOptInfo *joinrel);
237 
238 #endif /* FDWAPI_H */
GetForeignPlan_function GetForeignPlan
Definition: fdwapi.h:173
BeginForeignScan_function BeginForeignScan
Definition: fdwapi.h:174
GetForeignUpperPaths_function GetForeignUpperPaths
Definition: fdwapi.h:188
ExecForeignDelete_function ExecForeignDelete
Definition: fdwapi.h:196
EndDirectModify_function EndDirectModify
Definition: fdwapi.h:202
void(* ReScanForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:51
HeapTupleData * HeapTuple
Definition: htup.h:70
EstimateDSMForeignScan_function EstimateDSMForeignScan
Definition: fdwapi.h:222
Path * GetExistingLocalJoinPath(RelOptInfo *joinrel)
Definition: foreign.c:826
TupleTableSlot *(* ExecForeignDelete_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:90
ExplainForeignScan_function ExplainForeignScan
Definition: fdwapi.h:210
AnalyzeForeignTable_function AnalyzeForeignTable
Definition: fdwapi.h:215
void(* GetForeignJoinPaths_function)(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra)
Definition: fdwapi.h:55
InitializeWorkerForeignScan_function InitializeWorkerForeignScan
Definition: fdwapi.h:224
Definition: plannodes.h:96
FdwRoutine * GetFdwRoutineForRelation(Relation relation, bool makecopy)
Definition: foreign.c:505
int(* AcquireSampleRowsFunc)(Relation relation, int elevel, HeapTuple *rows, int targrows, double *totalrows, double *totaldeadrows)
Definition: fdwapi.h:132
ExecForeignInsert_function ExecForeignInsert
Definition: fdwapi.h:194
void(* ExplainForeignScan_function)(ForeignScanState *node, struct ExplainState *es)
Definition: fdwapi.h:120
void(* EndForeignModify_function)(EState *estate, ResultRelInfo *rinfo)
Definition: fdwapi.h:95
FdwRoutine * GetFdwRoutine(Oid fdwhandler)
Definition: foreign.c:397
uint32 BlockNumber
Definition: block.h:31
TupleTableSlot *(* ExecForeignUpdate_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:85
bool(* AnalyzeForeignTable_function)(Relation relation, AcquireSampleRowsFunc *func, BlockNumber *totalpages)
Definition: fdwapi.h:137
unsigned int Oid
Definition: postgres_ext.h:31
NodeTag
Definition: nodes.h:26
void(* BeginDirectModify_function)(ForeignScanState *node, int eflags)
Definition: fdwapi.h:105
Size(* EstimateDSMForeignScan_function)(ForeignScanState *node, ParallelContext *pcxt)
Definition: fdwapi.h:144
bool IsImportableForeignTable(const char *tablename, ImportForeignSchemaStmt *stmt)
Definition: foreign.c:545
HeapTuple(* RefetchForeignRow_function)(EState *estate, ExecRowMark *erm, Datum rowid, bool *updated)
Definition: fdwapi.h:115
AddForeignUpdateTargets_function AddForeignUpdateTargets
Definition: fdwapi.h:191
char bool
Definition: c.h:199
JoinType
Definition: nodes.h:627
RecheckForeignScan_function RecheckForeignScan
Definition: fdwapi.h:207
IterateDirectModify_function IterateDirectModify
Definition: fdwapi.h:201
List *(* PlanForeignModify_function)(PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
Definition: fdwapi.h:69
int(* IsForeignRelUpdatable_function)(Relation rel)
Definition: fdwapi.h:98
void(* InitializeWorkerForeignScan_function)(ForeignScanState *node, shm_toc *toc, void *coordinate)
Definition: fdwapi.h:149
NodeTag type
Definition: fdwapi.h:168
IsForeignScanParallelSafe_function IsForeignScanParallelSafe
Definition: fdwapi.h:221
GetForeignJoinPaths_function GetForeignJoinPaths
Definition: fdwapi.h:185
void(* EndDirectModify_function)(ForeignScanState *node)
Definition: fdwapi.h:110
void(* GetForeignUpperPaths_function)(PlannerInfo *root, RelOptInfo *scan_join_rel)
Definition: fdwapi.h:62
GetForeignRelSize_function GetForeignRelSize
Definition: fdwapi.h:171
EndForeignScan_function EndForeignScan
Definition: fdwapi.h:177
ExplainDirectModify_function ExplainDirectModify
Definition: fdwapi.h:212
ImportForeignSchema_function ImportForeignSchema
Definition: fdwapi.h:218
PlanForeignModify_function PlanForeignModify
Definition: fdwapi.h:192
EndForeignModify_function EndForeignModify
Definition: fdwapi.h:197
void(* ExplainForeignModify_function)(ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, struct ExplainState *es)
Definition: fdwapi.h:123
GetForeignPaths_function GetForeignPaths
Definition: fdwapi.h:172
PlanDirectModify_function PlanDirectModify
Definition: fdwapi.h:199
FdwRoutine * GetFdwRoutineByRelId(Oid relid)
Definition: foreign.c:482
static int elevel
Definition: vacuumlazy.c:130
BeginDirectModify_function BeginDirectModify
Definition: fdwapi.h:200
RowMarkType(* GetForeignRowMarkType_function)(RangeTblEntry *rte, LockClauseStrength strength)
Definition: fdwapi.h:112
void(* GetForeignPaths_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
Definition: fdwapi.h:31
LockClauseStrength
Definition: lockoptions.h:21
uintptr_t Datum
Definition: postgres.h:374
void(* AddForeignUpdateTargets_function)(Query *parsetree, RangeTblEntry *target_rte, Relation target_relation)
Definition: fdwapi.h:65
GetForeignRowMarkType_function GetForeignRowMarkType
Definition: fdwapi.h:205
List *(* ImportForeignSchema_function)(ImportForeignSchemaStmt *stmt, Oid serverOid)
Definition: fdwapi.h:141
bool(* RecheckForeignScan_function)(ForeignScanState *node, TupleTableSlot *slot)
Definition: fdwapi.h:48
unsigned int Index
Definition: c.h:361
InitializeDSMForeignScan_function InitializeDSMForeignScan
Definition: fdwapi.h:223
ExecForeignUpdate_function ExecForeignUpdate
Definition: fdwapi.h:195
void(* GetForeignRelSize_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
Definition: fdwapi.h:27
ForeignScan *(* GetForeignPlan_function)(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid, ForeignPath *best_path, List *tlist, List *scan_clauses, Plan *outer_plan)
Definition: fdwapi.h:35
ReScanForeignScan_function ReScanForeignScan
Definition: fdwapi.h:176
void(* ExplainDirectModify_function)(ForeignScanState *node, struct ExplainState *es)
Definition: fdwapi.h:129
IterateForeignScan_function IterateForeignScan
Definition: fdwapi.h:175
void(* InitializeDSMForeignScan_function)(ForeignScanState *node, ParallelContext *pcxt, void *coordinate)
Definition: fdwapi.h:146
size_t Size
Definition: c.h:352
RowMarkType
Definition: plannodes.h:867
TupleTableSlot *(* IterateDirectModify_function)(ForeignScanState *node)
Definition: fdwapi.h:108
FdwRoutine * GetFdwRoutineByServerId(Oid serverid)
Definition: foreign.c:440
bool(* IsForeignScanParallelSafe_function)(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
Definition: fdwapi.h:152
TupleTableSlot *(* ExecForeignInsert_function)(EState *estate, ResultRelInfo *rinfo, TupleTableSlot *slot, TupleTableSlot *planSlot)
Definition: fdwapi.h:80
struct FdwRoutine FdwRoutine
ExplainForeignModify_function ExplainForeignModify
Definition: fdwapi.h:211
IsForeignRelUpdatable_function IsForeignRelUpdatable
Definition: fdwapi.h:198
Oid GetForeignServerIdByRelId(Oid relid)
Definition: foreign.c:418
TupleTableSlot *(* IterateForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:46
void(* EndForeignScan_function)(ForeignScanState *node)
Definition: fdwapi.h:53
bool(* PlanDirectModify_function)(PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index)
Definition: fdwapi.h:100
BeginForeignModify_function BeginForeignModify
Definition: fdwapi.h:193
Definition: pg_list.h:45
void(* BeginForeignModify_function)(ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_private, int subplan_index, int eflags)
Definition: fdwapi.h:74
Definition: relation.h:862
void(* BeginForeignScan_function)(ForeignScanState *node, int eflags)
Definition: fdwapi.h:43
RefetchForeignRow_function RefetchForeignRow
Definition: fdwapi.h:206