On Sat, Jun 05, 2021 at 09:44:18PM -0700, Noah Misch wrote: > On Wed, Apr 07, 2021 at 09:55:40PM +0200, Peter Eisentraut wrote: > > Committed. Thanks! > > I get a NULL pointer dereference if the function body has a doubled semicolon: > > create function f() returns int language sql begin atomic select 1;; end;
You don't even need a statements to reproduce the problem, a body containing only semi-colon(s) will behave the same. Attached patch should fix the problem.
>From d03f6f0aee61fb2f2246d72c266671fe975d6a65 Mon Sep 17 00:00:00 2001 From: Julien Rouhaud <julien.rouh...@free.fr> Date: Sun, 6 Jun 2021 15:28:59 +0800 Subject: [PATCH v1] Fix SQL-standard body empty statements handling. --- src/backend/commands/functioncmds.c | 3 +++ src/test/regress/expected/create_function_3.out | 2 +- src/test/regress/sql/create_function_3.sql | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 4c12aa33df..61de9bf11a 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -932,6 +932,9 @@ interpret_AS_clause(Oid languageOid, const char *languageName, Query *q; ParseState *pstate = make_parsestate(NULL); + if (!stmt) + continue; + pstate->p_sourcetext = queryString; sql_fn_parser_setup(pstate, pinfo); q = transformStmt(pstate, stmt); diff --git a/src/test/regress/expected/create_function_3.out b/src/test/regress/expected/create_function_3.out index 5b6bc5eddb..5955859bb5 100644 --- a/src/test/regress/expected/create_function_3.out +++ b/src/test/regress/expected/create_function_3.out @@ -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 diff --git a/src/test/regress/sql/create_function_3.sql b/src/test/regress/sql/create_function_3.sql index 4b778999ed..6e8b838ff2 100644 --- a/src/test/regress/sql/create_function_3.sql +++ b/src/test/regress/sql/create_function_3.sql @@ -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 -- 2.31.1