Re: Bug Report: INSERT ON CONFLICT sometimes does not work with partial index
От | David G. Johnston |
---|---|
Тема | Re: Bug Report: INSERT ON CONFLICT sometimes does not work with partial index |
Дата | |
Msg-id | CAKFQuwa1oJs6aNdpEJyT9K=o6k-frkAM8VUuxEtOjjtq8Zjv3g@mail.gmail.com обсуждение исходный текст |
Ответ на | Bug Report: INSERT ON CONFLICT sometimes does not work with partial index (Danylo Miroshnichenko <miroshnik.dan@gmail.com>) |
Список | pgsql-bugs |
On Sun, Feb 5, 2023 at 9:51 AM Danylo Miroshnichenko <miroshnik.dan@gmail.com> wrote:
CREATE UNIQUE INDEX IF NOT EXISTS 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', 6, 'Test');
The lastEXECUTE
statement always throws an error:[42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
All of it works fine if we replace$3
parameter with a constant value'Test'
(no errors):PREPARE test (text, int, text) AS INSERT INTO test (type, id) VALUES ($1, $2) ON CONFLICT (type, id) WHERE type = 'Test' DO UPDATE SET id = EXCLUDED.id;
This is a known deficiency that the first query ever works at all. It should error every time.
In short, consider the WHERE clause a part of query structure that has to statically match one partial index specification.
David J.
В списке pgsql-bugs по дате отправления: