From 18f63cbcb91dd10c1144f6bff165e5ab57fa0bf1 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 29 Oct 2009 15:10:36 +0400 Subject: [PATCH] A postfix for Bug#46633 Obsolete Serbian locale name Re-Allowing sr_YU with a "deprecated" warning. --- mysql-test/r/locale.result | 17 ++++++--- mysql-test/t/locale.test | 11 +++--- sql/sql_locale.cc | 71 ++++++++++++++++++++++++++++++++++---- 3 files changed, 83 insertions(+), 16 deletions(-) diff --git a/mysql-test/r/locale.result b/mysql-test/r/locale.result index 30c4c928a96..402470b5ae8 100644 --- a/mysql-test/r/locale.result +++ b/mysql-test/r/locale.result @@ -49,11 +49,18 @@ DROP TABLE t1; # # Bug#46633 Obsolete Serbian locale name # -set lc_messages=sr_YU; -ERROR HY000: Unknown locale: 'sr_YU' -set lc_messages=sr_RS; -set lc_time_names=sr_RS; -select format(123456.789, 3, 'sr_RS'); +SET lc_messages=sr_YU; +Warnings: +Warning 1287 'sr_YU' is deprecated; use 'sr_RS' instead +SHOW VARIABLES LIKE 'lc_messages'; +Variable_name Value +lc_messages sr_RS +SET lc_messages=sr_RS; +SHOW VARIABLES LIKE 'lc_messages'; +Variable_name Value +lc_messages sr_RS +SET lc_time_names=sr_RS; +SELECT format(123456.789, 3, 'sr_RS'); format(123456.789, 3, 'sr_RS') 123456.789 End of 5.4 tests diff --git a/mysql-test/t/locale.test b/mysql-test/t/locale.test index 4b669cc3de8..230a1f910d0 100644 --- a/mysql-test/t/locale.test +++ b/mysql-test/t/locale.test @@ -34,10 +34,11 @@ DROP TABLE t1; --echo # --echo # Bug#46633 Obsolete Serbian locale name --echo # ---error ER_UNKNOWN_LOCALE -set lc_messages=sr_YU; -set lc_messages=sr_RS; -set lc_time_names=sr_RS; -select format(123456.789, 3, 'sr_RS'); +SET lc_messages=sr_YU; +SHOW VARIABLES LIKE 'lc_messages'; +SET lc_messages=sr_RS; +SHOW VARIABLES LIKE 'lc_messages'; +SET lc_time_names=sr_RS; +SELECT format(123456.789, 3, 'sr_RS'); --echo End of 5.4 tests diff --git a/sql/sql_locale.cc b/sql/sql_locale.cc index e6b12d0e38b..6b027c62b81 100644 --- a/sql/sql_locale.cc +++ b/sql/sql_locale.cc @@ -1733,6 +1733,24 @@ static TYPELIB my_locale_typelib_day_names_sr_RS = { array_elements(my_locale_day_names_sr_RS)-1, "", my_locale_day_names_sr_RS, NULL }; static TYPELIB my_locale_typelib_ab_day_names_sr_RS = { array_elements(my_locale_ab_day_names_sr_RS)-1, "", my_locale_ab_day_names_sr_RS, NULL }; +MY_LOCALE my_locale_sr_YU /* Deprecated, use sr_RS instead */ +( + 48, + "sr_YU", + "Serbian - Yugoslavia", + FALSE, + &my_locale_typelib_month_names_sr_RS, + &my_locale_typelib_ab_month_names_sr_RS, + &my_locale_typelib_day_names_sr_RS, + &my_locale_typelib_ab_day_names_sr_RS, + 9, + 10, + '.', /* decimal point sr_RS */ + '\0', /* thousands_sep sr_RS */ + "\x80", /* grouping sr_RS */ + &global_errmsgs[sr_RS] +); + MY_LOCALE my_locale_sr_RS ( 48, @@ -3347,6 +3365,13 @@ MY_LOCALE *my_locales[]= }; +MY_LOCALE *my_locales_deprecated[]= +{ + &my_locale_sr_YU, + NULL +}; + + MY_LOCALE *my_locale_by_number(uint number) { MY_LOCALE *locale; @@ -3359,22 +3384,56 @@ MY_LOCALE *my_locale_by_number(uint number) } -MY_LOCALE *my_locale_by_name(const char *name) +static MY_LOCALE* +my_locale_by_name(MY_LOCALE** locales, const char *name) { MY_LOCALE **locale; - for (locale= my_locales; *locale != NULL; locale++) + for (locale= locales; *locale != NULL; locale++) { if (!my_strcasecmp(&my_charset_latin1, (*locale)->name, name)) - { - // Check that locale is on its correct position in the array - DBUG_ASSERT((*locale) == my_locales[(*locale)->number]); return *locale; - } } return NULL; } +MY_LOCALE *my_locale_by_name(const char *name) +{ + MY_LOCALE *locale; + + if ((locale= my_locale_by_name(my_locales, name))) + { + // Check that locale is on its correct position in the array + DBUG_ASSERT(locale == my_locales[locale->number]); + return locale; + } + else if ((locale= my_locale_by_name(my_locales_deprecated, name))) + { + THD *thd= current_thd; + /* + Replace the deprecated locale to the corresponding + 'fresh' locale with the same ID. + */ + locale= my_locales[locale->number]; + if (thd) + { + // Send a warning to the client + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, ER(ER_WARN_DEPRECATED_SYNTAX), + name, locale->name); + } + else + { + // Send a warning to mysqld error log + sql_print_warning("The syntax '%s' is deprecated and will be removed. " + "Please use %s instead.", + name, locale->name); + } + } + return locale; +} + + void cleanup_errmsgs() { for (MY_LOCALE_ERRMSGS *msgs= global_errmsgs; msgs->language; msgs++)