diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2024-06-06 13:42:47 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2024-06-06 13:42:47 +0300 |
commit | 91143c03d4ca36406a53e05cd421b19e47d131d1 (patch) | |
tree | 2618b37226ec5af8ff8ef1a750304d34ab48c71b | |
parent | 199012a3d844c6283e0ab4b1139440840a91433d (diff) | |
download | postgresql-91143c03d4ca36406a53e05cd421b19e47d131d1.tar.gz postgresql-91143c03d4ca36406a53e05cd421b19e47d131d1.zip |
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
-rw-r--r-- | src/backend/optimizer/path/pathkeys.c | 28 |
1 files changed, 28 insertions, 0 deletions
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; } |