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);
perPlacementQueries = lappend(perPlacementQueries, wrappedQuery->data);
}
SetTaskQueryString(selectTask, NULL);
selectTask->perPlacementQueryStrings = perPlacementQueries;
SetTaskPerPlacementQueryStrings(selectTask, perPlacementQueries);
}
}

View File

@ -41,6 +41,7 @@ static void UpdateTaskQueryString(Query *query, Oid distributedTableId,
static void ConvertRteToSubqueryWithEmptyResult(RangeTblEntry *rte);
static bool ShouldLazyDeparseQuery(Task *task);
static char * DeparseTaskQuery(Task *task, Query *query);
static bool IsEachPlacementQueryStringDifferent(Task* task);
/*
@ -426,9 +427,7 @@ SetTaskQuery(Task *task, Query *query)
task->queryStringLazy = NULL;
return;
}
task->queryForLocalExecution = NULL;
task->queryStringLazy = DeparseTaskQuery(task, query);
SetTaskQueryString(task, DeparseTaskQuery(task,query));
}
@ -444,6 +443,15 @@ SetTaskQueryString(Task *task, char *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.
@ -516,3 +524,11 @@ TaskQueryString(Task *task)
MemoryContextSwitchTo(previousContext);
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 SetTaskQueryString(Task *task, char *queryString);
extern void SetTaskQueryStringList(Task *task, List *queryStringList);
extern void SetTaskPerPlacementQueryStrings(Task *task, List* perPlacementQueryStringList)
extern char * TaskQueryString(Task *task);
extern bool UpdateRelationsToLocalShardTables(Node *node, List *relationShardList);