a column definition list is required for functions returning "record" - Mailing list pgsql-general

From Alexander Farber
Subject a column definition list is required for functions returning "record"
Date
Msg-id CAADeyWhYO4eoyTniakDMAtswHTHt5TwQPuPrfhNkjFpifSC+0w@mail.gmail.com
Whole thread Raw
Responses Re: a column definition list is required for functions returning "record"  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: a column definition list is required for functions returning "record"  (Cachique <cachique@gmail.com>)
List pgsql-general
Good afternon,

in 9.5.3 I have defined the following custom function:

CREATE OR REPLACE FUNCTION words_select_games(IN in_uid integer)
        RETURNS SETOF RECORD AS
$func$
BEGIN
        RETURN QUERY SELECT 
                g.gid AS gid, 
                EXTRACT(EPOCH FROM g.created)::int AS created,
                g.player1 AS player1,
                COALESCE(g.player2, 0) AS player2,
                COALESCE(EXTRACT(EPOCH FROM g.played1)::int, 0) AS played1,
                COALESCE(EXTRACT(EPOCH FROM g.played2)::int, 0) AS played2,
                ARRAY_TO_STRING(g.hand1, '') AS hand1,
                REGEXP_REPLACE(ARRAY_TO_STRING(g.hand2, ''), '.', '?', 'g') AS hand2,
                g.letters AS letters,         /* is a varchar[15][15] */
                g.values AS values,        /* is an integer[15][15] */
                g.bid AS bid,
                m.tiles AS last_tiles,
                m.score AS last_score
        FROM words_games g LEFT JOIN words_moves m USING(mid)
        WHERE g.player1 = in_uid
        UNION SELECT
                g.gid AS gid, 
                EXTRACT(EPOCH FROM g.created)::int AS created,
                g.player2 AS player1,
                COALESCE(g.player2, 0) AS player1,
                COALESCE(EXTRACT(EPOCH FROM g.played2)::int, 0) AS played1,
                COALESCE(EXTRACT(EPOCH FROM g.played1)::int, 0) AS played2,
                ARRAY_TO_STRING(g.hand2, '') AS hand1,
                REGEXP_REPLACE(ARRAY_TO_STRING(g.hand1, ''), '.', '?', 'g') AS hand2,
                g.letters AS letters,
                g.values AS values,
                g.bid AS bid,
                m.tiles AS last_tiles,
                m.score AS last_score
        FROM words_games g LEFT JOIN words_moves m USING(mid)
        WHERE g.player2 = in_uid;
END
$func$ LANGUAGE plpgsql;

but calling it gives me errors:

words=> select * from words_select_games(1);
ERROR:  a column definition list is required for functions returning "record"
LINE 1: select * from words_select_games(1);
                      ^
words=> select gid, bid from words_select_games(1);                                                                                                                               ERROR:  a column definition list is required for functions returning "record"
LINE 1: select gid, bid from words_select_games(1);
                             ^
I have also unsuccessfully tried

        RETURNS SETOF words_games, words_moves AS

and without the comma:

        RETURNS SETOF words_games words_moves AS

How would you recommend to fix my declaration problem please?

Regards
Alex

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: Understanding Postgres Memory Usage
Next
From: Tom Lane
Date:
Subject: Re: a column definition list is required for functions returning "record"