From aef4219e759343e2a0939f0ec3dc4a54ca6c3360 Mon Sep 17 00:00:00 2001 From: yuhuanhuan <1500773557@qq.com> Date: Sat, 7 Oct 2023 19:45:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3signal=E4=B8=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9C=BA=E6=99=AF=E4=B8=8Bcore=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/pl/plpgsql/src/gram.y | 15 +++- src/test/regress/expected/mysql_resignal.out | 95 ++++++++++++++++++++ src/test/regress/expected/mysql_signal.out | 55 ++++++++++++ src/test/regress/sql/mysql_resignal.sql | 51 +++++++++++ src/test/regress/sql/mysql_signal.sql | 30 +++++++ 5 files changed, 243 insertions(+), 3 deletions(-) diff --git a/src/common/pl/plpgsql/src/gram.y b/src/common/pl/plpgsql/src/gram.y index 7e6f69ed6..26ce1e8a3 100755 --- a/src/common/pl/plpgsql/src/gram.y +++ b/src/common/pl/plpgsql/src/gram.y @@ -13094,11 +13094,20 @@ static void read_signal_sqlstate(PLpgSQL_stmt_signal *newp, int tok) yyerror("unexpected end of function definition"); } - if (strcmp(yylval.str, "value") == 0) { - if (yylex() != SCONST) { - yyerror("syntax error, the expected value is a string."); + if (tok != SCONST && tok != T_WORD) { + yyerror("syntax error, the expected value is a string."); + } + + if (tok == T_WORD) { + if (strcmp(yylval.str, "value") == 0) { + if (yylex() != SCONST) { + yyerror("syntax error, the expected value is a string."); + } + } else { + yyerror("syntax error, the expected word is value."); } } + sqlstate_value = yylval.str; if (strlen(sqlstate_value) != 5 || diff --git a/src/test/regress/expected/mysql_resignal.out b/src/test/regress/expected/mysql_resignal.out index 4af2542a3..abb3b7026 100644 --- a/src/test/regress/expected/mysql_resignal.out +++ b/src/test/regress/expected/mysql_resignal.out @@ -1961,5 +1961,100 @@ select @a, @error_count; 0 | 2 (1 row) +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate 01001; + END; + DROP TABLE t1; +END; +/ +ERROR: syntax error, the expected value is a string. at or near "01001" +LINE 4: resignal sqlstate 01001; + ^ +QUERY: DECLARE BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate 01001; + END; + DROP TABLE t1; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value 01001; + END; + DROP TABLE t1; +END; +/ +ERROR: syntax error, the expected value is a string. at or near "01001" +LINE 4: resignal sqlstate value 01001; + ^ +QUERY: DECLARE BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value 01001; + END; + DROP TABLE t1; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values 01001; + END; + DROP TABLE t1; +END; +/ +ERROR: syntax error, the expected word is value. at or near "values" +LINE 4: resignal sqlstate values 01001; + ^ +QUERY: DECLARE BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values 01001; + END; + DROP TABLE t1; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value; + END; + DROP TABLE t1; +END; +/ +ERROR: syntax error, the expected value is a string. at or near ";" +LINE 4: resignal sqlstate value; + ^ +QUERY: DECLARE BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value; + END; + DROP TABLE t1; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values; + END; + DROP TABLE t1; +END; +/ +ERROR: syntax error, the expected word is value. at or near "values" +LINE 4: resignal sqlstate values; + ^ +QUERY: DECLARE BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values; + END; + DROP TABLE t1; +END \c regression drop database mysql_test_resignal; diff --git a/src/test/regress/expected/mysql_signal.out b/src/test/regress/expected/mysql_signal.out index 239846df6..b938e90b2 100644 --- a/src/test/regress/expected/mysql_signal.out +++ b/src/test/regress/expected/mysql_signal.out @@ -1544,5 +1544,60 @@ show warnings; Error | 22 | duplicated! (1 row) +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate 01001; +END; +/ +ERROR: syntax error, the expected value is a string. at or near "01001" +LINE 2: signal sqlstate 01001; + ^ +QUERY: DECLARE BEGIN + signal sqlstate 01001; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate value 01001; +END; +/ +ERROR: syntax error, the expected value is a string. at or near "01001" +LINE 2: signal sqlstate value 01001; + ^ +QUERY: DECLARE BEGIN + signal sqlstate value 01001; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate values 01001; +END; +/ +ERROR: syntax error, the expected word is value. at or near "values" +LINE 2: signal sqlstate values 01001; + ^ +QUERY: DECLARE BEGIN + signal sqlstate values 01001; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate value; +END; +/ +ERROR: syntax error, the expected value is a string. at or near ";" +LINE 2: signal sqlstate value; + ^ +QUERY: DECLARE BEGIN + signal sqlstate value; +END +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate values; +END; +/ +ERROR: syntax error, the expected word is value. at or near "values" +LINE 2: signal sqlstate values; + ^ +QUERY: DECLARE BEGIN + signal sqlstate values; +END \c regression drop database mysql_test_signal; diff --git a/src/test/regress/sql/mysql_resignal.sql b/src/test/regress/sql/mysql_resignal.sql index cd086ae43..626653871 100644 --- a/src/test/regress/sql/mysql_resignal.sql +++ b/src/test/regress/sql/mysql_resignal.sql @@ -1250,5 +1250,56 @@ call p2(); show warnings; select @a, @error_count; +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate 01001; + END; + DROP TABLE t1; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value 01001; + END; + DROP TABLE t1; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values 01001; + END; + DROP TABLE t1; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate value; + END; + DROP TABLE t1; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + resignal sqlstate values; + END; + DROP TABLE t1; +END; +/ + + \c regression drop database mysql_test_resignal; \ No newline at end of file diff --git a/src/test/regress/sql/mysql_signal.sql b/src/test/regress/sql/mysql_signal.sql index 19f1a148e..28d555f1c 100644 --- a/src/test/regress/sql/mysql_signal.sql +++ b/src/test/regress/sql/mysql_signal.sql @@ -965,5 +965,35 @@ call p2(0); call p2(0); show warnings; +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate 01001; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate value 01001; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate values 01001; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate value; +END; +/ + +CREATE OR REPLACE PROCEDURE p() IS +BEGIN + signal sqlstate values; +END; +/ + \c regression drop database mysql_test_signal; \ No newline at end of file