I think the culprit is that when replacing correlation uplevel vars with Params, we do not handle the SubLinks in the arguments of uplevel GroupingFunc. We expect build_subplan should take care of it. But in build_subplan, we ignore GroupingFunc incorrectly.
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 0881a208ac..e4918f275e 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -364,7 +364,8 @@ build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, * SS_replace_correlation_vars). Do that now. */ if (IsA(arg, PlaceHolderVar) || - IsA(arg, Aggref)) + IsA(arg, Aggref) || + IsA(arg, GroupingFunc)) arg = SS_process_sublinks(root, arg, false);
I think we also need to change SS_process_sublinks to avoid recursing into the arguments of an outer GroupingFunc. And that leads to a fix as