mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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:
@ -217,8 +217,7 @@ Condition_information::aggregate(THD *thd, const Diagnostics_area *da)
|
||||
DBUG_ENTER("Condition_information::aggregate");
|
||||
|
||||
/* Prepare the expression for evaluation. */
|
||||
if (!m_cond_number_expr->fixed &&
|
||||
m_cond_number_expr->fix_fields(thd, &m_cond_number_expr))
|
||||
if (m_cond_number_expr->fix_fields_if_needed(thd, &m_cond_number_expr))
|
||||
DBUG_RETURN(true);
|
||||
|
||||
cond_number= m_cond_number_expr->val_int();
|
||||
|
Reference in New Issue
Block a user