• evgen@moonbone.local's avatar
    Bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. · 7a1c61ef
    evgen@moonbone.local authored
    The BETWEEN function was comparing DATE/DATETIME values either as ints or as
    strings. Both methods have their disadvantages and may lead to a wrong
    result.
    
    Now BETWEEN function checks whether all of its arguments has the STRING result
    types and at least one of them is a DATE/DATETIME item. If so it sets up
    two Arg_comparator obects to compare with the compare_datetime() comparator
    and uses them to compare such items.
    
    Added two Arg_comparator object members and one flag to the
    Item_func_between class for the correct DATE/DATETIME comparison.
    The Item_func_between::fix_length_and_dec() function now detects whether
    it's used for DATE/DATETIME comparison and sets up newly added Arg_comparator
    objects to do this.
    The Item_func_between::val_int() now uses Arg_comparator objects to perform
    correct DATE/DATETIME comparison.
    The owner variable of the Arg_comparator class now can be set to NULL if the
    caller wants to handle NULL values by itself.
    Now the Item_date_add_interval::get_date() function ajusts cached_field type according to the detected type.
    7a1c61ef
item_cmpfunc.cc 116 KB