From a33479132966d9f9db5a03ff5a585f2b96582cf4 Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Mon, 12 Oct 2026 03:10:36 -0400 Subject: [PATCH v1 1/2] Don't use eager aggregation below volatile clauses. A volatile join clause or qual above a partial aggregate was evaluated once per group instead of once per joined row. Refuse to build grouped paths for a relation that still has such a clause to apply. --- src/backend/optimizer/util/relnode.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 34dfb757152..30724405255 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -2998,6 +2998,18 @@ eager_aggregation_possible_for_relation(PlannerInfo *root, RelOptInfo *rel) Assert(rel->reloptkind == RELOPT_BASEREL || rel->reloptkind == RELOPT_JOINREL); + /* + * Volatile clauses above the aggregate must see every joined row, so + * grouping below them is not allowed. + */ + foreach(lc, rel->joininfo) + { + RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc); + + if (contain_volatile_functions((Node *) rinfo)) + return false; + } + /* * Check if all aggregate expressions can be evaluated on this relation * level. -- 2.37.1 (Apple Git-137.1)