mirror of https://github.com/citusdata/citus.git
move queryStringList into taskQuery
Also allocate task query in the memory context of task.pull/3659/head
parent
c796ac335d
commit
8806c4d697
|
@ -221,7 +221,8 @@ WrapTasksForPartitioning(const char *resultIdPrefix, List *selectTaskList,
|
|||
shardPlacement->nodeId,
|
||||
quote_literal_cstr(taskPrefix),
|
||||
quote_literal_cstr(taskPrefix),
|
||||
quote_literal_cstr(TaskQueryStringForAllPlacements(selectTask)),
|
||||
quote_literal_cstr(TaskQueryStringForAllPlacements(
|
||||
selectTask)),
|
||||
partitionColumnIndex,
|
||||
quote_literal_cstr(partitionMethodString),
|
||||
minValuesString->data, maxValuesString->data,
|
||||
|
|
|
@ -1570,7 +1570,8 @@ TrackerQueueSqlTask(TaskTracker *taskTracker, Task *task)
|
|||
*/
|
||||
|
||||
StringInfo sqlTaskQueryString = makeStringInfo();
|
||||
char *escapedTaskQueryString = quote_literal_cstr(TaskQueryStringForAllPlacements(task));
|
||||
char *escapedTaskQueryString = quote_literal_cstr(TaskQueryStringForAllPlacements(
|
||||
task));
|
||||
|
||||
if (BinaryMasterCopyFormat)
|
||||
{
|
||||
|
|
|
@ -130,7 +130,8 @@ RebuildQueryStrings(Job *workerJob)
|
|||
task->parametersInQueryStringResolved = workerJob->parametersInJobQueryResolved;
|
||||
|
||||
ereport(DEBUG4, (errmsg("query after rebuilding: %s",
|
||||
ApplyLogRedaction(TaskQueryStringForAllPlacements(task)))));
|
||||
ApplyLogRedaction(TaskQueryStringForAllPlacements(
|
||||
task)))));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -459,7 +460,10 @@ InitializeTaskQueryIfNecessary(Task *task)
|
|||
{
|
||||
if (task->taskQuery == NULL)
|
||||
{
|
||||
MemoryContext previousContext = MemoryContextSwitchTo(GetMemoryChunkContext(
|
||||
task));
|
||||
task->taskQuery = CitusMakeNode(TaskQuery);
|
||||
MemoryContextSwitchTo(previousContext);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -483,8 +487,9 @@ SetTaskPerPlacementQueryStrings(Task *task, List *perPlacementQueryStringList)
|
|||
void
|
||||
SetTaskQueryStringList(Task *task, List *queryStringList)
|
||||
{
|
||||
task->queryStringList = queryStringList;
|
||||
SetTaskQueryString(task, StringJoin(queryStringList, ';'));
|
||||
InitializeTaskQueryIfNecessary(task);
|
||||
task->taskQuery->queryType = TASK_QUERY_TEXT_LIST;
|
||||
task->taskQuery->data.queryStringList = queryStringList;
|
||||
}
|
||||
|
||||
|
||||
|
@ -537,13 +542,18 @@ GetTaskQueryType(Task *task)
|
|||
char *
|
||||
TaskQueryStringForAllPlacements(Task *task)
|
||||
{
|
||||
if (GetTaskQueryType(task) == TASK_QUERY_TEXT_LIST)
|
||||
{
|
||||
return StringJoin(task->taskQuery->data.queryStringList, ';');
|
||||
}
|
||||
if (GetTaskQueryType(task) == TASK_QUERY_TEXT)
|
||||
{
|
||||
return task->taskQuery->data.queryStringLazy;
|
||||
}
|
||||
Query *jobQueryReferenceForLazyDeparsing = task->taskQuery->data.jobQueryReferenceForLazyDeparsing;
|
||||
Assert(task->taskQuery->queryType == TASK_QUERY_OBJECT && jobQueryReferenceForLazyDeparsing !=
|
||||
NULL);
|
||||
Query *jobQueryReferenceForLazyDeparsing =
|
||||
task->taskQuery->data.jobQueryReferenceForLazyDeparsing;
|
||||
Assert(task->taskQuery->queryType == TASK_QUERY_OBJECT &&
|
||||
jobQueryReferenceForLazyDeparsing != NULL);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -563,6 +573,10 @@ TaskQueryStringForAllPlacements(Task *task)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* TaskQueryStringForPlacement returns the query string that should be executed
|
||||
* on the placement with the given placementIndex.
|
||||
*/
|
||||
char *
|
||||
TaskQueryStringForPlacement(Task *task, int placementIndex)
|
||||
{
|
||||
|
|
|
@ -399,7 +399,8 @@ RemoteExplain(Task *task, ExplainState *es)
|
|||
|
||||
RemoteExplainPlan *remotePlan = (RemoteExplainPlan *) palloc0(
|
||||
sizeof(RemoteExplainPlan));
|
||||
StringInfo explainQuery = BuildRemoteExplainQuery(TaskQueryStringForAllPlacements(task),
|
||||
StringInfo explainQuery = BuildRemoteExplainQuery(TaskQueryStringForAllPlacements(
|
||||
task),
|
||||
es);
|
||||
|
||||
/*
|
||||
|
|
|
@ -276,6 +276,12 @@ CopyNodeTaskQuery(COPYFUNC_ARGS)
|
|||
break;
|
||||
}
|
||||
|
||||
case TASK_QUERY_TEXT_LIST:
|
||||
{
|
||||
COPY_NODE_FIELD(data.queryStringList);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
break;
|
||||
|
@ -293,7 +299,6 @@ CopyNodeTask(COPYFUNC_ARGS)
|
|||
COPY_SCALAR_FIELD(jobId);
|
||||
COPY_SCALAR_FIELD(taskId);
|
||||
COPY_NODE_FIELD(taskQuery);
|
||||
COPY_NODE_FIELD(queryStringList);
|
||||
COPY_SCALAR_FIELD(anchorDistributedTableId);
|
||||
COPY_SCALAR_FIELD(anchorShardId);
|
||||
COPY_NODE_FIELD(taskPlacementList);
|
||||
|
|
|
@ -474,6 +474,38 @@ void OutTaskQuery(OUTFUNC_ARGS) {
|
|||
WRITE_NODE_TYPE("TASKQUERY");
|
||||
|
||||
WRITE_ENUM_FIELD(queryType, TaskQueryType);
|
||||
|
||||
switch (node->queryType)
|
||||
{
|
||||
case TASK_QUERY_TEXT:
|
||||
{
|
||||
WRITE_STRING_FIELD(data.queryStringLazy);
|
||||
break;
|
||||
}
|
||||
|
||||
case TASK_QUERY_OBJECT:
|
||||
{
|
||||
WRITE_NODE_FIELD(data.jobQueryReferenceForLazyDeparsing);
|
||||
break;
|
||||
}
|
||||
|
||||
case TASK_QUERY_TEXT_PER_PLACEMENT:
|
||||
{
|
||||
WRITE_NODE_FIELD(data.perPlacementQueryStrings);
|
||||
break;
|
||||
}
|
||||
|
||||
case TASK_QUERY_TEXT_LIST:
|
||||
{
|
||||
WRITE_NODE_FIELD(data.queryStringList);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -485,8 +517,7 @@ OutTask(OUTFUNC_ARGS)
|
|||
WRITE_ENUM_FIELD(taskType, TaskType);
|
||||
WRITE_UINT64_FIELD(jobId);
|
||||
WRITE_UINT_FIELD(taskId);
|
||||
// WRITE_SCALAR_FIELD(taskQuery);
|
||||
WRITE_NODE_FIELD(queryStringList);
|
||||
WRITE_NODE_FIELD(taskQuery);
|
||||
WRITE_OID_FIELD(anchorDistributedTableId);
|
||||
WRITE_UINT64_FIELD(anchorShardId);
|
||||
WRITE_NODE_FIELD(taskPlacementList);
|
||||
|
|
|
@ -207,7 +207,8 @@ typedef enum TaskQueryType
|
|||
{
|
||||
TASK_QUERY_TEXT,
|
||||
TASK_QUERY_OBJECT,
|
||||
TASK_QUERY_TEXT_PER_PLACEMENT
|
||||
TASK_QUERY_TEXT_PER_PLACEMENT,
|
||||
TASK_QUERY_TEXT_LIST
|
||||
} TaskQueryType;
|
||||
|
||||
typedef struct TaskQuery
|
||||
|
@ -250,6 +251,14 @@ typedef struct TaskQuery
|
|||
* perPlacementQueryStrings is used when we have different query strings for each placement.
|
||||
*/
|
||||
List *perPlacementQueryStrings;
|
||||
|
||||
/*
|
||||
* queryStringList contains query strings. They should be
|
||||
* run sequentially. The concatenated version of this list
|
||||
* will already be set for queryStringLazy, this can be useful
|
||||
* when we want to access each query string.
|
||||
*/
|
||||
List *queryStringList;
|
||||
}data;
|
||||
}TaskQuery;
|
||||
|
||||
|
@ -262,14 +271,6 @@ typedef struct Task
|
|||
|
||||
TaskQuery *taskQuery;
|
||||
|
||||
/*
|
||||
* queryStringList contains query strings. They should be
|
||||
* run sequentially. The concatenated version of this list
|
||||
* will already be set for queryStringLazy, this can be useful
|
||||
* when we want to access each query string.
|
||||
*/
|
||||
List *queryStringList;
|
||||
|
||||
Oid anchorDistributedTableId; /* only applies to insert tasks */
|
||||
uint64 anchorShardId; /* only applies to compute tasks */
|
||||
List *taskPlacementList; /* only applies to compute tasks */
|
||||
|
|
Loading…
Reference in New Issue