• Alexander Barkov's avatar
    Bug#54916 GROUP_CONCAT + IFNULL truncates output · 6e9298bd
    Alexander Barkov authored
    Problem: a few functions did not calculate their max_length correctly.
    This is an after-fix for WL#2649 Number-to-string conversions".
    
    Fix: changing the buggy functions to calculate max_length
    using fix_char_length() introduced in WL#2649,
    instead of setting max_length directly
    
      mysql-test/include/ctype_numconv.inc
         Adding new tests
    
      mysql-test/r/ctype_binary.result
         Adding new tests
    
      mysql-test/r/ctype_cp1251.result
         Adding new tests
    
      mysql-test/r/ctype_latin1.result
         Adding new tests
    
      mysql-test/r/ctype_ucs.result
         Adding new tests
    
      mysql-test/r/ctype_utf8.result
         Adding new tests
    
      mysql-test/t/ctype_utf8.test
        Including ctype_numconv
    
      sql/item.h
        - Introducing new method fix_char_length_ulonglong(),
        for the cases when length is potentially greater
        than UINT_MAX32. This method removes a few
        instances of duplicate code, e.g. in item_strfunc.cc.
        - Setting collation in Item_copy properly. This change
        fixes wrong metadata on client side in some cases, when
        "binary" instead of the real character set was reported.
    
      sql/item_cmpfunc.cc
        - Using fix_char_length() and max_char_length() methods,
        instead of direct access to max_length, to calculate
        item length properly.
        - Moving count_only_length() in COALESCE after
        agg_arg_charsets_for_string_result(). The old
        order was incorrect and led to wrong length
        calucation in case of multi-byte character sets.
        
      sql/item_func.cc
        Fixing that count_only_length() didn't work
        properly for multi-byte character sets.
        Using fix_char_length() and max_char_length()
        instead of direct access to max_length.
    
      sql/item_strfunc.cc
        - Using fix_char_length(), fix_char_length_ulonglong(),
        max_char_length() instead of direct access to max_length.
        - Removing wierd condition: "if (collation.collation->mbmaxlen > 0)",
        which is never FALSE.
    6e9298bd
item_cmpfunc.cc 142 KB