MDEV-17318 CAST(LEAST(zero_date,non_zero_date) AS numeric_data_type) returns a wrong result
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.
Showing
Please register or sign in to comment