Fix returning of many-column result types
authorMarko Kreen <markokr@gmail.com>
Wed, 28 Jul 2010 14:44:48 +0000 (17:44 +0300)
committerMarko Kreen <markokr@gmail.com>
Wed, 28 Jul 2010 14:54:30 +0000 (17:54 +0300)
Old code used FUNC_MAX_ARGS as limit for number of columns,
but composite types can be larger.  Use dynamic allocation instead.

Patch by Hans-Jürgen Schönig

src/result.c

index 38ef3eb73e0add50f8f2289f3a8ceb79164cb62b..8b4bf2b26e4deb3523aee1777c96f4ea71c25513 100644 (file)
@@ -144,12 +144,16 @@ return_composite(ProxyFunction *func, ProxyConnection *conn, FunctionCallInfo fc
 {
        int                     i,
                                col;
-       char       *values[FUNC_MAX_ARGS];
-       int                     fmts[FUNC_MAX_ARGS];
-       int                     lengths[FUNC_MAX_ARGS];
+       char      **values;
+       int                *fmts;
+       int                *lengths;
        HeapTuple       tup;
        ProxyComposite *meta = func->ret_composite;
 
+       values = palloc(meta->tupdesc->natts * sizeof(char *));
+       fmts = palloc(meta->tupdesc->natts * sizeof(int));
+       lengths = palloc(meta->tupdesc->natts * sizeof(int));
+
        for (i = 0; i < meta->tupdesc->natts; i++)
        {
                col = func->result_map[i];
@@ -167,6 +171,11 @@ return_composite(ProxyFunction *func, ProxyConnection *conn, FunctionCallInfo fc
                }
        }
        tup = plproxy_recv_composite(meta, values, lengths, fmts);
+
+       pfree(lengths);
+       pfree(fmts);
+       pfree(values);
+
        return HeapTupleGetDatum(tup);
 }