Re: ON CONFLICT and WHERE
От | Tom Lane |
---|---|
Тема | Re: ON CONFLICT and WHERE |
Дата | |
Msg-id | 736683.1668373664@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | ON CONFLICT and WHERE (Adrian Klaver <adrian.klaver@aklaver.com>) |
Ответы |
Re: ON CONFLICT and WHERE
Re: ON CONFLICT and WHERE |
Список | pgsql-general |
Adrian Klaver <adrian.klaver@aklaver.com> writes: > INSERT INTO books VALUES (12, 0, CURRENT_TIMESTAMP) > ON CONFLICT (id) > WHERE updated IS NULL OR updated + INTERVAL '2min' < CURRENT_TIMESTAMP > DO UPDATE > SET version = books.version + 1, updated = CURRENT_TIMESTAMP; > I have not used WHERE with ON CONFLICT myself so it took longer then I > care to admit to correct the above to: > INSERT INTO books VALUES (12, 0, CURRENT_TIMESTAMP) > ON CONFLICT (id) > DO UPDATE > SET version = books.version + 1, updated = CURRENT_TIMESTAMP > WHERE books.version IS NULL OR books.updated + INTERVAL '2min' < > CURRENT_TIMESTAMP; > The question is why did the first case just ignore the WHERE instead of > throwing a syntax error? A WHERE placed there is an index_predicate attachment to the ON CONFLICT clause. It doesn't have any run-time effect other than to allow partial indexes to be chosen as arbiter indexes. TFM explains index_predicate Used to allow inference of partial unique indexes. Any indexes that satisfy the predicate (which need not actually be partial indexes) can be inferred. This strikes me as a bit of a foot-gun. I wonder if we should make it safer by insisting that the resolved index be partial when there's a WHERE clause here. (This documentation text is about as clear as mud, too. What does "inferred" mean here? I think it means "chosen as arbiter index", but maybe I misunderstand.) regards, tom lane
В списке pgsql-general по дате отправления: