Re: Remembering bug #6123

Поиск
Список
Период
Сортировка
От Florian Pflug
Тема Re: Remembering bug #6123
Дата
Msg-id 0D6B34D5-9933-4B03-A47E-1B42EDD74E2F@phlo.org
обсуждение исходный текст
Ответ на Remembering bug #6123  ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>)
Ответы Re: Remembering bug #6123  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
On Jan12, 2012, at 00:32 , Kevin Grittner wrote:
> Going back through the patches we had to make to 9.0 to move to
> PostgreSQL triggers, I noticed that I let the issues raised as bug
> #6123 lie untouched during the 9.2 development cycle.  In my view,
> the best suggestion for a solution was proposed by Florian here:
> 
> http://archives.postgresql.org/pgsql-hackers/2011-08/msg00388.php

I've recently encountered a related issue, this time not related to
triggers but to FOR UPDATE.

My code declared a cursor which iterates over pairs of parent and
child rows, and updated the parent which values from the child. I
declared the cursor "FOR UPDATE OF parent", and used "WHERE CURRENT OF"
to update the parent row while iterating over the cursor. The code
looked something like this

DECLARE c_parent_child CURSOR FOR   SELECT ... FROM parent JOIN child ON ...   FOR UPDATE OF parent;

BEGIN FOR v_row IN c_parent_child LOOP   ...   UPDATE parent SET ... WHERE CURRENT OF c_parent_child END LOOP

I figured that was all safe and sound, since with the cursor's results
should be unaffected by the later UPDATES - after all, it's cmax is
smaller than any of the UPDATEs command ids. What I didn't take into
account, however, is that "FOR UPDATE OF" will silently skip rows which
have been updated (by the same transaction) after the cursor's snapshot
was established.

Thus, what happened was that things worked fine for parents with only
one child, but for parents with multiple children only the first child
got be processed. Once I realized that source of that problem, the fix was
easy - simply using the parent table's primary key to do the update, and
dropping the "FOR UPDATE OF" clause fixed the problem.

So, I guess my question is, if we add safeguards against these sorts of
bugs for triggers, should we also add them to FOR UPDATE? Historically,
we seem to have taken the stand that modifications of self-updated tuples
should be ignored. If we're going to reverse that decision (which I think
Kevin has argued for quite convincingly), it seems consistent to complain
about all modifications to self-updated tuples, not only to those involving
triggers.

OTOH, the more cases we complain, the larger the chance that we cause serious
issues for people who upgrade to 9.2. (or 9.3, whatever).

best regards,
Florian Pflug



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

Предыдущее
От: Pavel Stehule
Дата:
Сообщение: Re: JSON for PG 9.2
Следующее
От: Alvaro Herrera
Дата:
Сообщение: Re: pgbench post-connection command