mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +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:
@@ -630,8 +630,7 @@ mysql_ha_fix_cond_and_key(SQL_HANDLER *handler,
|
||||
/* This can only be true for temp tables */
|
||||
if (table->query_id != thd->query_id)
|
||||
cond->cleanup(); // File was reopened
|
||||
if ((!cond->fixed &&
|
||||
cond->fix_fields(thd, &cond)) || cond->check_cols(1))
|
||||
if (cond->fix_fields_if_needed_for_bool(thd, &cond))
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -695,10 +694,9 @@ mysql_ha_fix_cond_and_key(SQL_HANDLER *handler,
|
||||
{
|
||||
my_bitmap_map *old_map;
|
||||
/* note that 'item' can be changed by fix_fields() call */
|
||||
if ((!item->fixed &&
|
||||
item->fix_fields(thd, it_ke.ref())) ||
|
||||
(item= *it_ke.ref())->check_cols(1))
|
||||
if (item->fix_fields_if_needed_for_scalar(thd, it_ke.ref()))
|
||||
return 1;
|
||||
item= *it_ke.ref();
|
||||
if (item->used_tables() & ~(RAND_TABLE_BIT | PARAM_TABLE_BIT))
|
||||
{
|
||||
my_error(ER_WRONG_ARGUMENTS,MYF(0),"HANDLER ... READ");
|
||||
|
||||
Reference in New Issue
Block a user