plpgsql's EXIT versus block and loop nesting
От | Tom Lane |
---|---|
Тема | plpgsql's EXIT versus block and loop nesting |
Дата | |
Msg-id | 21376.1241125806@sss.pgh.pa.us обсуждение исходный текст |
Ответы |
Re: plpgsql's EXIT versus block and loop nesting
Re: plpgsql's EXIT versus block and loop nesting Re: plpgsql's EXIT versus block and loop nesting |
Список | pgsql-hackers |
Whilst fooling with some plpgsql code translated from Oracle, I found out that we interpret this construct differently than they do: while true loop begin -- some code that might throw unique_violation exit; exception when unique_violation then -- take a recovery action (then go 'roundthe loop again) end; end loop; The code author obviously expects that the EXIT will exit the WHILE loop, so I assume that's what Oracle does with it. What plpgsql is doing is matching the EXIT to the BEGIN block, which means this is an infinite loop. Aside from the question of Oracle compatibility, ISTM this behavior is at variance with what our manual says about EXIT: If no label is given, the innermost loop is terminated and thestatement following END LOOP is executed next. I'm not sure we should change this in the back branches, but I propose that for 8.4, we fix it so that EXIT will only match to a begin-block if the block has a label and it matches the EXIT's. Unlabeled EXITs should match to the innermost loop, like the manual says. (This looks to be about a one-line code change.) Comments? regards, tom lane
В списке pgsql-hackers по дате отправления: