Re: PL/Python adding support for multi-dimensional arrays - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: PL/Python adding support for multi-dimensional arrays
Date
Msg-id CAFj8pRBDJP9zm=i7X_gHRUbNeNkULSBDpxo2rNAruVW6yD79Vw@mail.gmail.com
Whole thread Raw
In response to Re: PL/Python adding support for multi-dimensional arrays  (Heikki Linnakangas <hlinnaka@iki.fi>)
Responses Re: PL/Python adding support for multi-dimensional arrays  (Heikki Linnakangas <hlinnaka@iki.fi>)
List pgsql-hackers
Hi

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.

Regards

Pavel
 

- Heikki


pgsql-hackers by date:

Previous
From: Victor Wagner
Date:
Subject: Re: Patch: Implement failover on libpq connect level.
Next
From: Bruce Momjian
Date:
Subject: Re: [COMMITTERS] pgsql: Remove extra comma at end of enum list