diff options
author | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2021-10-20 12:02:35 +0530 |
---|---|---|
committer | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2021-10-21 17:13:13 +0530 |
commit | b14b6f31fa27cbceb5a8d85ed83c809d0ad471b7 (patch) | |
tree | 0e1066b745035cf4d139f7a29004f12e2f5c2738 | |
parent | d555ae38381a5b35449dea3ec2a8507a83f5b72c (diff) | |
download | mariadb-git-bb-10.7-row_number-MDEV-26843.tar.gz |
MDEV-26843: Inconsistent behavior of ROW_NUMBER upon resignalling frombb-10.7-row_number-MDEV-26843
function
Analysis: ROW_NUMBER should be 0 because the error produced is not related to
statement that modifies table data. It is just wrong number of arguments.
However, ROW_NUMBER is 1 because m_current_row_for_warning is not set to 0
before executing function.
Fix: Set m_current_row_for_warning to 0.
-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. |