Skip to content

Commit ff5de38

Browse files
mariadb-RuchaDeodharvuvova
authored andcommitted
MDEV-26832: ROW_NUMBER in SIGNAL/RESIGNAL causes a syntax error
Analysis: Parser was missing ROW_NUMBER as syntax for SIGNAL and RESIGNAL. Fix: Fix parser and fix how m_row_number is copied like other attributes to avoid ROW_NUMBER from assuming default value.
1 parent b15a5f6 commit ff5de38

File tree

6 files changed

+118
-1
lines changed

6 files changed

+118
-1
lines changed

mysql-test/main/get_diagnostics.result

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,3 +1689,42 @@ SELECT @n, @m;
16891689
@n @m
16901690
2 Out of range value for column 'f' at row 2
16911691
DROP TABLE t;
1692+
#
1693+
# MDEV-26832: ROW_NUMBER in SIGNAL/RESIGNAL causes a syntax error
1694+
#
1695+
# using signal
1696+
CREATE PROCEDURE signal_syntax()
1697+
BEGIN
1698+
DECLARE errno INT DEFAULT 0;
1699+
DECLARE msg TEXT DEFAULT "foo";
1700+
DECLARE row_num INT DEFAULT 0;
1701+
DECLARE cond CONDITION FOR SQLSTATE "01234";
1702+
DECLARE CONTINUE HANDLER for 1012
1703+
BEGIN
1704+
GET DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT, row_num= ROW_NUMBER;
1705+
END;
1706+
SIGNAL cond SET MESSAGE_TEXT = "Signal message", MYSQL_ERRNO = 1012, ROW_NUMBER= 5;
1707+
SELECT errno, msg, row_num;
1708+
END|
1709+
CALL signal_syntax();
1710+
errno msg row_num
1711+
1012 Signal message 5
1712+
DROP PROCEDURE signal_syntax;
1713+
# using resignal
1714+
CREATE PROCEDURE resignal_syntax()
1715+
BEGIN
1716+
DECLARE CONTINUE HANDLER
1717+
FOR 1146
1718+
BEGIN
1719+
RESIGNAL SET
1720+
MESSAGE_TEXT = '`temptab` does not exist', ROW_NUMBER= 105;
1721+
END;
1722+
SELECT `c` FROM `temptab`;
1723+
END|
1724+
CALL resignal_syntax();
1725+
ERROR 42S02: `temptab` does not exist
1726+
GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER;
1727+
SELECT @row_num;
1728+
@row_num
1729+
105
1730+
DROP PROCEDURE resignal_syntax;

mysql-test/main/get_diagnostics.test

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,3 +1565,56 @@ GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER, @m = MESSAGE_TEXT;
15651565
SELECT @n, @m;
15661566

15671567
DROP TABLE t;
1568+
1569+
--echo #
1570+
--echo # MDEV-26832: ROW_NUMBER in SIGNAL/RESIGNAL causes a syntax error
1571+
--echo #
1572+
1573+
--echo # using signal
1574+
1575+
DELIMITER |;
1576+
CREATE PROCEDURE signal_syntax()
1577+
BEGIN
1578+
DECLARE errno INT DEFAULT 0;
1579+
DECLARE msg TEXT DEFAULT "foo";
1580+
DECLARE row_num INT DEFAULT 0;
1581+
DECLARE cond CONDITION FOR SQLSTATE "01234";
1582+
DECLARE CONTINUE HANDLER for 1012
1583+
BEGIN
1584+
GET DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT, row_num= ROW_NUMBER;
1585+
END;
1586+
1587+
SIGNAL cond SET MESSAGE_TEXT = "Signal message", MYSQL_ERRNO = 1012, ROW_NUMBER= 5;
1588+
1589+
SELECT errno, msg, row_num;
1590+
END|
1591+
DELIMITER ;|
1592+
1593+
CALL signal_syntax();
1594+
1595+
DROP PROCEDURE signal_syntax;
1596+
1597+
--echo # using resignal
1598+
1599+
DELIMITER |;
1600+
1601+
CREATE PROCEDURE resignal_syntax()
1602+
BEGIN
1603+
DECLARE CONTINUE HANDLER
1604+
FOR 1146
1605+
BEGIN
1606+
RESIGNAL SET
1607+
MESSAGE_TEXT = '`temptab` does not exist', ROW_NUMBER= 105;
1608+
END;
1609+
SELECT `c` FROM `temptab`;
1610+
END|
1611+
1612+
DELIMITER ;|
1613+
1614+
--error ER_NO_SUCH_TABLE
1615+
CALL resignal_syntax();
1616+
1617+
GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER;
1618+
SELECT @row_num;
1619+
1620+
DROP PROCEDURE resignal_syntax;

