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.
pull/544/head
Burak Yucesoy 2016-05-20 16:20:23 +03:00
parent 027a7a717d
commit 5db357eb1a
1 changed files with 34 additions and 0 deletions

View File

@ -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;
}
}
}