• Alexander Barkov's avatar
    MDEV-16385 ROW SP variable is allowed in unexpected context · 106f0b57
    Alexander Barkov authored
    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;
    106f0b57
table.cc 267 KB