mirror of https://github.com/citusdata/citus.git
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
parent
157f4599c3
commit
982b5fbabf
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue