From 915c5df865909b6801d6b5f43a48a5998a2e0de5 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 20 Feb 2017 19:50:39 +0400 Subject: [PATCH] MDEV-12088 sql_mode=ORACLE: Do not require BEGIN..END in multi-statement exception handlers in THEN clause --- .../suite/compat/oracle/r/exception.result | 26 +++++++++++++++++++ .../suite/compat/oracle/t/exception.test | 24 +++++++++++++++++ sql/sql_yacc_ora.yy | 6 ++--- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/compat/oracle/r/exception.result b/mysql-test/suite/compat/oracle/r/exception.result index 9c40252a16366..b61d25f36ee3a 100644 --- a/mysql-test/suite/compat/oracle/r/exception.result +++ b/mysql-test/suite/compat/oracle/r/exception.result @@ -381,3 +381,29 @@ DROP FUNCTION f1; # # End of MDEV-10587 sql_mode=ORACLE: User defined exceptions # +# +# MDEV-12088 sql_mode=ORACLE: Do not require BEGIN..END in multi-statement exception handlers in THEN clause +# +CREATE TABLE t1 (a INT PRIMARY KEY); +INSERT INTO t1 VALUES (10),(20),(30); +CREATE PROCEDURE p1(a INT) AS +BEGIN +INSERT INTO t1 (a) VALUES (a); +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +a:= a+1; +INSERT INTO t1 VALUES (a); +WHEN OTHERS THEN +NULL; +NULL; +END; +$$ +CALL p1(30); +SELECT * FROM t1; +a +10 +20 +30 +31 +DROP PROCEDURE p1; +DROP TABLE t1; diff --git a/mysql-test/suite/compat/oracle/t/exception.test b/mysql-test/suite/compat/oracle/t/exception.test index 07061abb6bcd3..6448a6ef627e0 100644 --- a/mysql-test/suite/compat/oracle/t/exception.test +++ b/mysql-test/suite/compat/oracle/t/exception.test @@ -431,3 +431,27 @@ DROP FUNCTION f1; --echo # --echo # End of MDEV-10587 sql_mode=ORACLE: User defined exceptions --echo # + +--echo # +--echo # MDEV-12088 sql_mode=ORACLE: Do not require BEGIN..END in multi-statement exception handlers in THEN clause +--echo # +CREATE TABLE t1 (a INT PRIMARY KEY); +INSERT INTO t1 VALUES (10),(20),(30); +DELIMITER $$; +CREATE PROCEDURE p1(a INT) AS +BEGIN + INSERT INTO t1 (a) VALUES (a); +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + a:= a+1; + INSERT INTO t1 VALUES (a); + WHEN OTHERS THEN + NULL; + NULL; +END; +$$ +DELIMITER ;$$ +CALL p1(30); +SELECT * FROM t1; +DROP PROCEDURE p1; +DROP TABLE t1; diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index cebf78995ff43..d9f1ccd975ed5 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -3734,8 +3734,8 @@ opt_exception_clause: ; exception_handlers: - exception_handler ';' { $$= 1; } - | exception_handlers exception_handler ';' { $$= $1 + 1; } + exception_handler { $$= 1; } + | exception_handlers exception_handler { $$= $1 + 1; } ; exception_handler: @@ -3746,7 +3746,7 @@ exception_handler: } sp_hcond_list THEN_SYM - sp_proc_stmt + sp_proc_stmts1_implicit_block { if (Lex->sp_handler_declaration_finalize(thd, sp_handler::EXIT)) MYSQL_YYABORT;