Use PlannerRestrictionContext instead of RecursivePlannerContext

pull/4358/head
Sait Talha Nisanci 2020-12-01 18:53:07 +03:00
parent 3fe3c55023
commit ff4f3b2f3c
3 changed files with 23 additions and 33 deletions

View File

@ -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)
{ {

View File

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

View File

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