On Wed, 2021-04-07 at 19:53 +0000, Peter Eisentraut wrote: > SQL-standard function body > > This adds support for writing CREATE FUNCTION and CREATE PROCEDURE > statements for language SQL with a function body that conforms to the > SQL standard and is portable to other implementations. > > [...] > > psql needs some new intelligence to keep track of function body > boundaries so that it doesn't send off statements when it sees > semicolons that are inside a function body.
This causes psql to fail to recognize the semicolon in the following statement as the end of a statement: IMPORT FOREIGN SCHEMA x FROM SERVER y INTO z OPTIONS (case 'lower'); The cause is the "case", which is recognized as the start of a function body. Now you could argue that "case" is a reserved word, and I should double quote it if I insist on using it as a FDW option, but it is a regression. Would it be an option to recognize BEGIN and CASE as starting a function body only if they are *not* inside parentheses, like in the attached? Yours, Laurenz Albe
From 8c95440905c01b8c9ed8b46ef01a24b01f24580d Mon Sep 17 00:00:00 2001 From: Laurenz Albe <laurenz.a...@cybertec.at> Date: Fri, 9 Apr 2021 19:40:36 +0200 Subject: [PATCH] Improve psql's parsing of SQL standard function bodies Treat BEGIN and CASE as the start of a function body only if we are not inside parentheses. That allows statements like the following to be parsed correctly: ALTER FOREIGN TABLE x OPTIONS (ADD case 'upper'); --- src/fe_utils/psqlscan.l | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l index 4ec57e96a9..dbfcfc84e5 100644 --- a/src/fe_utils/psqlscan.l +++ b/src/fe_utils/psqlscan.l @@ -871,8 +871,9 @@ other . {identifier} { cur_state->identifier_count++; - if (pg_strcasecmp(yytext, "begin") == 0 - || pg_strcasecmp(yytext, "case") == 0) + if (cur_state->paren_depth == 0 + && (pg_strcasecmp(yytext, "begin") == 0 + || pg_strcasecmp(yytext, "case") == 0)) { if (cur_state->identifier_count > 1) cur_state->begin_depth++; -- 2.26.3