BUG #19444: conkey field empty for domain NOT NULL constraint in pg_constraint (18.3)

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

The following bug has been logged on the website:

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

When creating a domain with a NOT NULL constraint, the conkey field in
pg_constraint remains empty. This is inconsistent with table-level NOT
NULL constraints, which correctly populate the conkey field.

Version: PostgreSQL 18.3 (x86_64)
Platform: Linux x86_64

Steps to Reproduce:
-------------------
CREATE DOMAIN my_domain AS text NOT NULL;

SELECT conname, contype, conkey, contypid::regtype
FROM pg_constraint
WHERE contypid = 'my_domain'::regtype;

Actual Result:
--------------
conname | contype | conkey | contypid
--------------------+---------+--------+-----------
my_domain_not_null | n | | my_domain
(1 row)

Expected Result:
----------------
The conkey field should contain {1} (the first and only column of the
domain):

conname | contype | conkey | contypid
--------------------+---------+--------+-----------
my_domain_not_null | n | {1} | my_domain

Additional Information:
-----------------------
- The NOT NULL constraint works correctly (rejects NULL values)
- The issue is only with the system catalog metadata
- This may affect tools like pg_dump, pg_upgrade, or extensions that rely
on the conkey field for domain constraints
- Table-level NOT NULL constraints correctly populate conkey:

CREATE TABLE test_table (id text NOT NULL);
SELECT conname, contype, conkey FROM pg_constraint
WHERE conrelid = 'test_table'::regclass;

Result: test_table_id_not_null | n | {1}

Please let me know if you need any additional information or testing.

#2Junwang Zhao
zhjwpku@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #19444: conkey field empty for domain NOT NULL constraint in pg_constraint (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: 19444
Logged by: Xianghang Zheng
Email address: zheng_xianghang@163.com
PostgreSQL version: 18.3
Operating system: Linux x86_64
Description:

When creating a domain with a NOT NULL constraint, the conkey field in
pg_constraint remains empty. This is inconsistent with table-level NOT
NULL constraints, which correctly populate the conkey field.

Version: PostgreSQL 18.3 (x86_64)
Platform: Linux x86_64

Steps to Reproduce:
-------------------
CREATE DOMAIN my_domain AS text NOT NULL;

SELECT conname, contype, conkey, contypid::regtype
FROM pg_constraint
WHERE contypid = 'my_domain'::regtype;

Actual Result:
--------------
conname | contype | conkey | contypid
--------------------+---------+--------+-----------
my_domain_not_null | n | | my_domain
(1 row)

Expected Result:
----------------
The conkey field should contain {1} (the first and only column of the
domain):

conname | contype | conkey | contypid
--------------------+---------+--------+-----------
my_domain_not_null | n | {1} | my_domain

Additional Information:
-----------------------
- The NOT NULL constraint works correctly (rejects NULL values)
- The issue is only with the system catalog metadata
- This may affect tools like pg_dump, pg_upgrade, or extensions that rely
on the conkey field for domain constraints
- Table-level NOT NULL constraints correctly populate conkey:

CREATE TABLE test_table (id text NOT NULL);
SELECT conname, contype, conkey FROM pg_constraint
WHERE conrelid = 'test_table'::regclass;

Result: test_table_id_not_null | n | {1}

Please let me know if you need any additional information or testing.

I think you have interpreted this incorrectly, domain is a type, not a relation.
See the comments in pg_constraint.h for clarification.

/*
* conrelid and conkey are only meaningful if the constraint applies to a
* specific relation (this excludes domain constraints and assertions).
* Otherwise conrelid is 0 and conkey is NULL.
*/

--
Regards
Junwang Zhao

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: PG Bug reporting form (#1)
Re: BUG #19444: conkey field empty for domain NOT NULL constraint in pg_constraint (18.3)

PG Bug reporting form <noreply@postgresql.org> writes:

When creating a domain with a NOT NULL constraint, the conkey field in
pg_constraint remains empty. This is inconsistent with table-level NOT
NULL constraints, which correctly populate the conkey field.

I do not think this is a bug. The system catalog documentation says

conkey int2[] (references pg_attribute.attnum)

If a table constraint (including foreign keys, but not
constraint triggers), list of the constrained columns

So (a) this is not a table constraint, and (b) a domain does not have
columns.

regards, tom lane