mirror of https://github.com/citusdata/citus.git
Use PlannerRestrictionContext instead of RecursivePlannerContext
parent
3fe3c55023
commit
ff4f3b2f3c
|
@ -71,27 +71,22 @@ typedef struct ConversionCandidates
|
||||||
static Oid GetResultRelationId(Query *query);
|
static Oid GetResultRelationId(Query *query);
|
||||||
static bool ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList,
|
static bool ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList,
|
||||||
Oid resultRelationId,
|
Oid resultRelationId,
|
||||||
RecursivePlanningContext *context);
|
PlannerRestrictionContext *plannerRestrictionContext);
|
||||||
static bool HasUniqueFilter(RangeTblEntry *distRTE, List *distRTERestrictionList,
|
static bool HasUniqueFilter(RangeTblEntry *distRTE, List *distRTERestrictionList,
|
||||||
List *requiredAttrNumbersForDistRTE);
|
List *requiredAttrNumbersForDistRTE);
|
||||||
static bool ShouldConvertDistributedTable(FromExpr *joinTree,
|
static bool ShouldConvertDistributedTable(FromExpr *joinTree,
|
||||||
RangeTableEntryDetails *distRTEContext);
|
RangeTableEntryDetails *distRTEContext);
|
||||||
static List * RequiredAttrNumbersForRelation(RangeTblEntry *relationRte,
|
static List * RequiredAttrNumbersForRelation(RangeTblEntry *relationRte,
|
||||||
RecursivePlanningContext *planningContext);
|
PlannerRestrictionContext *plannerRestrictionContext);
|
||||||
static ConversionCandidates * CreateConversionCandidates(
|
static ConversionCandidates * CreateConversionCandidates(
|
||||||
RecursivePlanningContext *context,
|
PlannerRestrictionContext *plannerRestrictionContext,
|
||||||
List *rangeTableList,
|
List *rangeTableList,
|
||||||
Oid resultRelationId);
|
Oid resultRelationId);
|
||||||
static void GetAllUniqueIndexes(Form_pg_index indexForm, List **uniqueIndexes);
|
static void GetAllUniqueIndexes(Form_pg_index indexForm, List **uniqueIndexes);
|
||||||
static RangeTableEntryDetails * GetNextRTEToConvertToSubquery(FromExpr *joinTree,
|
static RangeTableEntryDetails * GetNextRTEToConvertToSubquery(FromExpr *joinTree,
|
||||||
ConversionCandidates
|
ConversionCandidates *conversionCandidates,
|
||||||
*
|
PlannerRestrictionContext* plannerRestrictionContext,
|
||||||
conversionCandidates,
|
Oid resultRelationId);
|
||||||
PlannerRestrictionContext
|
|
||||||
*
|
|
||||||
plannerRestrictionContext,
|
|
||||||
Oid
|
|
||||||
resultRelationId);
|
|
||||||
static void GetRangeTableEntriesFromJoinTree(Node *joinNode, List *rangeTableList,
|
static void GetRangeTableEntriesFromJoinTree(Node *joinNode, List *rangeTableList,
|
||||||
List **joinRangeTableEntries);
|
List **joinRangeTableEntries);
|
||||||
static void RemoveFromConversionCandidates(ConversionCandidates *conversionCandidates, Oid
|
static void RemoveFromConversionCandidates(ConversionCandidates *conversionCandidates, Oid
|
||||||
|
@ -106,13 +101,18 @@ void
|
||||||
ConvertUnplannableTableJoinsToSubqueries(Query *query,
|
ConvertUnplannableTableJoinsToSubqueries(Query *query,
|
||||||
RecursivePlanningContext *context)
|
RecursivePlanningContext *context)
|
||||||
{
|
{
|
||||||
|
PlannerRestrictionContext* plannerRestrictionContext = context->plannerRestrictionContext;
|
||||||
|
|
||||||
List *rangeTableList = NIL;
|
List *rangeTableList = NIL;
|
||||||
GetRangeTableEntriesFromJoinTree((Node *) query->jointree, query->rtable,
|
GetRangeTableEntriesFromJoinTree((Node *) query->jointree, query->rtable,
|
||||||
&rangeTableList);
|
&rangeTableList);
|
||||||
|
|
||||||
Oid resultRelationId = GetResultRelationId(query);
|
Oid resultRelationId = GetResultRelationId(query);
|
||||||
|
if (!ShouldConvertLocalTableJoinsToSubqueries(query, rangeTableList, resultRelationId, plannerRestrictionContext)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
ConversionCandidates *conversionCandidates =
|
ConversionCandidates *conversionCandidates =
|
||||||
CreateConversionCandidates(context, rangeTableList, resultRelationId);
|
CreateConversionCandidates(plannerRestrictionContext, rangeTableList, resultRelationId);
|
||||||
|
|
||||||
RangeTableEntryDetails *rangeTableEntryDetails =
|
RangeTableEntryDetails *rangeTableEntryDetails =
|
||||||
GetNextRTEToConvertToSubquery(query->jointree, conversionCandidates,
|
GetNextRTEToConvertToSubquery(query->jointree, conversionCandidates,
|
||||||
|
@ -120,7 +120,7 @@ ConvertUnplannableTableJoinsToSubqueries(Query *query,
|
||||||
resultRelationId);
|
resultRelationId);
|
||||||
|
|
||||||
while (ShouldConvertLocalTableJoinsToSubqueries(query, rangeTableList,
|
while (ShouldConvertLocalTableJoinsToSubqueries(query, rangeTableList,
|
||||||
resultRelationId, context))
|
resultRelationId, plannerRestrictionContext))
|
||||||
{
|
{
|
||||||
ReplaceRTERelationWithRteSubquery(
|
ReplaceRTERelationWithRteSubquery(
|
||||||
rangeTableEntryDetails->rangeTableEntry,
|
rangeTableEntryDetails->rangeTableEntry,
|
||||||
|
@ -289,7 +289,7 @@ RemoveFromConversionCandidates(ConversionCandidates *conversionCandidates, Oid r
|
||||||
static bool
|
static bool
|
||||||
ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList,
|
ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList,
|
||||||
Oid resultRelationId,
|
Oid resultRelationId,
|
||||||
RecursivePlanningContext *context)
|
PlannerRestrictionContext *plannerRestrictionContext)
|
||||||
{
|
{
|
||||||
if (LocalTableJoinPolicy == LOCAL_JOIN_POLICY_NEVER)
|
if (LocalTableJoinPolicy == LOCAL_JOIN_POLICY_NEVER)
|
||||||
{
|
{
|
||||||
|
@ -301,8 +301,7 @@ ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlannerRestrictionContext *plannerRestrictionContext =
|
plannerRestrictionContext = FilterPlannerRestrictionForQuery(plannerRestrictionContext, query);
|
||||||
FilterPlannerRestrictionForQuery(context->plannerRestrictionContext, query);
|
|
||||||
if (IsRouterPlannable(query, plannerRestrictionContext))
|
if (IsRouterPlannable(query, plannerRestrictionContext))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -403,11 +402,8 @@ GetAllUniqueIndexes(Form_pg_index indexForm, List **uniqueIndexes)
|
||||||
*/
|
*/
|
||||||
static List *
|
static List *
|
||||||
RequiredAttrNumbersForRelation(RangeTblEntry *relationRte,
|
RequiredAttrNumbersForRelation(RangeTblEntry *relationRte,
|
||||||
RecursivePlanningContext *planningContext)
|
PlannerRestrictionContext *plannerRestrictionContext)
|
||||||
{
|
{
|
||||||
PlannerRestrictionContext *plannerRestrictionContext =
|
|
||||||
planningContext->plannerRestrictionContext;
|
|
||||||
|
|
||||||
/* TODO: Get rid of this hack, find relation restriction information directly */
|
/* TODO: Get rid of this hack, find relation restriction information directly */
|
||||||
PlannerRestrictionContext *filteredPlannerRestrictionContext =
|
PlannerRestrictionContext *filteredPlannerRestrictionContext =
|
||||||
FilterPlannerRestrictionForQuery(plannerRestrictionContext,
|
FilterPlannerRestrictionForQuery(plannerRestrictionContext,
|
||||||
|
@ -454,7 +450,7 @@ RequiredAttrNumbersForRelation(RangeTblEntry *relationRte,
|
||||||
* be converted to a subquery so that citus planners can work.
|
* be converted to a subquery so that citus planners can work.
|
||||||
*/
|
*/
|
||||||
static ConversionCandidates *
|
static ConversionCandidates *
|
||||||
CreateConversionCandidates(RecursivePlanningContext *context,
|
CreateConversionCandidates(PlannerRestrictionContext *plannerRestrictionContext,
|
||||||
List *rangeTableList, Oid resultRelationId)
|
List *rangeTableList, Oid resultRelationId)
|
||||||
{
|
{
|
||||||
ConversionCandidates *conversionCandidates = palloc0(
|
ConversionCandidates *conversionCandidates = palloc0(
|
||||||
|
@ -488,11 +484,9 @@ CreateConversionCandidates(RecursivePlanningContext *context,
|
||||||
rangeTableEntryDetails->rangeTableEntry = rangeTableEntry;
|
rangeTableEntryDetails->rangeTableEntry = rangeTableEntry;
|
||||||
rangeTableEntryDetails->rteIndex = rteIndex;
|
rangeTableEntryDetails->rteIndex = rteIndex;
|
||||||
rangeTableEntryDetails->restrictionList = GetRestrictInfoListForRelation(
|
rangeTableEntryDetails->restrictionList = GetRestrictInfoListForRelation(
|
||||||
rangeTableEntry,
|
rangeTableEntry, plannerRestrictionContext, 1);
|
||||||
context->
|
|
||||||
plannerRestrictionContext, 1);
|
|
||||||
rangeTableEntryDetails->requiredAttributeNumbers = RequiredAttrNumbersForRelation(
|
rangeTableEntryDetails->requiredAttributeNumbers = RequiredAttrNumbersForRelation(
|
||||||
rangeTableEntry, context);
|
rangeTableEntry, plannerRestrictionContext);
|
||||||
|
|
||||||
if (referenceOrDistributedTable)
|
if (referenceOrDistributedTable)
|
||||||
{
|
{
|
||||||
|
|
|
@ -223,6 +223,7 @@ CreateModifyPlan(Query *originalQuery, Query *query,
|
||||||
distributedPlan->planningError = ModifyQuerySupported(query, originalQuery,
|
distributedPlan->planningError = ModifyQuerySupported(query, originalQuery,
|
||||||
multiShardQuery,
|
multiShardQuery,
|
||||||
plannerRestrictionContext);
|
plannerRestrictionContext);
|
||||||
|
|
||||||
if (distributedPlan->planningError != NULL)
|
if (distributedPlan->planningError != NULL)
|
||||||
{
|
{
|
||||||
return distributedPlan;
|
return distributedPlan;
|
||||||
|
@ -550,10 +551,6 @@ ModifyPartialQuerySupported(Query *queryTree, bool multiShardQuery,
|
||||||
|
|
||||||
Oid resultRelationId = ModifyQueryResultRelationId(queryTree);
|
Oid resultRelationId = ModifyQueryResultRelationId(queryTree);
|
||||||
*distributedTableIdOutput = resultRelationId;
|
*distributedTableIdOutput = resultRelationId;
|
||||||
if (ContainsTableToBeConvertedToSubquery(queryTree->rtable, resultRelationId))
|
|
||||||
{
|
|
||||||
return deferredError;
|
|
||||||
}
|
|
||||||
|
|
||||||
Var *partitionColumn = NULL;
|
Var *partitionColumn = NULL;
|
||||||
|
|
||||||
|
|
|
@ -1542,8 +1542,7 @@ ContainsLocalTableSubqueryJoin(List *rangeTableList, Oid resultRelationId)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsCitusTable(rangeTableEntry->relid) && rangeTableEntry->relid !=
|
if (!IsCitusTable(rangeTableEntry->relid) && rangeTableEntry->relid != resultRelationId)
|
||||||
resultRelationId)
|
|
||||||
{
|
{
|
||||||
containsLocalTable = true;
|
containsLocalTable = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue