From: Laurenz Albe <laurenz.albe@cybertec.at>
To: Peter Eisentraut <peter@eisentraut.org>
To: pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: SQL-standard function body
Date: Sat, 10 Apr 2021 03:38:31 +0200
Message-ID: <7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at> (raw)
In-Reply-To: <cee01d26fe55bc086b3bcf10bfe4e8d450e2f608.camel@cybertec.at>
References: <E1lUEF5-00027L-N4@gemulon.postgresql.org>
<cee01d26fe55bc086b3bcf10bfe4e8d450e2f608.camel@cybertec.at>
On Fri, 2021-04-09 at 19:44 +0200, I wrote:
> > SQL-standard function body
> >
> > 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.
>
> 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?
Here is an improved patch, which treats END in the same fashion
(not properly indented for readability).
Yours,
Laurenz Albe
Attachments:0001-Improve-parsing-of-SQL-standard-functions-in-psql.patch (text/x-patch, 1.0K) download
From b0aaf040a42e3a036ba43c9891e07bad73c35a5e Mon Sep 17 00:00:00 2001
From: Laurenz Albe <laurenz.albe@cybertec.at>
Date: Sat, 10 Apr 2021 03:35:39 +0200
Subject: [PATCH] Improve parsing of SQL standard functions in psql
Handle BEGIN, CASE and END as special 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 | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.lindex 4ec57e96a9..caf6412164 100644--- a/src/fe_utils/psqlscan.l+++ b/src/fe_utils/psqlscan.l@@ -871,6 +871,8 @@ other .
{identifier} {
cur_state->identifier_count++;
+ if (cur_state->paren_depth == 0)+ {
if (pg_strcasecmp(yytext, "begin") == 0
|| pg_strcasecmp(yytext, "case") == 0)
{
@@ -882,6 +884,7 @@ other .
if (cur_state->begin_depth > 0)
cur_state->begin_depth--;
}
+ }
ECHO;
}
--
2.26.3
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: laurenz.albe@cybertec.at, peter@eisentraut.org, pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: SQL-standard function body
In-Reply-To: <7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox