2201B ОШИБКА: недопустимое регулярное выражение при использовании функции replace()

Почему Postgres выдает эту ошибку

[2014-10-30 13:43:36] [2201B] ОШИБКА: недопустимое регулярное выражение: неверный escape \ sequence Где: функция PL/pgSQL normalize_username(), строка 5 при назначении

когда я использую оператор SQL:

UPDATE users."user" SET username = username

со следующим активным триггером:

CREATE OR REPLACE FUNCTION normalize_username()
  RETURNS TRIGGER AS $normalize_username$
BEGIN
  IF NOT (NEW.username IS NULL)
  THEN
    NEW.username := replace(NEW.username, 'ё', 'е');
  END IF;
  RETURN NEW;
END;
$normalize_username$ LANGUAGE plpgsql;

Таблица создавалась так:

            CREATE TABLE USERS.user (
              user_id                SERIAL PRIMARY KEY,
              username                CITEXT,
)

replace() — это простая текстовая функция, верно? Я полагаю, это не должно иметь никакого отношения к регулярным выражениям.


person Vladislav Rastrusny    schedule 30.10.2014    source источник


Ответы (1)


Проблема была решена путем приведения имени пользователя к ТЕКСТу в таком назначении:

CREATE OR REPLACE FUNCTION normalize_username()
  RETURNS TRIGGER AS $normalize_username$
BEGIN
  IF NOT (NEW.username IS NULL)
  THEN
    NEW.username := replace(NEW.username::TEXT, 'ё', 'е');
  END IF;
  RETURN NEW;
END;
$normalize_username$ LANGUAGE plpgsql;

Похоже, что операции со столбцами CITEXT под капотом незаметно преобразуются в операции с регулярными выражениями. Кто-нибудь может это подтвердить?

person Vladislav Rastrusny    schedule 30.10.2014