mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-16385 ROW SP variable is allowed in unexpected context
The problem described in the bug report happened because the code
did not test check_cols(1) after fix_fields() in a few places.
Additionally, fix_fields() could be called multiple times for SP variables,
because they are all fixed at a early stage in append_for_log().
Solution:
1. Adding a few helper methods
- fix_fields_if_needed()
- fix_fields_if_needed_for_scalar()
- fix_fields_if_needed_for_bool()
- fix_fields_if_needed_for_order_by()
and using it in many cases instead of fix_fields() where
the "fixed" status is not definitely known to be "false".
2. Adding DBUG_ASSERT(!fixed) into Item_splocal*::fix_fields()
to catch double execution.
3. Adding tests.
As a good side effect, the patch removes a lot of duplicate code (~60 lines):
if (!item->fixed &&
item->fix_fields(..) &&
item->check_cols(1))
return true;
This commit is contained in:
@@ -218,16 +218,9 @@ int Sql_cmd_common_signal::eval_signal_informations(THD *thd, Sql_condition *con
|
||||
i <= LAST_DIAG_SET_PROPERTY;
|
||||
i++)
|
||||
{
|
||||
set= m_set_signal_information.m_item[i];
|
||||
if (set)
|
||||
{
|
||||
if (! set->fixed)
|
||||
{
|
||||
if (set->fix_fields(thd, & set))
|
||||
goto end;
|
||||
m_set_signal_information.m_item[i]= set;
|
||||
}
|
||||
}
|
||||
if ((set= m_set_signal_information.m_item[i]) &&
|
||||
set->fix_fields_if_needed(thd, &m_set_signal_information.m_item[i]))
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user