The following bug has been logged on the website:
Bug reference: 18693
Logged by: Jan Behrens
Email address: jbe-mlist@magnetkern.de
PostgreSQL version: 16.4
Operating system: FreeBSD
Description:
I used the following SQL code:
CREATE TABLE tbl (a TEXT, b TEXT);
CREATE FUNCTION "buggy"() RETURNS VOID LANGUAGE plpgsql AS $$
DECLARE
t tbl%ROWTYPE;
r RECORD;
BEGIN
SELECT a, b INTO t FROM (SELECT 'A' AS a, 'B' AS b) AS q;
RAISE NOTICE 'non-strict t = %', t;
RAISE NOTICE 'non-strict t.a = %', t.a;
RAISE NOTICE 'non-strict t.b = %', t.b;
SELECT a, b STRICT INTO t FROM (SELECT 'A' AS a, 'B' AS b) AS q;
RAISE NOTICE 'STRICT t = %', t;
RAISE NOTICE 'STRICT t.a = %', t.a;
RAISE NOTICE 'STRICT t.b = %', t.b;
SELECT a, b INTO r FROM (SELECT 'A' AS a, 'B' AS b) AS q;
RAISE NOTICE 'non-strict r = %', r;
RAISE NOTICE 'non-strict r.a = %', r.a;
RAISE NOTICE 'non-strict r.b = %', r.b;
SELECT a, b STRICT INTO r FROM (SELECT 'A' AS a, 'B' AS b) AS q;
RAISE NOTICE 'STRICT r = %', r;
RAISE NOTICE 'STRICT r.a = %', r.a;
RAISE NOTICE 'STRICT r.b = %', r.b;
END;
$$;
SELECT buggy();
Invoking the buggy() function resulted in:
NOTICE: non-strict t = (A,B)
NOTICE: non-strict t.a = A
NOTICE: non-strict t.b = B
NOTICE: STRICT t = (A,B)
NOTICE: STRICT t.a = A
NOTICE: STRICT t.b = B
NOTICE: non-strict r = (A,B)
NOTICE: non-strict r.a = A
NOTICE: non-strict r.b = B
NOTICE: STRICT r = (A,B)
NOTICE: STRICT r.a = A
ERROR: record "r" has no field "b"
CONTEXT: SQL expression "r.b"
PL/pgSQL function buggy() line 21 at RAISE
I would expect the last statement to not result in an error but to correctly
access field "b" as in the non-strict case or tbl%ROWTYPE case.