Skip to content

Commit

Permalink
MDEV-14426 Assertion in Diagnostics_area::set_error_status when using…
Browse files Browse the repository at this point in the history
… a bad datetime with PS and SP
  • Loading branch information
Alexander Barkov committed Dec 22, 2017
1 parent 9c28fd7 commit a76a252
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
29 changes: 29 additions & 0 deletions mysql-test/r/ps.result
Original file line number Diff line number Diff line change
Expand Up @@ -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;
34 changes: 34 additions & 0 deletions mysql-test/t/ps.test
Original file line number Diff line number Diff line change
Expand Up @@ -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;
12 changes: 12 additions & 0 deletions sql/sql_prepare.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit a76a252

Please sign in to comment.