Fix EXIT out of outermost block in plpgsql.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Sep 2021 16:42:04 +0000 (12:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Sep 2021 16:42:04 +0000 (12:42 -0400)
Ordinarily, using EXIT this way would draw "control reached end of
function without RETURN".  However, if the function is one where we
don't require an explicit RETURN (such as a DO block), that should
not happen.  It did anyway, because add_dummy_return() neglected to
account for the case.

Per report from Herwig Goemans.  Back-patch to all supported branches.

Discussion: https://postgr.es/m/868ae948-e3ca-c7ec-95a6-83cfc08ef750@gmail.com

src/pl/plpgsql/src/pl_comp.c

index 75249b3ec8e72a98fe6c99016dcd81e5521a1d9d..e88c1ac551e7e10cfebb4d3cf36613878f2d10e1 100644 (file)
@@ -976,9 +976,11 @@ add_dummy_return(PLpgSQL_function *function)
    /*
     * If the outer block has an EXCEPTION clause, we need to make a new outer
     * block, since the added RETURN shouldn't act like it is inside the
-    * EXCEPTION clause.
+    * EXCEPTION clause.  Likewise, if it has a label, wrap it in a new outer
+    * block so that EXIT doesn't skip the RETURN.
     */
-   if (function->action->exceptions != NULL)
+   if (function->action->exceptions != NULL ||
+       function->action->label != NULL)
    {
        PLpgSQL_stmt_block *new;