mirror of
https://github.com/postgres/postgres.git
synced 2026-03-20 17:44:08 -04:00
Since commit7012b132d0, postgres_fdw has been able to push down the toplevel aggregation operation to the remote server. Commite2f1eb0ee3made it possible to break down the toplevel aggregation into one aggregate per partition. This commit lets postgres_fdw push down aggregation in that case just as it does at the top level. In order to make this work, this commit adds an additional argument to the GetForeignUpperPaths FDW API. A matching argument is added to the signature for create_upper_paths_hook. Third-party code using either of these will need to be updated. Also adjust create_foreignscan_plan() so that it picks up the correct set of relids in this case. Jeevan Chalke, reviewed by Ashutosh Bapat and by me and with some adjustments by me. The larger patch series of which this patch is a part was also reviewed and tested by Antonin Houska, Rajkumar Raghuwanshi, David Rowley, Dilip Kumar, Konstantin Knizhnik, Pascal Legrand, and Rafia Sabih. Discussion: http://postgr.es/m/CAM2+6=V64_xhstVHie0Rz=KPEQnLJMZt_e314P0jaT_oJ9MR8A@mail.gmail.com Discussion: http://postgr.es/m/CAM2+6=XPWujjmj5zUaBTGDoB38CemwcPmjkRy0qOcsQj_V+2sQ@mail.gmail.com
67 lines
2.2 KiB
C
67 lines
2.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* planner.h
|
|
* prototypes for planner.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/optimizer/planner.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PLANNER_H
|
|
#define PLANNER_H
|
|
|
|
#include "nodes/plannodes.h"
|
|
#include "nodes/relation.h"
|
|
|
|
|
|
/* Hook for plugins to get control in planner() */
|
|
typedef PlannedStmt *(*planner_hook_type) (Query *parse,
|
|
int cursorOptions,
|
|
ParamListInfo boundParams);
|
|
extern PGDLLIMPORT planner_hook_type planner_hook;
|
|
|
|
/* Hook for plugins to get control when grouping_planner() plans upper rels */
|
|
typedef void (*create_upper_paths_hook_type) (PlannerInfo *root,
|
|
UpperRelationKind stage,
|
|
RelOptInfo *input_rel,
|
|
RelOptInfo *output_rel,
|
|
void *extra);
|
|
extern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;
|
|
|
|
|
|
extern PlannedStmt *planner(Query *parse, int cursorOptions,
|
|
ParamListInfo boundParams);
|
|
extern PlannedStmt *standard_planner(Query *parse, int cursorOptions,
|
|
ParamListInfo boundParams);
|
|
|
|
extern PlannerInfo *subquery_planner(PlannerGlobal *glob, Query *parse,
|
|
PlannerInfo *parent_root,
|
|
bool hasRecursion, double tuple_fraction);
|
|
|
|
extern bool is_dummy_plan(Plan *plan);
|
|
|
|
extern RowMarkType select_rowmark_type(RangeTblEntry *rte,
|
|
LockClauseStrength strength);
|
|
|
|
extern void mark_partial_aggref(Aggref *agg, AggSplit aggsplit);
|
|
|
|
extern Path *get_cheapest_fractional_path(RelOptInfo *rel,
|
|
double tuple_fraction);
|
|
|
|
extern Expr *expression_planner(Expr *expr);
|
|
|
|
extern Expr *preprocess_phv_expression(PlannerInfo *root, Expr *expr);
|
|
|
|
extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);
|
|
extern int plan_create_index_workers(Oid tableOid, Oid indexOid);
|
|
|
|
extern List *get_partitioned_child_rels(PlannerInfo *root, Index rti,
|
|
bool *part_cols_updated);
|
|
extern List *get_partitioned_child_rels_for_join(PlannerInfo *root,
|
|
Relids join_relids);
|
|
|
|
#endif /* PLANNER_H */
|