mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"
This reverts commitec38694894
and its fixup589bb81649
. This change was intended to support query planning avoiding acquisition of locks on partitions that were going to be pruned; however, the overall project took a different direction at [1] and this bit is no longer needed. Put things back the way they were as agreed in [2], to avoid unnecessary complexity. Discussion: [1] https://postgr.es/m/4191508.1674157166@sss.pgh.pa.us Discussion: [2] https://postgr.es/m/20230502175409.kcoirxczpdha26wt@alvherre.pgsql
This commit is contained in:
@ -824,7 +824,6 @@ InitPlan(QueryDesc *queryDesc, int eflags)
|
|||||||
ExecInitRangeTable(estate, rangeTable, plannedstmt->permInfos);
|
ExecInitRangeTable(estate, rangeTable, plannedstmt->permInfos);
|
||||||
|
|
||||||
estate->es_plannedstmt = plannedstmt;
|
estate->es_plannedstmt = plannedstmt;
|
||||||
estate->es_part_prune_infos = plannedstmt->partPruneInfos;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Next, build the ExecRowMark array from the PlanRowMark(s), if any.
|
* Next, build the ExecRowMark array from the PlanRowMark(s), if any.
|
||||||
|
@ -183,7 +183,6 @@ ExecSerializePlan(Plan *plan, EState *estate)
|
|||||||
pstmt->dependsOnRole = false;
|
pstmt->dependsOnRole = false;
|
||||||
pstmt->parallelModeNeeded = false;
|
pstmt->parallelModeNeeded = false;
|
||||||
pstmt->planTree = plan;
|
pstmt->planTree = plan;
|
||||||
pstmt->partPruneInfos = estate->es_part_prune_infos;
|
|
||||||
pstmt->rtable = estate->es_range_table;
|
pstmt->rtable = estate->es_range_table;
|
||||||
pstmt->permInfos = estate->es_rteperminfos;
|
pstmt->permInfos = estate->es_rteperminfos;
|
||||||
pstmt->resultRelations = NIL;
|
pstmt->resultRelations = NIL;
|
||||||
|
@ -1778,9 +1778,6 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
|
|||||||
* Initialize data structure needed for run-time partition pruning and
|
* Initialize data structure needed for run-time partition pruning and
|
||||||
* do initial pruning if needed
|
* do initial pruning if needed
|
||||||
*
|
*
|
||||||
* 'root_parent_relids' identifies the relation to which both the parent plan
|
|
||||||
* and the PartitionPruneInfo given by 'part_prune_index' belong.
|
|
||||||
*
|
|
||||||
* On return, *initially_valid_subplans is assigned the set of indexes of
|
* On return, *initially_valid_subplans is assigned the set of indexes of
|
||||||
* child subplans that must be initialized along with the parent plan node.
|
* child subplans that must be initialized along with the parent plan node.
|
||||||
* Initial pruning is performed here if needed and in that case only the
|
* Initial pruning is performed here if needed and in that case only the
|
||||||
@ -1793,24 +1790,11 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
|
|||||||
PartitionPruneState *
|
PartitionPruneState *
|
||||||
ExecInitPartitionPruning(PlanState *planstate,
|
ExecInitPartitionPruning(PlanState *planstate,
|
||||||
int n_total_subplans,
|
int n_total_subplans,
|
||||||
int part_prune_index,
|
PartitionPruneInfo *pruneinfo,
|
||||||
Bitmapset *root_parent_relids,
|
|
||||||
Bitmapset **initially_valid_subplans)
|
Bitmapset **initially_valid_subplans)
|
||||||
{
|
{
|
||||||
PartitionPruneState *prunestate;
|
PartitionPruneState *prunestate;
|
||||||
EState *estate = planstate->state;
|
EState *estate = planstate->state;
|
||||||
PartitionPruneInfo *pruneinfo;
|
|
||||||
|
|
||||||
/* Obtain the pruneinfo we need, and make sure it's the right one */
|
|
||||||
pruneinfo = list_nth(estate->es_part_prune_infos, part_prune_index);
|
|
||||||
if (!bms_equal(root_parent_relids, pruneinfo->root_parent_relids))
|
|
||||||
ereport(ERROR,
|
|
||||||
errcode(ERRCODE_INTERNAL_ERROR),
|
|
||||||
errmsg_internal("mismatching PartitionPruneInfo found at part_prune_index %d",
|
|
||||||
part_prune_index),
|
|
||||||
errdetail_internal("plan node relids %s, pruneinfo relids %s",
|
|
||||||
bmsToString(root_parent_relids),
|
|
||||||
bmsToString(pruneinfo->root_parent_relids)));
|
|
||||||
|
|
||||||
/* We may need an expression context to evaluate partition exprs */
|
/* We may need an expression context to evaluate partition exprs */
|
||||||
ExecAssignExprContext(estate, planstate);
|
ExecAssignExprContext(estate, planstate);
|
||||||
|
@ -123,7 +123,6 @@ CreateExecutorState(void)
|
|||||||
estate->es_rowmarks = NULL;
|
estate->es_rowmarks = NULL;
|
||||||
estate->es_rteperminfos = NIL;
|
estate->es_rteperminfos = NIL;
|
||||||
estate->es_plannedstmt = NULL;
|
estate->es_plannedstmt = NULL;
|
||||||
estate->es_part_prune_infos = NIL;
|
|
||||||
|
|
||||||
estate->es_junkFilter = NULL;
|
estate->es_junkFilter = NULL;
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
|
|||||||
appendstate->as_begun = false;
|
appendstate->as_begun = false;
|
||||||
|
|
||||||
/* If run-time partition pruning is enabled, then set that up now */
|
/* If run-time partition pruning is enabled, then set that up now */
|
||||||
if (node->part_prune_index >= 0)
|
if (node->part_prune_info != NULL)
|
||||||
{
|
{
|
||||||
PartitionPruneState *prunestate;
|
PartitionPruneState *prunestate;
|
||||||
|
|
||||||
@ -145,8 +145,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
|
|||||||
*/
|
*/
|
||||||
prunestate = ExecInitPartitionPruning(&appendstate->ps,
|
prunestate = ExecInitPartitionPruning(&appendstate->ps,
|
||||||
list_length(node->appendplans),
|
list_length(node->appendplans),
|
||||||
node->part_prune_index,
|
node->part_prune_info,
|
||||||
node->apprelids,
|
|
||||||
&validsubplans);
|
&validsubplans);
|
||||||
appendstate->as_prune_state = prunestate;
|
appendstate->as_prune_state = prunestate;
|
||||||
nplans = bms_num_members(validsubplans);
|
nplans = bms_num_members(validsubplans);
|
||||||
|
@ -82,7 +82,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
|
|||||||
mergestate->ps.ExecProcNode = ExecMergeAppend;
|
mergestate->ps.ExecProcNode = ExecMergeAppend;
|
||||||
|
|
||||||
/* If run-time partition pruning is enabled, then set that up now */
|
/* If run-time partition pruning is enabled, then set that up now */
|
||||||
if (node->part_prune_index >= 0)
|
if (node->part_prune_info != NULL)
|
||||||
{
|
{
|
||||||
PartitionPruneState *prunestate;
|
PartitionPruneState *prunestate;
|
||||||
|
|
||||||
@ -93,8 +93,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
|
|||||||
*/
|
*/
|
||||||
prunestate = ExecInitPartitionPruning(&mergestate->ps,
|
prunestate = ExecInitPartitionPruning(&mergestate->ps,
|
||||||
list_length(node->mergeplans),
|
list_length(node->mergeplans),
|
||||||
node->part_prune_index,
|
node->part_prune_info,
|
||||||
node->apprelids,
|
|
||||||
&validsubplans);
|
&validsubplans);
|
||||||
mergestate->ms_prune_state = prunestate;
|
mergestate->ms_prune_state = prunestate;
|
||||||
nplans = bms_num_members(validsubplans);
|
nplans = bms_num_members(validsubplans);
|
||||||
|
@ -1203,6 +1203,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
|
|||||||
ListCell *subpaths;
|
ListCell *subpaths;
|
||||||
int nasyncplans = 0;
|
int nasyncplans = 0;
|
||||||
RelOptInfo *rel = best_path->path.parent;
|
RelOptInfo *rel = best_path->path.parent;
|
||||||
|
PartitionPruneInfo *partpruneinfo = NULL;
|
||||||
int nodenumsortkeys = 0;
|
int nodenumsortkeys = 0;
|
||||||
AttrNumber *nodeSortColIdx = NULL;
|
AttrNumber *nodeSortColIdx = NULL;
|
||||||
Oid *nodeSortOperators = NULL;
|
Oid *nodeSortOperators = NULL;
|
||||||
@ -1353,9 +1354,6 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
|
|||||||
subplans = lappend(subplans, subplan);
|
subplans = lappend(subplans, subplan);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set below if we find quals that we can use to run-time prune */
|
|
||||||
plan->part_prune_index = -1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If any quals exist, they may be useful to perform further partition
|
* If any quals exist, they may be useful to perform further partition
|
||||||
* pruning during execution. Gather information needed by the executor to
|
* pruning during execution. Gather information needed by the executor to
|
||||||
@ -1379,7 +1377,8 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prunequal != NIL)
|
if (prunequal != NIL)
|
||||||
plan->part_prune_index = make_partition_pruneinfo(root, rel,
|
partpruneinfo =
|
||||||
|
make_partition_pruneinfo(root, rel,
|
||||||
best_path->subpaths,
|
best_path->subpaths,
|
||||||
prunequal);
|
prunequal);
|
||||||
}
|
}
|
||||||
@ -1387,6 +1386,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
|
|||||||
plan->appendplans = subplans;
|
plan->appendplans = subplans;
|
||||||
plan->nasyncplans = nasyncplans;
|
plan->nasyncplans = nasyncplans;
|
||||||
plan->first_partial_plan = best_path->first_partial_path;
|
plan->first_partial_plan = best_path->first_partial_path;
|
||||||
|
plan->part_prune_info = partpruneinfo;
|
||||||
|
|
||||||
copy_generic_path_info(&plan->plan, (Path *) best_path);
|
copy_generic_path_info(&plan->plan, (Path *) best_path);
|
||||||
|
|
||||||
@ -1425,6 +1425,7 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
|
|||||||
List *subplans = NIL;
|
List *subplans = NIL;
|
||||||
ListCell *subpaths;
|
ListCell *subpaths;
|
||||||
RelOptInfo *rel = best_path->path.parent;
|
RelOptInfo *rel = best_path->path.parent;
|
||||||
|
PartitionPruneInfo *partpruneinfo = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We don't have the actual creation of the MergeAppend node split out
|
* We don't have the actual creation of the MergeAppend node split out
|
||||||
@ -1517,9 +1518,6 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
|
|||||||
subplans = lappend(subplans, subplan);
|
subplans = lappend(subplans, subplan);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set below if we find quals that we can use to run-time prune */
|
|
||||||
node->part_prune_index = -1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If any quals exist, they may be useful to perform further partition
|
* If any quals exist, they may be useful to perform further partition
|
||||||
* pruning during execution. Gather information needed by the executor to
|
* pruning during execution. Gather information needed by the executor to
|
||||||
@ -1535,13 +1533,13 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
|
|||||||
Assert(best_path->path.param_info == NULL);
|
Assert(best_path->path.param_info == NULL);
|
||||||
|
|
||||||
if (prunequal != NIL)
|
if (prunequal != NIL)
|
||||||
node->part_prune_index = make_partition_pruneinfo(root, rel,
|
partpruneinfo = make_partition_pruneinfo(root, rel,
|
||||||
best_path->subpaths,
|
best_path->subpaths,
|
||||||
prunequal);
|
prunequal);
|
||||||
}
|
}
|
||||||
|
|
||||||
node->mergeplans = subplans;
|
node->mergeplans = subplans;
|
||||||
|
node->part_prune_info = partpruneinfo;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If prepare_sort_from_pathkeys added sort columns, but we were told to
|
* If prepare_sort_from_pathkeys added sort columns, but we were told to
|
||||||
|
@ -522,7 +522,6 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
|
|||||||
result->dependsOnRole = glob->dependsOnRole;
|
result->dependsOnRole = glob->dependsOnRole;
|
||||||
result->parallelModeNeeded = glob->parallelModeNeeded;
|
result->parallelModeNeeded = glob->parallelModeNeeded;
|
||||||
result->planTree = top_plan;
|
result->planTree = top_plan;
|
||||||
result->partPruneInfos = glob->partPruneInfos;
|
|
||||||
result->rtable = glob->finalrtable;
|
result->rtable = glob->finalrtable;
|
||||||
result->permInfos = glob->finalrteperminfos;
|
result->permInfos = glob->finalrteperminfos;
|
||||||
result->resultRelations = glob->resultRelations;
|
result->resultRelations = glob->resultRelations;
|
||||||
|
@ -350,29 +350,6 @@ set_plan_references(PlannerInfo *root, Plan *plan)
|
|||||||
palloc0(list_length(glob->subplans) * sizeof(bool));
|
palloc0(list_length(glob->subplans) * sizeof(bool));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Also fix up the information in PartitionPruneInfos. */
|
|
||||||
foreach(lc, root->partPruneInfos)
|
|
||||||
{
|
|
||||||
PartitionPruneInfo *pruneinfo = lfirst(lc);
|
|
||||||
ListCell *l;
|
|
||||||
|
|
||||||
pruneinfo->root_parent_relids =
|
|
||||||
offset_relid_set(pruneinfo->root_parent_relids, rtoffset);
|
|
||||||
foreach(l, pruneinfo->prune_infos)
|
|
||||||
{
|
|
||||||
List *prune_infos = lfirst(l);
|
|
||||||
ListCell *l2;
|
|
||||||
|
|
||||||
foreach(l2, prune_infos)
|
|
||||||
{
|
|
||||||
PartitionedRelPruneInfo *pinfo = lfirst(l2);
|
|
||||||
|
|
||||||
/* RT index of the table to which the pinfo belongs. */
|
|
||||||
pinfo->rtindex += rtoffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now fix the Plan tree */
|
/* Now fix the Plan tree */
|
||||||
result = set_plan_refs(root, plan, rtoffset);
|
result = set_plan_refs(root, plan, rtoffset);
|
||||||
|
|
||||||
@ -1728,29 +1705,6 @@ set_customscan_references(PlannerInfo *root,
|
|||||||
cscan->custom_relids = offset_relid_set(cscan->custom_relids, rtoffset);
|
cscan->custom_relids = offset_relid_set(cscan->custom_relids, rtoffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* register_partpruneinfo
|
|
||||||
* Subroutine for set_append_references and set_mergeappend_references
|
|
||||||
*
|
|
||||||
* Add the PartitionPruneInfo from root->partPruneInfos at the given index
|
|
||||||
* into PlannerGlobal->partPruneInfos and return its index there.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
register_partpruneinfo(PlannerInfo *root, int part_prune_index)
|
|
||||||
{
|
|
||||||
PlannerGlobal *glob = root->glob;
|
|
||||||
PartitionPruneInfo *pruneinfo;
|
|
||||||
|
|
||||||
Assert(part_prune_index >= 0 &&
|
|
||||||
part_prune_index < list_length(root->partPruneInfos));
|
|
||||||
pruneinfo = list_nth_node(PartitionPruneInfo, root->partPruneInfos,
|
|
||||||
part_prune_index);
|
|
||||||
|
|
||||||
glob->partPruneInfos = lappend(glob->partPruneInfos, pruneinfo);
|
|
||||||
|
|
||||||
return list_length(glob->partPruneInfos) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set_append_references
|
* set_append_references
|
||||||
* Do set_plan_references processing on an Append
|
* Do set_plan_references processing on an Append
|
||||||
@ -1803,12 +1757,21 @@ set_append_references(PlannerInfo *root,
|
|||||||
|
|
||||||
aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset);
|
aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset);
|
||||||
|
|
||||||
/*
|
if (aplan->part_prune_info)
|
||||||
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
|
{
|
||||||
*/
|
foreach(l, aplan->part_prune_info->prune_infos)
|
||||||
if (aplan->part_prune_index >= 0)
|
{
|
||||||
aplan->part_prune_index =
|
List *prune_infos = lfirst(l);
|
||||||
register_partpruneinfo(root, aplan->part_prune_index);
|
ListCell *l2;
|
||||||
|
|
||||||
|
foreach(l2, prune_infos)
|
||||||
|
{
|
||||||
|
PartitionedRelPruneInfo *pinfo = lfirst(l2);
|
||||||
|
|
||||||
|
pinfo->rtindex += rtoffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* We don't need to recurse to lefttree or righttree ... */
|
/* We don't need to recurse to lefttree or righttree ... */
|
||||||
Assert(aplan->plan.lefttree == NULL);
|
Assert(aplan->plan.lefttree == NULL);
|
||||||
@ -1870,12 +1833,21 @@ set_mergeappend_references(PlannerInfo *root,
|
|||||||
|
|
||||||
mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);
|
mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);
|
||||||
|
|
||||||
/*
|
if (mplan->part_prune_info)
|
||||||
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
|
{
|
||||||
*/
|
foreach(l, mplan->part_prune_info->prune_infos)
|
||||||
if (mplan->part_prune_index >= 0)
|
{
|
||||||
mplan->part_prune_index =
|
List *prune_infos = lfirst(l);
|
||||||
register_partpruneinfo(root, mplan->part_prune_index);
|
ListCell *l2;
|
||||||
|
|
||||||
|
foreach(l2, prune_infos)
|
||||||
|
{
|
||||||
|
PartitionedRelPruneInfo *pinfo = lfirst(l2);
|
||||||
|
|
||||||
|
pinfo->rtindex += rtoffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* We don't need to recurse to lefttree or righttree ... */
|
/* We don't need to recurse to lefttree or righttree ... */
|
||||||
Assert(mplan->plan.lefttree == NULL);
|
Assert(mplan->plan.lefttree == NULL);
|
||||||
|
@ -210,20 +210,16 @@ static void partkey_datum_from_expr(PartitionPruneContext *context,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* make_partition_pruneinfo
|
* make_partition_pruneinfo
|
||||||
* Checks if the given set of quals can be used to build pruning steps
|
* Builds a PartitionPruneInfo which can be used in the executor to allow
|
||||||
* that the executor can use to prune away unneeded partitions. If
|
* additional partition pruning to take place. Returns NULL when
|
||||||
* suitable quals are found then a PartitionPruneInfo is built and tagged
|
* partition pruning would be useless.
|
||||||
* onto the PlannerInfo's partPruneInfos list.
|
|
||||||
*
|
|
||||||
* The return value is the 0-based index of the item added to the
|
|
||||||
* partPruneInfos list or -1 if nothing was added.
|
|
||||||
*
|
*
|
||||||
* 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list
|
* 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list
|
||||||
* of scan paths for its child rels.
|
* of scan paths for its child rels.
|
||||||
* 'prunequal' is a list of potential pruning quals (i.e., restriction
|
* 'prunequal' is a list of potential pruning quals (i.e., restriction
|
||||||
* clauses that are applicable to the appendrel).
|
* clauses that are applicable to the appendrel).
|
||||||
*/
|
*/
|
||||||
int
|
PartitionPruneInfo *
|
||||||
make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
||||||
List *subpaths,
|
List *subpaths,
|
||||||
List *prunequal)
|
List *prunequal)
|
||||||
@ -337,11 +333,10 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
|||||||
* quals, then we can just not bother with run-time pruning.
|
* quals, then we can just not bother with run-time pruning.
|
||||||
*/
|
*/
|
||||||
if (prunerelinfos == NIL)
|
if (prunerelinfos == NIL)
|
||||||
return -1;
|
return NULL;
|
||||||
|
|
||||||
/* Else build the result data structure */
|
/* Else build the result data structure */
|
||||||
pruneinfo = makeNode(PartitionPruneInfo);
|
pruneinfo = makeNode(PartitionPruneInfo);
|
||||||
pruneinfo->root_parent_relids = parentrel->relids;
|
|
||||||
pruneinfo->prune_infos = prunerelinfos;
|
pruneinfo->prune_infos = prunerelinfos;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -364,9 +359,7 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
|
|||||||
else
|
else
|
||||||
pruneinfo->other_subplans = NULL;
|
pruneinfo->other_subplans = NULL;
|
||||||
|
|
||||||
root->partPruneInfos = lappend(root->partPruneInfos, pruneinfo);
|
return pruneinfo;
|
||||||
|
|
||||||
return list_length(root->partPruneInfos) - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -57,6 +57,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 202304211
|
#define CATALOG_VERSION_NO 202305041
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -123,9 +123,9 @@ typedef struct PartitionPruneState
|
|||||||
|
|
||||||
extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate,
|
extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate,
|
||||||
int n_total_subplans,
|
int n_total_subplans,
|
||||||
int part_prune_index,
|
PartitionPruneInfo *pruneinfo,
|
||||||
Bitmapset *root_parent_relids,
|
|
||||||
Bitmapset **initially_valid_subplans);
|
Bitmapset **initially_valid_subplans);
|
||||||
extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate,
|
extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate,
|
||||||
bool initial_prune);
|
bool initial_prune);
|
||||||
|
|
||||||
#endif /* EXECPARTITION_H */
|
#endif /* EXECPARTITION_H */
|
||||||
|
@ -623,7 +623,6 @@ typedef struct EState
|
|||||||
* ExecRowMarks, or NULL if none */
|
* ExecRowMarks, or NULL if none */
|
||||||
List *es_rteperminfos; /* List of RTEPermissionInfo */
|
List *es_rteperminfos; /* List of RTEPermissionInfo */
|
||||||
PlannedStmt *es_plannedstmt; /* link to top of plan tree */
|
PlannedStmt *es_plannedstmt; /* link to top of plan tree */
|
||||||
List *es_part_prune_infos; /* PlannedStmt.partPruneInfos */
|
|
||||||
const char *es_sourceText; /* Source text from QueryDesc */
|
const char *es_sourceText; /* Source text from QueryDesc */
|
||||||
|
|
||||||
JunkFilter *es_junkFilter; /* top-level junk filter, if any */
|
JunkFilter *es_junkFilter; /* top-level junk filter, if any */
|
||||||
|
@ -125,9 +125,6 @@ typedef struct PlannerGlobal
|
|||||||
/* "flat" list of AppendRelInfos */
|
/* "flat" list of AppendRelInfos */
|
||||||
List *appendRelations;
|
List *appendRelations;
|
||||||
|
|
||||||
/* List of PartitionPruneInfo contained in the plan */
|
|
||||||
List *partPruneInfos;
|
|
||||||
|
|
||||||
/* OIDs of relations the plan depends on */
|
/* OIDs of relations the plan depends on */
|
||||||
List *relationOids;
|
List *relationOids;
|
||||||
|
|
||||||
@ -547,9 +544,6 @@ struct PlannerInfo
|
|||||||
|
|
||||||
/* Does this query modify any partition key columns? */
|
/* Does this query modify any partition key columns? */
|
||||||
bool partColsUpdated;
|
bool partColsUpdated;
|
||||||
|
|
||||||
/* PartitionPruneInfos added in this query's plan. */
|
|
||||||
List *partPruneInfos;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,9 +70,6 @@ typedef struct PlannedStmt
|
|||||||
|
|
||||||
struct Plan *planTree; /* tree of Plan nodes */
|
struct Plan *planTree; /* tree of Plan nodes */
|
||||||
|
|
||||||
List *partPruneInfos; /* List of PartitionPruneInfo contained in the
|
|
||||||
* plan */
|
|
||||||
|
|
||||||
List *rtable; /* list of RangeTblEntry nodes */
|
List *rtable; /* list of RangeTblEntry nodes */
|
||||||
|
|
||||||
List *permInfos; /* list of RTEPermissionInfo nodes for rtable
|
List *permInfos; /* list of RTEPermissionInfo nodes for rtable
|
||||||
@ -276,8 +273,8 @@ typedef struct Append
|
|||||||
*/
|
*/
|
||||||
int first_partial_plan;
|
int first_partial_plan;
|
||||||
|
|
||||||
/* Index to PlannerInfo.partPruneInfos or -1 if no run-time pruning */
|
/* Info for run-time subplan pruning; NULL if we're not doing that */
|
||||||
int part_prune_index;
|
struct PartitionPruneInfo *part_prune_info;
|
||||||
} Append;
|
} Append;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -311,8 +308,8 @@ typedef struct MergeAppend
|
|||||||
/* NULLS FIRST/LAST directions */
|
/* NULLS FIRST/LAST directions */
|
||||||
bool *nullsFirst pg_node_attr(array_size(numCols));
|
bool *nullsFirst pg_node_attr(array_size(numCols));
|
||||||
|
|
||||||
/* Index to PlannerInfo.partPruneInfos or -1 if no run-time pruning */
|
/* Info for run-time subplan pruning; NULL if we're not doing that */
|
||||||
int part_prune_index;
|
struct PartitionPruneInfo *part_prune_info;
|
||||||
} MergeAppend;
|
} MergeAppend;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1414,8 +1411,6 @@ typedef struct PlanRowMark
|
|||||||
* Then, since an Append-type node could have multiple partitioning
|
* Then, since an Append-type node could have multiple partitioning
|
||||||
* hierarchies among its children, we have an unordered List of those Lists.
|
* hierarchies among its children, we have an unordered List of those Lists.
|
||||||
*
|
*
|
||||||
* root_parent_relids RelOptInfo.relids of the relation to which the parent
|
|
||||||
* plan node and this PartitionPruneInfo node belong
|
|
||||||
* prune_infos List of Lists containing PartitionedRelPruneInfo nodes,
|
* prune_infos List of Lists containing PartitionedRelPruneInfo nodes,
|
||||||
* one sublist per run-time-prunable partition hierarchy
|
* one sublist per run-time-prunable partition hierarchy
|
||||||
* appearing in the parent plan node's subplans.
|
* appearing in the parent plan node's subplans.
|
||||||
@ -1428,7 +1423,6 @@ typedef struct PartitionPruneInfo
|
|||||||
pg_node_attr(no_equal, no_query_jumble)
|
pg_node_attr(no_equal, no_query_jumble)
|
||||||
|
|
||||||
NodeTag type;
|
NodeTag type;
|
||||||
Bitmapset *root_parent_relids;
|
|
||||||
List *prune_infos;
|
List *prune_infos;
|
||||||
Bitmapset *other_subplans;
|
Bitmapset *other_subplans;
|
||||||
} PartitionPruneInfo;
|
} PartitionPruneInfo;
|
||||||
|
@ -70,7 +70,7 @@ typedef struct PartitionPruneContext
|
|||||||
#define PruneCxtStateIdx(partnatts, step_id, keyno) \
|
#define PruneCxtStateIdx(partnatts, step_id, keyno) \
|
||||||
((partnatts) * (step_id) + (keyno))
|
((partnatts) * (step_id) + (keyno))
|
||||||
|
|
||||||
extern int make_partition_pruneinfo(struct PlannerInfo *root,
|
extern PartitionPruneInfo *make_partition_pruneinfo(struct PlannerInfo *root,
|
||||||
struct RelOptInfo *parentrel,
|
struct RelOptInfo *parentrel,
|
||||||
List *subpaths,
|
List *subpaths,
|
||||||
List *prunequal);
|
List *prunequal);
|
||||||
|
Reference in New Issue
Block a user