投射到自定义域 PostgreSQL

Ale*_*rov 6 sql postgresql types casting

我正在尝试创建自定义域类型来强制对多个表进行约束。
约束工作正常,但我还想添加自定义转换,该转换将在实际转换和检查之前应用小写。

CREATE DOMAIN email AS varchar(80)
  CHECK (value ~ ('^[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@' ||
                  '(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$'));

CREATE OR REPLACE FUNCTION text_as_email(text)
  RETURNS email
LANGUAGE SQL AS
$$ SELECT lower($1) :: email $$;

CREATE CAST ( text AS email )
WITH FUNCTION text_as_email(text) AS IMPLICIT;
Run Code Online (Sandbox Code Playgroud)

域和函数都按预期工作

SELECT 'abc@abc.com' :: email; -- no errors
SELECT 'abc@@abc.com' :: email; -- expected error
SELECT text_as_email('ABC@abc.com'); -- no errors, returns 'abc@abc.com'
Run Code Online (Sandbox Code Playgroud)

但强制转换无法转换大写

SELECT 'ABC@abc.com' :: email; -- gives an error
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何想法,谢谢。

kli*_*lin 4

文档中:

目前,与域类型之间的转换没有任何效果。与域之间的转换使用与其基础类型关联的转换。

创建演员阵容时会收到警告:

CREATE CAST ( text AS email )
WITH FUNCTION text_as_email(text) AS IMPLICIT;

WARNING:  cast will be ignored because the target data type is a domain
Run Code Online (Sandbox Code Playgroud)