Re: proposal: plpgsql, new check for extra_errors - strict_expr_check - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: proposal: plpgsql, new check for extra_errors - strict_expr_check
Date
Msg-id CAFj8pRBTcnj0WBMqwpn_6=aWsbm8GJfBovkx4qL0BTwTzMMe6g@mail.gmail.com
Whole thread Raw
In response to Re: proposal: plpgsql, new check for extra_errors - strict_expr_check  (Marcos Pegoraro <marcos@f10.com.br>)
Responses Re: proposal: plpgsql, new check for extra_errors - strict_expr_check
List pgsql-hackers
Hi

ne 16. 6. 2024 v 16:22 odesílatel Marcos Pegoraro <marcos@f10.com.br> napsal:
Can you remove or just ignore double ; too ?

I don't know - it is a different issue.

PLpgSQL allows zero statements inside block, so you can write BEGIN END or IF 1 THEN END IF but it doesn't allow empty statement

like ;;

probably it just needs one more rule in gram.y - but in this case, I am not sure if we should support it. 

What is the expected benefit? Generally PL/pgSQL has very strict syntax - and using double semicolons makes no sense.


 

postgres=# do $$ 
declare var_x integer; 
begin 
  var_x = 99;; 
  delete from x where x = var_x; 
end; $$;
ERROR:  syntax error at or near ";"
LINE 1: do $$ declare var_x integer; begin var_x = 99;; delete from ...

Atenciosamente, 




Em dom., 16 de jun. de 2024 às 11:12, Pavel Stehule <pavel.stehule@gmail.com> escreveu:
Hi,

assigned patch try to solve issue reported by Mor Lehr (Missing semicolon in anonymous plpgsql block does not raise syntax error).


by introducing a new extra error check. With this check only a_expr exprs are allowed as plpgsql expressions. This is a small step to behaviour described in SQL/PSM standard (although the language is different, the expression syntax and features are almost similar. With this check the undocumented (but supported syntax)

var := column FROM tab

is disallowed. Only ANSI syntax for embedded queries (inside assignment statement) is allowed

var := (SELECT column FROM tab);

With this check, the reported issue (by Mor Lehr) is detected

default setting

CREATE TABLE foo3(id serial PRIMARY key, txt text);
INSERT INTO foo3 (txt) VALUES ('aaa'),('bbb');

DO $$
DECLARE
    l_cnt int;
BEGIN
    l_cnt := 1
    DELETE FROM foo3 WHERE id=1;
END; $$

-- without reaction - just don't work

(2024-06-16 16:05:55) postgres=# set plpgsql.extra_errors to 'strict_expr_check';
SET
(2024-06-16 16:06:43) postgres=# DO $$                                          
DECLARE
    l_cnt int;
BEGIN
    l_cnt := 1
    DELETE FROM foo3 WHERE id=1;
END; $$;
ERROR:  syntax error at or near "DELETE"
LINE 11:     DELETE FROM foo3 WHERE id=1;
             ^

This patch has three parts

1. Introduction strict_expr_check
2. set strict_expr_check as default, and impact on regress tests
3. revert @2

I don't propose to be strict_expr_check active  by default.

Comments, notes?

Regards

Pavel


pgsql-hackers by date:

Previous
From: Marcos Pegoraro
Date:
Subject: Re: proposal: plpgsql, new check for extra_errors - strict_expr_check
Next
From: Marcos Pegoraro
Date:
Subject: Re: proposal: plpgsql, new check for extra_errors - strict_expr_check