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:
@ -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;
|
||||
|
Reference in New Issue
Block a user