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

From Marcos Pegoraro
Subject Re: proposal: plpgsql, new check for extra_errors - strict_expr_check
Date
Msg-id CAB-JLwbKmKpqRhVWb1uU13-vi36zANCaTh6ikwcZ+q2s0mAQPQ@mail.gmail.com
Whole thread Raw
In response to proposal: plpgsql, new check for extra_errors - strict_expr_check  (Pavel Stehule <pavel.stehule@gmail.com>)
Responses Re: proposal: plpgsql, new check for extra_errors - strict_expr_check
List pgsql-hackers
Can you remove or just ignore double ; too ?

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: Pavel Stehule
Date:
Subject: proposal: plpgsql, new check for extra_errors - strict_expr_check
Next
From: Pavel Stehule
Date:
Subject: Re: proposal: plpgsql, new check for extra_errors - strict_expr_check