1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-22560 Crash on a table value constructor with an SP variable

fix_fields_for_tvc() could call fix_fields() for Items that have
already been fixed before. Changing fix_fields() to fix_fields_if_needed().
This commit is contained in:
Alexander Barkov
2020-05-15 06:15:10 +04:00
parent f7cf60991d
commit 1408e26d0b
3 changed files with 32 additions and 1 deletions

View File

@ -2599,3 +2599,14 @@ a
2 2
1 1
drop view v1; drop view v1;
#
# MDEV-22560 Crash on a table value constructor with an SP variable
#
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
VALUES (a) UNION SELECT 1;
END;
$$
a
0
1

View File

@ -1326,3 +1326,16 @@ create view v1 as with t(a) as (values (2), (1)) select a from t;
show create view v1; show create view v1;
select * from v1; select * from v1;
drop view v1; drop view v1;
--echo #
--echo # MDEV-22560 Crash on a table value constructor with an SP variable
--echo #
DELIMITER $$;
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
VALUES (a) UNION SELECT 1;
END;
$$
DELIMITER ;$$

View File

@ -52,7 +52,14 @@ bool fix_fields_for_tvc(THD *thd, List_iterator_fast<List_item> &li)
while ((item= it++)) while ((item= it++))
{ {
if (item->fix_fields(thd, 0)) /*
Some items have already been fixed.
For example Item_splocal items get fixed in
Item_splocal::append_for_log(), which is called from subst_spvars()
while replacing their values to NAME_CONST()s.
So fix only those that have not been.
*/
if (item->fix_fields_if_needed(thd, 0))
DBUG_RETURN(true); DBUG_RETURN(true);
} }
} }