PostgreSQL Source Code git master
postgres_fdw.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * postgres_fdw.h
4 * Foreign-data wrapper for remote PostgreSQL servers
5 *
6 * Portions Copyright (c) 2012-2025, PostgreSQL Global Development Group
7 *
8 * IDENTIFICATION
9 * contrib/postgres_fdw/postgres_fdw.h
10 *
11 *-------------------------------------------------------------------------
12 */
13#ifndef POSTGRES_FDW_H
14#define POSTGRES_FDW_H
15
16#include "foreign/foreign.h"
17#include "lib/stringinfo.h"
18#include "libpq-fe.h"
19#include "nodes/execnodes.h"
20#include "nodes/pathnodes.h"
21#include "utils/relcache.h"
22
23/*
24 * FDW-specific planner information kept in RelOptInfo.fdw_private for a
25 * postgres_fdw foreign table. For a baserel, this struct is created by
26 * postgresGetForeignRelSize, although some fields are not filled till later.
27 * postgresGetForeignJoinPaths creates it for a joinrel, and
28 * postgresGetForeignUpperPaths creates it for an upperrel.
29 */
30typedef struct PgFdwRelationInfo
31{
32 /*
33 * True means that the relation can be pushed down. Always true for simple
34 * foreign scan.
35 */
37
38 /*
39 * Restriction clauses, divided into safe and unsafe to pushdown subsets.
40 * All entries in these lists should have RestrictInfo wrappers; that
41 * improves efficiency of selectivity and cost estimation.
42 */
45
46 /* Actual remote restriction clauses for scan (sans RestrictInfos) */
48
49 /* Bitmap of attr numbers we need to fetch from the remote server. */
51
52 /* True means that the query_pathkeys is safe to push down */
54
55 /* Cost and selectivity of local_conds. */
58
59 /* Selectivity of join conditions */
61
62 /* Estimated size and cost for a scan, join, or grouping/aggregation. */
63 double rows;
64 int width;
68
69 /*
70 * Estimated number of rows fetched from the foreign server, and costs
71 * excluding costs for transferring those rows from the foreign server.
72 * These are only used by estimate_path_cost_size().
73 */
77
78 /* Options extracted from catalogs. */
82 List *shippable_extensions; /* OIDs of shippable extensions */
84
85 /* Cached catalog information. */
88 UserMapping *user; /* only set in use_remote_estimate mode */
89
90 int fetch_size; /* fetch size for this remote table */
91
92 /*
93 * Name of the relation, for use while EXPLAINing ForeignScan. It is used
94 * for join and upper relations but is set for all relations. For a base
95 * relation, this is really just the RT index as a string; we convert that
96 * while producing EXPLAIN output. For join and upper relations, the name
97 * indicates which base foreign tables are included and the join type or
98 * aggregation type used.
99 */
101
102 /* Join information */
106 /* joinclauses contains only JOIN/ON conditions for an outer join */
107 List *joinclauses; /* List of RestrictInfo */
108
109 /* Upper relation information */
111
112 /* Grouping information */
114
115 /* Subquery information */
116 bool make_outerrel_subquery; /* do we deparse outerrel as a
117 * subquery? */
118 bool make_innerrel_subquery; /* do we deparse innerrel as a
119 * subquery? */
120 Relids lower_subquery_rels; /* all relids appearing in lower
121 * subqueries */
122 Relids hidden_subquery_rels; /* relids, which can't be referred to
123 * from upper relations, used
124 * internally for equivalence member
125 * search */
126
127 /*
128 * Index of the relation. It is used to create an alias to a subquery
129 * representing the relation.
130 */
133
134/*
135 * Extra control information relating to a connection.
136 */
137typedef struct PgFdwConnState
138{
139 AsyncRequest *pendingAreq; /* pending async request */
141
142/*
143 * Method used by ANALYZE to sample remote rows.
144 */
146{
147 ANALYZE_SAMPLE_OFF, /* no remote sampling */
148 ANALYZE_SAMPLE_AUTO, /* choose by server version */
149 ANALYZE_SAMPLE_RANDOM, /* remote random() */
150 ANALYZE_SAMPLE_SYSTEM, /* TABLESAMPLE system */
151 ANALYZE_SAMPLE_BERNOULLI, /* TABLESAMPLE bernoulli */
153
154/* in postgres_fdw.c */
155extern int set_transmission_modes(void);
156extern void reset_transmission_modes(int nestlevel);
157extern void process_pending_request(AsyncRequest *areq);
158
159/* in connection.c */
160extern PGconn *GetConnection(UserMapping *user, bool will_prep_stmt,
162extern void ReleaseConnection(PGconn *conn);
163extern unsigned int GetCursorNumber(PGconn *conn);
164extern unsigned int GetPrepStmtNumber(PGconn *conn);
165extern void do_sql_command(PGconn *conn, const char *sql);
167extern PGresult *pgfdw_exec_query(PGconn *conn, const char *query,
169extern void pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
170 bool clear, const char *sql);
171
172/* in option.c */
173extern int ExtractConnectionOptions(List *defelems,
174 const char **keywords,
175 const char **values);
176extern List *ExtractExtensionList(const char *extensionsString,
177 bool warnOnMissing);
178extern char *process_pgfdw_appname(const char *appname);
179extern char *pgfdw_application_name;
180
181/* in deparse.c */
183 RelOptInfo *baserel,
184 List *input_conds,
185 List **remote_conds,
186 List **local_conds);
187extern bool is_foreign_expr(PlannerInfo *root,
188 RelOptInfo *baserel,
189 Expr *expr);
191 RelOptInfo *baserel,
192 Expr *expr);
194 RelOptInfo *baserel,
195 PathKey *pathkey);
197 Index rtindex, Relation rel,
198 List *targetAttrs, bool doNothing,
199 List *withCheckOptionList, List *returningList,
200 List **retrieved_attrs, int *values_end_len);
201extern void rebuildInsertSql(StringInfo buf, Relation rel,
202 char *orig_query, List *target_attrs,
203 int values_end_len, int num_params,
204 int num_rows);
206 Index rtindex, Relation rel,
207 List *targetAttrs,
208 List *withCheckOptionList, List *returningList,
209 List **retrieved_attrs);
211 Index rtindex, Relation rel,
212 RelOptInfo *foreignrel,
213 List *targetlist,
214 List *targetAttrs,
215 List *remote_conds,
216 List **params_list,
217 List *returningList,
218 List **retrieved_attrs);
220 Index rtindex, Relation rel,
221 List *returningList,
222 List **retrieved_attrs);
224 Index rtindex, Relation rel,
225 RelOptInfo *foreignrel,
226 List *remote_conds,
227 List **params_list,
228 List *returningList,
229 List **retrieved_attrs);
233 PgFdwSamplingMethod sample_method,
234 double sample_frac,
235 List **retrieved_attrs);
237 List *rels,
238 DropBehavior behavior,
239 bool restart_seqs);
240extern void deparseStringLiteral(StringInfo buf, const char *val);
243 RelOptInfo *rel);
246 RelOptInfo *rel);
247extern List *build_tlist_to_deparse(RelOptInfo *foreignrel);
249 RelOptInfo *rel, List *tlist,
250 List *remote_conds, List *pathkeys,
251 bool has_final_sort, bool has_limit,
252 bool is_subquery,
253 List **retrieved_attrs, List **params_list);
254extern const char *get_jointype_name(JoinType jointype);
255
256/* in shippable.c */
257extern bool is_builtin(Oid objectId);
258extern bool is_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo);
259
260#endif /* POSTGRES_FDW_H */
static Datum values[MAXATTR]
Definition: bootstrap.c:151
unsigned int Index
Definition: c.h:571
long val
Definition: informix.c:689
static const JsonPathKeyword keywords[]
double Cost
Definition: nodes.h:251
double Selectivity
Definition: nodes.h:250
JoinType
Definition: nodes.h:288
DropBehavior
Definition: parsenodes.h:2384
UpperRelationKind
Definition: pathnodes.h:70
static char * user
Definition: pg_regress.c:119
static char * buf
Definition: pg_test_fsync.c:72
unsigned int Oid
Definition: postgres_ext.h:32
bool is_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo)
Definition: shippable.c:162
unsigned int GetCursorNumber(PGconn *conn)
Definition: connection.c:891
void deparseAnalyzeSizeSql(StringInfo buf, Relation rel)
Definition: deparse.c:2497
void do_sql_command(PGconn *conn, const char *sql)
Definition: connection.c:784
PGresult * pgfdw_exec_query(PGconn *conn, const char *query, PgFdwConnState *state)
Definition: connection.c:920
void ReleaseConnection(PGconn *conn)
Definition: connection.c:870
PGconn * GetConnection(UserMapping *user, bool will_prep_stmt, PgFdwConnState **state)
Definition: connection.c:202
struct PgFdwConnState PgFdwConnState
PGresult * pgfdw_get_result(PGconn *conn)
Definition: connection.c:937
const char * get_jointype_name(JoinType jointype)
Definition: deparse.c:1639
void deparseAnalyzeInfoSql(StringInfo buf, Relation rel)
Definition: deparse.c:2519
bool is_builtin(Oid objectId)
Definition: shippable.c:152
void deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel, RelOptInfo *foreignrel, List *remote_conds, List **params_list, List *returningList, List **retrieved_attrs)
Definition: deparse.c:2389
void deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel, RelOptInfo *foreignrel, List *targetlist, List *targetAttrs, List *remote_conds, List **params_list, List *returningList, List **retrieved_attrs)
Definition: deparse.c:2274
void pgfdw_report_error(int elevel, PGresult *res, PGconn *conn, bool clear, const char *sql)
Definition: connection.c:956
bool is_foreign_param(PlannerInfo *root, RelOptInfo *baserel, Expr *expr)
Definition: deparse.c:1080
void reset_transmission_modes(int nestlevel)
int set_transmission_modes(void)
void deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *rel, List *tlist, List *remote_conds, List *pathkeys, bool has_final_sort, bool has_limit, bool is_subquery, List **retrieved_attrs, List **params_list)
Definition: deparse.c:1231
void deparseStringLiteral(StringInfo buf, const char *val)
Definition: deparse.c:2847
void rebuildInsertSql(StringInfo buf, Relation rel, char *orig_query, List *target_attrs, int values_end_len, int num_params, int num_rows)
Definition: deparse.c:2154
int ExtractConnectionOptions(List *defelems, const char **keywords, const char **values)
Definition: option.c:416
void deparseInsertSql(StringInfo buf, RangeTblEntry *rte, Index rtindex, Relation rel, List *targetAttrs, bool doNothing, List *withCheckOptionList, List *returningList, List **retrieved_attrs, int *values_end_len)
Definition: deparse.c:2081
void deparseUpdateSql(StringInfo buf, RangeTblEntry *rte, Index rtindex, Relation rel, List *targetAttrs, List *withCheckOptionList, List *returningList, List **retrieved_attrs)
Definition: deparse.c:2214
EquivalenceMember * find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel)
void deparseDeleteSql(StringInfo buf, RangeTblEntry *rte, Index rtindex, Relation rel, List *returningList, List **retrieved_attrs)
Definition: deparse.c:2360
void deparseAnalyzeSql(StringInfo buf, Relation rel, PgFdwSamplingMethod sample_method, double sample_frac, List **retrieved_attrs)
Definition: deparse.c:2559
List * ExtractExtensionList(const char *extensionsString, bool warnOnMissing)
Definition: option.c:447
struct PgFdwRelationInfo PgFdwRelationInfo
PgFdwSamplingMethod
Definition: postgres_fdw.h:146
@ ANALYZE_SAMPLE_AUTO
Definition: postgres_fdw.h:148
@ ANALYZE_SAMPLE_OFF
Definition: postgres_fdw.h:147
@ ANALYZE_SAMPLE_BERNOULLI
Definition: postgres_fdw.h:151
@ ANALYZE_SAMPLE_SYSTEM
Definition: postgres_fdw.h:150
@ ANALYZE_SAMPLE_RANDOM
Definition: postgres_fdw.h:149
unsigned int GetPrepStmtNumber(PGconn *conn)
Definition: connection.c:905
char * pgfdw_application_name
Definition: option.c:51
bool is_foreign_expr(PlannerInfo *root, RelOptInfo *baserel, Expr *expr)
Definition: deparse.c:242
void classifyConditions(PlannerInfo *root, RelOptInfo *baserel, List *input_conds, List **remote_conds, List **local_conds)
Definition: deparse.c:216
void process_pending_request(AsyncRequest *areq)
void deparseTruncateSql(StringInfo buf, List *rels, DropBehavior behavior, bool restart_seqs)
Definition: deparse.c:2644
bool is_foreign_pathkey(PlannerInfo *root, RelOptInfo *baserel, PathKey *pathkey)
Definition: deparse.c:1121
char * process_pgfdw_appname(const char *appname)
Definition: option.c:493
List * build_tlist_to_deparse(RelOptInfo *foreignrel)
Definition: deparse.c:1174
EquivalenceMember * find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel)
tree ctl root
Definition: radixtree.h:1857
PGconn * conn
Definition: streamutil.c:53
Definition: pg_list.h:54
AsyncRequest * pendingAreq
Definition: postgres_fdw.h:139
List * shippable_extensions
Definition: postgres_fdw.h:82
Relids lower_subquery_rels
Definition: postgres_fdw.h:120
RelOptInfo * outerrel
Definition: postgres_fdw.h:103
ForeignTable * table
Definition: postgres_fdw.h:86
Selectivity joinclause_sel
Definition: postgres_fdw.h:60
List * final_remote_exprs
Definition: postgres_fdw.h:47
UserMapping * user
Definition: postgres_fdw.h:88
Relids hidden_subquery_rels
Definition: postgres_fdw.h:122
Selectivity local_conds_sel
Definition: postgres_fdw.h:57
ForeignServer * server
Definition: postgres_fdw.h:87
QualCost local_conds_cost
Definition: postgres_fdw.h:56
Bitmapset * attrs_used
Definition: postgres_fdw.h:50
RelOptInfo * innerrel
Definition: postgres_fdw.h:104
UpperRelationKind stage
Definition: postgres_fdw.h:110
Definition: regguts.h:323