From 5db357eb1a794706f2854ffd9254df191241b8af Mon Sep 17 00:00:00 2001 From: Burak Yucesoy Date: Fri, 20 May 2016 16:20:23 +0300 Subject: [PATCH] Remove ONLY clause from worker queries Fixes #475 With this change we prevent addition of ONLY clause to queries prepared for worker nodes. When we add ONLY clause we may miss the inherited tables in worker nodes created by users manually. --- .../planner/multi_router_planner.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index f94e30259..679e302f7 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -71,6 +71,7 @@ static Const * ExtractInsertPartitionValue(Query *query, Var *partitionColumn); static Task * RouterSelectTask(Query *query); static Job * RouterQueryJob(Query *query, Task *task); static bool ColumnMatchExpressionAtTopLevelConjunction(Node *node, Var *column); +static void SetRangeTablesInherited(Query *query); /* @@ -424,6 +425,12 @@ RouterModifyTask(Query *query) upsertQuery = false; #endif + /* + * We set inh flag of all range tables entries to true so that deparser will not + * add ONLY keyword to resulting query string. + */ + SetRangeTablesInherited(query); + deparse_shard_query(query, shardInterval->relationId, shardId, queryString); ereport(DEBUG4, (errmsg("distributed statement: %s", queryString->data))); @@ -778,6 +785,12 @@ RouterSelectTask(Query *query) joinTree->quals = whereClause; } + /* + * We set inh flag of all range tables entries to true so that deparser will not + * add ONLY keyword to resulting query string. + */ + SetRangeTablesInherited(query); + deparse_shard_query(query, shardInterval->relationId, shardId, queryString); ereport(DEBUG4, (errmsg("distributed statement: %s", queryString->data))); @@ -1043,3 +1056,24 @@ ColumnMatchExpressionAtTopLevelConjunction(Node *node, Var *column) return false; } + + +/* + * RouterSetRangeTablesInherited sets inh flag of all range table entries to true. + * We basically iterate over all range table entries and set their inh flag. + */ +static void +SetRangeTablesInherited(Query *query) +{ + List *rangeTableList = query->rtable; + ListCell *rangeTableCell = NULL; + + foreach(rangeTableCell, rangeTableList) + { + RangeTblEntry *rangeTableEntry = (RangeTblEntry *) lfirst(rangeTableCell); + if (rangeTableEntry->rtekind == RTE_RELATION) + { + rangeTableEntry->inh = true; + } + } +}