plpgsql's EXIT versus block and loop nesting - Mailing list pgsql-hackers

From Tom Lane
Subject plpgsql's EXIT versus block and loop nesting
Date
Msg-id 21376.1241125806@sss.pgh.pa.us
Whole thread Raw
Responses Re: plpgsql's EXIT versus block and loop nesting  (Pavel Stehule <pavel.stehule@gmail.com>)
Re: plpgsql's EXIT versus block and loop nesting  (Andrew Dunstan <andrew@dunslane.net>)
Re: plpgsql's EXIT versus block and loop nesting  (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>)
List 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 by date:

Previous
From: Jaime Casanova
Date:
Subject: Re: Creating a tablespace directory in recovery
Next
From: Tom Lane
Date:
Subject: Re: GCC 4.4 compiler warnings