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
Onder Kalaci 2022-07-26 13:44:42 +02:00
parent b8008999dc
commit 26fdcb68f0
3 changed files with 30 additions and 7 deletions

View File

@ -161,13 +161,31 @@ GeneratePositiveIntSequenceList(int upTo)
/* /*
* StringJoin gets a list of char * and then simply * StringJoin gets a list of char * and then simply
* returns a newly allocated char * joined with the * returns a newly allocated char * joined with the
* given delimiter. * given delimiter. It uses ';' as the delimiter by
* default.
*/ */
char * char *
StringJoin(List *stringList, char delimiter) 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(); StringInfo joinedString = makeStringInfo();
if (prefix != NULL)
{
appendStringInfoString(joinedString, prefix);
}
const char *command = NULL; const char *command = NULL;
int curIndex = 0; int curIndex = 0;
foreach_ptr(command, stringList) foreach_ptr(command, stringList)
@ -180,6 +198,11 @@ StringJoin(List *stringList, char delimiter)
curIndex++; curIndex++;
} }
if (postfix != NULL)
{
appendStringInfoString(joinedString, postfix);
}
return joinedString->data; return joinedString->data;
} }

View File

@ -569,13 +569,11 @@ CreateFixPartitionShardIndexNames(Oid parentRelationId, Oid partitionRelationId,
task->taskId = taskId++; task->taskId = taskId++;
task->taskType = DDL_TASK; 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, ';'); SetTaskQueryString(task, string);
StringInfo commandToRun = makeStringInfo();
appendStringInfo(commandToRun,
"SELECT pg_catalog.citus_run_local_command($$%s$$)", string);
SetTaskQueryString(task, commandToRun->data);
task->dependentTaskList = NULL; task->dependentTaskList = NULL;

View File

@ -166,6 +166,8 @@ extern List * SortList(List *pointerList,
extern void ** PointerArrayFromList(List *pointerList); extern void ** PointerArrayFromList(List *pointerList);
extern HTAB * ListToHashSet(List *pointerList, Size keySize, bool isStringList); extern HTAB * ListToHashSet(List *pointerList, Size keySize, bool isStringList);
extern char * StringJoin(List *stringList, char delimiter); 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 List * ListTake(List *pointerList, int size);
extern void * safe_list_nth(const List *list, int index); extern void * safe_list_nth(const List *list, int index);
extern List * GeneratePositiveIntSequenceList(int upTo); extern List * GeneratePositiveIntSequenceList(int upTo);