Return pointer to the buffer used to store various fields values, so that
authorPavan Deolasee <[email protected]>
Wed, 6 Jul 2016 10:21:44 +0000 (15:51 +0530)
committerPavan Deolasee <[email protected]>
Wed, 6 Jul 2016 10:21:44 +0000 (15:51 +0530)
caller can free up the memory when done with it.

This fixes a memory like while running ALTER TABLE DISTRIBUTE BY

src/backend/pgxc/copy/copyops.c
src/backend/pgxc/locator/redistrib.c
src/include/pgxc/copyops.h

index a85a06cc09619626b6b455bbaefa534c1f732207..7e30a6cd6a5e8f0bc387aef6e4ac3ccf92ff7eb5 100644 (file)
@@ -219,7 +219,8 @@ attribute_out_text(StringInfo buf, char *string)
  * 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;
@@ -243,7 +244,7 @@ CopyOps_RawDataToArrayField(TupleDesc tupdesc, char *message, int len)
        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 */
index 13074e885ac0686d217c68148dce7f4453d45836..3fc36af8d0f9e745107a47bff94c4d504c9dafb2 100644 (file)
@@ -535,11 +535,12 @@ distrib_copy_from(RedistribState *distribState, ExecNodes *exec_nodes)
                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 */
@@ -550,6 +551,8 @@ distrib_copy_from(RedistribState *distribState, ExecNodes *exec_nodes)
                                is_null = false;
                        }
 
+                       if (tmpbuf)
+                               pfree(tmpbuf);
                        pfree(fields);
                }
 
index 862dbbd299e2f229028fbaa07818fe06589d91b2..4ddf1597959fce21e34d00776cf44a3b02dd7f18 100644 (file)
@@ -21,7 +21,8 @@
 /* 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