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
Reported-by: Tom Lane
Author: Andrei Lepikhov
Reviewed-by: Alexander Korotkov, Pavel Borisov
This commit is contained in:
Alexander Korotkov 2024-06-06 13:43:24 +03:00
parent 91143c03d4
commit 0c1af2c35c
4 changed files with 24 additions and 17 deletions

View file

@ -450,7 +450,7 @@ group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys,
/* /*
* pathkeys_are_duplicate * pathkeys_are_duplicate
* Check if give pathkeys are already contained the list of * Check if give pathkeys are already contained the list of
* PathKeyInfo's. * GroupByOrdering's.
*/ */
static bool static bool
pathkeys_are_duplicate(List *infos, List *pathkeys) pathkeys_are_duplicate(List *infos, List *pathkeys)
@ -459,7 +459,7 @@ pathkeys_are_duplicate(List *infos, List *pathkeys)
foreach(lc, infos) foreach(lc, infos)
{ {
PathKeyInfo *info = lfirst_node(PathKeyInfo, lc); GroupByOrdering *info = lfirst_node(GroupByOrdering, lc);
if (compare_pathkeys(pathkeys, info->pathkeys) == PATHKEYS_EQUAL) if (compare_pathkeys(pathkeys, info->pathkeys) == PATHKEYS_EQUAL)
return true; return true;
@ -471,7 +471,7 @@ pathkeys_are_duplicate(List *infos, List *pathkeys)
* get_useful_group_keys_orderings * get_useful_group_keys_orderings
* Determine which orderings of GROUP BY keys are potentially interesting. * 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 * ordering of GROUP BY keys. Each item stores pathkeys and clauses in the
* matching order. * matching order.
* *
@ -486,13 +486,13 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
{ {
Query *parse = root->parse; Query *parse = root->parse;
List *infos = NIL; List *infos = NIL;
PathKeyInfo *info; GroupByOrdering *info;
List *pathkeys = root->group_pathkeys; List *pathkeys = root->group_pathkeys;
List *clauses = root->processed_groupClause; List *clauses = root->processed_groupClause;
/* always return at least the original pathkeys/clauses */ /* always return at least the original pathkeys/clauses */
info = makeNode(PathKeyInfo); info = makeNode(GroupByOrdering);
info->pathkeys = pathkeys; info->pathkeys = pathkeys;
info->clauses = clauses; info->clauses = clauses;
infos = lappend(infos, info); infos = lappend(infos, info);
@ -528,7 +528,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
(enable_incremental_sort || n == root->num_groupby_pathkeys) && (enable_incremental_sort || n == root->num_groupby_pathkeys) &&
!pathkeys_are_duplicate(infos, pathkeys)) !pathkeys_are_duplicate(infos, pathkeys))
{ {
info = makeNode(PathKeyInfo); info = makeNode(GroupByOrdering);
info->pathkeys = pathkeys; info->pathkeys = pathkeys;
info->clauses = clauses; info->clauses = clauses;
@ -553,7 +553,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
(enable_incremental_sort || n == list_length(root->sort_pathkeys)) && (enable_incremental_sort || n == list_length(root->sort_pathkeys)) &&
!pathkeys_are_duplicate(infos, pathkeys)) !pathkeys_are_duplicate(infos, pathkeys))
{ {
info = makeNode(PathKeyInfo); info = makeNode(GroupByOrdering);
info->pathkeys = pathkeys; info->pathkeys = pathkeys;
info->clauses = clauses; info->clauses = clauses;
@ -563,7 +563,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
#ifdef USE_ASSERT_CHECKING #ifdef USE_ASSERT_CHECKING
{ {
PathKeyInfo *pinfo = linitial_node(PathKeyInfo, infos); GroupByOrdering *pinfo = linitial_node(GroupByOrdering, infos);
ListCell *lc; ListCell *lc;
/* Test consistency of info structures */ /* Test consistency of info structures */
@ -572,7 +572,7 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
ListCell *lc1, ListCell *lc1,
*lc2; *lc2;
info = lfirst_node(PathKeyInfo, lc); info = lfirst_node(GroupByOrdering, lc);
Assert(list_length(info->clauses) == list_length(pinfo->clauses)); Assert(list_length(info->clauses) == list_length(pinfo->clauses));
Assert(list_length(info->pathkeys) == list_length(pinfo->pathkeys)); Assert(list_length(info->pathkeys) == list_length(pinfo->pathkeys));

View file

@ -6917,7 +6917,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel,
foreach(lc2, pathkey_orderings) foreach(lc2, pathkey_orderings)
{ {
PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2);
/* restore the path (we replace it in the loop) */ /* restore the path (we replace it in the loop) */
path = path_save; path = path_save;
@ -6998,7 +6998,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel,
/* process all potentially interesting grouping reorderings */ /* process all potentially interesting grouping reorderings */
foreach(lc2, pathkey_orderings) foreach(lc2, pathkey_orderings)
{ {
PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2);
/* restore the path (we replace it in the loop) */ /* restore the path (we replace it in the loop) */
path = path_save; path = path_save;
@ -7249,7 +7249,7 @@ create_partial_grouping_paths(PlannerInfo *root,
/* process all potentially interesting grouping reorderings */ /* process all potentially interesting grouping reorderings */
foreach(lc2, pathkey_orderings) foreach(lc2, pathkey_orderings)
{ {
PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2);
/* restore the path (we replace it in the loop) */ /* restore the path (we replace it in the loop) */
path = path_save; path = path_save;
@ -7305,7 +7305,7 @@ create_partial_grouping_paths(PlannerInfo *root,
/* process all potentially interesting grouping reorderings */ /* process all potentially interesting grouping reorderings */
foreach(lc2, pathkey_orderings) foreach(lc2, pathkey_orderings)
{ {
PathKeyInfo *info = (PathKeyInfo *) lfirst(lc2); GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2);
/* restore the path (we replace it in the loop) */ /* restore the path (we replace it in the loop) */

View file

@ -1468,14 +1468,21 @@ typedef struct PathKey
} 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; NodeTag type;
List *pathkeys; List *pathkeys;
List *clauses; List *clauses;
} PathKeyInfo; } GroupByOrdering;
/* /*
* VolatileFunctionStatus -- allows nodes to cache their * VolatileFunctionStatus -- allows nodes to cache their

View file

@ -1056,6 +1056,7 @@ GrantRoleStmt
GrantStmt GrantStmt
GrantTargetType GrantTargetType
Group Group
GroupByOrdering
GroupClause GroupClause
GroupPath GroupPath
GroupPathExtraData GroupPathExtraData
@ -2067,7 +2068,6 @@ PathClauseUsage
PathCostComparison PathCostComparison
PathHashStack PathHashStack
PathKey PathKey
PathKeyInfo
PathKeysComparison PathKeysComparison
PathTarget PathTarget
PatternInfo PatternInfo