1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-26606: ROW_NUMBER property value isn't passed from inside a stored

procedure

Analysis: m_current_row_for_warning is reset to 1 during cleanup phase of
stored procedure. When we perform a copy because some statement of procedure
created warning, this reset value is passed to push_warning().
Hence the output is always 1.
Fix: Add a parameter in relevant functions to pass correct value of
row_number and don't use m_current_row_for_warning directly.
This commit is contained in:
Rucha Deodhar
2021-09-26 01:30:36 +05:30
parent 25921c997e
commit 479e303ef3
6 changed files with 140 additions and 10 deletions

View File

@ -1430,3 +1430,69 @@ DROP TABLE t1,t2;
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP VIEW v;
--echo #
--echo # MDEV-26606: ROW_NUMBER property value isn't passed from inside a
--echo # stored procedure
--echo #
--echo # Test 1: Without RESIGNAL
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
CREATE OR REPLACE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
SET @num=null, @msg=null;
INSERT INTO t1 VALUES(1);
--error ER_DUP_ENTRY
CALL sp(1);
GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
SELECT @num, @msg;
DROP PROCEDURE sp;
DROP TABLE t1;
--echo # Test 2: With RESIGNAL
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
DELIMITER |;
CREATE OR REPLACE PROCEDURE sp(a INT)
BEGIN
DECLARE n INT;
DECLARE m VARCHAR(255);
DECLARE EXIT HANDLER FOR 1062
BEGIN
GET DIAGNOSTICS CONDITION 1 n = ROW_NUMBER, m = MESSAGE_TEXT;
SELECT n, m;
RESIGNAL;
END;
INSERT INTO t1 VALUES (2), (a);
END |
DELIMITER ;|
SET @num=null, @msg=null;
INSERT INTO t1 VALUES (1);
--error ER_DUP_ENTRY
CALL sp(1);
GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
SELECT @num, @msg;
DROP PROCEDURE sp;
DROP TABLE t1;
--echo # Checking more errors
CREATE TABLE t1 (val1 TINYINT);
CREATE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
INSERT INTO t1 VALUES(1);
CALL sp(100000);
GET DIAGNOSTICS CONDITION 1 @var1= ROW_NUMBER;
SELECT @var1;
DROP TABLE t1;
DROP PROCEDURE sp;