From 67c4ab916acf94a136179107f6d8a84834758445 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Mon, 27 May 2024 14:57:43 +0300 Subject: [PATCH v2 3/4] Rename PathKeyInfo to GroupByOrdering 0452b461bc made optimizer explore alternative orderings of group-by pathkeys. The PathKeyInfo data structure was used to store the particular ordering of group-by pathkeys and corresponding clauses. It turns out that PathKeyInfo is not the best name for that purpose. This commit renames this data structure to GroupByOrdering, and revises its comment. Discussion: https://postgr.es/m/db0fc3a4-966c-4cec-a136-94024d39212d%40postgrespro.ru Author: Andrei Lepikhov --- src/backend/optimizer/path/pathkeys.c | 18 +++++++++--------- src/backend/optimizer/plan/planner.c | 8 ++++---- src/include/nodes/pathnodes.h | 13 ++++++++++--- src/tools/pgindent/typedefs.list | 2 +- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index e8ff2297697..85bfa080680 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -462,7 +462,7 @@ group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys, /* * pathkeys_are_duplicate * Check if give pathkeys are already contained the list of - * PathKeyInfo's. + * GroupByOrdering's. */ static bool pathkeys_are_duplicate(List *infos, List *pathkeys) @@ -471,7 +471,7 @@ pathkeys_are_duplicate(List *infos, List *pathkeys) foreach(lc, infos) { - PathKeyInfo *info = lfirst_node(PathKeyInfo, lc); + GroupByOrdering *info = lfirst_node(GroupByOrdering, lc); if (compare_pathkeys(pathkeys, info->pathkeys) == PATHKEYS_EQUAL) return true; @@ -483,7 +483,7 @@ pathkeys_are_duplicate(List *infos, List *pathkeys) * get_useful_group_keys_orderings * Determine which orderings of GROUP BY keys are potentially interesting. * - * Returns a list of PathKeyInfo items, each representing an interesting + * Returns a list of GroupByOrdering items, each representing an interesting * ordering of GROUP BY keys. Each item stores pathkeys and clauses in the * matching order. * @@ -498,13 +498,13 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) { Query *parse = root->parse; List *infos = NIL; - PathKeyInfo *info; + GroupByOrdering *info; List *pathkeys = root->group_pathkeys; List *clauses = root->processed_groupClause; /* always return at least the original pathkeys/clauses */ - info = makeNode(PathKeyInfo); + info = makeNode(GroupByOrdering); info->pathkeys = pathkeys; info->clauses = clauses; infos = lappend(infos, info); @@ -540,7 +540,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) (enable_incremental_sort || n == root->num_groupby_pathkeys) && !pathkeys_are_duplicate(infos, pathkeys)) { - info = makeNode(PathKeyInfo); + info = makeNode(GroupByOrdering); info->pathkeys = pathkeys; info->clauses = clauses; @@ -565,7 +565,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) (enable_incremental_sort || n == list_length(root->sort_pathkeys)) && !pathkeys_are_duplicate(infos, pathkeys)) { - info = makeNode(PathKeyInfo); + info = makeNode(GroupByOrdering); info->pathkeys = pathkeys; info->clauses = clauses; @@ -575,7 +575,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) #ifdef USE_ASSERT_CHECKING { - PathKeyInfo *pinfo = linitial_node(PathKeyInfo, infos); + GroupByOrdering *pinfo = linitial_node(GroupByOrdering, infos); ListCell *lc; /* Test consistency of info structures */ @@ -584,7 +584,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) ListCell *lc1, *lc2; - info = lfirst_node(PathKeyInfo, lc); + info = lfirst_node(GroupByOrdering, lc); Assert(list_length(info->clauses) == list_length(pinfo->clauses)); Assert(list_length(info->pathkeys) == list_length(pinfo->pathkeys)); diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index e723f72db64..5739275aa70 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -6917,7 +6917,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, foreach(lc2, pathkey_orderings) { - PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); /* restore the path (we replace it in the loop) */ path = path_save; @@ -6998,7 +6998,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, /* process all potentially interesting grouping reorderings */ foreach(lc2, pathkey_orderings) { - PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); /* restore the path (we replace it in the loop) */ path = path_save; @@ -7249,7 +7249,7 @@ create_partial_grouping_paths(PlannerInfo *root, /* process all potentially interesting grouping reorderings */ foreach(lc2, pathkey_orderings) { - PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); /* restore the path (we replace it in the loop) */ path = path_save; @@ -7305,7 +7305,7 @@ create_partial_grouping_paths(PlannerInfo *root, /* process all potentially interesting grouping reorderings */ foreach(lc2, pathkey_orderings) { - PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); /* restore the path (we replace it in the loop) */ diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 14ef296ab72..78489398294 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1468,14 +1468,21 @@ typedef struct PathKey } PathKey; /* - * Combines the information about pathkeys and the associated clauses. + * Contains an order of group-by clauses and the corresponding list of + * pathkeys. + * + * The elements of 'clauses' list should have the same order as the head of + * 'pathkeys' list. The tleSortGroupRef of the clause should be equal to + * ec_sortref of the pathkey equivalence class. If there are redundant + * clauses with the same tleSortGroupRef, they must be grouped together. */ -typedef struct PathKeyInfo +typedef struct GroupByOrdering { NodeTag type; + List *pathkeys; List *clauses; -} PathKeyInfo; +} GroupByOrdering; /* * VolatileFunctionStatus -- allows nodes to cache their diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index d427a1c16a5..4f57078d133 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1056,6 +1056,7 @@ GrantRoleStmt GrantStmt GrantTargetType Group +GroupByOrdering GroupClause GroupPath GroupPathExtraData @@ -2067,7 +2068,6 @@ PathClauseUsage PathCostComparison PathHashStack PathKey -PathKeyInfo PathKeysComparison PathTarget PatternInfo -- 2.39.3 (Apple Git-145)