From f7b9cb011e07b26bc66c07eaf26d106f1d0ede5b Mon Sep 17 00:00:00 2001 From: shihao zhong Date: Mon, 12 Oct 2026 03:07:24 -0400 Subject: [PATCH v1 1/3] Reset aggpresorted when the planner restarts after join removal. query_planner() can call standard_qp_callback() twice. Flags set on the first call stayed set, so an aggregate could skip its sort when the input was no longer sorted for it. Clear the flags before choosing again. --- src/backend/optimizer/plan/planner.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index edaa42d713a..74490fe30f0 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -3551,6 +3551,19 @@ adjust_group_pathkeys_for_groupagg(PlannerInfo *root) if (!enable_presorted_aggregate) return; + /* + * query_planner() can call us again after removing a join, so forget what + * an earlier call marked. + */ + foreach(lc, root->agginfos) + { + AggInfo *agginfo = lfirst_node(AggInfo, lc); + ListCell *lc2; + + foreach(lc2, agginfo->aggrefs) + lfirst_node(Aggref, lc2)->aggpresorted = false; + } + /* * Make a first pass over all AggInfos to collect a Bitmapset containing * the indexes of all AggInfos to be processed below. -- 2.37.1 (Apple Git-137.1)