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 users (id int, school_id int, name varchar(32));
INSERT INTO users VALUES
(42, 1, 'foo')
, (43, 2, 'bar');
CREATE TABLE
INSERT 0 2
CREATE OR REPLACE FUNCTION get_object_fields1(_school_id int
, OUT user1_id int
, OUT user1_name varchar(32)
, OUT user2_id int
, OUT user2_name varchar(32)) AS
$func$
BEGIN
SELECT INTO user1_id, user1_name
u.id, u.name
FROM users u
WHERE u.school_id = _school_id;
user2_id := user1_id + 1; -- some calculation
SELECT INTO user2_name
u.name
FROM users u
WHERE u.id = user2_id;
END
$func$ LANGUAGE plpgsql;
SELECT * FROM get_object_fields1(1);
CREATE FUNCTION
user1_id | user1_name | user2_id | user2_name |
---|---|---|---|
42 | foo | 43 | bar |
SELECT 1
CREATE OR REPLACE FUNCTION get_object_fields2(_school_id int)
RETURNS TABLE (user1_id int
, user1_name varchar(32)
, user2_id int
, user2_name varchar(32)) AS
$func$
BEGIN
RETURN QUERY
SELECT u1.id, u1.name, u2.id, u2.name
FROM users u1
JOIN users u2 ON u2.id = u1.id + 1
WHERE u1.school_id = _school_id
LIMIT 1; -- may be optional
END
$func$ LANGUAGE plpgsql;
SELECT * FROM get_object_fields2(1);
CREATE FUNCTION
user1_id | user1_name | user2_id | user2_name |
---|---|---|---|
42 | foo | 43 | bar |
SELECT 1