From 39dde5ef57fd7258c3d7973d17c8231b45673cb3 Mon Sep 17 00:00:00 2001 From: William Bernbaum Date: Wed, 26 Aug 2026 07:31:33 -0700 Subject: [PATCH v1 01/16] Stop assuming eager aggregation always has an aggregate expression to push A deduplication can be pushed below a join like a partial aggregate, letting the same machinery handle an empty aggregate list. --- src/backend/optimizer/path/allpaths.c | 14 ++++++-------- src/backend/optimizer/util/relnode.c | 14 +++++--------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 24a6a8d11dd..8cc702cface 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -352,11 +352,10 @@ setup_simple_grouped_rels(PlannerInfo *root) Index rti; /* - * If there are no aggregate expressions or grouping expressions, eager - * aggregation is not possible. + * If there are no grouping expressions, eager aggregation is not + * possible. */ - if (root->agg_clause_list == NIL || - root->group_expr_list == NIL) + if (root->group_expr_list == NIL) return; for (rti = 1; rti < root->simple_rel_array_size; rti++) @@ -1386,11 +1385,10 @@ set_grouped_rel_pathlist(PlannerInfo *root, RelOptInfo *rel) RelOptInfo *grouped_rel; /* - * If there are no aggregate expressions or grouping expressions, eager - * aggregation is not possible. + * If there are no grouping expressions, eager aggregation is not + * possible. */ - if (root->agg_clause_list == NIL || - root->group_expr_list == NIL) + if (root->group_expr_list == NIL) return; /* Add paths to the grouped base relation if one exists. */ diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index ee69f81945f..4fd569d21b4 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -451,10 +451,9 @@ build_simple_grouped_rel(PlannerInfo *root, RelOptInfo *rel) RelAggInfo *agg_info; /* - * We should have available aggregate expressions and grouping - * expressions, otherwise we cannot reach here. + * We should have available grouping expressions, otherwise we cannot + * reach here. */ - Assert(root->agg_clause_list != NIL); Assert(root->group_expr_list != NIL); /* nothing to do for dummy rel */ @@ -2723,11 +2722,7 @@ create_rel_agg_info(PlannerInfo *root, RelOptInfo *rel, List *group_clauses = NIL; List *group_exprs = NIL; - /* - * The lists of aggregate expressions and grouping expressions should have - * been constructed. - */ - Assert(root->agg_clause_list != NIL); + /* The list of grouping expressions should have been constructed. */ Assert(root->group_expr_list != NIL); /* @@ -3089,7 +3084,8 @@ init_grouping_targets(PlannerInfo *root, RelOptInfo *rel, *group_clauses = lappend(*group_clauses, sgc); *group_exprs = lappend(*group_exprs, expr); } - else if (is_var_in_aggref_only(root, (Var *) expr)) + else if (root->agg_clause_list != NIL && + is_var_in_aggref_only(root, (Var *) expr)) { /* * The expression is referenced by an aggregate function pushed