diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 6e33d65340..f54ce21447 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -760,7 +760,7 @@ strftime_win32(char *dst, size_t dstlen, /* Subroutine for cache_locale_time(). */ static void -cache_single_time(char **dst, const char *format, const struct tm *tm) +cache_single_time(char **dst, const char *format, const struct tm *tm, int encoding) { char buf[MAX_L10N_DATA]; char *ptr; @@ -777,7 +777,10 @@ cache_single_time(char **dst, const char *format, const struct tm *tm) if (strftime(buf, MAX_L10N_DATA, format, tm) <= 0) elog(ERROR, "strftime(%s) failed: %m", format); - ptr = MemoryContextStrdup(TopMemoryContext, buf); + /* convert the string to the database encoding */ + ptr = pg_any_to_server(buf, strlen(buf), encoding); + + ptr = MemoryContextStrdup(TopMemoryContext, ptr); if (*dst) pfree(*dst); *dst = ptr; @@ -792,7 +795,8 @@ cache_locale_time(void) char *save_lc_time; time_t timenow; struct tm *timeinfo; - int i; + int i, + encoding; #ifdef WIN32 char *save_lc_ctype; @@ -830,6 +834,7 @@ cache_locale_time(void) #endif setlocale(LC_TIME, locale_time); + encoding = pg_get_encoding_from_locale(locale_time, true); timenow = time(NULL); timeinfo = localtime(&timenow); @@ -838,8 +843,8 @@ cache_locale_time(void) for (i = 0; i < 7; i++) { timeinfo->tm_wday = i; - cache_single_time(&localized_abbrev_days[i], "%a", timeinfo); - cache_single_time(&localized_full_days[i], "%A", timeinfo); + cache_single_time(&localized_abbrev_days[i], "%a", timeinfo, encoding); + cache_single_time(&localized_full_days[i], "%A", timeinfo, encoding); } /* localized months */ @@ -847,8 +852,8 @@ cache_locale_time(void) { timeinfo->tm_mon = i; timeinfo->tm_mday = 1; /* make sure we don't have invalid date */ - cache_single_time(&localized_abbrev_months[i], "%b", timeinfo); - cache_single_time(&localized_full_months[i], "%B", timeinfo); + cache_single_time(&localized_abbrev_months[i], "%b", timeinfo, encoding); + cache_single_time(&localized_full_months[i], "%B", timeinfo, encoding); } /* try to restore internal settings */ diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out index 15b3222239..7449959ef9 100644 --- a/src/test/regress/expected/collate.linux.utf8.out +++ b/src/test/regress/expected/collate.linux.utf8.out @@ -430,16 +430,17 @@ SELECT relname FROM pg_class WHERE relname ~* '^abc'; -- to_char SET lc_time TO 'tr_TR'; -SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY'); to_char ------------- - 01 NIS 2010 + 01 ŞUB 2010 (1 row) -SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); - to_char -------------- - 01 NİS 2010 +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'), +to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); + to_char | to_char +-------------+------------- + 01 NIS 2010 | 01 NİS 2010 (1 row) -- backwards parsing diff --git a/src/test/regress/sql/collate.linux.utf8.sql b/src/test/regress/sql/collate.linux.utf8.sql index 4ca02b821d..6f1035ff3a 100644 --- a/src/test/regress/sql/collate.linux.utf8.sql +++ b/src/test/regress/sql/collate.linux.utf8.sql @@ -167,10 +167,10 @@ SELECT relname FROM pg_class WHERE relname ~* '^abc'; -- to_char - SET lc_time TO 'tr_TR'; -SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'); -SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); +SELECT to_char(date '2010-02-01', 'DD TMMON YYYY'); +SELECT to_char(date '2010-04-01', 'DD TMMON YYYY'), +to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR"); -- backwards parsing