pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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.l index 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

view thread (18+ messages)  latest in thread

Message-ID: <7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at>
Permalink:  ../7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at/
Also on:    postgresql.org/message-id/7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at

 ·  · 

reply

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