Commit 6dda0998 authored by Peter Eisentraut's avatar Peter Eisentraut

Allow ICU to use SortSupport on Windows with UTF-8

There is no reason to ever prevent the use of SortSupport on Windows
when ICU locales are used.  We previously avoided SortSupport on Windows
with UTF-8 server encoding and a non C-locale due to restrictions in
Windows' libc functionality.

This is now considered to be a restriction in one platform's libc
collation provider, and not a more general platform restriction.
Reported-by: default avatarPeter Geoghegan <pg@bowt.ie>
parent 9b31c72a
...@@ -1823,12 +1823,6 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar) ...@@ -1823,12 +1823,6 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar)
* requirements of BpChar callers. However, if LC_COLLATE = C, we can * requirements of BpChar callers. However, if LC_COLLATE = C, we can
* make things quite a bit faster with varstrfastcmp_c or bpcharfastcmp_c, * make things quite a bit faster with varstrfastcmp_c or bpcharfastcmp_c,
* both of which use memcmp() rather than strcoll(). * both of which use memcmp() rather than strcoll().
*
* There is a further exception on Windows. When the database encoding is
* UTF-8 and we are not using the C collation, complex hacks are required.
* We don't currently have a comparator that handles that case, so we fall
* back on the slow method of having the sort code invoke bttextcmp() (in
* the case of text) via the fmgr trampoline.
*/ */
if (lc_collate_is_c(collid)) if (lc_collate_is_c(collid))
{ {
...@@ -1839,14 +1833,8 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar) ...@@ -1839,14 +1833,8 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar)
collate_c = true; collate_c = true;
} }
#ifdef WIN32
else if (GetDatabaseEncoding() == PG_UTF8)
return;
#endif
else else
{ {
ssup->comparator = varstrfastcmp_locale;
/* /*
* We need a collation-sensitive comparison. To make things faster, * We need a collation-sensitive comparison. To make things faster,
* we'll figure out the collation based on the locale id and cache the * we'll figure out the collation based on the locale id and cache the
...@@ -1867,6 +1855,22 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar) ...@@ -1867,6 +1855,22 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar)
} }
locale = pg_newlocale_from_collation(collid); locale = pg_newlocale_from_collation(collid);
} }
/*
* There is a further exception on Windows. When the database
* encoding is UTF-8 and we are not using the C collation, complex
* hacks are required. We don't currently have a comparator that
* handles that case, so we fall back on the slow method of having the
* sort code invoke bttextcmp() (in the case of text) via the fmgr
* trampoline. ICU locales work just the same on Windows, however.
*/
#ifdef WIN32
if (GetDatabaseEncoding() == PG_UTF8 &&
!(locale && locale->provider == COLLPROVIDER_ICU))
return;
#endif
ssup->comparator = varstrfastcmp_locale;
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment