• Alexander Barkov's avatar
    Bug#11926811 / Bug#60625 Illegal mix of collations · ece1996b
    Alexander Barkov authored
    Problem: comparison of a DATETIME sp variable and NOW()
    led to Illegal mix of collations error when 
    character_set_connection=utf8.
    Introduced by "WL#2649 Number-to-string conversions".
    
    Error happened in Arg_comparator::set_compare_func(),
    because the first argument was errouneously converted to utf8,
    while the second argument was not.
    
    Fix: separate agg_arg_charsets_for_comparison() into two functions:
    
    - agg_arg_charsets_for_comparison() - for pure comparison,
      when we don't need to return any string result and therefore
      don't need to convert arguments to @@character_set_connection:
        SELECT a = b;
    
    - agg_arg_charsets_for_string_results_with_comparison() - when
      we need to return a string result, but we also need to do
      comparison internally: SELECT REPLACE(a,b,c)
      If all arguments are numbers:
        SELECT REPLACE(123,2,3) -> 133
      we convert arguments to @@character_set_connection.
    
    
      @ mysql-test/include/ctype_numconv.inc
      @ mysql-test/r/ctype_binary.result
      @ mysql-test/r/ctype_cp1251.result
      @ mysql-test/r/ctype_latin1.result
      @ mysql-test/r/ctype_ucs.result
      @ mysql-test/r/ctype_utf8.result
      Adding tests
    
      @ sql/item.cc
      @ sql/item.h
      @ sql/item_func.cc
      @ sql/item_func.h
      @ sql/item_strfunc.cc
    
      Introducing and using new function
       agg_item_charsets_for_string_result_with_comparison() and
      its Item_func wrapper agg_arg_charsets_for_string_result_with_comparison().
    ece1996b
item_strfunc.cc 102 KB