mirror of https://github.com/citusdata/citus.git
Optimize StringJoin() for when prefix-postfix is needed
Before this commit, we required multiple copies of the same stringInfo if we needed to append/prepend data to the stringInfo. Now, we optionally get prefix/postfix. For large string operations, this can save up to %10 memory.pull/6086/head
parent
b8008999dc
commit
26fdcb68f0
|
@ -161,13 +161,31 @@ GeneratePositiveIntSequenceList(int upTo)
|
|||
/*
|
||||
* StringJoin gets a list of char * and then simply
|
||||
* returns a newly allocated char * joined with the
|
||||
* given delimiter.
|
||||
* given delimiter. It uses ';' as the delimiter by
|
||||
* default.
|
||||
*/
|
||||
char *
|
||||
StringJoin(List *stringList, char delimiter)
|
||||
{
|
||||
return StringJoinParams(stringList, delimiter, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* StringJoin gets a list of char * and then simply
|
||||
* returns a newly allocated char * joined with the
|
||||
* given delimiter, prefix and postfix.
|
||||
*/
|
||||
char *
|
||||
StringJoinParams(List *stringList, char delimiter, char *prefix, char *postfix)
|
||||
{
|
||||
StringInfo joinedString = makeStringInfo();
|
||||
|
||||
if (prefix != NULL)
|
||||
{
|
||||
appendStringInfoString(joinedString, prefix);
|
||||
}
|
||||
|
||||
const char *command = NULL;
|
||||
int curIndex = 0;
|
||||
foreach_ptr(command, stringList)
|
||||
|
@ -180,6 +198,11 @@ StringJoin(List *stringList, char delimiter)
|
|||
curIndex++;
|
||||
}
|
||||
|
||||
if (postfix != NULL)
|
||||
{
|
||||
appendStringInfoString(joinedString, postfix);
|
||||
}
|
||||
|
||||
return joinedString->data;
|
||||
}
|
||||
|
||||
|
|
|
@ -569,13 +569,11 @@ CreateFixPartitionShardIndexNames(Oid parentRelationId, Oid partitionRelationId,
|
|||
task->taskId = taskId++;
|
||||
task->taskType = DDL_TASK;
|
||||
|
||||
char *prefix = "SELECT pg_catalog.citus_run_local_command($$";
|
||||
char *postfix = "$$)";
|
||||
char *string = StringJoinParams(queryStringList, ';', prefix, postfix);
|
||||
|
||||
char *string = StringJoin(queryStringList, ';');
|
||||
StringInfo commandToRun = makeStringInfo();
|
||||
|
||||
appendStringInfo(commandToRun,
|
||||
"SELECT pg_catalog.citus_run_local_command($$%s$$)", string);
|
||||
SetTaskQueryString(task, commandToRun->data);
|
||||
SetTaskQueryString(task, string);
|
||||
|
||||
|
||||
task->dependentTaskList = NULL;
|
||||
|
|
|
@ -166,6 +166,8 @@ extern List * SortList(List *pointerList,
|
|||
extern void ** PointerArrayFromList(List *pointerList);
|
||||
extern HTAB * ListToHashSet(List *pointerList, Size keySize, bool isStringList);
|
||||
extern char * StringJoin(List *stringList, char delimiter);
|
||||
extern char * StringJoinParams(List *stringList, char delimiter,
|
||||
char *prefix, char *postfix);
|
||||
extern List * ListTake(List *pointerList, int size);
|
||||
extern void * safe_list_nth(const List *list, int index);
|
||||
extern List * GeneratePositiveIntSequenceList(int upTo);
|
||||
|
|
Loading…
Reference in New Issue