mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-18 22:43:22 +02:00
Now that the upper planner uses paths, and now that we have proper hooks to inject paths into the upper planning process, it's possible for foreign data wrappers to arrange to push aggregates to the remote side instead of fetching all of the rows and aggregating them locally. This figures to be a massive win for performance, so teach postgres_fdw to do it. Jeevan Chalke and Ashutosh Bapat. Reviewed by Ashutosh Bapat with additional testing by Prabhat Sahu. Various mostly cosmetic changes by me.
173 lines
5.7 KiB
C
173 lines
5.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* postgres_fdw.h
|
|
* Foreign-data wrapper for remote PostgreSQL servers
|
|
*
|
|
* Portions Copyright (c) 2012-2016, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* contrib/postgres_fdw/postgres_fdw.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef POSTGRES_FDW_H
|
|
#define POSTGRES_FDW_H
|
|
|
|
#include "foreign/foreign.h"
|
|
#include "lib/stringinfo.h"
|
|
#include "nodes/relation.h"
|
|
#include "utils/relcache.h"
|
|
|
|
#include "libpq-fe.h"
|
|
|
|
/*
|
|
* FDW-specific planner information kept in RelOptInfo.fdw_private for a
|
|
* foreign table. This information is collected by postgresGetForeignRelSize.
|
|
*/
|
|
typedef struct PgFdwRelationInfo
|
|
{
|
|
/*
|
|
* True means that the relation can be pushed down. Always true for simple
|
|
* foreign scan.
|
|
*/
|
|
bool pushdown_safe;
|
|
|
|
/*
|
|
* Restriction clauses, divided into safe and unsafe to pushdown subsets.
|
|
*
|
|
* For a base foreign relation this is a list of clauses along-with
|
|
* RestrictInfo wrapper. Keeping RestrictInfo wrapper helps while dividing
|
|
* scan_clauses in postgresGetForeignPlan into safe and unsafe subsets.
|
|
* Also it helps in estimating costs since RestrictInfo caches the
|
|
* selectivity and qual cost for the clause in it.
|
|
*
|
|
* For a join relation, however, they are part of otherclause list
|
|
* obtained from extract_actual_join_clauses, which strips RestrictInfo
|
|
* construct. So, for a join relation they are list of bare clauses.
|
|
*/
|
|
List *remote_conds;
|
|
List *local_conds;
|
|
|
|
/* Bitmap of attr numbers we need to fetch from the remote server. */
|
|
Bitmapset *attrs_used;
|
|
|
|
/* Cost and selectivity of local_conds. */
|
|
QualCost local_conds_cost;
|
|
Selectivity local_conds_sel;
|
|
|
|
/* Selectivity of join conditions */
|
|
Selectivity joinclause_sel;
|
|
|
|
/* Estimated size and cost for a scan or join. */
|
|
double rows;
|
|
int width;
|
|
Cost startup_cost;
|
|
Cost total_cost;
|
|
/* Costs excluding costs for transferring data from the foreign server */
|
|
Cost rel_startup_cost;
|
|
Cost rel_total_cost;
|
|
|
|
/* Options extracted from catalogs. */
|
|
bool use_remote_estimate;
|
|
Cost fdw_startup_cost;
|
|
Cost fdw_tuple_cost;
|
|
List *shippable_extensions; /* OIDs of whitelisted extensions */
|
|
|
|
/* Cached catalog information. */
|
|
ForeignTable *table;
|
|
ForeignServer *server;
|
|
UserMapping *user; /* only set in use_remote_estimate mode */
|
|
|
|
int fetch_size; /* fetch size for this remote table */
|
|
|
|
/*
|
|
* Name of the relation while EXPLAINing ForeignScan. It is used for join
|
|
* relations but is set for all relations. For join relation, the name
|
|
* indicates which foreign tables are being joined and the join type used.
|
|
*/
|
|
StringInfo relation_name;
|
|
|
|
/* Join information */
|
|
RelOptInfo *outerrel;
|
|
RelOptInfo *innerrel;
|
|
JoinType jointype;
|
|
List *joinclauses;
|
|
|
|
/* Grouping information */
|
|
List *grouped_tlist;
|
|
} PgFdwRelationInfo;
|
|
|
|
/* in postgres_fdw.c */
|
|
extern int set_transmission_modes(void);
|
|
extern void reset_transmission_modes(int nestlevel);
|
|
|
|
/* in connection.c */
|
|
extern PGconn *GetConnection(UserMapping *user, bool will_prep_stmt);
|
|
extern void ReleaseConnection(PGconn *conn);
|
|
extern unsigned int GetCursorNumber(PGconn *conn);
|
|
extern unsigned int GetPrepStmtNumber(PGconn *conn);
|
|
extern PGresult *pgfdw_get_result(PGconn *conn, const char *query);
|
|
extern PGresult *pgfdw_exec_query(PGconn *conn, const char *query);
|
|
extern void pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
|
|
bool clear, const char *sql);
|
|
|
|
/* in option.c */
|
|
extern int ExtractConnectionOptions(List *defelems,
|
|
const char **keywords,
|
|
const char **values);
|
|
extern List *ExtractExtensionList(const char *extensionsString,
|
|
bool warnOnMissing);
|
|
|
|
/* in deparse.c */
|
|
extern void classifyConditions(PlannerInfo *root,
|
|
RelOptInfo *baserel,
|
|
List *input_conds,
|
|
List **remote_conds,
|
|
List **local_conds);
|
|
extern bool is_foreign_expr(PlannerInfo *root,
|
|
RelOptInfo *baserel,
|
|
Expr *expr);
|
|
extern void deparseInsertSql(StringInfo buf, PlannerInfo *root,
|
|
Index rtindex, Relation rel,
|
|
List *targetAttrs, bool doNothing, List *returningList,
|
|
List **retrieved_attrs);
|
|
extern void deparseUpdateSql(StringInfo buf, PlannerInfo *root,
|
|
Index rtindex, Relation rel,
|
|
List *targetAttrs, List *returningList,
|
|
List **retrieved_attrs);
|
|
extern void deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root,
|
|
Index rtindex, Relation rel,
|
|
List *targetlist,
|
|
List *targetAttrs,
|
|
List *remote_conds,
|
|
List **params_list,
|
|
List *returningList,
|
|
List **retrieved_attrs);
|
|
extern void deparseDeleteSql(StringInfo buf, PlannerInfo *root,
|
|
Index rtindex, Relation rel,
|
|
List *returningList,
|
|
List **retrieved_attrs);
|
|
extern void deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root,
|
|
Index rtindex, Relation rel,
|
|
List *remote_conds,
|
|
List **params_list,
|
|
List *returningList,
|
|
List **retrieved_attrs);
|
|
extern void deparseAnalyzeSizeSql(StringInfo buf, Relation rel);
|
|
extern void deparseAnalyzeSql(StringInfo buf, Relation rel,
|
|
List **retrieved_attrs);
|
|
extern void deparseStringLiteral(StringInfo buf, const char *val);
|
|
extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel);
|
|
extern List *build_tlist_to_deparse(RelOptInfo *foreignrel);
|
|
extern void deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root,
|
|
RelOptInfo *foreignrel, List *tlist,
|
|
List *remote_conds, List *pathkeys,
|
|
List **retrieved_attrs, List **params_list);
|
|
|
|
/* in shippable.c */
|
|
extern bool is_builtin(Oid objectId);
|
|
extern bool is_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo);
|
|
extern const char *get_jointype_name(JoinType jointype);
|
|
|
|
#endif /* POSTGRES_FDW_H */
|