mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-36179 Assertion `0' failed in virtual bool Type_handler_row::Item_save_in_value(THD*, Item*, st_value*) const
sp_head::execute_procedure() and sp_head::execute_function() did not check that Item_param could be passed as an actual parameter to a ROW type formal parameter of a stored routine. Example: CREATE PROCEDURE p0(OUT a ROW(a INT,b INT)) ...; PREPARE s0 'CALL p0(?)'; EXECUTE p0 USING @a; In case of passing a user variable as an OUT parameter it led to a crash after executing routine instructions, when copying formal OUT parameters to the bound actual parameters. Fix: Check cases when Item_param is being bound to a ROW type formal parameter. Raise an error if so. The new check is done for all parameter modes: IN, OUT, INOUT, for a consistent error message. The new check is done before executing the routine instructions.
This commit is contained in:
@@ -1544,3 +1544,64 @@ BEGIN NOT ATOMIC
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
|
||||
--echo # Start of 10.6 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36179 Assertion `0' failed in virtual bool Type_handler_row::Item_save_in_value(THD*, Item*, st_value*) const
|
||||
--echo #
|
||||
|
||||
DELIMITER /;
|
||||
CREATE PROCEDURE p0 (IN a ROW(a INT,b INT))
|
||||
BEGIN
|
||||
SET a=ROW(0,0);
|
||||
END;
|
||||
/
|
||||
DELIMITER ;/
|
||||
PREPARE s0 FROM 'CALL p0(?)';
|
||||
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||
EXECUTE s0 USING @a;
|
||||
DROP PROCEDURE p0;
|
||||
|
||||
|
||||
DELIMITER /;
|
||||
CREATE PROCEDURE p0 (INOUT a ROW(a INT,b INT))
|
||||
BEGIN
|
||||
SET a=ROW(0,0);
|
||||
END;
|
||||
/
|
||||
DELIMITER ;/
|
||||
PREPARE s0 FROM 'CALL p0(?)';
|
||||
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||
EXECUTE s0 USING @a;
|
||||
DROP PROCEDURE p0;
|
||||
|
||||
|
||||
DELIMITER /;
|
||||
CREATE PROCEDURE p0 (OUT a ROW(a INT,b INT))
|
||||
BEGIN
|
||||
SET a=ROW(0,0);
|
||||
END;
|
||||
/
|
||||
DELIMITER ;/
|
||||
PREPARE s0 FROM 'CALL p0(?)';
|
||||
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||
EXECUTE s0 USING @a;
|
||||
DROP PROCEDURE p0;
|
||||
|
||||
|
||||
DELIMITER /;
|
||||
CREATE FUNCTION f0(a ROW(a INT,b INT)) RETURNS BOOLEAN
|
||||
BEGIN
|
||||
RETURN FALSE;
|
||||
END;
|
||||
/
|
||||
DELIMITER ;/
|
||||
PREPARE s0 FROM 'SELECT f0(?)';
|
||||
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||
EXECUTE s0 USING @a;
|
||||
DROP FUNCTION f0;
|
||||
|
||||
--echo # End of 10.6 tests
|
||||
|
Reference in New Issue
Block a user