domain check constraint should also consider domain's collation

Started by jian heabout 1 year ago2 messageshackers
Beta feature

Hackorum builds and tests every patch posted to the lists, not only commitfest submissions. This is Hackorum's own CI rather than the PostgreSQL project's, and it is still under testing - please report anything that looks wrong.

won't retrysuccessCI history

You can run a PostgreSQL built from this patch straight from Docker, with no checkout and no build:

docker run --rm -p 5432:5432 ghcr.io/hackorum-dev/postgres-patch:t51914
psql -h localhost -U postgres

Built from patchset v1 (message #1), August 10, 2026 at 02:33 AM.

Every patchset is also pushed to a branch of our PostgreSQL fork, so you can check out the same tree CI built. Without a PostgreSQL checkout:

git clone --branch t51914_1 https://github.com/hackorum-dev/postgres.git

In a checkout you already have, add the fork once:

git remote add hackorum https://github.com/hackorum-dev/postgres.git

then, for this patchset and every later one:

git fetch hackorum t51914_1 && git checkout t51914_1

Patchset v1 (message #1) is on t51914_1

Jump to latest
#1jian he
jian.universality@gmail.com

hi.

CREATE COLLATION case_insensitive (provider = icu, locale =
'@colStrength=secondary', deterministic = false);
SELECT 'a' = 'A' COLLATE case_insensitive;
CREATE DOMAIN d1 as text collate case_insensitive check (value <> 'a');
SELECT 'A'::d1;

``SELECT 'A'::d1`` should error out as domain check constraint not satisfied?

If so, attached is the POC trying to implement it.

Attachments:

t51914_1
v1-0001-CoerceToDomainValue-should-use-domain-s-collation.patchtext/x-patch; charset=UTF-8; name=v1-0001-CoerceToDomainValue-should-use-domain-s-collation.patchDownload+41-6
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: jian he (#1)
Re: domain check constraint should also consider domain's collation

jian he <jian.universality@gmail.com> writes:

CREATE COLLATION case_insensitive (provider = icu, locale =
'@colStrength=secondary', deterministic = false);
SELECT 'a' = 'A' COLLATE case_insensitive;
CREATE DOMAIN d1 as text collate case_insensitive check (value <> 'a');
SELECT 'A'::d1;

``SELECT 'A'::d1`` should error out as domain check constraint not satisfied?

No. In the above, 'value' is of type text, not type d1, and therefore
that comparison will use the default collation. If you try to make it
do something else, you will break far more than you fix. (The
fundamental reason why this is important is that we cannot assume that
the domain constraints hold for the value until after we complete the
CHECK expressions.) So the correct way to create a domain that works
as you have in mind is

CREATE DOMAIN d1 as text collate case_insensitive
check (value <> 'a' COLLATE case_insensitive);

regards, tom lane