1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +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:
Alexander Barkov
2018-06-05 10:25:39 +04:00
parent b50685af82
commit 106f0b5798
32 changed files with 184 additions and 186 deletions

View File

@ -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;
}
/*