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:
parent
91143c03d4
commit
0c1af2c35c
4 changed files with 24 additions and 17 deletions
|
@ -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));
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue