mirror of
https://github.com/postgres/postgres.git
synced 2025-05-29 16:21:20 +03:00
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: Peter Geoghegan <pg@bowt.ie>
This commit is contained in:
parent
33e2f346b0
commit
29923859f9
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user