diff --git a/mysql-test/main/mdev_38791.result b/mysql-test/main/mdev_38791.result new file mode 100644 index 0000000000000..42d480b4d0869 --- /dev/null +++ b/mysql-test/main/mdev_38791.result @@ -0,0 +1,11 @@ +SET sql_mode='ORACLE'; +SELECT TO_DATE('Monday Mon', 'DAY DY'); +TO_DATE('Monday Mon', 'DAY DY') +NULL +Warnings: +Warning 1411 Incorrect datetime value: 'Monday Mon' for function to_date +SELECT TO_DATE('Mon Mon', 'DY DY'); +TO_DATE('Mon Mon', 'DY DY') +NULL +Warnings: +Warning 1411 Incorrect datetime value: 'Mon Mon' for function to_date diff --git a/mysql-test/main/mdev_38791.test b/mysql-test/main/mdev_38791.test new file mode 100644 index 0000000000000..2ecd54da3aed2 --- /dev/null +++ b/mysql-test/main/mdev_38791.test @@ -0,0 +1,4 @@ +SET sql_mode='ORACLE'; + +SELECT TO_DATE('Monday Mon', 'DAY DY'); +SELECT TO_DATE('Mon Mon', 'DY DY'); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index c008c2089ba29..0cb00124df96b 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2982,6 +2982,8 @@ static bool parse_format_string(const String *format, uint16 *fmt_array, } else if (tmp1 == 'Y') { + if (for_to_date && formats_used(&used, FMT_DAY)) + goto error; *tmp_fmt= FMT_DY; // Day name tmp_len+= 3; type_flags|= PARSE_TYPE_WEEKDAY | PARSE_TYPE_NON_DETERMINISTIC; @@ -2990,6 +2992,8 @@ static bool parse_format_string(const String *format, uint16 *fmt_array, { if (ptr + 2 == end || my_toupper(system_charset_info, *(ptr+2)) != 'Y') goto error; + if (for_to_date && formats_used(&used, FMT_DAY)) + goto error; *tmp_fmt= FMT_DAY; // Day name tmp_len+= locale->max_day_name_length * my_charset_utf8mb3_bin.mbmaxlen; type_flags|= PARSE_TYPE_WEEKDAY | PARSE_TYPE_NON_DETERMINISTIC;