Skip to content

Commit

Permalink
Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"
Browse files Browse the repository at this point in the history
This reverts commit ec38694 and its fixup 589bb81.

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/[email protected]
Discussion: [2] https://postgr.es/m/[email protected]
  • Loading branch information
alvherre committed May 4, 2023
1 parent 919c486 commit 5472743
Show file tree
Hide file tree
Showing 16 changed files with 63 additions and 135 deletions.
1 change: 0 additions & 1 deletion src/backend/executor/execMain.c
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,6 @@ InitPlan(QueryDesc *queryDesc, int eflags)
ExecInitRangeTable(estate, rangeTable, plannedstmt->permInfos);

estate->es_plannedstmt = plannedstmt;
estate->es_part_prune_infos = plannedstmt->partPruneInfos;

/*
* Next, build the ExecRowMark array from the PlanRowMark(s), if any.
Expand Down
1 change: 0 additions & 1 deletion src/backend/executor/execParallel.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ ExecSerializePlan(Plan *plan, EState *estate)
pstmt->dependsOnRole = false;
pstmt->parallelModeNeeded = false;
pstmt->planTree = plan;
pstmt->partPruneInfos = estate->es_part_prune_infos;
pstmt->rtable = estate->es_range_table;
pstmt->permInfos = estate->es_rteperminfos;
pstmt->resultRelations = NIL;
Expand Down
18 changes: 1 addition & 17 deletions src/backend/executor/execPartition.c
Original file line number Diff line number Diff line change
Expand Up @@ -1778,9 +1778,6 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
* Initialize data structure needed for run-time partition pruning and
* 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
* 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
Expand All @@ -1793,24 +1790,11 @@ adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap)
PartitionPruneState *
ExecInitPartitionPruning(PlanState *planstate,
int n_total_subplans,
int part_prune_index,
Bitmapset *root_parent_relids,
PartitionPruneInfo *pruneinfo,
Bitmapset **initially_valid_subplans)
{
PartitionPruneState *prunestate;
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 */
ExecAssignExprContext(estate, planstate);
Expand Down
1 change: 0 additions & 1 deletion src/backend/executor/execUtils.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ CreateExecutorState(void)
estate->es_rowmarks = NULL;
estate->es_rteperminfos = NIL;
estate->es_plannedstmt = NULL;
estate->es_part_prune_infos = NIL;

estate->es_junkFilter = NULL;

Expand Down
5 changes: 2 additions & 3 deletions src/backend/executor/nodeAppend.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
appendstate->as_begun = false;

/* 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;

Expand All @@ -145,8 +145,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
*/
prunestate = ExecInitPartitionPruning(&appendstate->ps,
list_length(node->appendplans),
node->part_prune_index,
node->apprelids,
node->part_prune_info,
&validsubplans);
appendstate->as_prune_state = prunestate;
nplans = bms_num_members(validsubplans);
Expand Down
5 changes: 2 additions & 3 deletions src/backend/executor/nodeMergeAppend.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
mergestate->ps.ExecProcNode = ExecMergeAppend;

/* 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;

Expand All @@ -93,8 +93,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
*/
prunestate = ExecInitPartitionPruning(&mergestate->ps,
list_length(node->mergeplans),
node->part_prune_index,
node->apprelids,
node->part_prune_info,
&validsubplans);
mergestate->ms_prune_state = prunestate;
nplans = bms_num_members(validsubplans);
Expand Down
24 changes: 11 additions & 13 deletions src/backend/optimizer/plan/createplan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1203,6 +1203,7 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
ListCell *subpaths;
int nasyncplans = 0;
RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;
int nodenumsortkeys = 0;
AttrNumber *nodeSortColIdx = NULL;
Oid *nodeSortOperators = NULL;
Expand Down Expand Up @@ -1353,9 +1354,6 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
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
* pruning during execution. Gather information needed by the executor to
Expand All @@ -1379,14 +1377,16 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags)
}

if (prunequal != NIL)
plan->part_prune_index = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
partpruneinfo =
make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
}

plan->appendplans = subplans;
plan->nasyncplans = nasyncplans;
plan->first_partial_plan = best_path->first_partial_path;
plan->part_prune_info = partpruneinfo;

copy_generic_path_info(&plan->plan, (Path *) best_path);

Expand Down Expand Up @@ -1425,6 +1425,7 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
List *subplans = NIL;
ListCell *subpaths;
RelOptInfo *rel = best_path->path.parent;
PartitionPruneInfo *partpruneinfo = NULL;

/*
* We don't have the actual creation of the MergeAppend node split out
Expand Down Expand Up @@ -1517,9 +1518,6 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
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
* pruning during execution. Gather information needed by the executor to
Expand All @@ -1535,13 +1533,13 @@ create_merge_append_plan(PlannerInfo *root, MergeAppendPath *best_path,
Assert(best_path->path.param_info == NULL);

if (prunequal != NIL)
node->part_prune_index = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
partpruneinfo = make_partition_pruneinfo(root, rel,
best_path->subpaths,
prunequal);
}

node->mergeplans = subplans;

node->part_prune_info = partpruneinfo;

/*
* If prepare_sort_from_pathkeys added sort columns, but we were told to
Expand Down
1 change: 0 additions & 1 deletion src/backend/optimizer/plan/planner.c
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,6 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
result->dependsOnRole = glob->dependsOnRole;
result->parallelModeNeeded = glob->parallelModeNeeded;
result->planTree = top_plan;
result->partPruneInfos = glob->partPruneInfos;
result->rtable = glob->finalrtable;
result->permInfos = glob->finalrteperminfos;
result->resultRelations = glob->resultRelations;
Expand Down
88 changes: 30 additions & 58 deletions src/backend/optimizer/plan/setrefs.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,29 +350,6 @@ set_plan_references(PlannerInfo *root, Plan *plan)
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 */
result = set_plan_refs(root, plan, rtoffset);

