Hi 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 [[[[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. Regards Pavel > > - Heikki > >