2016-10-14 10:53 GMT+02:00 Heikki Linnakangas <hlinn...@iki.fi>:
> On 10/11/2016 08:56 AM, Pavel Stehule wrote:
>> 2016-10-11 7:49 GMT+02:00 Heikki Linnakangas <hlinn...@iki.fi>:
>> Unfortunately there are cases that are fundamentally ambiguous.
>>> create type comptype as (intarray int);
>>> create function array_return() returns comptype as $$
>>> return [[[]]];
>>> $$ language plpython;
>>> What does the function return? It could be two-dimension array of
>>> comptype, with a single-dimension intarray, or a single-dimension
>>> with a two-dimension intarray.
>>> We could resolve it for simpler cases, but not the general case. The
>>> simple cases would probably cover most things people do in practice. But
>>> the distinction between a tuple and a list feels natural to Python
>>> programmers, I think it would be more clear in the long run to have
>>> adjust their applications.
>> I agree. The distinction is natural - and it is our issue, so we don't
>> distinguish strongly.
> Ok, let's do that then. Here is a patch set that does that. The first is
> the main patch. The second patch adds some code to give a hint, if you do
> that thing that whose behavior changed. That code isn't very pretty, but I
> think a good error message is absolutely required, if we are to make this
> change. Does anyone have better suggestions on how to catch the common
> cases of that?
> Please review. Are the docs and the error messages now clear enough on
> this? We'll need a mention in the release notes too, when it's time for
The error message is clear.
I tested patches - and the regression test is broken (is not actualized)
+ -- Starting with PostgreSQL 10, a composite type in an array cannot be
+ -- a Python list, because it's ambiguous with multi-dimensional arrays.
+ -- throws an error now. The error should contain a useful hint on the
+ CREATE FUNCTION composite_type_as_list() RETURNS type_record AS $$
+ return [['first', 1]];
+ $$ LANGUAGE plpythonu;
+ SELECT * FROM composite_type_as_list();
+ ERROR: malformed record literal: "first"
+ DETAIL: Missing left parenthesis.
+ HINT: To return a composite type in an array, return the composite type
as a Python tuple, e.g. "[('foo')]"
+ CONTEXT: while creating return value
+ PL/Python function "composite_type_as_list"
I tested Pyhon 3.5 and 2.7 and there are not any other issues
There are no new tests for multidimensional array of composites - there is
only new negative test.
> - Heikki