• Gleb Shchepa's avatar
    Bug #49480: WHERE using YEAR columns returns unexpected results · 32463833
    Gleb Shchepa authored
    A few problems were found in the fix for bug 43668:
    1) Comparison of the YEAR column with NULL always returned TRUE;
    2) Comparison of the YEAR column with constants always returned
       unpredictable result;
    3) Unnecessary conversion warnings when comparing a non-integer
       constant with a NULL value in the YEAR column;
    
    The problems described above have been resolved with an
    exception: zero (i.e. invalid) YEAR column value comparison
    with 00 or 2000 still fail (it is not a regression and it was
    not a regression), so MIN/MAX on YEAR column containing zero
    value still fail.
    
    
    mysql-test/r/type_year.result:
      Test case for bug #49480.
    mysql-test/t/type_year.test:
      Test case for bug #49480.
    sql/item_cmpfunc.cc:
      - The get_year_value() function has been modified to make its
        return value compatible with the get_datetime_value() return
        value (i.e. to convert numeric values into the YYYY0000000000
        (YYYY-00-00 00:00:00) form.
      
      - The Arg_comparator::set_cmp_func method has been modified to
        use the get_year_value function if get_datetime_value() is not
        applicable.
        From now only 2 cases have a special processing there:
        * both comparing items have MYSQL_TYPE_YEAR field type
                or
        * one item have is MYSQL_TYPE_YEAR and other one is
          is_datetime()-compliant.
      
      - New helper function try_year_cmp_func() has been
        added for the better code readability to call from
        Arg_comparator::set_cmp_func().
      
      - The Arg_comparator::compare_year method has been removed
        since get_year_value() is compatible with the old
        Arg_comparator::compare_datetime method that doesn't have
        problems #1-#3 (see whole patch entry commentary).
    sql/item_cmpfunc.h:
      - New helper function try_year_cmp_func() has been
        added for the better code readability to call from
        Arg_comparator::set_cmp_func().
      
      - Unnecessary Arg_comparator::year_as_datetime and
        Arg_comparator::compare_year() declarations have been
        removed.
    32463833
item_cmpfunc.cc 139 KB