From 6bff0e7d92133d50c064d9f652f538891873aa32 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 11 Dec 2013 17:22:47 -0500
Subject: [PATCH] Add a regression test case for plpython function returning
 setof RECORD.

We had coverage for functions returning setof a named composite type,
but not for anonymous records, which is a somewhat different code path.
In view of recent crash report from Sergey Konoplev, this seems worth
testing, though I doubt there's any deterministic bug here today.
---
 src/pl/plpython/expected/plpython_setof.out | 36 +++++++++++++++++++--
 src/pl/plpython/sql/plpython_setof.sql      | 15 +++++++--
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/src/pl/plpython/expected/plpython_setof.out b/src/pl/plpython/expected/plpython_setof.out
index b3bbdd81238..62b8a454a35 100644
--- a/src/pl/plpython/expected/plpython_setof.out
+++ b/src/pl/plpython/expected/plpython_setof.out
@@ -124,8 +124,7 @@ SELECT test_setof_spi_in_iterator();
  World
 (4 rows)
 
--- setof function with an SPI result set (used to crash because of
--- memory management issues across multiple calls)
+-- returns set of named-composite-type tuples
 CREATE OR REPLACE FUNCTION get_user_records()
 RETURNS SETOF users
 AS $$
@@ -140,3 +139,36 @@ SELECT get_user_records();
  (willem,doe,w_doe,3)
 (4 rows)
 
+SELECT * FROM get_user_records();
+ fname  | lname | username | userid 
+--------+-------+----------+--------
+ jane   | doe   | j_doe    |      1
+ john   | doe   | johnd    |      2
+ rick   | smith | slash    |      4
+ willem | doe   | w_doe    |      3
+(4 rows)
+
+-- same, but returning set of RECORD
+CREATE OR REPLACE FUNCTION get_user_records2()
+RETURNS TABLE(fname text, lname text, username text, userid int)
+AS $$
+    return plpy.execute("SELECT * FROM users ORDER BY username")
+$$ LANGUAGE plpythonu;
+SELECT get_user_records2();
+  get_user_records2   
+----------------------
+ (jane,doe,j_doe,1)
+ (john,doe,johnd,2)
+ (rick,smith,slash,4)
+ (willem,doe,w_doe,3)
+(4 rows)
+
+SELECT * FROM get_user_records2();
+ fname  | lname | username | userid 
+--------+-------+----------+--------
+ jane   | doe   | j_doe    |      1
+ john   | doe   | johnd    |      2
+ rick   | smith | slash    |      4
+ willem | doe   | w_doe    |      3
+(4 rows)
+
diff --git a/src/pl/plpython/sql/plpython_setof.sql b/src/pl/plpython/sql/plpython_setof.sql
index 243f711dcc6..fe034fba45e 100644
--- a/src/pl/plpython/sql/plpython_setof.sql
+++ b/src/pl/plpython/sql/plpython_setof.sql
@@ -64,9 +64,7 @@ SELECT test_setof_as_iterator(2, null);
 SELECT test_setof_spi_in_iterator();
 
 
--- setof function with an SPI result set (used to crash because of
--- memory management issues across multiple calls)
-
+-- returns set of named-composite-type tuples
 CREATE OR REPLACE FUNCTION get_user_records()
 RETURNS SETOF users
 AS $$
@@ -74,3 +72,14 @@ AS $$
 $$ LANGUAGE plpythonu;
 
 SELECT get_user_records();
+SELECT * FROM get_user_records();
+
+-- same, but returning set of RECORD
+CREATE OR REPLACE FUNCTION get_user_records2()
+RETURNS TABLE(fname text, lname text, username text, userid int)
+AS $$
+    return plpy.execute("SELECT * FROM users ORDER BY username")
+$$ LANGUAGE plpythonu;
+
+SELECT get_user_records2();
+SELECT * FROM get_user_records2();
-- 
GitLab