sql/sql_class.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,8 @@ typedef enum enum_diag_condition_item_name
560560
DIAG_CURSOR_NAME= 9,
561561
DIAG_MESSAGE_TEXT= 10,
562562
DIAG_MYSQL_ERRNO= 11,
563-
LAST_DIAG_SET_PROPERTY= DIAG_MYSQL_ERRNO
563+
DIAG_ROW_NUMBER= 12,
564+
LAST_DIAG_SET_PROPERTY= DIAG_ROW_NUMBER
564565
} Diag_condition_item_name;
565566

566567
/**

sql/sql_error.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ Sql_condition::copy_opt_attributes(const Sql_condition *cond)
204204
copy_string(m_mem_root, & m_table_name, & cond->m_table_name);
205205
copy_string(m_mem_root, & m_column_name, & cond->m_column_name);
206206
copy_string(m_mem_root, & m_cursor_name, & cond->m_cursor_name);
207+
m_row_number= cond->m_row_number;
207208
}
208209

209210

sql/sql_signal.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const LEX_CSTRING Diag_condition_item_names[]=
4444
{ STRING_WITH_LEN("CURSOR_NAME") },
4545
{ STRING_WITH_LEN("MESSAGE_TEXT") },
4646
{ STRING_WITH_LEN("MYSQL_ERRNO") },
47+
{ STRING_WITH_LEN("ROW_NUMBER") },
4748

4849
{ STRING_WITH_LEN("CONDITION_IDENTIFIER") },
4950
{ STRING_WITH_LEN("CONDITION_NUMBER") },
@@ -309,6 +310,26 @@ int Sql_cmd_common_signal::eval_signal_informations(THD *thd, Sql_condition *con
309310
cond->m_sql_errno= (int) code;
310311
}
311312

313+
set= m_set_signal_information.m_item[DIAG_ROW_NUMBER];
314+
if (set != NULL)
315+
{
316+
if (set->is_null())
317+
{
318+
thd->raise_error_printf(ER_WRONG_VALUE_FOR_VAR,
319+
"ROW_NUMBER", "NULL");
320+
goto end;
321+
}
322+
longlong row_number_value= set->val_int();
323+
if (row_number_value < 0)
324+
{
325+
str= set->val_str(& str_value);
326+
thd->raise_error_printf(ER_WRONG_VALUE_FOR_VAR,
327+
"ROW_NUMBER", str->c_ptr_safe());
328+
goto end;
329+
}
330+
cond->m_row_number= (ulong) row_number_value;
331+
}
332+
312333
/*
313334
The various item->val_xxx() methods don't return an error code,
314335
but flag thd in case of failure.

sql/sql_yacc.yy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,6 +3475,8 @@ signal_condition_information_item_name:
34753475
{ $$= DIAG_MESSAGE_TEXT; }
34763476
| MYSQL_ERRNO_SYM
34773477
{ $$= DIAG_MYSQL_ERRNO; }
3478+
| ROW_NUMBER_SYM
3479+
{ $$= DIAG_ROW_NUMBER; }
34783480
;
34793481

34803482
resignal_stmt:

0 commit comments

Comments
 (0)