From 0012312bf784bf0e0954feacc55fae9b647458f0 Mon Sep 17 00:00:00 2001 From: Juan Jose Santamaria Flecha Date: Thu, 8 Jun 2023 09:27:44 -0400 Subject: [PATCH] POC Inconsistent results with libc sorting on Windows --- src/backend/utils/adt/pg_locale.c | 11 ++++++++++- src/include/utils/pg_locale.h | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 31e3b16..903e0c4 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1534,6 +1534,14 @@ pg_newlocale_from_collation(Oid collid) NULL); #else loc = _create_locale(LC_ALL, collcollate); + if (GetDatabaseEncoding() == PG_UTF8) + { + wchar_t wcollcollate[LOCALE_NAME_MAX_LENGTH]; + + MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wcollcollate, + LOCALE_NAME_MAX_LENGTH); + result.info.lcid = LocaleNameToLCID(wcollcollate, 0); + } #endif if (!loc) report_newlocale_failure(collcollate); @@ -1790,7 +1798,8 @@ pg_strncoll_libc_win32_utf8(const char *arg1, size_t len1, const char *arg2, errno = 0; #ifdef HAVE_LOCALE_T if (locale) - result = wcscoll_l((LPWSTR) a1p, (LPWSTR) a2p, locale->info.lt); + result = CompareStringW(locale->info.lcid, NORM_LINGUISTIC_CASING, + (LPWSTR) a1p, -1, (LPWSTR) a2p, -1); else #endif result = wcscoll((LPWSTR) a1p, (LPWSTR) a2p); diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index e2a7243..966067a 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -81,6 +81,9 @@ struct pg_locale_struct #ifdef HAVE_LOCALE_T locale_t lt; #endif +#ifdef WIN32 + LCID lcid; +#endif #ifdef USE_ICU struct { -- 2.11.0