add SetTaskPerPlacementStrings

It is possible that a task will have different query string for each
placement. This is the case in INSERT..SELECT via repartitioning. When
we are setting task->perPlacementQueryString, we should set
queryStringLazy to NULL. Therefore a method for that purpose is created.
pull/3659/head
SaitTalhaNisanci 2020-03-26 13:21:31 +03:00
parent 157f4599c3
commit 982b5fbabf
3 changed files with 21 additions and 6 deletions

View File

@ -228,9 +228,7 @@ WrapTasksForPartitioning(const char *resultIdPrefix, List *selectTaskList,
binaryFormatString); binaryFormatString);
perPlacementQueries = lappend(perPlacementQueries, wrappedQuery->data); perPlacementQueries = lappend(perPlacementQueries, wrappedQuery->data);
} }
SetTaskPerPlacementQueryStrings(selectTask, perPlacementQueries);
SetTaskQueryString(selectTask, NULL);
selectTask->perPlacementQueryStrings = perPlacementQueries;
} }
} }

View File

@ -41,6 +41,7 @@ static void UpdateTaskQueryString(Query *query, Oid distributedTableId,
static void ConvertRteToSubqueryWithEmptyResult(RangeTblEntry *rte); static void ConvertRteToSubqueryWithEmptyResult(RangeTblEntry *rte);
static bool ShouldLazyDeparseQuery(Task *task); static bool ShouldLazyDeparseQuery(Task *task);
static char * DeparseTaskQuery(Task *task, Query *query); static char * DeparseTaskQuery(Task *task, Query *query);
static bool IsEachPlacementQueryStringDifferent(Task* task);
/* /*
@ -426,9 +427,7 @@ SetTaskQuery(Task *task, Query *query)
task->queryStringLazy = NULL; task->queryStringLazy = NULL;
return; return;
} }
SetTaskQueryString(task, DeparseTaskQuery(task,query));
task->queryForLocalExecution = NULL;
task->queryStringLazy = DeparseTaskQuery(task, query);
} }
@ -444,6 +443,15 @@ SetTaskQueryString(Task *task, char *queryString)
task->queryStringLazy = queryString; task->queryStringLazy = queryString;
} }
/*
* SetTaskPerPlacementQueryStrings set the perPlacementQueryString for the given task.
*/
void SetTaskPerPlacementQueryStrings(Task *task, List* perPlacementQueryStringList) {
Assert(perPlacementQueryStringList != NIL);
task->perPlacementQueryStrings = perPlacementQueryStringList;
SetTaskQueryString(task, NULL);
}
/* /*
* SetTaskQueryStringList sets the queryStringList of the given task. * SetTaskQueryStringList sets the queryStringList of the given task.
@ -516,3 +524,11 @@ TaskQueryString(Task *task)
MemoryContextSwitchTo(previousContext); MemoryContextSwitchTo(previousContext);
return task->queryStringLazy; return task->queryStringLazy;
} }
/*
* IsEachPlacementQueryStringDifferent returns true if each placement
* has a different query string.
*/
static bool IsEachPlacementQueryStringDifferent(Task* task) {
return list_length(task->perPlacementQueryStrings) > 0;
}

View File

@ -26,6 +26,7 @@ extern bool UpdateRelationToShardNames(Node *node, List *relationShardList);
extern void SetTaskQuery(Task *task, Query *query); extern void SetTaskQuery(Task *task, Query *query);
extern void SetTaskQueryString(Task *task, char *queryString); extern void SetTaskQueryString(Task *task, char *queryString);
extern void SetTaskQueryStringList(Task *task, List *queryStringList); extern void SetTaskQueryStringList(Task *task, List *queryStringList);
extern void SetTaskPerPlacementQueryStrings(Task *task, List* perPlacementQueryStringList)
extern char * TaskQueryString(Task *task); extern char * TaskQueryString(Task *task);
extern bool UpdateRelationsToLocalShardTables(Node *node, List *relationShardList); extern bool UpdateRelationsToLocalShardTables(Node *node, List *relationShardList);