From 91143c03d4ca36406a53e05cd421b19e47d131d1 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 6 Jun 2024 13:42:47 +0300 Subject: [PATCH] Add invariants check to get_useful_group_keys_orderings() This commit introduces invariants checking of generated orderings in get_useful_group_keys_orderings() for assert-enabled builds. Discussion: https://postgr.es/m/a663f0f6-cbf6-49aa-af2e-234dc6768a07%40postgrespro.ru Reported-by: Tom Lane Author: Andrei Lepikhov Reviewed-by: Alexander Korotkov, Pavel Borisov --- src/backend/optimizer/path/pathkeys.c | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index df966b18f34..02e46a6eaaf 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -561,6 +561,34 @@ get_useful_group_keys_orderings(PlannerInfo *root, Path *path) } } +#ifdef USE_ASSERT_CHECKING + { + PathKeyInfo *pinfo = linitial_node(PathKeyInfo, infos); + ListCell *lc; + + /* Test consistency of info structures */ + for_each_from(lc, infos, 1) + { + ListCell *lc1, + *lc2; + + info = lfirst_node(PathKeyInfo, lc); + + Assert(list_length(info->clauses) == list_length(pinfo->clauses)); + Assert(list_length(info->pathkeys) == list_length(pinfo->pathkeys)); + Assert(list_difference(info->clauses, pinfo->clauses) == NIL); + Assert(list_difference_ptr(info->pathkeys, pinfo->pathkeys) == NIL); + + forboth(lc1, info->clauses, lc2, info->pathkeys) + { + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc1); + PathKey *pk = lfirst_node(PathKey, lc2); + + Assert(pk->pk_eclass->ec_sortref == sgc->tleSortGroupRef); + } + } + } +#endif return infos; }