Skip to content

Commit 2ae721f

Browse files
committedMar 19, 2025
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.
1 parent 1756b0f commit 2ae721f

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed
 

‎mysql-test/main/sp-row.result

+41
Original file line numberDiff line numberDiff line change
@@ -2313,3 +2313,44 @@ SELECT 1 LIKE 2 ESCAPE a;
23132313
END;
23142314
$$
23152315
ERROR 21000: Operand should contain 1 column(s)
2316+
# Start of 10.6 tests
2317+
#
2318+
# MDEV-36179 Assertion `0' failed in virtual bool Type_handler_row::Item_save_in_value(THD*, Item*, st_value*) const
2319+
#
2320+
CREATE PROCEDURE p0 (IN a ROW(a INT,b INT))
2321+
BEGIN
2322+
SET a=ROW(0,0);
2323+
END;
2324+
/
2325+
PREPARE s0 FROM 'CALL p0(?)';
2326+
EXECUTE s0 USING @a;
2327+
ERROR HY000: Illegal parameter data type row for operation 'EXECUTE ... USING ?'
2328+
DROP PROCEDURE p0;
2329+
CREATE PROCEDURE p0 (INOUT a ROW(a INT,b INT))
2330+
BEGIN
2331+
SET a=ROW(0,0);
2332+
END;
2333+
/
2334+
PREPARE s0 FROM 'CALL p0(?)';
2335+
EXECUTE s0 USING @a;
2336+
ERROR HY000: Illegal parameter data type row for operation 'EXECUTE ... USING ?'
2337+
DROP PROCEDURE p0;
2338+
CREATE PROCEDURE p0 (OUT a ROW(a INT,b INT))
2339+
BEGIN
2340+
SET a=ROW(0,0);
2341+
END;
2342+
/
2343+
PREPARE s0 FROM 'CALL p0(?)';
2344+
EXECUTE s0 USING @a;
2345+
ERROR HY000: Illegal parameter data type row for operation 'EXECUTE ... USING ?'
2346+
DROP PROCEDURE p0;
2347+
CREATE FUNCTION f0(a ROW(a INT,b INT)) RETURNS BOOLEAN
2348+
BEGIN
2349+
RETURN FALSE;
2350+
END;
2351+
/
2352+
PREPARE s0 FROM 'SELECT f0(?)';
2353+
EXECUTE s0 USING @a;
2354+
ERROR HY000: Illegal parameter data type row for operation 'EXECUTE ... USING ?'
2355+
DROP FUNCTION f0;
2356+
# End of 10.6 tests

‎mysql-test/main/sp-row.test

+61
Original file line numberDiff line numberDiff line change
@@ -1544,3 +1544,64 @@ BEGIN NOT ATOMIC
15441544
END;
15451545
$$
15461546
DELIMITER ;$$
1547+
1548+
1549+
--echo # Start of 10.6 tests
1550+
1551+
1552+
--echo #
1553+
--echo # MDEV-36179 Assertion `0' failed in virtual bool Type_handler_row::Item_save_in_value(THD*, Item*, st_value*) const
1554+
--echo #
1555+
1556+
DELIMITER /;
1557+
CREATE PROCEDURE p0 (IN a ROW(a INT,b INT))
1558+
BEGIN
1559+
SET a=ROW(0,0);
1560+
END;
1561+
/
1562+
DELIMITER ;/
1563+
PREPARE s0 FROM 'CALL p0(?)';
1564+
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
1565+
EXECUTE s0 USING @a;
1566+
DROP PROCEDURE p0;
1567+
1568+
1569+
DELIMITER /;
1570+
CREATE PROCEDURE p0 (INOUT a ROW(a INT,b INT))
1571+
BEGIN
1572+
SET a=ROW(0,0);
1573+
END;
1574+
/
1575+
DELIMITER ;/
1576+
PREPARE s0 FROM 'CALL p0(?)';
1577+
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
1578+
EXECUTE s0 USING @a;
1579+
DROP PROCEDURE p0;
1580+
1581+
1582+
DELIMITER /;
1583+
CREATE PROCEDURE p0 (OUT a ROW(a INT,b INT))
1584+
BEGIN
1585+
SET a=ROW(0,0);
1586+
END;
1587+
/
1588+
DELIMITER ;/
1589+
PREPARE s0 FROM 'CALL p0(?)';
1590+
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
1591+
EXECUTE s0 USING @a;
1592+
DROP PROCEDURE p0;
1593+
1594+
1595+
DELIMITER /;
1596+
CREATE FUNCTION f0(a ROW(a INT,b INT)) RETURNS BOOLEAN
1597+
BEGIN
1598+
RETURN FALSE;
1599+
END;
1600+
/
1601+
DELIMITER ;/
1602+
PREPARE s0 FROM 'SELECT f0(?)';
1603+
--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
1604+
EXECUTE s0 USING @a;
1605+
DROP FUNCTION f0;
1606+
1607+
--echo # End of 10.6 tests

‎sql/sp_head.cc

+37
Original file line numberDiff line numberDiff line change
@@ -2114,6 +2114,27 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount,
21142114
/* Arguments must be fixed in Item_func_sp::fix_fields */
21152115
DBUG_ASSERT(argp[arg_no]->fixed());
21162116

2117+
sp_variable *spvar= m_pcont->find_variable(arg_no);
2118+
2119+
if (!spvar)
2120+
continue;
2121+
2122+
/*
2123+
When you get a merge conflict, please move this code
2124+
into bind_input_param(). This also applies to the similar
2125+
code in execute_procedure().
2126+
*/
2127+
if (!spvar->field_def.type_handler()->is_scalar_type() &&
2128+
dynamic_cast<Item_param*>(argp[arg_no]))
2129+
{
2130+
// Item_param cannot store values of non-scalar data types yet
2131+
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION, MYF(0),
2132+
spvar->field_def.type_handler()->name().ptr(),
2133+
"EXECUTE ... USING ?");
2134+
err_status= true;
2135+
goto err_with_cleanup;
2136+
}
2137+
21172138
if ((err_status= (*func_ctx)->set_parameter(thd, arg_no, &(argp[arg_no]))))
21182139
goto err_with_cleanup;
21192140
}
@@ -2359,11 +2380,27 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
23592380
if (!arg_item)
23602381
break;
23612382

2383+
/*
2384+
When you get a merge conflict, please move this code
2385+
into bind_input_param(). This also applies to the similar
2386+
code in execute_function().
2387+
*/
23622388
sp_variable *spvar= m_pcont->find_variable(i);
23632389

23642390
if (!spvar)
23652391
continue;
23662392

2393+
if (!spvar->field_def.type_handler()->is_scalar_type() &&
2394+
dynamic_cast<Item_param*>(arg_item))
2395+
{
2396+
// Item_param cannot store values of non-scalar data types yet
2397+
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION, MYF(0),
2398+
spvar->field_def.type_handler()->name().ptr(),
2399+
"EXECUTE ... USING ?");
2400+
err_status= true;
2401+
break;
2402+
}
2403+
23672404
if (spvar->mode != sp_variable::MODE_IN)
23682405
{
23692406
Settable_routine_parameter *srp=

0 commit comments

Comments
 (0)