Index rti, RangeTblEntry *rte);
static void generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel,
List *live_childrels,
- List *all_child_pathkeys,
- List *partitioned_rels);
+ List *all_child_pathkeys);
static Path *get_cheapest_parameterized_child_path(PlannerInfo *root,
RelOptInfo *rel,
Relids required_outer);
-static List *accumulate_partitioned_rels(List *partitioned_rels,
- List *sub_partitioned_rels,
- bool flatten_partitioned_rels);
static void accumulate_append_subpath(Path *path,
- List **subpaths, List **special_subpaths,
- List **partitioned_rels,
- bool flatten_partitioned_rels);
+ List **subpaths,
+ List **special_subpaths);
static Path *get_singleton_append_subpath(Path *path);
static void set_dummy_rel_pathlist(RelOptInfo *rel);
static void set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,
List *all_child_pathkeys = NIL;
List *all_child_outers = NIL;
ListCell *l;
- List *partitioned_rels = NIL;
- List *partial_partitioned_rels = NIL;
- List *pa_partitioned_rels = NIL;
double partial_rows = -1;
- bool flatten_partitioned_rels;
/* If appropriate, consider parallel append */
pa_subpaths_valid = enable_parallel_append && rel->consider_parallel;
- /* What we do with the partitioned_rels list is different for UNION ALL */
- flatten_partitioned_rels = (rel->rtekind != RTE_SUBQUERY);
-
- /*
- * For partitioned tables, we accumulate a list of Relids of each
- * partitioned table which has at least one of its subpartitions directly
- * present as a subpath in this Append. This is used later for run-time
- * partition pruning. We must maintain separate lists for each Append
- * Path that we create as some paths that we create here can't flatten
- * sub-Appends and sub-MergeAppends into the top-level Append. We needn't
- * bother doing this for join rels as no run-time pruning is done on
- * those.
- */
- if (rel->reloptkind != RELOPT_JOINREL && rel->part_scheme != NULL)
- {
- partitioned_rels = list_make1(bms_make_singleton(rel->relid));
- partial_partitioned_rels = list_make1(bms_make_singleton(rel->relid));
-
- /* skip this one if we're not going to make a Parallel Append path */
- if (pa_subpaths_valid)
- pa_partitioned_rels = list_make1(bms_make_singleton(rel->relid));
- }
-
/*
* For every non-dummy child, remember the cheapest path. Also, identify
* all pathkeys (orderings) and parameterizations (required_outer sets)
if (childrel->pathlist != NIL &&
childrel->cheapest_total_path->param_info == NULL)
accumulate_append_subpath(childrel->cheapest_total_path,
- &subpaths, NULL, &partitioned_rels,
- flatten_partitioned_rels);
+ &subpaths, NULL);
else
subpaths_valid = false;
{
cheapest_partial_path = linitial(childrel->partial_pathlist);
accumulate_append_subpath(cheapest_partial_path,
- &partial_subpaths, NULL,
- &partial_partitioned_rels,
- flatten_partitioned_rels);
+ &partial_subpaths, NULL);
}
else
partial_subpaths_valid = false;
Assert(cheapest_partial_path != NULL);
accumulate_append_subpath(cheapest_partial_path,
&pa_partial_subpaths,
- &pa_nonpartial_subpaths,
- &pa_partitioned_rels,
- flatten_partitioned_rels);
-
+ &pa_nonpartial_subpaths);
}
else
{
*/
accumulate_append_subpath(nppath,
&pa_nonpartial_subpaths,
- NULL,
- &pa_partitioned_rels,
- flatten_partitioned_rels);
+ NULL);
}
}
if (subpaths_valid)
add_path(rel, (Path *) create_append_path(root, rel, subpaths, NIL,
NIL, NULL, 0, false,
- partitioned_rels, -1));
+ -1));
/*
* Consider an append of unordered, unparameterized partial paths. Make
appendpath = create_append_path(root, rel, NIL, partial_subpaths,
NIL, NULL, parallel_workers,
enable_parallel_append,
- partial_partitioned_rels, -1);
+ -1);
/*
* Make sure any subsequent partial paths use the same row count
appendpath = create_append_path(root, rel, pa_nonpartial_subpaths,
pa_partial_subpaths,
NIL, NULL, parallel_workers, true,
- pa_partitioned_rels, partial_rows);
+ partial_rows);
add_partial_path(rel, (Path *) appendpath);
}
*/
if (subpaths_valid)
generate_orderedappend_paths(root, rel, live_childrels,
- all_child_pathkeys,
- partitioned_rels);
+ all_child_pathkeys);
/*
* Build Append paths for each parameterization seen among the child rels.
{
Relids required_outer = (Relids) lfirst(l);
ListCell *lcr;
- List *part_rels = NIL;
-
- if (rel->reloptkind != RELOPT_JOINREL && rel->part_scheme != NULL)
- part_rels = list_make1(bms_make_singleton(rel->relid));
/* Select the child paths for an Append with this parameterization */
subpaths = NIL;
subpaths_valid = false;
break;
}
- accumulate_append_subpath(subpath, &subpaths, NULL, &part_rels,
- flatten_partitioned_rels);
+ accumulate_append_subpath(subpath, &subpaths, NULL);
}
if (subpaths_valid)
add_path(rel, (Path *)
create_append_path(root, rel, subpaths, NIL,
NIL, required_outer, 0, false,
- part_rels, -1));
+ -1));
}
/*
appendpath = create_append_path(root, rel, NIL, list_make1(path),
NIL, NULL,
path->parallel_workers, true,
- partitioned_rels, partial_rows);
+ partial_rows);
add_partial_path(rel, (Path *) appendpath);
}
}
static void
generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel,
List *live_childrels,
- List *all_child_pathkeys,
- List *partitioned_rels)
+ List *all_child_pathkeys)
{
ListCell *lcp;
List *partition_pathkeys = NIL;
List *partition_pathkeys_desc = NIL;
bool partition_pathkeys_partial = true;
bool partition_pathkeys_desc_partial = true;
- List *startup_partitioned_rels = NIL;
- List *total_partitioned_rels = NIL;
- bool flatten_partitioned_rels;
-
- /* Set up the method for building the partitioned rels lists */
- flatten_partitioned_rels = (rel->rtekind != RTE_SUBQUERY);
-
- if (rel->reloptkind != RELOPT_JOINREL && rel->part_scheme != NULL)
- {
- startup_partitioned_rels = list_make1(bms_make_singleton(rel->relid));
- total_partitioned_rels = list_make1(bms_make_singleton(rel->relid));
- }
/*
* Some partitioned table setups may allow us to use an Append node
* child paths for the MergeAppend.
*/
accumulate_append_subpath(cheapest_startup,
- &startup_subpaths, NULL,
- &startup_partitioned_rels,
- flatten_partitioned_rels);
+ &startup_subpaths, NULL);
accumulate_append_subpath(cheapest_total,
- &total_subpaths, NULL,
- &total_partitioned_rels,
- flatten_partitioned_rels);
+ &total_subpaths, NULL);
}
}
NULL,
0,
false,
- startup_partitioned_rels,
-1));
if (startup_neq_total)
add_path(rel, (Path *) create_append_path(root,
NULL,
0,
false,
- total_partitioned_rels,
-1));
}
else
rel,
startup_subpaths,
pathkeys,
- NULL,
- startup_partitioned_rels));
+ NULL));
if (startup_neq_total)
add_path(rel, (Path *) create_merge_append_path(root,
rel,
total_subpaths,
pathkeys,
- NULL,
- total_partitioned_rels));
+ NULL));
}
}
}
return cheapest;
}
-/*
- * accumulate_partitioned_rels
- * Record 'sub_partitioned_rels' in the 'partitioned_rels' list,
- * flattening as appropriate.
- */
-static List *
-accumulate_partitioned_rels(List *partitioned_rels,
- List *sub_partitioned_rels,
- bool flatten)
-{
- if (flatten)
- {
- /*
- * We're only called with flatten == true when the partitioned_rels
- * list has at most 1 element. So we can just add the members from
- * sub list's first element onto the first element of
- * partitioned_rels. Only later in planning when doing UNION ALL
- * Append processing will we see flatten == false. partitioned_rels
- * may end up with more than 1 element then, but we never expect to be
- * called with flatten == true again after that, so we needn't bother
- * doing anything here for anything but the initial element.
- */
- if (partitioned_rels != NIL && sub_partitioned_rels != NIL)
- {
- Relids partrels = (Relids) linitial(partitioned_rels);
- Relids subpartrels = (Relids) linitial(sub_partitioned_rels);
-
- /* Ensure the above comment holds true */
- Assert(list_length(partitioned_rels) == 1);
- Assert(list_length(sub_partitioned_rels) == 1);
-
- linitial(partitioned_rels) = bms_add_members(partrels, subpartrels);
- }
- }
- else
- {
- /*
- * Handle UNION ALL to partitioned tables. This always occurs after
- * we've done the accumulation for sub-partitioned tables, so there's
- * no need to consider how adding multiple elements to the top level
- * list affects the flatten == true case above.
- */
- partitioned_rels = list_concat(partitioned_rels, sub_partitioned_rels);
- }
-
- return partitioned_rels;
-}
-
/*
* accumulate_append_subpath
* Add a subpath to the list being built for an Append or MergeAppend.
* children to subpaths and the rest to special_subpaths. If the latter is
* NULL, we don't flatten the path at all (unless it contains only partial
* paths).
- *
- * When pulling up sub-Appends and sub-Merge Appends, we also gather the
- * path's list of partitioned tables and store in 'partitioned_rels'. The
- * exact behavior here depends on the value of 'flatten_partitioned_rels'.
- *
- * When 'flatten_partitioned_rels' is true, 'partitioned_rels' will contain at
- * most one element which is a Relids of the partitioned relations which there
- * are subpaths for. In this case, we just add the RT indexes for the
- * partitioned tables for the subpath we're pulling up to the single entry in
- * 'partitioned_rels'. When 'flatten_partitioned_rels' is false we
- * concatenate the path's partitioned rel list onto the top-level list. This
- * done for UNION ALLs which could have a partitioned table in each union
- * branch.
*/
static void
-accumulate_append_subpath(Path *path, List **subpaths, List **special_subpaths,
- List **partitioned_rels,
- bool flatten_partitioned_rels)
+accumulate_append_subpath(Path *path, List **subpaths, List **special_subpaths)
{
if (IsA(path, AppendPath))
{
if (!apath->path.parallel_aware || apath->first_partial_path == 0)
{
*subpaths = list_concat(*subpaths, apath->subpaths);
- *partitioned_rels = accumulate_partitioned_rels(*partitioned_rels,
- apath->partitioned_rels,
- flatten_partitioned_rels);
return;
}
else if (special_subpaths != NULL)
apath->first_partial_path);
*special_subpaths = list_concat(*special_subpaths,
new_special_subpaths);
- *partitioned_rels = accumulate_partitioned_rels(*partitioned_rels,
- apath->partitioned_rels,
- flatten_partitioned_rels);
return;
}
}
MergeAppendPath *mpath = (MergeAppendPath *) path;
*subpaths = list_concat(*subpaths, mpath->subpaths);
- *partitioned_rels = accumulate_partitioned_rels(*partitioned_rels,
- mpath->partitioned_rels,
- flatten_partitioned_rels);
return;
}
/* Set up the dummy path */
add_path(rel, (Path *) create_append_path(NULL, rel, NIL, NIL,
NIL, rel->lateral_relids,
- 0, false, NIL, -1));
+ 0, false, -1));
/*
* We set the cheapest-path fields immediately, just in case they were