From 1ea5c8c20a0360202565ccb989d169e9e9edbedd Mon Sep 17 00:00:00 2001 From: Mehmet Yilmaz Date: Tue, 17 Jun 2025 07:37:06 +0000 Subject: [PATCH 1/2] Enhance set_relation_column_names to handle relid validation and support for synthetic PG 18 RTEs --- .../distributed/deparser/ruleutils_18.c | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/deparser/ruleutils_18.c b/src/backend/distributed/deparser/ruleutils_18.c index deecebb27..7d1e05c1c 100644 --- a/src/backend/distributed/deparser/ruleutils_18.c +++ b/src/backend/distributed/deparser/ruleutils_18.c @@ -1191,8 +1191,9 @@ set_relation_column_names(deparse_namespace *dpns, RangeTblEntry *rte, * real_colnames[] will be indexed by physical column number, with NULL * entries for dropped columns. */ - if (rte->rtekind == RTE_RELATION || - GetRangeTblKind(rte) == CITUS_RTE_SHARD) + if ((rte->rtekind == RTE_RELATION || + GetRangeTblKind(rte) == CITUS_RTE_SHARD) && + OidIsValid(rte->relid)) { /* Relation --- look to the system catalogs for up-to-date info */ Relation rel; @@ -1215,6 +1216,28 @@ set_relation_column_names(deparse_namespace *dpns, RangeTblEntry *rte, } relation_close(rel, AccessShareLock); } + else if (GetRangeTblKind(rte) == CITUS_RTE_SHARD) + { + /* shard RTE without relid (pulled-up clone in PG18) */ + /* use the column aliases already stored in rte->eref->colnames */ + + ncolumns = list_length(rte->eref->colnames); + real_colnames = (char **) palloc0(ncolumns * sizeof(char *)); + + for (i = 0; i < ncolumns; i++) + real_colnames[i] = pstrdup(strVal(list_nth(rte->eref->colnames, i))); + + /* keep changed_any / has_anonymous defaults */ + } + else if (rte->rtekind == RTE_GROUP) + { + /* ----- synthetic PG 18 RTE for GROUP BY / HAVING ----- */ + ncolumns = list_length(rte->eref->colnames); + real_colnames = (char **) palloc0(ncolumns * sizeof(char *)); + + for (i = 0; i < ncolumns; i++) + real_colnames[i] = pstrdup(strVal(list_nth(rte->eref->colnames, i))); + } else { /* Otherwise get the column names from eref or expandRTE() */ From cb2f4c5aafdbe18f636e12aaa5d0de9a29b1007b Mon Sep 17 00:00:00 2001 From: Mehmet Yilmaz Date: Tue, 17 Jun 2025 13:05:58 +0000 Subject: [PATCH 2/2] Handle unnamed groups in set_rtable_names by using the group's name --- src/backend/distributed/deparser/ruleutils_18.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/distributed/deparser/ruleutils_18.c b/src/backend/distributed/deparser/ruleutils_18.c index 7d1e05c1c..207ce83e8 100644 --- a/src/backend/distributed/deparser/ruleutils_18.c +++ b/src/backend/distributed/deparser/ruleutils_18.c @@ -795,6 +795,11 @@ set_rtable_names(deparse_namespace *dpns, List *parent_namespaces, /* Unnamed join has no refname */ refname = NULL; } + else if (rte->rtekind == RTE_GROUP) + { + /* Use the name of the group */ + refname = NULL; + } else { /* Otherwise use whatever the parser assigned */