Don't crash on empty statements in SQL-standard function bodies.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Jun 2021 15:59:34 +0000 (11:59 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Jun 2021 15:59:34 +0000 (11:59 -0400)
gram.y should discard NULL pointers (empty statements) when
assembling a routine_body_stmt_list, as it does for other
sorts of statement lists.

Julien Rouhaud and Tom Lane, per report from Noah Misch.

Discussion: https://postgr.es/m/20210606044418.GA297923@rfd.leadboat.com

src/backend/parser/gram.y
src/test/regress/expected/create_function_3.out
src/test/regress/sql/create_function_3.sql

index 9ee90e3f13a40d786e8a925ef7602f85a1d66bb2..52a254928f87904eca62baa38d457e3d0e7aa967 100644 (file)
@@ -7990,7 +7990,11 @@ opt_routine_body:
 routine_body_stmt_list:
            routine_body_stmt_list routine_body_stmt ';'
                {
-                   $$ = lappend($1, $2);
+                   /* As in stmtmulti, discard empty statements */
+                   if ($2 != NULL)
+                       $$ = lappend($1, $2);
+                   else
+                       $$ = $1;
                }
            | /*EMPTY*/
                {
index 5b6bc5eddbe759e8d95186752d94d79fc4913eb6..5955859bb57b4a21ea3f7882fda27944bf189298 100644 (file)
@@ -267,7 +267,7 @@ CREATE FUNCTION functest_S_3() RETURNS boolean
     RETURN false;
 CREATE FUNCTION functest_S_3a() RETURNS boolean
     BEGIN ATOMIC
-        RETURN false;
+        ;;RETURN false;;
     END;
 CREATE FUNCTION functest_S_10(a text, b date) RETURNS boolean
     LANGUAGE SQL
index 4b778999ed7fc93cd200ace3c2e13da400ed4a5b..6e8b838ff2d48082c5be9b0ecfd83a694ed4a532 100644 (file)
@@ -165,7 +165,7 @@ CREATE FUNCTION functest_S_3() RETURNS boolean
     RETURN false;
 CREATE FUNCTION functest_S_3a() RETURNS boolean
     BEGIN ATOMIC
-        RETURN false;
+        ;;RETURN false;;
     END;
 
 CREATE FUNCTION functest_S_10(a text, b date) RETURNS boolean