From: | cpburnz(at)gmail(dot)com |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #13317: Cannot select multiple columns from multiple rows returned from PL/Python function |
Date: | 2015-05-19 17:26:19 |
Message-ID: | 20150519172619.26515.48844@wrigleys.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged on the website:
Bug reference: 13317
Logged by: Caleb P. Burns
Email address: cpburnz(at)gmail(dot)com
PostgreSQL version: 9.3.6
Operating system: Ubuntu 12.04.5
Description:
If I define a SQL function as:
CREATE FUNCTION sql_test() RETURNS TABLE (a INTEGER, b INTEGER) AS $$
SELECT 1, 2
UNION ALL
SELECT 3, 4
$$ LANGUAGE sql IMMUTABLE ROWS 2;
I can select the values from both columns:
postgres=# SELECT (sql_test()).*;
a | b
---+---
1 | 2
3 | 4
(2 rows)
I can also do the same for a PL/pgSQL function:
CREATE FUNCTION plpgsql_test() RETURNS TABLE (a INTEGER, b INTEGER) AS $$
BEGIN
RETURN QUERY SELECT 1, 2 UNION ALL SELECT 3, 4;
END
$$ LANGUAGE plpgsql IMMUTABLE ROWS 2;
postgres=# SELECT (plpgsql_test()).*;
a | b
---+---
1 | 2
3 | 4
(2 rows)
If I try to do the same for a PL/Python (3u) function, the query will run
for more than 5 or 10 minutes and never finish:
CREATE FUNCTION plpython_yield_test() RETURNS TABLE (a INTEGER, b INTEGER)
AS $$
yield (1, 2)
yield (3, 4)
$$ LANGUAGE plpython3u IMMUTABLE ROWS 2;
postgres=# SELECT (plpython_yield_test()).*;
^CCancel request sent
Cancel request sent
ERROR: canceling statement due to user request
CREATE FUNCTION plpython_return_test() RETURNS TABLE (a INTEGER, b INTEGER)
AS $$
return [(1, 2), (3, 4)]
$$ LANGUAGE plpython3u IMMUTABLE ROWS 2;
postgres=# SELECT (plpython_return_test()).*;
^CCancel request sent
Cancel request sent
ERROR: canceling statement due to user request
However, selecting only a single column works.
postgres=# SELECT (plpython_yield_test()).a;
a
---
1
3
(2 rows)
postgres=# SELECT (plpython_yield_test()).b;
b
---
2
4
(2 rows)
postgres=# SELECT (plpython_return_test()).a;
a
---
1
3
(2 rows)
postgres=# SELECT (plpython_return_test()).b;
b
---
2
4
(2 rows)
Or if only one row is returned, then the query finishes:
CREATE FUNCTION plpython_return_test2() RETURNS TABLE (a INTEGER, b INTEGER)
AS $$
return [(5, 6)]
$$ LANGUAGE plpython3u IMMUTABLE ROWS 1;
SELECT (plpython_return_test2()).*;
a | b
---+---
5 | 6
(1 row)
Running EXPLAIN does not reveal anything:
postgres=# EXPLAIN SELECT (plpython_return_test()).a;
QUERY PLAN
------------------------------------------
Result (cost=0.00..0.27 rows=2 width=0)
(1 row)
postgres=# EXPLAIN SELECT (plpython_return_test()).*;
QUERY PLAN
------------------------------------------
Result (cost=0.00..0.52 rows=2 width=0)
(1 row)
However, EXPLAIN ANALYZE will not finish for the multiple columns and rows:
postgres=# EXPLAIN ANALYZE SELECT (plpython_return_test()).a;
QUERY PLAN
------------------------------------------------------------------------------------
Result (cost=0.00..0.27 rows=2 width=0) (actual time=0.056..0.063 rows=2
loops=1)
Total runtime: 0.076 ms
(2 rows)
postgres=# EXPLAIN ANALYZE SELECT (plpython_return_test()).*;
^CCancel request sent
Cancel request sent
ERROR: canceling statement due to user request
postgres=# EXPLAIN ANALYZE SELECT (plpython_return_test2()).*;
QUERY PLAN
------------------------------------------------------------------------------------
Result (cost=0.00..0.51 rows=1 width=0) (actual time=0.089..0.106 rows=1
loops=1)
Total runtime: 0.119 ms
(2 rows)
This appears to be a bug that selecting from multiple columns returned from
a PL/Python function returning multiple rows does not work (never
finishes).
NOTE: This issue is also present on a Windows machine running PostgreSQL
9.1.0.
From | Date | Subject | |
---|---|---|---|
Next Message | David G. Johnston | 2015-05-19 20:18:00 | Re: BUG #13317: Cannot select multiple columns from multiple rows returned from PL/Python function |
Previous Message | Christopher Browne | 2015-05-19 16:40:28 | Re: Error with Database name |