add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
CREATE TABLE demo (
demo_id integer PRIMARY KEY
, demo text
, flag boolean
, log_up timestamp
);

INSERT INTO demo VALUES
(1, 'foo', TRUE, '2013-07-24')
, (2, 'bar', FALSE, NULL)
;
CREATE TABLE
INSERT 0 2
-- return SELECT *
CREATE OR REPLACE FUNCTION f_row1()
RETURNS SETOF demo
LANGUAGE sql AS
'SELECT * FROM demo';

-- the same with standard-SQL syntax (pg 14+)
CREATE OR REPLACE FUNCTION f_row1_std()
RETURNS SETOF demo
LANGUAGE sql PARALLEL SAFE
BEGIN ATOMIC
SELECT * FROM demo;
END;


-- return SELECT <rowtype>
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo)
LANGUAGE sql AS
'SELECT d FROM demo d';

-- the same with standard-SQL syntax (pg 14+)
CREATE OR REPLACE FUNCTION f_row2_std()
RETURNS TABLE (rec demo)
LANGUAGE sql PARALLEL SAFE
BEGIN ATOMIC
SELECT d FROM demo d;
END;


-- anther variant, same result
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo
LANGUAGE sql AS
'SELECT * FROM demo';

CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
SELECT * FROM f_row1();
SELECT * FROM f_row1_std();
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
SELECT * FROM f_row2();
SELECT * FROM f_row2_std();
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
SELECT * FROM f_row3();
SELECT * FROM f_row3_std();
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
demo_id demo flag log_up
1 foo t 2013-07-24 00:00:00
2 bar f null
SELECT 2
-- doesn't work!
SELECT rec FROM f_row2();
SELECT rec FROM f_row2_std();
ERROR:  column "rec" does not exist
LINE 2: SELECT rec FROM f_row2();
               ^
SELECT * FROM f_rowplus();
rec add_int add_txt
(1,foo,t,"2013-07-24 00:00:00") 5 baz
(2,bar,f,) 5 baz
SELECT 2
SELECT * FROM f_rowplus_std();
rec add_int add_txt
(1,foo,t,"2013-07-24 00:00:00") 5 baz
(2,bar,f,) 5 baz
SELECT 2
SELECT rec FROM f_rowplus();
SELECT rec FROM f_rowplus_std();
rec
(1,foo,t,"2013-07-24 00:00:00")
(2,bar,f,)
SELECT 2
rec
(1,foo,t,"2013-07-24 00:00:00")
(2,bar,f,)
SELECT 2
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
SELECT (rec).*, add_int, add_txt FROM f_rowplus_std();
demo_id demo flag log_up add_int add_txt
1 foo t 2013-07-24 00:00:00 5 baz
2 bar f null 5 baz
SELECT 2
demo_id demo flag log_up add_int add_txt
1 foo t 2013-07-24 00:00:00 5 baz
2 bar f null 5 baz
SELECT 2