mirror of https://github.com/citusdata/citus.git
Added true clauses to join expressions with no qualifiers
parent
f38618ecb1
commit
ff15d79c97
|
@ -105,7 +105,7 @@ static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNo
|
||||||
* Local functions forward declarations for subquery pushdown. Note that these
|
* Local functions forward declarations for subquery pushdown. Note that these
|
||||||
* functions will be removed with upcoming subqery changes.
|
* functions will be removed with upcoming subqery changes.
|
||||||
*/
|
*/
|
||||||
static FromExpr * CollapseJoinTree(FromExpr *fromExpr);
|
static Node * SubqueryJoinTreeFixup(Node *fromExpr);
|
||||||
static MultiNode * SubqueryPushdownMultiPlanTree(Query *queryTree,
|
static MultiNode * SubqueryPushdownMultiPlanTree(Query *queryTree,
|
||||||
List *subqueryEntryList);
|
List *subqueryEntryList);
|
||||||
static void ErrorIfSubqueryJoin(Query *queryTree);
|
static void ErrorIfSubqueryJoin(Query *queryTree);
|
||||||
|
@ -2044,29 +2044,67 @@ ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FromExpr *
|
static Node *
|
||||||
CollapseJoinTree(FromExpr *fromExpr)
|
SubqueryJoinTreeFixup(Node *expr)
|
||||||
{
|
{
|
||||||
FromExpr *result = fromExpr;
|
Node *currentExpr = expr;
|
||||||
|
if (IsA(currentExpr, FromExpr))
|
||||||
if (list_length(fromExpr->fromlist) == 1)
|
|
||||||
{
|
{
|
||||||
Node *firstItem = linitial(fromExpr->fromlist);
|
FromExpr *fromExpr = (FromExpr *) expr;
|
||||||
if (IsA(firstItem, FromExpr))
|
|
||||||
|
if (list_length(fromExpr->fromlist) == 1)
|
||||||
{
|
{
|
||||||
result = CollapseJoinTree((FromExpr *) firstItem);
|
Node *firstItem = linitial(fromExpr->fromlist);
|
||||||
|
if (IsA(firstItem, FromExpr))
|
||||||
|
{
|
||||||
|
currentExpr = SubqueryJoinTreeFixup((Node *) firstItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentExpr != NULL && IsA(currentExpr, FromExpr))
|
||||||
|
{
|
||||||
|
fromExpr = (FromExpr *) currentExpr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fromExpr != NULL && IsA(fromExpr->fromlist, List))
|
||||||
|
{
|
||||||
|
List *fromList = (List *) fromExpr->fromlist;
|
||||||
|
List *newFromList = NIL;
|
||||||
|
ListCell *fromListCell = NULL;
|
||||||
|
|
||||||
|
foreach(fromListCell, fromList)
|
||||||
|
{
|
||||||
|
Node *fromItem = (Node *) lfirst(fromListCell);
|
||||||
|
Node *nextItem = fromItem;
|
||||||
|
nextItem = SubqueryJoinTreeFixup(fromItem);
|
||||||
|
newFromList = lappend(newFromList, nextItem);
|
||||||
|
}
|
||||||
|
fromExpr->fromlist = newFromList;
|
||||||
|
if (fromExpr->quals != NULL && IsA(fromExpr->quals, List))
|
||||||
|
{
|
||||||
|
fromExpr->quals = (Node *) make_ands_explicit((List *) fromExpr->quals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentExpr = (Node *) fromExpr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsA(currentExpr, JoinExpr))
|
||||||
|
{
|
||||||
|
JoinExpr *joinExpr = (JoinExpr *) currentExpr;
|
||||||
|
joinExpr->larg = SubqueryJoinTreeFixup(joinExpr->larg);
|
||||||
|
joinExpr->rarg = SubqueryJoinTreeFixup(joinExpr->rarg);
|
||||||
|
if (joinExpr->quals == NULL)
|
||||||
|
{
|
||||||
|
joinExpr->quals = makeBoolConst(true, false);
|
||||||
|
}
|
||||||
|
else if (IsA(joinExpr->quals, List))
|
||||||
|
{
|
||||||
|
joinExpr->quals = (Node *) make_ands_explicit((List *) joinExpr->quals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result->quals != NULL)
|
return currentExpr;
|
||||||
{
|
|
||||||
if (IsA(result->quals, List))
|
|
||||||
{
|
|
||||||
List *qualsList = (List *) result->quals;
|
|
||||||
result->quals = (Node *) make_ands_explicit(qualsList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2159,7 +2197,8 @@ SubqueryPushdownMultiPlanTree(Query *queryTree, List *subqueryEntryList)
|
||||||
column->varattno = targetNo;
|
column->varattno = targetNo;
|
||||||
}
|
}
|
||||||
|
|
||||||
queryCopy->jointree = CollapseJoinTree(queryCopy->jointree);
|
queryCopy->jointree = (FromExpr *) SubqueryJoinTreeFixup(
|
||||||
|
(Node *) queryCopy->jointree);
|
||||||
|
|
||||||
|
|
||||||
queryCopy->targetList = subqueryTargetEntryList;
|
queryCopy->targetList = subqueryTargetEntryList;
|
||||||
|
|
Loading…
Reference in New Issue