1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * fdwapi.h |
4 | * API for foreign-data wrappers |
5 | * |
6 | * Copyright (c) 2010-2019, 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/pathnodes.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 | |
43 | typedef void (*BeginForeignScan_function) (ForeignScanState *node, |
44 | int eflags); |
45 | |
46 | typedef TupleTableSlot *(*IterateForeignScan_function) (ForeignScanState *node); |
47 | |
48 | typedef bool (*RecheckForeignScan_function) (ForeignScanState *node, |
49 | TupleTableSlot *slot); |
50 | |
51 | typedef void (*ReScanForeignScan_function) (ForeignScanState *node); |
52 | |
53 | typedef void (*EndForeignScan_function) (ForeignScanState *node); |
54 | |
55 | typedef void (*GetForeignJoinPaths_function) (PlannerInfo *root, |
56 | RelOptInfo *joinrel, |
57 | RelOptInfo *outerrel, |
58 | RelOptInfo *innerrel, |
59 | JoinType jointype, |
60 | JoinPathExtraData *); |
61 | |
62 | typedef void (*GetForeignUpperPaths_function) (PlannerInfo *root, |
63 | UpperRelationKind stage, |
64 | RelOptInfo *input_rel, |
65 | RelOptInfo *output_rel, |
66 | void *); |
67 | |
68 | typedef void (*AddForeignUpdateTargets_function) (Query *parsetree, |
69 | RangeTblEntry *target_rte, |
70 | Relation target_relation); |
71 | |
72 | typedef List *(*PlanForeignModify_function) (PlannerInfo *root, |
73 | ModifyTable *plan, |
74 | Index resultRelation, |
75 | int subplan_index); |
76 | |
77 | typedef void (*BeginForeignModify_function) (ModifyTableState *mtstate, |
78 | ResultRelInfo *rinfo, |
79 | List *fdw_private, |
80 | int subplan_index, |
81 | int eflags); |
82 | |
83 | typedef TupleTableSlot *(*ExecForeignInsert_function) (EState *estate, |
84 | ResultRelInfo *rinfo, |
85 | TupleTableSlot *slot, |
86 | TupleTableSlot *planSlot); |
87 | |
88 | typedef TupleTableSlot *(*ExecForeignUpdate_function) (EState *estate, |
89 | ResultRelInfo *rinfo, |
90 | TupleTableSlot *slot, |
91 | TupleTableSlot *planSlot); |
92 | |
93 | typedef TupleTableSlot *(*ExecForeignDelete_function) (EState *estate, |
94 | ResultRelInfo *rinfo, |
95 | TupleTableSlot *slot, |
96 | TupleTableSlot *planSlot); |
97 | |
98 | typedef void (*EndForeignModify_function) (EState *estate, |
99 | ResultRelInfo *rinfo); |
100 | |
101 | typedef void (*BeginForeignInsert_function) (ModifyTableState *mtstate, |
102 | ResultRelInfo *rinfo); |
103 | |
104 | typedef void (*EndForeignInsert_function) (EState *estate, |
105 | ResultRelInfo *rinfo); |
106 | |
107 | typedef int (*IsForeignRelUpdatable_function) (Relation rel); |
108 | |
109 | typedef bool (*PlanDirectModify_function) (PlannerInfo *root, |
110 | ModifyTable *plan, |
111 | Index resultRelation, |
112 | int subplan_index); |
113 | |
114 | typedef void (*BeginDirectModify_function) (ForeignScanState *node, |
115 | int eflags); |
116 | |
117 | typedef TupleTableSlot *(*IterateDirectModify_function) (ForeignScanState *node); |
118 | |
119 | typedef void (*EndDirectModify_function) (ForeignScanState *node); |
120 | |
121 | typedef RowMarkType (*GetForeignRowMarkType_function) (RangeTblEntry *rte, |
122 | LockClauseStrength strength); |
123 | |
124 | typedef void (*RefetchForeignRow_function) (EState *estate, |
125 | ExecRowMark *erm, |
126 | Datum rowid, |
127 | TupleTableSlot *slot, |
128 | bool *updated); |
129 | |
130 | typedef void (*ExplainForeignScan_function) (ForeignScanState *node, |
131 | struct ExplainState *es); |
132 | |
133 | typedef void (*ExplainForeignModify_function) (ModifyTableState *mtstate, |
134 | ResultRelInfo *rinfo, |
135 | List *fdw_private, |
136 | int subplan_index, |
137 | struct ExplainState *es); |
138 | |
139 | typedef void (*ExplainDirectModify_function) (ForeignScanState *node, |
140 | struct ExplainState *es); |
141 | |
142 | typedef int (*AcquireSampleRowsFunc) (Relation relation, int elevel, |
143 | HeapTuple *rows, int targrows, |
144 | double *totalrows, |
145 | double *totaldeadrows); |
146 | |
147 | typedef bool (*AnalyzeForeignTable_function) (Relation relation, |
148 | AcquireSampleRowsFunc *func, |
149 | BlockNumber *totalpages); |
150 | |
151 | typedef List *(*ImportForeignSchema_function) (ImportForeignSchemaStmt *stmt, |
152 | Oid serverOid); |
153 | |
154 | typedef Size (*EstimateDSMForeignScan_function) (ForeignScanState *node, |
155 | ParallelContext *pcxt); |
156 | typedef void (*InitializeDSMForeignScan_function) (ForeignScanState *node, |
157 | ParallelContext *pcxt, |
158 | void *coordinate); |
159 | typedef void (*ReInitializeDSMForeignScan_function) (ForeignScanState *node, |
160 | ParallelContext *pcxt, |
161 | void *coordinate); |
162 | typedef void (*InitializeWorkerForeignScan_function) (ForeignScanState *node, |
163 | shm_toc *toc, |
164 | void *coordinate); |
165 | typedef void (*ShutdownForeignScan_function) (ForeignScanState *node); |
166 | typedef bool (*IsForeignScanParallelSafe_function) (PlannerInfo *root, |
167 | RelOptInfo *rel, |
168 | RangeTblEntry *rte); |
169 | typedef List *(*ReparameterizeForeignPathByChild_function) (PlannerInfo *root, |
170 | List *fdw_private, |
171 | RelOptInfo *child_rel); |
172 | |
173 | /* |
174 | * FdwRoutine is the struct returned by a foreign-data wrapper's handler |
175 | * function. It provides pointers to the callback functions needed by the |
176 | * planner and executor. |
177 | * |
178 | * More function pointers are likely to be added in the future. Therefore |
179 | * it's recommended that the handler initialize the struct with |
180 | * makeNode(FdwRoutine) so that all fields are set to NULL. This will |
181 | * ensure that no fields are accidentally left undefined. |
182 | */ |
183 | typedef struct FdwRoutine |
184 | { |
185 | NodeTag type; |
186 | |
187 | /* Functions for scanning foreign tables */ |
188 | GetForeignRelSize_function GetForeignRelSize; |
189 | GetForeignPaths_function GetForeignPaths; |
190 | GetForeignPlan_function GetForeignPlan; |
191 | BeginForeignScan_function BeginForeignScan; |
192 | IterateForeignScan_function IterateForeignScan; |
193 | ReScanForeignScan_function ReScanForeignScan; |
194 | EndForeignScan_function EndForeignScan; |
195 | |
196 | /* |
197 | * Remaining functions are optional. Set the pointer to NULL for any that |
198 | * are not provided. |
199 | */ |
200 | |
201 | /* Functions for remote-join planning */ |
202 | GetForeignJoinPaths_function GetForeignJoinPaths; |
203 | |
204 | /* Functions for remote upper-relation (post scan/join) planning */ |
205 | GetForeignUpperPaths_function GetForeignUpperPaths; |
206 | |
207 | /* Functions for updating foreign tables */ |
208 | AddForeignUpdateTargets_function AddForeignUpdateTargets; |
209 | PlanForeignModify_function PlanForeignModify; |
210 | BeginForeignModify_function BeginForeignModify; |
211 | ExecForeignInsert_function ExecForeignInsert; |
212 | ExecForeignUpdate_function ExecForeignUpdate; |
213 | ExecForeignDelete_function ExecForeignDelete; |
214 | EndForeignModify_function EndForeignModify; |
215 | BeginForeignInsert_function BeginForeignInsert; |
216 | EndForeignInsert_function EndForeignInsert; |
217 | IsForeignRelUpdatable_function IsForeignRelUpdatable; |
218 | PlanDirectModify_function PlanDirectModify; |
219 | BeginDirectModify_function BeginDirectModify; |
220 | IterateDirectModify_function IterateDirectModify; |
221 | EndDirectModify_function EndDirectModify; |
222 | |
223 | /* Functions for SELECT FOR UPDATE/SHARE row locking */ |
224 | GetForeignRowMarkType_function GetForeignRowMarkType; |
225 | RefetchForeignRow_function RefetchForeignRow; |
226 | RecheckForeignScan_function RecheckForeignScan; |
227 | |
228 | /* Support functions for EXPLAIN */ |
229 | ExplainForeignScan_function ExplainForeignScan; |
230 | ExplainForeignModify_function ExplainForeignModify; |
231 | ExplainDirectModify_function ExplainDirectModify; |
232 | |
233 | /* Support functions for ANALYZE */ |
234 | AnalyzeForeignTable_function AnalyzeForeignTable; |
235 | |
236 | /* Support functions for IMPORT FOREIGN SCHEMA */ |
237 | ImportForeignSchema_function ImportForeignSchema; |
238 | |
239 | /* Support functions for parallelism under Gather node */ |
240 | IsForeignScanParallelSafe_function IsForeignScanParallelSafe; |
241 | EstimateDSMForeignScan_function EstimateDSMForeignScan; |
242 | InitializeDSMForeignScan_function InitializeDSMForeignScan; |
243 | ReInitializeDSMForeignScan_function ReInitializeDSMForeignScan; |
244 | InitializeWorkerForeignScan_function InitializeWorkerForeignScan; |
245 | ShutdownForeignScan_function ShutdownForeignScan; |
246 | |
247 | /* Support functions for path reparameterization. */ |
248 | ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild; |
249 | } FdwRoutine; |
250 | |
251 | |
252 | /* Functions in foreign/foreign.c */ |
253 | extern FdwRoutine *GetFdwRoutine(Oid fdwhandler); |
254 | extern Oid GetForeignServerIdByRelId(Oid relid); |
255 | extern FdwRoutine *GetFdwRoutineByServerId(Oid serverid); |
256 | extern FdwRoutine *GetFdwRoutineByRelId(Oid relid); |
257 | extern FdwRoutine *GetFdwRoutineForRelation(Relation relation, bool makecopy); |
258 | extern bool IsImportableForeignTable(const char *tablename, |
259 | ImportForeignSchemaStmt *stmt); |
260 | extern Path *GetExistingLocalJoinPath(RelOptInfo *joinrel); |
261 | |
262 | #endif /* FDWAPI_H */ |
263 | |