BUG #19442: PL/pgSQL: domain over composite type bypasses type validation when assigning NULL (PostgreSQL 18.3)

Started by PG Bug reporting form6 days ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 19442
Logged by: Xianghang Zheng
Email address: zheng_xianghang@163.com
PostgreSQL version: 18.3
Operating system: Linux x86_64
Description:

I found an issue on PostgreSQL 18.3 related to domain handling over
composite types in PL/pgSQL.
After the fix for BUG #18735, the "cache lookup failed for type 0" error no
longer occurs, but a new correctness problem arises:
When assigning a NULL composite variable to a domain over composite type in
PL/pgSQL,
the domain's type validation and coercion logic is bypassed.
This indicates an incomplete fix and may lead to incorrect enforcement of
domain constraints (CHECK, NOT NULL, etc.) in the future.
Version: PostgreSQL 18.3
Test case:
CREATE TYPE comp AS (a int, b text);
CREATE DOMAIN dcomp AS comp;
CREATE OR REPLACE FUNCTION test_domain_bug()
RETURNS dcomp
AS $$
DECLARE
v_comp comp := NULL;
v_dcomp dcomp;
BEGIN
v_dcomp := v_comp;
RETURN v_dcomp;
END;
$$ LANGUAGE plpgsql;
SELECT test_domain_bug();
Actual result: NULL (no error)
Expected result: Domain type coercion should be properly executed even for
NULL values.
This is a regression caused by incomplete backpatch of BUG #18735.

#2Junwang Zhao
zhjwpku@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #19442: PL/pgSQL: domain over composite type bypasses type validation when assigning NULL (PostgreSQL 18.3)

On Mon, Mar 30, 2026 at 7:52 PM PG Bug reporting form
<noreply@postgresql.org> wrote:

The following bug has been logged on the website:

Bug reference: 19442
Logged by: Xianghang Zheng
Email address: zheng_xianghang@163.com
PostgreSQL version: 18.3
Operating system: Linux x86_64
Description:

I found an issue on PostgreSQL 18.3 related to domain handling over
composite types in PL/pgSQL.
After the fix for BUG #18735, the "cache lookup failed for type 0" error no
longer occurs, but a new correctness problem arises:
When assigning a NULL composite variable to a domain over composite type in
PL/pgSQL,
the domain's type validation and coercion logic is bypassed.
This indicates an incomplete fix and may lead to incorrect enforcement of
domain constraints (CHECK, NOT NULL, etc.) in the future.
Version: PostgreSQL 18.3
Test case:
CREATE TYPE comp AS (a int, b text);
CREATE DOMAIN dcomp AS comp;
CREATE OR REPLACE FUNCTION test_domain_bug()
RETURNS dcomp
AS $$
DECLARE
v_comp comp := NULL;
v_dcomp dcomp;
BEGIN
v_dcomp := v_comp;
RETURN v_dcomp;
END;
$$ LANGUAGE plpgsql;
SELECT test_domain_bug();
Actual result: NULL (no error)
Expected result: Domain type coercion should be properly executed even for
NULL values.

dcomp doesn't have the not null constraint, so I think this is ok?

I tried `CREATE DOMAIN dcomp AS comp not null;`, it does report error:

[local] zhjwpku@postgres:5432-20309=# SELECT test_domain_bug();
ERROR: domain dcomp does not allow null values
CONTEXT: PL/pgSQL function test_domain_bug() line 4 during statement
block local variable initialization
Time: 2.730 ms

This is a regression caused by incomplete backpatch of BUG #18735.

--
Regards
Junwang Zhao