Skip to content

Commit 5cc9cf9

Browse files
MDEV-26681: ROW_NUMBER is not available within compound statement blocks
Fixed after patch MDEV-26606 because root cause was same. 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(). Fix: Add a parameter in relevant functions to pass correct value of error index and don't use m_current_row_for_warning directly.
1 parent af95c99 commit 5cc9cf9

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

mysql-test/main/get_diagnostics.result

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,3 +1638,36 @@ SELECT @ind, @msg;
16381638
@ind @msg
16391639
0 Invalid condition number
16401640
DROP TABLE t1;
1641+
#
1642+
# MDEV-26681: ROW_NUMBER is not available within compound statement blocks
1643+
#
1644+
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, a CHAR(3));
1645+
INSERT IGNORE INTO t1 VALUES (1,'foo'),(1,'bar'),(2,'foobar');
1646+
Warnings:
1647+
Warning 1062 Duplicate entry '1' for key 'PRIMARY'
1648+
Warning 1265 Data truncated for column 'a' at row 3
1649+
BEGIN NOT ATOMIC
1650+
DECLARE i INT DEFAULT 0;
1651+
DECLARE rnum INT DEFAULT -1;
1652+
DECLARE msg VARCHAR(1024) DEFAULT '';
1653+
DECLARE err INT DEFAULT -1;
1654+
WHILE i < @@warning_count
1655+
DO
1656+
SET i = i + 1;
1657+
GET DIAGNOSTICS CONDITION i rnum = ROW_NUMBER, msg = MESSAGE_TEXT, err = MYSQL_ERRNO;
1658+
SELECT i, rnum, msg, err;
1659+
END WHILE;
1660+
END |
1661+
i rnum msg err
1662+
1 2 Duplicate entry '1' for key 'PRIMARY' 1062
1663+
i rnum msg err
1664+
2 3 Data truncated for column 'a' at row 3 1265
1665+
GET DIAGNOSTICS CONDITION 1 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
1666+
select @rnum, @msg, @err;
1667+
@rnum @msg @err
1668+
2 Duplicate entry '1' for key 'PRIMARY' 1062
1669+
GET DIAGNOSTICS CONDITION 2 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
1670+
SELECT @rnum, @msg, @err;
1671+
@rnum @msg @err
1672+
3 Data truncated for column 'a' at row 3 1265
1673+
DROP TABLE t1;

mysql-test/main/get_diagnostics.test

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,3 +1520,35 @@ GET DIAGNOSTICS CONDITION 5 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
15201520
SELECT @ind, @msg;
15211521

15221522
DROP TABLE t1;
1523+
1524+
--echo #
1525+
--echo # MDEV-26681: ROW_NUMBER is not available within compound statement blocks
1526+
--echo #
1527+
1528+
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, a CHAR(3));
1529+
INSERT IGNORE INTO t1 VALUES (1,'foo'),(1,'bar'),(2,'foobar');
1530+
1531+
DELIMITER |;
1532+
1533+
BEGIN NOT ATOMIC
1534+
DECLARE i INT DEFAULT 0;
1535+
DECLARE rnum INT DEFAULT -1;
1536+
DECLARE msg VARCHAR(1024) DEFAULT '';
1537+
DECLARE err INT DEFAULT -1;
1538+
WHILE i < @@warning_count
1539+
DO
1540+
SET i = i + 1;
1541+
GET DIAGNOSTICS CONDITION i rnum = ROW_NUMBER, msg = MESSAGE_TEXT, err = MYSQL_ERRNO;
1542+
SELECT i, rnum, msg, err;
1543+
END WHILE;
1544+
END |
1545+
1546+
DELIMITER ;|
1547+
1548+
GET DIAGNOSTICS CONDITION 1 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
1549+
select @rnum, @msg, @err;
1550+
1551+
GET DIAGNOSTICS CONDITION 2 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
1552+
SELECT @rnum, @msg, @err;
1553+
1554+
DROP TABLE t1;

sql/lex.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,6 @@ SYMBOL symbols[] = {
567567
{ "ROWS", SYM(ROWS_SYM)},
568568
{ "ROWTYPE", SYM(ROWTYPE_MARIADB_SYM)},
569569
{ "ROW_COUNT", SYM(ROW_COUNT_SYM)},
570-
/** sql_function and condition_property_name for GET DIAGNOSTICS */
571-
{ "ROW_NUMBER", SYM(ROW_NUMBER_SYM)},
572570
{ "ROW_FORMAT", SYM(ROW_FORMAT_SYM)},
573571
/** sql_function and condition_property_name for GET DIAGNOSTICS */
574572
{ "ROW_NUMBER", SYM(ROW_NUMBER_SYM)},

0 commit comments

Comments
 (0)