hi. CREATE DOMAIN int_domain1 AS INT CONSTRAINT nn1 NOT NULL CONSTRAINT nn2 NOT NULL;
will install two not-null pg_constraint entries. we should have only one?
From 8328340ac98daa3e26ac13cc06348560a468abf0 Mon Sep 17 00:00:00 2001 From: jian he <jian.universality@gmail.com> Date: Sun, 1 Jun 2025 11:32:28 +0800 Subject: [PATCH v1 1/1] Fix CREATE DOMAIN create two not null constraint When you currently create a domain like int_domain1 with multiple NOT NULL constraints, for example: CREATE DOMAIN int_domain1 AS INT CONSTRAINT nn1 NOT NULL CONSTRAINT nn2 NOT NULL; Currently we install two separate NOT NULL constraints. However, only one NOT NULL constraint should be installed discussion: https://postgr.es/m/ --- src/backend/commands/typecmds.c | 11 ++++++++--- src/test/regress/expected/domain.out | 10 ++++++++++ src/test/regress/sql/domain.sql | 6 ++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 45ae7472ab5..b2a8d480866 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -731,6 +731,7 @@ DefineDomain(ParseState *pstate, CreateDomainStmt *stmt) int32 basetypeMod; Oid baseColl; ObjectAddress address; + bool notnull_added = false; /* Convert list of names to a name and namespace */ domainNamespace = QualifiedNameGetCreationNamespace(stmt->domainname, @@ -1141,9 +1142,13 @@ DefineDomain(ParseState *pstate, CreateDomainStmt *stmt) break; case CONSTR_NOTNULL: - domainAddNotNullConstraint(address.objectId, domainNamespace, - basetypeoid, basetypeMod, - constr, domainName, NULL); + if (!notnull_added) + { + domainAddNotNullConstraint(address.objectId, domainNamespace, + basetypeoid, basetypeMod, + constr, domainName, NULL); + notnull_added = true; + } break; /* Other constraint types were fully processed above */ diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index ba6f05eeb7d..974e6637ff5 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -1013,6 +1013,16 @@ drop cascades to type dtop -- enforced correctly, even if there's no default value for the new -- column. Per bug #1433 create domain str_domain as text not null; +create domain int_domain1 as int constraint nn1 not null constraint nn2 not null; +select conname, contype +from pg_constraint +where contypid = 'int_domain1'::regtype +order by conname; + conname | contype +---------+--------- + nn1 | n +(1 row) + create table domain_test (a int, b int); insert into domain_test values (1, 2); insert into domain_test values (1, 2); diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index b752a63ab5f..97b0b6a822e 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -594,6 +594,12 @@ drop domain vchar4 cascade; -- column. Per bug #1433 create domain str_domain as text not null; +create domain int_domain1 as int constraint nn1 not null constraint nn2 not null; +select conname, contype +from pg_constraint +where contypid = 'int_domain1'::regtype +order by conname; + create table domain_test (a int, b int); insert into domain_test values (1, 2); -- 2.34.1