Domain checks not always working when used in compound type

Поиск
Список
Период
Сортировка
От Holger Jakobs
Тема Domain checks not always working when used in compound type
Дата
Msg-id d2d319cd-ddb9-a94a-7e2a-1879a6c52e64@jakobs.com
обсуждение исходный текст
Ответы Re: Domain checks not always working when used in compound type  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-admin
Hello All,

Today I was experimenting with domain and compound types.

-- Creating a domain type with NOT NULL constraint and at least 2 
characters.
CREATE DOMAIN domain_a AS VARCHAR(10) NOT NULL
   CHECK (LENGTH(TRIM(value)) > 2);

-- Using the domain within a compound type. The NOT NULL constraint 
should be
-- inherited from the domain, therefore not repeated here for column a.
CREATE TYPE compound_ab AS (
   a    domain_a,
   b    varchar(10)
);

-- Creating a table using the compound type.
CREATE TABLE test1 (
   name  VARCHAR(25) NOT NULL UNIQUE,
   ab    compound_ab,
   id    INTEGER GENERATED ALWAYS AS IDENTITY
);

-- Insert into table without providing a value for ab, thus (ab).a is 
NULL, which shouldn't be allowed.
INSERT INTO test1 VALUES ('person1');
INSERT 0 1

-- Select proves that (ab).a is NULL - violating the NOT NULL constraint.
SELECT *, (ab).a FROM test1;
   name   | a
---------+---
  person1 | ¤

¤ is set as a marker for NULL values in order to make it distinguishable 
from an empty string.

-- Directly inserting a NULL gives an error, so the constraint is in place.
INSERT INTO test1 (name, ab.a, ab.b)
   VALUES ('person2', NULL, 'something');
ERROR 23502: domain domain_a doesn't allow NULL values

INSERT INTO test1
   VALUES ('person3', '(,something)');
ERROR 23502: domain domain_a doesn't allow NULL values

-- But it can be circumvented by only feeding ab.b, but not ab.a.
INSERT INTO test1 (name, ab.b)
   VALUES ('person3', 'something');

SELECT *, (ab).a FROM test1;
   name   |      ab      | id | a
---------+--------------+----+---
  person1 | ¤            |  1 | ¤
  person3 | (,something) |  2 | ¤

The tests have been carried out with PostgreSQL 16.1.

Is the behaviour as expected? I think it isn't.

Regards,

Holger

-- 
Holger Jakobs, Bergisch Gladbach, Germany, Tel. +49-178-9759012
Hint: Only my mail server is entitled to send mails from my mail address. The SPF regulation is strict.
Mailing lists must not use the original from address when forwarding!




В списке pgsql-admin по дате отправления:

Предыдущее
От: hubert depesz lubaczewski
Дата:
Сообщение: Re: [EXTERNAL] Re: Need help with slow query - postgres 12 on linux RHEL 8
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Domain checks not always working when used in compound type