From 0012312bf784bf0e0954feacc55fae9b647458f0 Mon Sep 17 00:00:00 2001
From: Juan Jose Santamaria Flecha <juanjo.santamaria@gmail.com>
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

