mirror of https://github.com/citusdata/citus.git
WIP
parent
6c903cd6f7
commit
68bda043c9
|
@ -110,7 +110,6 @@ struct RecursivePlanningContextInternal
|
||||||
int level;
|
int level;
|
||||||
uint64 planId;
|
uint64 planId;
|
||||||
bool allDistributionKeysInQueryAreEqual; /* used for some optimizations */
|
bool allDistributionKeysInQueryAreEqual; /* used for some optimizations */
|
||||||
bool setOperationJoinWithAnyRTE;
|
|
||||||
List *subPlanList;
|
List *subPlanList;
|
||||||
PlannerRestrictionContext *plannerRestrictionContext;
|
PlannerRestrictionContext *plannerRestrictionContext;
|
||||||
};
|
};
|
||||||
|
@ -142,7 +141,6 @@ typedef struct VarLevelsUpWalkerContext
|
||||||
static DeferredErrorMessage * RecursivelyPlanSubqueriesAndCTEs(Query *query,
|
static DeferredErrorMessage * RecursivelyPlanSubqueriesAndCTEs(Query *query,
|
||||||
RecursivePlanningContext *
|
RecursivePlanningContext *
|
||||||
context);
|
context);
|
||||||
static bool ContainsSetOperationJoinRTE(JoinRestrictionContext *joinRestrictionContext);
|
|
||||||
static bool ShouldRecursivelyPlanNonColocatedSubqueries(Query *subquery,
|
static bool ShouldRecursivelyPlanNonColocatedSubqueries(Query *subquery,
|
||||||
RecursivePlanningContext *
|
RecursivePlanningContext *
|
||||||
context);
|
context);
|
||||||
|
@ -222,10 +220,6 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
|
||||||
context.subPlanList = NIL;
|
context.subPlanList = NIL;
|
||||||
context.plannerRestrictionContext = plannerRestrictionContext;
|
context.plannerRestrictionContext = plannerRestrictionContext;
|
||||||
|
|
||||||
context.setOperationJoinWithAnyRTE =
|
|
||||||
ContainsSetOperationJoinRTE(plannerRestrictionContext->joinRestrictionContext);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculating the distribution key equality upfront is a trade-off for us.
|
* Calculating the distribution key equality upfront is a trade-off for us.
|
||||||
*
|
*
|
||||||
|
@ -238,12 +232,8 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
|
||||||
* calculating this wouldn't help us at all, we should individually check
|
* calculating this wouldn't help us at all, we should individually check
|
||||||
* each each subquery and subquery joins among subqueries.
|
* each each subquery and subquery joins among subqueries.
|
||||||
*/
|
*/
|
||||||
if (!context.setOperationJoinWithAnyRTE)
|
context.allDistributionKeysInQueryAreEqual =
|
||||||
{
|
AllDistributionKeysInQueryAreEqual(originalQuery, plannerRestrictionContext);
|
||||||
context.allDistributionKeysInQueryAreEqual =
|
|
||||||
AllDistributionKeysInQueryAreEqual(originalQuery, plannerRestrictionContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DeferredErrorMessage *error = RecursivelyPlanSubqueriesAndCTEs(originalQuery,
|
DeferredErrorMessage *error = RecursivelyPlanSubqueriesAndCTEs(originalQuery,
|
||||||
&context);
|
&context);
|
||||||
|
@ -269,74 +259,6 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
ContainsSetOperationJoinRTE(JoinRestrictionContext *joinRestrictionContext)
|
|
||||||
{
|
|
||||||
List *attributeEquivalenceList = NIL;
|
|
||||||
ListCell *joinRestrictionCell = NULL;
|
|
||||||
|
|
||||||
if (joinRestrictionContext == NULL)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach(joinRestrictionCell, joinRestrictionContext->joinRestrictionList)
|
|
||||||
{
|
|
||||||
JoinRestriction *joinRestriction =
|
|
||||||
(JoinRestriction *) lfirst(joinRestrictionCell);
|
|
||||||
ListCell *restrictionInfoList = NULL;
|
|
||||||
|
|
||||||
foreach(restrictionInfoList, joinRestriction->joinRestrictInfoList)
|
|
||||||
{
|
|
||||||
RestrictInfo *rinfo = (RestrictInfo *) lfirst(restrictionInfoList);
|
|
||||||
Expr *restrictionClause = rinfo->clause;
|
|
||||||
|
|
||||||
if (!IsA(restrictionClause, OpExpr))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
OpExpr *restrictionOpExpr = (OpExpr *) restrictionClause;
|
|
||||||
if (list_length(restrictionOpExpr->args) != 2)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!OperatorImplementsEquality(restrictionOpExpr->opno))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Node *leftNode = linitial(restrictionOpExpr->args);
|
|
||||||
Node *rightNode = lsecond(restrictionOpExpr->args);
|
|
||||||
|
|
||||||
/* we also don't want implicit coercions */
|
|
||||||
Expr *strippedLeftExpr = (Expr *) strip_implicit_coercions((Node *) leftNode);
|
|
||||||
Expr *strippedRightExpr =
|
|
||||||
(Expr *) strip_implicit_coercions((Node *) rightNode);
|
|
||||||
|
|
||||||
if (!(IsA(strippedLeftExpr, Var) && IsA(strippedRightExpr, Var)))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlannerInfo *root = joinRestriction->plannerInfo;
|
|
||||||
Var *leftVar = (Var *) strippedLeftExpr;
|
|
||||||
RangeTblEntry *leftRangeTblEntry = root->simple_rte_array[leftVar->varno];
|
|
||||||
|
|
||||||
Var *rightVar = (Var *) strippedRightExpr;
|
|
||||||
RangeTblEntry *rightRangeTblEntry = root->simple_rte_array[rightVar->varno];
|
|
||||||
|
|
||||||
if (leftRangeTblEntry->inh || rightRangeTblEntry->inh)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RecursivelyPlanSubqueriesAndCTEs finds subqueries and CTEs that cannot be pushed down to
|
* RecursivelyPlanSubqueriesAndCTEs finds subqueries and CTEs that cannot be pushed down to
|
||||||
* workers directly and instead plans them by recursively calling the planner and
|
* workers directly and instead plans them by recursively calling the planner and
|
||||||
|
@ -1088,11 +1010,6 @@ ShouldRecursivelyPlanSetOperation(Query *query, RecursivePlanningContext *contex
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context->setOperationJoinWithAnyRTE)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DeferErrorIfUnsupportedUnionQuery(query) != NULL)
|
if (DeferErrorIfUnsupportedUnionQuery(query) != NULL)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1362,6 +1362,11 @@ AddUnionAllSetOperationsToAttributeEquivalenceClass(AttributeEquivalenceClass **
|
||||||
List *appendRelList = root->append_rel_list;
|
List *appendRelList = root->append_rel_list;
|
||||||
ListCell *appendRelCell = NULL;
|
ListCell *appendRelCell = NULL;
|
||||||
|
|
||||||
|
if (root->simple_rel_array_size != 1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* iterate on the queries that are part of UNION ALL subqueries */
|
/* iterate on the queries that are part of UNION ALL subqueries */
|
||||||
foreach(appendRelCell, appendRelList)
|
foreach(appendRelCell, appendRelList)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue