summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2021-10-20 12:02:35 +0530
committerRucha Deodhar <rucha.deodhar@mariadb.com>2021-10-21 17:13:13 +0530
commitb14b6f31fa27cbceb5a8d85ed83c809d0ad471b7 (patch)
tree0e1066b745035cf4d139f7a29004f12e2f5c2738
parentd555ae38381a5b35449dea3ec2a8507a83f5b72c (diff)
downloadmariadb-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.result27
-rw-r--r--mysql-test/main/get_diagnostics.test29
-rw-r--r--sql/sp_head.cc1
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.