Expand Down Expand Up @@ -1728,29 +1705,6 @@ set_customscan_references(PlannerInfo *root,
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
* Do set_plan_references processing on an Append
Expand Down Expand Up @@ -1803,12 +1757,21 @@ set_append_references(PlannerInfo *root,

aplan->apprelids = offset_relid_set(aplan->apprelids, rtoffset);

/*
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
*/
if (aplan->part_prune_index >= 0)
aplan->part_prune_index =
register_partpruneinfo(root, aplan->part_prune_index);
if (aplan->part_prune_info)
{
foreach(l, aplan->part_prune_info->prune_infos)
{
List *prune_infos = lfirst(l);
ListCell *l2;

foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);

pinfo->rtindex += rtoffset;
}
}
}

/* We don't need to recurse to lefttree or righttree ... */
Assert(aplan->plan.lefttree == NULL);
Expand Down Expand Up @@ -1870,12 +1833,21 @@ set_mergeappend_references(PlannerInfo *root,

mplan->apprelids = offset_relid_set(mplan->apprelids, rtoffset);

/*
* Add PartitionPruneInfo, if any, to PlannerGlobal and update the index.
*/
if (mplan->part_prune_index >= 0)
mplan->part_prune_index =
register_partpruneinfo(root, mplan->part_prune_index);
if (mplan->part_prune_info)
{
foreach(l, mplan->part_prune_info->prune_infos)
{
List *prune_infos = lfirst(l);
ListCell *l2;

foreach(l2, prune_infos)
{
PartitionedRelPruneInfo *pinfo = lfirst(l2);

pinfo->rtindex += rtoffset;
}
}
}

/* We don't need to recurse to lefttree or righttree ... */
Assert(mplan->plan.lefttree == NULL);
Expand Down
19 changes: 6 additions & 13 deletions src/backend/partitioning/partprune.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,20 +210,16 @@ static void partkey_datum_from_expr(PartitionPruneContext *context,

/*
* make_partition_pruneinfo
* Checks if the given set of quals can be used to build pruning steps
* that the executor can use to prune away unneeded partitions. If
* suitable quals are found then a PartitionPruneInfo is built and tagged
* 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.
* Builds a PartitionPruneInfo which can be used in the executor to allow
* additional partition pruning to take place. Returns NULL when
* partition pruning would be useless.
*
* 'parentrel' is the RelOptInfo for an appendrel, and 'subpaths' is the list
* of scan paths for its child rels.
* 'prunequal' is a list of potential pruning quals (i.e., restriction
* clauses that are applicable to the appendrel).
*/
int
PartitionPruneInfo *
make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
List *subpaths,
List *prunequal)
Expand Down Expand Up @@ -337,11 +333,10 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
* quals, then we can just not bother with run-time pruning.
*/
if (prunerelinfos == NIL)
return -1;
return NULL;

/* Else build the result data structure */
pruneinfo = makeNode(PartitionPruneInfo);
pruneinfo->root_parent_relids = parentrel->relids;
pruneinfo->prune_infos = prunerelinfos;

/*
Expand All @@ -364,9 +359,7 @@ make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel,
else
pruneinfo->other_subplans = NULL;

root->partPruneInfos = lappend(root->partPruneInfos, pruneinfo);

return list_length(root->partPruneInfos) - 1;
return pruneinfo;
}

/*
Expand Down
2 changes: 1 addition & 1 deletion src/include/catalog/catversion.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,6 @@
*/

/* yyyymmddN */
#define CATALOG_VERSION_NO 202304211
#define CATALOG_VERSION_NO 202305041

#endif
4 changes: 2 additions & 2 deletions src/include/executor/execPartition.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ typedef struct PartitionPruneState

extern PartitionPruneState *ExecInitPartitionPruning(PlanState *planstate,
int n_total_subplans,
int part_prune_index,
Bitmapset *root_parent_relids,
PartitionPruneInfo *pruneinfo,
Bitmapset **initially_valid_subplans);
extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate,
bool initial_prune);

#endif /* EXECPARTITION_H */
1 change: 0 additions & 1 deletion src/include/nodes/execnodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,6 @@ typedef struct EState
* ExecRowMarks, or NULL if none */
List *es_rteperminfos; /* List of RTEPermissionInfo */
PlannedStmt *es_plannedstmt; /* link to top of plan tree */
List *es_part_prune_infos; /* PlannedStmt.partPruneInfos */
const char *es_sourceText; /* Source text from QueryDesc */

JunkFilter *es_junkFilter; /* top-level junk filter, if any */
Expand Down
6 changes: 0 additions & 6 deletions src/include/nodes/pathnodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,6 @@ typedef struct PlannerGlobal
/* "flat" list of AppendRelInfos */
List *appendRelations;

/* List of PartitionPruneInfo contained in the plan */
List *partPruneInfos;

/* OIDs of relations the plan depends on */
List *relationOids;

Expand Down Expand Up @@ -547,9 +544,6 @@ struct PlannerInfo

/* Does this query modify any partition key columns? */
bool partColsUpdated;

/* PartitionPruneInfos added in this query's plan. */
List *partPruneInfos;
};


Expand Down
Loading

0 comments on commit 5472743

Please sign in to comment.