Re: PL/Python adding support for multi-dimensional arrays

From: Alexey Grishchenko <agrishchenko(at)pivotal(dot)io>
To: pgsql-hackers(at)postgresql(dot)org
Cc: Alexey Grishchenko <programmerag(at)gmail(dot)com>
Subject: Re: PL/Python adding support for multi-dimensional arrays
Date: 2016-08-03 11:54:54
Message-ID: CAH38_t=0oZBbXmjqYNrLeHqH3+vCyzgPFycV1jaduUEO=42hQQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Aug 3, 2016 at 12:49 PM, Alexey Grishchenko <agrishchenko(at)pivotal(dot)io
> wrote:

> Hi
>
> Current implementation of PL/Python does not allow the use of
> multi-dimensional arrays, for both input and output parameters. This forces
> end users to introduce workarounds like casting arrays to text before
> passing them to the functions and parsing them after, which is an
> error-prone approach
>
> This patch adds support for multi-dimensional arrays as both input and
> output parameters for PL/Python functions. The number of dimensions
> supported is limited by Postgres MAXDIM macrovariable, by default equal to
> 6. Both input and output multi-dimensional arrays should have fixed
> dimension sizes, i.e. 2-d arrays should represent MxN matrix, 3-d arrays
> represent MxNxK cube, etc.
>
> This patch does not support multi-dimensional arrays of composite types,
> as composite types in Python might be represented as iterators and there is
> no obvious way to find out when the nested array stops and composite type
> structure starts. For example, if we have a composite type of (int, text),
> we can try to return "[ [ [1,'a'], [2,'b'] ], [ [3,'c'], [4,'d'] ] ]", and
> it is hard to find out that the first two lists are lists, and the third
> one represents structure. Things are getting even more complex when you
> have arrays as members of composite type. This is why I think this
> limitation is reasonable.
>
> Given the function:
>
> CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[]
> AS $$
> plpy.info(x, type(x))
> return x
> $$ LANGUAGE plpythonu;
>
> Before patch:
>
> # SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]);
> ERROR: cannot convert multidimensional array to Python list
> DETAIL: PL/Python only supports one-dimensional arrays.
> CONTEXT: PL/Python function "test_type_conversion_array_int4"
>
>
> After patch:
>
> # SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]);
> INFO: ([[1, 2, 3], [4, 5, 6]], <type 'list'>)
> test_type_conversion_array_int4
> ---------------------------------
> {{1,2,3},{4,5,6}}
> (1 row)
>
>
> --
> Best regards,
> Alexey Grishchenko
>

Also this patch incorporates the fix for
https://www.postgresql.org/message-id/CAH38_tkwA5qgLV8zPN1OpPzhtkNKQb30n3xq-2NR9jUfv3qwHA%40mail.gmail.com,
as they touch the same piece of code - array manipulation in PL/Python

--
Best regards,
Alexey Grishchenko

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Eisentraut 2016-08-03 12:35:19 Re: pg_ctl promote wait
Previous Message Alexey Grishchenko 2016-08-03 11:49:08 PL/Python adding support for multi-dimensional arrays