diff options
-rw-r--r-- | mysql-test/main/get_diagnostics.result | 27 | ||||
-rw-r--r-- | mysql-test/main/get_diagnostics.test | 29 | ||||
-rw-r--r-- | sql/sp_head.cc | 1 |
3 files changed, 57 insertions, 0 deletions
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result index a884ebe3fe0..3d088f74bd4 100644 --- a/mysql-test/main/get_diagnostics.result +++ b/mysql-test/main/get_diagnostics.result @@ -1783,3 +1783,30 @@ SELECT @n; @n 4 DROP TABLE t1; +# +# MDEV-26843: Inconsistent behavior of ROW_NUMBER upon resignalling from function +# +CREATE OR REPLACE FUNCTION f(a INT) RETURNS INT RETURN a; +CREATE OR REPLACE FUNCTION f2() RETURNS INT +BEGIN +DECLARE i INT DEFAULT -1; +DECLARE EXIT HANDLER FOR 1318 +BEGIN +GET DIAGNOSTICS CONDITION 1 @row_number_in_f2= ROW_NUMBER, @msg_in_f2= MESSAGE_TEXT; +RESIGNAL; +RETURN -2; +END; +SELECT f() INTO i; +RETURN i; +END | +SELECT f2(); +ERROR 42000: Incorrect number of arguments for FUNCTION test.f; expected 1, got 0 +GET DIAGNOSTICS CONDITION 1 @row_number_outside= ROW_NUMBER, @msg_outside= MESSAGE_TEXT; +SELECT @row_number_in_f2, @msg_in_f2; +@row_number_in_f2 @msg_in_f2 +0 Incorrect number of arguments for FUNCTION test.f; expected 1, got 0 +SELECT @row_number_outside, @msg_outside; +@row_number_outside @msg_outside +0 Incorrect number of arguments for FUNCTION test.f; expected 1, got 0 +DROP FUNCTION f2; +DROP FUNCTION f; diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test index a1779f3c0ab..826799a4c11 100644 --- a/mysql-test/main/get_diagnostics.test +++ b/mysql-test/main/get_diagnostics.test @@ -1667,3 +1667,32 @@ GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER; SELECT @n; DROP TABLE t1; + +--echo # +--echo # MDEV-26843: Inconsistent behavior of ROW_NUMBER upon resignalling from function +--echo # +CREATE OR REPLACE FUNCTION f(a INT) RETURNS INT RETURN a; +DELIMITER |; +CREATE OR REPLACE FUNCTION f2() RETURNS INT +BEGIN + DECLARE i INT DEFAULT -1; + DECLARE EXIT HANDLER FOR 1318 + BEGIN + GET DIAGNOSTICS CONDITION 1 @row_number_in_f2= ROW_NUMBER, @msg_in_f2= MESSAGE_TEXT; + RESIGNAL; + RETURN -2; + END; + SELECT f() INTO i; + RETURN i; +END | +DELIMITER ;| + +--error ER_SP_WRONG_NO_OF_ARGS +SELECT f2(); + +GET DIAGNOSTICS CONDITION 1 @row_number_outside= ROW_NUMBER, @msg_outside= MESSAGE_TEXT; +SELECT @row_number_in_f2, @msg_in_f2; +SELECT @row_number_outside, @msg_outside; + +DROP FUNCTION f2; +DROP FUNCTION f; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index d1cf5c2d9bd..ebae2f356bd 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -2033,6 +2033,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, */ if (argcount != m_pcont->context_var_count()) { + thd->get_stmt_da()->reset_current_row_for_warning(0); /* Need to use my_error here, or it will not terminate the invoking query properly. |