• evgen@moonbone.local's avatar
    Bug#27590: Wrong DATE/DATETIME comparison. · 4747fa0c
    evgen@moonbone.local authored
    DATE and DATETIME can be compared either as strings or as int. Both
    methods have their disadvantages. Strings can contain valid DATETIME value
    but have insignificant zeros omitted thus became non-comparable with
    other DATETIME strings. The comparison as int usually will require conversion
    from the string representation and the automatic conversion in most cases is
    carried out in a wrong way thus producing wrong comparison result. Another
    problem occurs when one tries to compare DATE field with a DATETIME constant.
    The constant is converted to DATE losing its precision i.e. losing time part.
    
    This fix addresses the problems described above by adding a special
    DATE/DATETIME comparator. The comparator correctly converts DATE/DATETIME
    string values to int when it's necessary, adds zero time part (00:00:00)
    to DATE values to compare them correctly to DATETIME values. Due to correct
    conversion malformed DATETIME string values are correctly compared to other
    DATE/DATETIME values.
    
    As of this patch a DATE value equals to DATETIME value with zero time part.
    For example '2001-01-01' equals to '2001-01-01 00:00:00'.
    
    The compare_datetime() function is added to the Arg_comparator class.
    It implements the correct comparator for DATE/DATETIME values.
    Two supplementary functions called get_date_from_str() and get_datetime_value()
    are added. The first one extracts DATE/DATETIME value from a string and the
    second one retrieves the correct DATE/DATETIME value from an item.
    The new Arg_comparator::can_compare_as_dates() function is added and used
    to check whether two given items can be compared by the compare_datetime()
    comparator.
    Two caching variables were added to the Arg_comparator class to speedup the
    DATE/DATETIME comparison.
    One more store() method was added to the Item_cache_int class to cache int
    values.
    The new is_datetime() function was added to the Item class. It indicates
    whether the item returns a DATE/DATETIME value.
    4747fa0c
ps_3innodb.result 103 KB