2016-10-14 10:53 GMT+02:00 Heikki Linnakangas <hlinnaka@iki.fi>:
On 10/11/2016 08:56 AM, Pavel Stehule wrote:
2016-10-11 7:49 GMT+02:00 Heikki Linnakangas <hlinnaka@iki.fi>:
Unfortunately there are cases that are fundamentally ambiguous.
create type comptype as (intarray int[]); create function array_return() returns comptype[] as $$ return [[[[1]]]]; $$ language plpython;
What does the function return? It could be two-dimension array of comptype, with a single-dimension intarray, or a single-dimension comptype, 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 if 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 people 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 that.
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 represented as + -- a Python list, because it's ambiguous with multi-dimensional arrays. So this + -- throws an error now. The error should contain a useful hint on the issue. + 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.