Обновляемый VIEW не работает с ON CONFLICT в Postgres 9.5

Версия PostgreSQL: 9.5.4

У меня есть таблица, определенная как:

CREATE TABLE IF NOT EXISTS TEST_1 (
ID       SERIAL PRIMARY KEY,
C1       BYTEA,
C2       TEXT NOT NULL,
C3       BOOLEAN NOT NULL DEFAULT FALSE,
CONSTRAINT TEST_1_unique_idx UNIQUE(C1, C2)
);

У меня есть представление, определенное как:

create or replace view test as select * from test_1 with cascaded check
option;

Это необходимо для абстрагирования от имени таблицы, пока код приложения работает через имя представления (для реализации своего рода простого разделения с заменой таблиц при необходимости).

Когда я запускаю следующий запрос в view:

insert into test (c1, c2, c3) values (decode('MTIzAAE=', 'base64'), 'text', true) on conflict (c1, c2) do update set c3=excluded.c3

Я получаю следующую ошибку:

[0A000] ERROR: ON CONFLICT is not supported on table "test" used as a catalog table
  Position: 83

Но тот же запрос к table работает, как и ожидалось. Согласно документации Postgres, это должно работать и с представлением, поскольку ON CONFLICT полностью поддерживается с обновляемыми представлениями https://www.postgresql.org/docs/9.5/static/sql-createview.html

Любые идеи, что мне не хватает?


person gpotter    schedule 26.10.2016    source источник
comment
Пожалуйста, покажите нам определение таблицы test_1 и фактический код Java, который выполняет ваше выражение (с и без PreparedStatement)   -  person a_horse_with_no_name    schedule 26.10.2016
comment
Привет, @a_horse_with_no_name, спасибо за быстрый ответ! Пока я готовил для вас тестовый код, мне удалось воспроизвести проблему без PgPreparedStatement. Я обновил описание, вы можете найти все детали, необходимые для воспроизведения   -  person gpotter    schedule 26.10.2016
comment
Проблема в with check option. Если убрать то работает. Поскольку вы не ограничиваете строки в представлении, почему вы все равно используете with check option?   -  person a_horse_with_no_name    schedule 26.10.2016
comment
@a_horse_with_no_name Первоначально представление было более сложным, и требовалось with check option. Логика изменилась, но with check option осталось. Спасибо что подметил это. Вы правы, это больше не нужно. Без with check option работает нормально. Большое спасибо! Любые идеи, почему это происходит with check option? Согласно документации, таких ограничений нет. Должен ли я сообщить об этом сообществу Postgres как об ошибке?   -  person gpotter    schedule 26.10.2016
comment
Увидев сообщение об ошибке, я бы предположил, что это скорее ошибка документации (оплошность), чем ошибка в реализации. ON CONFLICT не может работать должным образом, если вы ограничиваете строки, возвращаемые представлением.   -  person a_horse_with_no_name    schedule 26.10.2016
comment
@a_horse_with_no_name: пожалуйста, продвигайте / преобразуйте свой комментарий в ответ. ИМХО, это может быть полезно и для будущих читателей.   -  person wildplasser    schedule 26.10.2016


Ответы (1)


По-видимому, это не поддерживается для представлений, использующих with check option

Если вы удалите with cascaded check option, это сработает.

Это явно не упоминается в руководстве, так что это может быть оплошностью документации.

person a_horse_with_no_name    schedule 26.10.2016