caller can free up the memory when done with it.
This fixes a memory like while running ALTER TABLE DISTRIBUTE BY
* redistribution and storage of tuple data into a tuple store.
*/
char **
-CopyOps_RawDataToArrayField(TupleDesc tupdesc, char *message, int len)
+CopyOps_RawDataToArrayField(TupleDesc tupdesc, char *message, int len,
+ char **tmpbuf)
{
char delimc = COPYOPS_DELIMITER;
int fieldno;
raw_fields = (char **) palloc(fields * sizeof(char *));
/* Take a copy of message to manipulate */
- origin_ptr = (char *) palloc0(sizeof(char) * (len + 1));
+ *tmpbuf = origin_ptr = (char *) palloc0(sizeof(char) * (len + 1));
memcpy(origin_ptr, message, len + 1);
/* Add clean separator '\0' at the end of message */
if (AttributeNumberIsValid(copyState->rel_loc->partAttrNum))
{
char **fields;
-
+ char *tmpbuf = NULL;
+
/*
* Split message on an array of fields.
*/
- fields = CopyOps_RawDataToArrayField(tupdesc, data, len);
+ fields = CopyOps_RawDataToArrayField(tupdesc, data, len, &tmpbuf);
Assert(partIdx >= 0);
/* Determine partitioning value */
is_null = false;
}
+ if (tmpbuf)
+ pfree(tmpbuf);
pfree(fields);
}
/* Type of data delimiter used for data redistribution using remote COPY */
#define COPYOPS_DELIMITER '\t'
-extern char **CopyOps_RawDataToArrayField(TupleDesc tupdesc, char *message, int len);
+extern char **CopyOps_RawDataToArrayField(TupleDesc tupdesc, char *message,
+ int len, char **tmpbuf);
extern char *CopyOps_BuildOneRowTo(TupleDesc tupdesc, Datum *values, bool *nulls, int *len);
#endif