触发器中的 Postgres 正则表达式匹配不正确
Postgres regex match incorrect in trigger
我有一个带有正则表达式检查的 INSERT 触发器,它不是 return 我的预期结果...但是 只有 当 运行 在触发器中.当我的 SQL 编辑器 运行 时,它按预期工作。
触发代码失败(我添加了 RAISE
来解决问题,我试图开始工作的代码是下面的 IF
语句):
RAISE EXCEPTION 'postal_code regex check %', '55555' !~* '^\d{5}$';
IF NEW.postal_code !~* '^\d{5}$' THEN
errors := ARRAY_APPEND(errors, 'Postal code format is invalid.');
END IF;
这是抛出的异常(我预计 t
是 f
):
# --- Caused by: ---
# PG::RaiseException:
# ERROR: postal_code regex check t
如果我只是 运行 在我的 SQL 编辑器中直接这样做:
select '55555' !~* '^\d{5}$';
它 returns false
符合预期。
Postgres 9.6
更新:我试图找出这个问题,但无法通过以下方式重现(如果这是显示问题,select count(*)
应该 return 0 但它 returns 1):
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (
postal_code varchar
);
CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
LANGUAGE plpgsql
AS $_$
DECLARE
BEGIN
IF NEW.postal_code !~* '^\d{5}$' THEN
RETURN false;
END IF;
RETURN NEW;
END;
$_$;
DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
insert into my_table values ('55555');
select count(*) from my_table;
问题是添加触发器的 Rails 迁移从正则表达式中删除了反斜杠。
在迁移中使用此语法:
sql = <<-SQL
CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
IF NEW.postal_code !~ '^\d{5}$' THEN
RAISE EXCEPTION 'Debug--> postal_code regex check %, %, %', NEW.postal_code !~* '^\d{5}$', TG_OP, NEW.postal_code;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
SQL
execute sql
在 Rails 迁移中删除了我的正则表达式中的反斜杠。应用于数据库的实际正则表达式是 '^d{5}$'
(缺少反斜杠)而不是 '^\d{5}$'
.
我有一个带有正则表达式检查的 INSERT 触发器,它不是 return 我的预期结果...但是 只有 当 运行 在触发器中.当我的 SQL 编辑器 运行 时,它按预期工作。
触发代码失败(我添加了 RAISE
来解决问题,我试图开始工作的代码是下面的 IF
语句):
RAISE EXCEPTION 'postal_code regex check %', '55555' !~* '^\d{5}$';
IF NEW.postal_code !~* '^\d{5}$' THEN
errors := ARRAY_APPEND(errors, 'Postal code format is invalid.');
END IF;
这是抛出的异常(我预计 t
是 f
):
# --- Caused by: ---
# PG::RaiseException:
# ERROR: postal_code regex check t
如果我只是 运行 在我的 SQL 编辑器中直接这样做:
select '55555' !~* '^\d{5}$';
它 returns false
符合预期。
Postgres 9.6
更新:我试图找出这个问题,但无法通过以下方式重现(如果这是显示问题,select count(*)
应该 return 0 但它 returns 1):
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (
postal_code varchar
);
CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
LANGUAGE plpgsql
AS $_$
DECLARE
BEGIN
IF NEW.postal_code !~* '^\d{5}$' THEN
RETURN false;
END IF;
RETURN NEW;
END;
$_$;
DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
insert into my_table values ('55555');
select count(*) from my_table;
问题是添加触发器的 Rails 迁移从正则表达式中删除了反斜杠。
在迁移中使用此语法:
sql = <<-SQL
CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
IF NEW.postal_code !~ '^\d{5}$' THEN
RAISE EXCEPTION 'Debug--> postal_code regex check %, %, %', NEW.postal_code !~* '^\d{5}$', TG_OP, NEW.postal_code;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
SQL
execute sql
在 Rails 迁移中删除了我的正则表达式中的反斜杠。应用于数据库的实际正则表达式是 '^d{5}$'
(缺少反斜杠)而不是 '^\d{5}$'
.