mirror of https://github.com/postgres/postgres
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.
This commit is contained in:
parent
307c78852f
commit
28048cbaa2
|
@ -524,6 +524,7 @@ fileGetForeignPaths(PlannerInfo *root,
|
|||
*/
|
||||
add_path(baserel, (Path *)
|
||||
create_foreignscan_path(root, baserel,
|
||||
NULL, /* default pathtarget */
|
||||
baserel->rows,
|
||||
startup_cost,
|
||||
total_cost,
|
||||
|
|
|
@ -793,6 +793,7 @@ postgresGetForeignPaths(PlannerInfo *root,
|
|||
* to estimate cost and size of this path.
|
||||
*/
|
||||
path = create_foreignscan_path(root, baserel,
|
||||
NULL, /* default pathtarget */
|
||||
fpinfo->rows,
|
||||
fpinfo->startup_cost,
|
||||
fpinfo->total_cost,
|
||||
|
@ -964,6 +965,7 @@ postgresGetForeignPaths(PlannerInfo *root,
|
|||
|
||||
/* Make the path */
|
||||
path = create_foreignscan_path(root, baserel,
|
||||
NULL, /* default pathtarget */
|
||||
rows,
|
||||
startup_cost,
|
||||
total_cost,
|
||||
|
@ -3565,6 +3567,7 @@ add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||
|
||||
add_path(rel, (Path *)
|
||||
create_foreignscan_path(root, rel,
|
||||
NULL,
|
||||
rows,
|
||||
startup_cost,
|
||||
total_cost,
|
||||
|
@ -3702,6 +3705,7 @@ postgresGetForeignJoinPaths(PlannerInfo *root,
|
|||
*/
|
||||
joinpath = create_foreignscan_path(root,
|
||||
joinrel,
|
||||
NULL, /* default pathtarget */
|
||||
rows,
|
||||
startup_cost,
|
||||
total_cost,
|
||||
|
|
|
@ -1819,10 +1819,13 @@ create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
|
|||
* This function is never called from core Postgres; rather, it's expected
|
||||
* to be called by the GetForeignPaths or GetForeignJoinPaths function of
|
||||
* 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 *
|
||||
create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
|
||||
PathTarget *target,
|
||||
double rows, Cost startup_cost, Cost total_cost,
|
||||
List *pathkeys,
|
||||
Relids required_outer,
|
||||
|
@ -1833,7 +1836,7 @@ create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
|
|||
|
||||
pathnode->path.pathtype = T_ForeignScan;
|
||||
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,
|
||||
required_outer);
|
||||
pathnode->path.parallel_aware = false;
|
||||
|
|
|
@ -87,6 +87,7 @@ extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
|
|||
extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
|
||||
Relids required_outer);
|
||||
extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
|
||||
PathTarget *target,
|
||||
double rows, Cost startup_cost, Cost total_cost,
|
||||
List *pathkeys,
|
||||
Relids required_outer,
|
||||
|
|
Loading…
Reference in New Issue