diff --git a/src/backend/distributed/executor/distributed_intermediate_results.c b/src/backend/distributed/executor/distributed_intermediate_results.c index ee11c03b7..7e9d47218 100644 --- a/src/backend/distributed/executor/distributed_intermediate_results.c +++ b/src/backend/distributed/executor/distributed_intermediate_results.c @@ -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); } } diff --git a/src/backend/distributed/planner/deparse_shard_query.c b/src/backend/distributed/planner/deparse_shard_query.c index 3651da73a..69d3012bc 100644 --- a/src/backend/distributed/planner/deparse_shard_query.c +++ b/src/backend/distributed/planner/deparse_shard_query.c @@ -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; +} \ No newline at end of file diff --git a/src/include/distributed/deparse_shard_query.h b/src/include/distributed/deparse_shard_query.h index dc340821b..95baeb6e4 100644 --- a/src/include/distributed/deparse_shard_query.h +++ b/src/include/distributed/deparse_shard_query.h @@ -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);