From 48148dae9cf118e5b54625da882e67940a33db44 Mon Sep 17 00:00:00 2001 From: Colm McHugh Date: Fri, 31 Oct 2025 13:59:00 +0000 Subject: [PATCH] PG18: Fix missing Planning Fast Path Query DEBUG messages With PG18's GROUP RTE, queries that should have been eligible for fast path planning were skipped because the fast path planner allows exactly one range table only. This fix extends that to account for a GROUP RTE. --- .../distributed/planner/fast_path_router_planner.c | 12 ++++++++++-- .../distributed/planner/multi_router_planner.c | 6 +++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/planner/fast_path_router_planner.c b/src/backend/distributed/planner/fast_path_router_planner.c index 0d4840652..80afc7afa 100644 --- a/src/backend/distributed/planner/fast_path_router_planner.c +++ b/src/backend/distributed/planner/fast_path_router_planner.c @@ -273,8 +273,16 @@ FastPathRouterQuery(Query *query, FastPathRestrictionContext *fastPathContext) return true; } - /* make sure that the only range table in FROM clause */ - if (list_length(query->rtable) != 1) + int numFromRels = list_length(query->rtable); + + /* make sure that there is only one range table in FROM clause */ + if ((numFromRels != 1) +#if PG_VERSION_NUM >= PG_VERSION_18 + + /* with a PG18+ twist for GROUP rte - if present make sure there's two range tables */ + && (!query->hasGroupRTE || numFromRels != 2) +#endif + ) { return false; } diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 017dceef6..14ce199c8 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -2192,7 +2192,11 @@ CheckAndBuildDelayedFastPathPlan(DistributedPlanningContext *planContext, static bool ConvertToQueryOnShard(Query *query, Oid citusTableOid, Oid shardId) { - Assert(list_length(query->rtable) == 1); + Assert(list_length(query->rtable) == 1 + #if PG_VERSION_NUM >= PG_VERSION_18 + || (list_length(query->rtable) == 2 && query->hasGroupRTE) + #endif + ); RangeTblEntry *citusTableRte = (RangeTblEntry *) linitial(query->rtable); Assert(citusTableRte->relid == citusTableOid);