Commit a76a2522 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-14426 Assertion in Diagnostics_area::set_error_status when using a bad datetime with PS and SP

parent 9c28fd7a
......@@ -5074,3 +5074,32 @@ t1 CREATE TABLE `t1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
DROP PROCEDURE p1;
#
# MDEV-14426 Assertion in Diagnostics_area::set_error_status when using a bad datetime with PS and SP
#
CREATE PROCEDURE p1(OUT a VARCHAR(20))
BEGIN
SET a=10;
END;
$$
BEGIN NOT ATOMIC
DECLARE a DATETIME;
CALL p1(a);
END;
$$
ERROR 22007: Incorrect datetime value: '10' for column 'a' at row 1
BEGIN NOT ATOMIC
DECLARE a DATETIME;
EXECUTE IMMEDIATE 'CALL p1(?)' USING a;
END;
$$
ERROR 22007: Incorrect datetime value: '10' for column 'a' at row 1
BEGIN NOT ATOMIC
DECLARE a DATETIME;
PREPARE stmt FROM 'CALL p1(?)';
EXECUTE stmt USING a;
DEALLOCATE PREPARE stmt;
END;
$$
ERROR 22007: Incorrect datetime value: '10' for column 'a' at row 1
DROP PROCEDURE p1;
......@@ -4529,3 +4529,37 @@ CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
SHOW CREATE TABLE t1;
DROP TABLE t1;
DROP PROCEDURE p1;
--echo #
--echo # MDEV-14426 Assertion in Diagnostics_area::set_error_status when using a bad datetime with PS and SP
--echo #
DELIMITER $$;
CREATE PROCEDURE p1(OUT a VARCHAR(20))
BEGIN
SET a=10;
END;
$$
--error ER_TRUNCATED_WRONG_VALUE
BEGIN NOT ATOMIC
DECLARE a DATETIME;
CALL p1(a);
END;
$$
--error ER_TRUNCATED_WRONG_VALUE
BEGIN NOT ATOMIC
DECLARE a DATETIME;
EXECUTE IMMEDIATE 'CALL p1(?)' USING a;
END;
$$
--error ER_TRUNCATED_WRONG_VALUE
BEGIN NOT ATOMIC
DECLARE a DATETIME;
PREPARE stmt FROM 'CALL p1(?)';
EXECUTE stmt USING a;
DEALLOCATE PREPARE stmt;
END;
$$
DELIMITER ;$$
DROP PROCEDURE p1;
......@@ -4786,7 +4786,19 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor)
if (error == 0 && this->lex->sql_command == SQLCOM_CALL)
{
if (is_sql_prepare())
{
/*
Here we have the diagnostics area status already set to DA_OK.
sent_out_parameters() can raise errors when assigning OUT parameters:
DECLARE a DATETIME;
EXECUTE IMMEDIATE 'CALL p1(?)' USING a;
when the procedure p1 assigns a DATETIME-incompatible value (e.g. 10)
to the out parameter. Allow to overwrite status (to DA_ERROR).
*/
thd->get_stmt_da()->set_overwrite_status(true);
thd->protocol_text.send_out_parameters(&this->lex->param_list);
thd->get_stmt_da()->set_overwrite_status(false);
}
else
thd->protocol->send_out_parameters(&this->lex->param_list);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment