/*------------------------------------------------------------------------- * * postgres_fdw.h * Foreign-data wrapper for remote PostgreSQL servers * * Portions Copyright (c) 2012-2017, 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" #if PG_VERSION_NUM>=120000 #include "nodes/pathnodes.h" #else #include "nodes/relation.h" #endif #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; /* Bitmap of VOPS attributes (attributes available in VOPS projection) */ Bitmapset *vops_attrs; /* Bitmap of VOPS tile attributes (attributes represented by tiles in VOPS projection) */ Bitmapset *tile_attrs; /* Cost and selectivity of local_conds. */ QualCost local_conds_cost; Selectivity local_conds_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; /* Cached catalog information. */ ForeignTable *table; ForeignServer *server; /* * 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; /* Grouping information */ RelOptInfo *upperrel; List *grouped_tlist; } PgFdwRelationInfo; extern void vopsClassifyConditions(PlannerInfo *root, RelOptInfo *baserel, List *input_conds, List **remote_conds, List **local_conds); extern bool vops_is_foreign_expr(PlannerInfo *root, RelOptInfo *baserel, Expr *expr); extern List *vops_build_tlist_to_deparse(RelOptInfo *foreignrel); extern void vopsDeparseSelectStmtForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, List *tlist, List *remote_conds, List *pathkeys, List **retrieved_attrs, List **params_list); extern char *vops_deparse_type_name(Oid type_oid, int32 typemod); extern void vopsDeparseRelation(StringInfo buf, Relation rel); #endif /* POSTGRES_FDW_H */