Оператор равенства геометрии недоступен в pg_restore без явного приведения типов

#postgresql #triggers #postgis #pg-dump #pg-restore

#postgresql #триггеры #postgis #pg-дамп #pg-восстановление

Вопрос:

Postgres 12, Postgis 3

Изначально определены два триггера с критериями WHEN (OLD.geom IS DISTINCT FROM NEW.geom) . Столбец geom имеет тип geometry .

Это вызвало проблемы при pg_restore базы данных из-за недоступности оператора геометрии для equals:

 pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 10233; 2620 673186 TRIGGER lines the_trigger_name geo
pg_restore: error: could not execute query: ERROR:  operator is not unique: public.geometry = public.geometry
LINE 1: ...public.lines FOR EACH ROW WHEN ((old.geom IS DISTINC...
                                                             ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
Command was: CREATE TRIGGER the_trigger_name AFTER UPDATE ON public.lines FOR EACH ROW WHEN ((old.geom IS DISTINCT FROM new.geom)) EXECUTE FUNCTION public.the_function_name();
  

Резервная база данных использует postgis 3.0.0

Мы загружаем его двумя разными способами:

  • в одной среде (postgis 3.0.1) мы используем дамп базы данных в формате обычного текста (по умолчанию) ( pg_dump -F p ) и загружаем его, просто выполняя текстовый файл, например psql -f /my/file.sql
    • это сообщение об ошибке, но загрузка базы данных все еще работает
  • в другой среде (postgis 3.0.2) мы используем дамп базы данных в пользовательском формате ( pg_dump -F custom ) и загружаем его, выполнив pg_restore --single-transaction < “$DB_FILE”
    • это сообщение об ошибке и сбой

Добавление ::geometry приведения к СТАРОМУ / НОВОМУ geom устраняет эту проблему. Почему pg не может определить оператор равенства в определенных контекстах (без приведения типов)?