From 01df112261a8cd2e6e7b6befd163ebdee5d01304 Mon Sep 17 00:00:00 2001 From: hanweibo Date: Tue, 6 Aug 2024 19:26:09 +0800 Subject: [PATCH] fix group_by_has_partkey bug --- src/backend/optimizer/plan/planner.c | 35 +++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 948afd9094..8cdece261f 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -8025,13 +8025,42 @@ group_by_has_partkey(RelOptInfo *input_rel, foreach(lc, partexprs) { + ListCell *lg; Expr *partexpr = lfirst(lc); + Oid partcoll = input_rel->part_scheme->partcollation[cnt]; - if (list_member(groupexprs, partexpr)) + foreach (lg, groupexprs) { - found = true; - break; + Expr *groupexpr = lfirst(lg); + + /* + * GROUP BY xx COLLATE xxx + * Set collation in group by clause using COLLATE syntax, and the collation IS NOT equal + * to column's default collation. + */ + if (nodeTag(groupexpr) == T_RelabelType) + { + RelabelType *rt = (RelabelType *) groupexpr; + + if (equal(rt->arg, partexpr) && rt->resultcollid == partcoll) + { + found = true; + break; + } + } + /* + * Not set collation in group by clause, or the collation + * is the same as column's. + */ + else if (equal(groupexpr, partexpr) && exprCollation((Node *) groupexpr) == partcoll) + { + found = true; + break; + } } + + if (found) + break; } /* -- 2.25.1