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

Reply via email to