Commit 28048cba authored by Tom Lane's avatar Tom Lane

Allow callers of create_foreignscan_path to specify nondefault PathTarget.

Although the default choice of rel->reltarget should typically be
sufficient for scan or join paths, it's not at all sufficient for the
purposes PathTargets were invented for; in particular not for
upper-relation Paths.  So break API compatibility by adding a PathTarget
argument to create_foreignscan_path().  To ease updating of existing
code, accept a NULL value of the argument as selecting rel->reltarget.
parent 307c7885
...@@ -524,6 +524,7 @@ fileGetForeignPaths(PlannerInfo *root, ...@@ -524,6 +524,7 @@ fileGetForeignPaths(PlannerInfo *root,
*/ */
add_path(baserel, (Path *) add_path(baserel, (Path *)
create_foreignscan_path(root, baserel, create_foreignscan_path(root, baserel,
NULL, /* default pathtarget */
baserel->rows, baserel->rows,
startup_cost, startup_cost,
total_cost, total_cost,
......
...@@ -793,6 +793,7 @@ postgresGetForeignPaths(PlannerInfo *root, ...@@ -793,6 +793,7 @@ postgresGetForeignPaths(PlannerInfo *root,
* to estimate cost and size of this path. * to estimate cost and size of this path.
*/ */
path = create_foreignscan_path(root, baserel, path = create_foreignscan_path(root, baserel,
NULL, /* default pathtarget */
fpinfo->rows, fpinfo->rows,
fpinfo->startup_cost, fpinfo->startup_cost,
fpinfo->total_cost, fpinfo->total_cost,
...@@ -964,6 +965,7 @@ postgresGetForeignPaths(PlannerInfo *root, ...@@ -964,6 +965,7 @@ postgresGetForeignPaths(PlannerInfo *root,
/* Make the path */ /* Make the path */
path = create_foreignscan_path(root, baserel, path = create_foreignscan_path(root, baserel,
NULL, /* default pathtarget */
rows, rows,
startup_cost, startup_cost,
total_cost, total_cost,
...@@ -3565,6 +3567,7 @@ add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, ...@@ -3565,6 +3567,7 @@ add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel,
add_path(rel, (Path *) add_path(rel, (Path *)
create_foreignscan_path(root, rel, create_foreignscan_path(root, rel,
NULL,
rows, rows,
startup_cost, startup_cost,
total_cost, total_cost,
...@@ -3702,6 +3705,7 @@ postgresGetForeignJoinPaths(PlannerInfo *root, ...@@ -3702,6 +3705,7 @@ postgresGetForeignJoinPaths(PlannerInfo *root,
*/ */
joinpath = create_foreignscan_path(root, joinpath = create_foreignscan_path(root,
joinrel, joinrel,
NULL, /* default pathtarget */
rows, rows,
startup_cost, startup_cost,
total_cost, total_cost,
......
...@@ -1819,10 +1819,13 @@ create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel, ...@@ -1819,10 +1819,13 @@ create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
* This function is never called from core Postgres; rather, it's expected * This function is never called from core Postgres; rather, it's expected
* to be called by the GetForeignPaths or GetForeignJoinPaths function of * to be called by the GetForeignPaths or GetForeignJoinPaths function of
* a foreign data wrapper. We make the FDW supply all fields of the path, * a foreign data wrapper. We make the FDW supply all fields of the path,
* since we do not have any way to calculate them in core. * since we do not have any way to calculate them in core. However, there
* is a sane default for the pathtarget (rel->reltarget), so we let a NULL
* for "target" select that.
*/ */
ForeignPath * ForeignPath *
create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
PathTarget *target,
double rows, Cost startup_cost, Cost total_cost, double rows, Cost startup_cost, Cost total_cost,
List *pathkeys, List *pathkeys,
Relids required_outer, Relids required_outer,
...@@ -1833,7 +1836,7 @@ create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, ...@@ -1833,7 +1836,7 @@ create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
pathnode->path.pathtype = T_ForeignScan; pathnode->path.pathtype = T_ForeignScan;
pathnode->path.parent = rel; pathnode->path.parent = rel;
pathnode->path.pathtarget = rel->reltarget; pathnode->path.pathtarget = target ? target : rel->reltarget;
pathnode->path.param_info = get_baserel_parampathinfo(root, rel, pathnode->path.param_info = get_baserel_parampathinfo(root, rel,
required_outer); required_outer);
pathnode->path.parallel_aware = false; pathnode->path.parallel_aware = false;
......
...@@ -87,6 +87,7 @@ extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, ...@@ -87,6 +87,7 @@ extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel, extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
Relids required_outer); Relids required_outer);
extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
PathTarget *target,
double rows, Cost startup_cost, Cost total_cost, double rows, Cost startup_cost, Cost total_cost,
List *pathkeys, List *pathkeys,
Relids required_outer, Relids required_outer,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment