BUG #13317: Cannot select multiple columns from multiple rows returned from PL/Python function - Mailing list pgsql-bugs
From | cpburnz@gmail.com |
---|---|
Subject | BUG #13317: Cannot select multiple columns from multiple rows returned from PL/Python function |
Date | |
Msg-id | 20150519172619.26515.48844@wrigleys.postgresql.org Whole thread Raw |
Responses |
Re: BUG #13317: Cannot select multiple columns from multiple
rows returned from PL/Python function
|
List | pgsql-bugs |
The following bug has been logged on the website: Bug reference: 13317 Logged by: Caleb P. Burns Email address: cpburnz@gmail.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.
pgsql-bugs by date: