Make sure that ExtractRangeTableRelationWalker never misses RTE_RELATION

pull/1833/head
Onder Kalaci 2017-11-27 15:28:03 +02:00
parent 32def06ebd
commit 26d9b58e9e
1 changed files with 32 additions and 10 deletions

View File

@ -3385,24 +3385,46 @@ NeedsDistributedPlanning(Query *queryTree)
/* /*
* ExtractRangeTableRelationWalker gathers all range table entries in a query * ExtractRangeTableRelationWalker gathers all range table relation entries
* and filters them to preserve only those of the RTE_RELATION type. * in a query.
*/ */
bool bool
ExtractRangeTableRelationWalker(Node *node, List **rangeTableRelationList) ExtractRangeTableRelationWalker(Node *node, List **rangeTableRelationList)
{ {
List *rangeTableList = NIL; bool walkIsComplete = false;
ListCell *rangeTableCell = NULL;
bool walkIsComplete = ExtractRangeTableEntryWalker(node, &rangeTableList);
foreach(rangeTableCell, rangeTableList) if (node == NULL)
{ {
RangeTblEntry *rangeTableEntry = (RangeTblEntry *) lfirst(rangeTableCell); return false;
if (rangeTableEntry->rtekind == RTE_RELATION && }
rangeTableEntry->relkind != RELKIND_VIEW)
if (IsA(node, RangeTblEntry))
{
RangeTblEntry *rangeTable = (RangeTblEntry *) node;
if (rangeTable->rtekind == RTE_RELATION && rangeTable->relkind != RELKIND_VIEW)
{ {
(*rangeTableRelationList) = lappend(*rangeTableRelationList, rangeTableEntry); (*rangeTableRelationList) = lappend(*rangeTableRelationList, rangeTable);
walkIsComplete = false;
} }
else
{
walkIsComplete = range_table_walker(list_make1(rangeTable),
ExtractRangeTableRelationWalker,
rangeTableRelationList, 0);
}
}
else if (IsA(node, Query))
{
walkIsComplete = query_tree_walker((Query *) node,
ExtractRangeTableRelationWalker,
rangeTableRelationList, QTW_EXAMINE_RTES);
}
else
{
walkIsComplete = expression_tree_walker(node, ExtractRangeTableRelationWalker,
rangeTableRelationList);
} }
return walkIsComplete; return walkIsComplete;