• Alexander Barkov's avatar
    MDEV-17318 CAST(LEAST(zero_date,non_zero_date) AS numeric_data_type) returns a wrong result · f79bab3a
    Alexander Barkov authored
    Also fixes:
    MDEV-17330 Wrong result for 0 + LEAST(TIME'-10:00:00',TIME'10:00:00')
    
    Problems:
    
    1. These methods did not take into account the current session date flags
    and passed date_mode_t(0) to func->get_date():
    
    Type_handler_temporal_result::Item_func_min_max_val_real
    Type_handler_temporal_result::Item_func_min_max_val_int
    Type_handler_temporal_result::Item_func_min_max_val_decimal
    
    Fixing to pass sql_mode_for_dates(thd) instead of date_mode_t(0).
    Note, sql_mode_for_dates(thd) is only needed for DATE/DATETIME
    data types. It is not needed for TIME.
    So splitting value methods Type_handler_temporal_result::Item_func_min_max_xxx
    into individual implementations for
    Type_handler_{time|date|datetime|timestamp}_common
    and, instead of calling get_date(), reusing inside classes
    Time(), Date(), Datetime() and their methods to_longlong().
    sql_mode_for_dates(thd) is automatically passed to get_date()
    inside Date() and Datetime() constructors.
    
    The switch to classes also fixed the problem reported in MDEV-17330.
    Type_handler_temporal_result::Item_func_min_max_val_int() used to
    call TIME_to_ulonglong(), which was not correct for TIME.
    Changing the code to use Time().to_longlong() solved this.
    
    2. Type_handler_temporal_result::Item_func_min_max_get_date
    also did not take into account the current session
    date flags in case of conversion from DATE/DATETIME to time
    and passed date_mode_t(0) to get_date_native().
    Fixing to pass sql_mode_for_dates(thd) in case of conversion
    from DATE/DATETIME to TIME.
    f79bab3a
sql_type.h 193 KB