BUG #18403: PL/pgSQL is reporting unexpected errors when processing DECLARE blocks with <<label>>

Started by PG Bug reporting formabout 2 years ago5 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 18403
Logged by: Jiangshan Liu
Email address: jiangshan.liu@tju.edu.cn
PostgreSQL version: 15.2
Operating system: Ubuntu
Description:

Hi, I think PL/pgSQL is reporting unexpected errors when dealing with
DECLARE blocks paired with <<label>>.
I have approximated the program to a clean situation. When I execute this
program, the PL/pgSQL engine does not report errors to me:

DO $$
DECLARE
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

But when I try to add <<label>> before the second DECLARE block, the
PL/pgSQL engine prompts me with this error message:

DO $$
DECLARE
<<label>>
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

ERROR: block label must be placed before DECLARE, not after

LINE 3: <<label>>
^

It seems to think that I am adding <<label>> after the first DECLARE block,
which is not my intention. I do add the <<label>> before the second DECLARE
block. Why is this program being reported as an error? Is this a bug in
PL/pgSQL's handling of <<label>>?

Looking forward and thank you for your response to this question.

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #18403: PL/pgSQL is reporting unexpected errors when processing DECLARE blocks with <<label>>

st 20. 3. 2024 v 20:59 odesílatel PG Bug reporting form <
noreply@postgresql.org> napsal:

The following bug has been logged on the website:

Bug reference: 18403
Logged by: Jiangshan Liu
Email address: jiangshan.liu@tju.edu.cn
PostgreSQL version: 15.2
Operating system: Ubuntu
Description:

Hi, I think PL/pgSQL is reporting unexpected errors when dealing with
DECLARE blocks paired with <<label>>.
I have approximated the program to a clean situation. When I execute this
program, the PL/pgSQL engine does not report errors to me:

DO $$
DECLARE
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

But when I try to add <<label>> before the second DECLARE block, the
PL/pgSQL engine prompts me with this error message:

DO $$
DECLARE
<<label>>
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

ERROR: block label must be placed before DECLARE, not after

LINE 3: <<label>>
^

It seems to think that I am adding <<label>> after the first DECLARE block,
which is not my intention. I do add the <<label>> before the second DECLARE
block. Why is this program being reported as an error? Is this a bug in
PL/pgSQL's handling of <<label>>?

Looking forward and thank you for your response to this question.

There cannot be labels between DECLARE keywords. The label in this case is
not related to DECLARE, but to the following BEGIN END block.

Regards

Pavel

#3David G. Johnston
david.g.johnston@gmail.com
In reply to: PG Bug reporting form (#1)

On Wednesday, March 20, 2024, PG Bug reporting form <noreply@postgresql.org>
wrote:

The following bug has been logged on the website:

Bug reference: 18403
Logged by: Jiangshan Liu
Email address: jiangshan.liu@tju.edu.cn
PostgreSQL version: 15.2
Operating system: Ubuntu
Description:

Hi, I think PL/pgSQL is reporting unexpected errors when dealing with
DECLARE blocks paired with <<label>>.
I have approximated the program to a clean situation. When I execute this
program, the PL/pgSQL engine does not report errors to me:

DO $$
DECLARE
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

The failure to report an error here seems contrary to the documentation.
When the end of the DO text is reached and only a single begin/end pair is
seen the parser is being loose in being OK that one of the declares was not
associated with a full block.

David J.

#4Pavel Stehule
pavel.stehule@gmail.com
In reply to: David G. Johnston (#3)
Re: BUG #18403: PL/pgSQL is reporting unexpected errors when processing DECLARE blocks with <<label>>

st 20. 3. 2024 v 21:47 odesílatel David G. Johnston <
david.g.johnston@gmail.com> napsal:

On Wednesday, March 20, 2024, PG Bug reporting form <
noreply@postgresql.org> wrote:

The following bug has been logged on the website:

Bug reference: 18403
Logged by: Jiangshan Liu
Email address: jiangshan.liu@tju.edu.cn
PostgreSQL version: 15.2
Operating system: Ubuntu
Description:

Hi, I think PL/pgSQL is reporting unexpected errors when dealing with
DECLARE blocks paired with <<label>>.
I have approximated the program to a clean situation. When I execute this
program, the PL/pgSQL engine does not report errors to me:

DO $$
DECLARE
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

The failure to report an error here seems contrary to the documentation.
When the end of the DO text is reached and only a single begin/end pair is
seen the parser is being loose in being OK that one of the declares was not
associated with a full block.

One block can have more DECLAREs

I am not sure if the empty list for DECLARE should be valid, but plpgsql
parser allows it.

do $$
declare x int;
declare y int;
begin
x := 1; y := 1;
raise notice '% %', x,y;
end;
$$;

Show quoted text

David J.

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: PG Bug reporting form (#1)
Re: BUG #18403: PL/pgSQL is reporting unexpected errors when processing DECLARE blocks with <<label>>

PG Bug reporting form <noreply@postgresql.org> writes:

I have approximated the program to a clean situation. When I execute this
program, the PL/pgSQL engine does not report errors to me:

DO $$
DECLARE
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

That is not valid code according to the documentation, which clearly
says that every DECLARE must be followed by BEGIN and then END [1]https://www.postgresql.org/docs/current/plpgsql-structure.html.
You happen to get away with it because of an undocumented "feature":
one of the options for a declaration statement is

| K_DECLARE
{
/* We allow useless extra DECLAREs */
}

So the first DECLARE begins the block, and the second is an
ignored noise word.

DO $$
DECLARE
<<label>>
DECLARE
var1 INT = 1;
BEGIN
RAISE NOTICE '%', var1;
END;
$$;

This, however, is flat wrong, and the error message seems
perfectly on-point to me:

ERROR: block label must be placed before DECLARE, not after
LINE 3: <<label>>
^

regards, tom lane

[1]: https://www.postgresql.org/docs/current/plpgsql-structure.html