• Alexander Barkov's avatar
    MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion · 0fc123c5
    Alexander Barkov authored
    Item_func_group_concat::print() did not take into account
    that Item_func_group_concat::separator can be of a different character set
    than the "String *str" (when the printing is being done to).
    Therefore, printing did not work correctly for:
    - non-ASCII separators when GROUP_CONCAT is done on 8bit data
      or multi-byte data with mbminlen==1.
    - all separators (even including simple ones like comma)
      when GROUP_CONCAT is done on ucs2/utf16/utf32 data (mbminlen>1).
    
    Because of this problem, VIEW definitions did not print correctly to
    their FRM files. This later led to a wrong SELECT and SHOW CREATE output.
    
    Fix:
    
    - Adding new String methods:
    
      bool append_for_single_quote_using_mb_wc(const char *str, size_t length,
                                               CHARSET_INFO *cs);
    
      bool append_for_single_quote_opt_convert(const char *str,
                                               size_t length,
                                               CHARSET_INFO *cs)
    
      which perform both escaping and character set conversion at the same time.
    
    - Adding a new String method escaped_wc_for_single_quote(),
      to reuse the code between the old and the new methods.
    
    - Fixing Item_func_group_concat::print() to use the new
      method append_for_single_quote_opt_convert().
    0fc123c5
sql_string.cc 35.9 KB