From a33479132966d9f9db5a03ff5a585f2b96582cf4 Mon Sep 17 00:00:00 2001
From: shihao zhong <zhong950419@gmail.com>
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)

