Re: [BUGS] BUG #14526: no unique or exclusion constraint matching the ON CONFLICT

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [BUGS] BUG #14526: no unique or exclusion constraint matching the ON CONFLICT
Дата
Msg-id 4487.1486573790@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: [BUGS] BUG #14526: no unique or exclusion constraint matching theON CONFLICT  (Tiago Babo <tiago.babo@gmail.com>)
Ответы Re: [BUGS] BUG #14526: no unique or exclusion constraint matching the ON CONFLICT  (Tiago Babo <tiago.babo@gmail.com>)
Re: [BUGS] BUG #14526: no unique or exclusion constraint matching theON CONFLICT  (Peter Geoghegan <pg@bowt.ie>)
Список pgsql-bugs
Tiago Babo <tiago.babo@gmail.com> writes:
> Hi, again. After some testing, I was able to reproduce this error with the following code:

> CREATE UNIQUE INDEX uniq_id_test ON test USING btree (type, id) WHERE (type = 'Test');

> PREPARE test (text, int, text) AS
>   INSERT INTO test (type, id)
>   VALUES ($1, $2)
>   ON CONFLICT (type, id) WHERE type = $3 DO UPDATE SET id = EXCLUDED.id;

> EXECUTE test('Test', 1, 'Test');
> EXECUTE test('Test', 2, 'Test');
> EXECUTE test('Test', 3, 'Test');
> EXECUTE test('Test', 4, 'Test');
> EXECUTE test('Test', 5, 'Test');
> EXECUTE test('Test', 6, 'Test');

> It gives the error when trying to execute the last statement.

Hm.  So the problem here is that the prepared statement only matches the
partial index as long as the actual parameter is substituted literally
into the statement.  As soon as the plancache tries to consider a generic
plan, in which it's not apparent at plan time what $3 is, we can't prove
the partial index to be matched so you get the error.

If this is representative of what your application is actually doing,
rather than what you were saying it does, then the answer is that you
have to match the partial index clause exactly, not rely on substitution/
simplification to produce a match.

Or don't use a partial index.  That schema seems pretty bizarre to me
anyway.

Having said all that, I think this is a fine example of why relying on
planner inferences for semantic decisions (rather than just optimization)
is damn-fool design.  If I'd been paying closer attention I would have
objected loudly to the use of WHERE in ON CONFLICT for this purpose.
I wonder whether it's too late to deprecate that feature.

            regards, tom lane


--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [BUGS] BUG #14535: SET search_path and list tables
Следующее
От: Tiago Babo
Дата:
Сообщение: Re: [BUGS] BUG #14526: no unique or exclusion constraint matching the ON CONFLICT