Allow ICU to use SortSupport on Windows with UTF-8
authorPeter Eisentraut <peter_e@gmx.net>
Sun, 24 Sep 2017 04:56:31 +0000 (00:56 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Sun, 24 Sep 2017 11:55:24 +0000 (07:55 -0400)
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>
src/backend/utils/adt/varlena.c

index 260efd519aac733b58d8ecf43bac1605895869da..4b5483dbb97e35289fc6ac6ae8856bcae1b0b80b 100644 (file)
@@ -1823,12 +1823,6 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar)
     * requirements of BpChar callers.  However, if LC_COLLATE = C, we can
     * make things quite a bit faster with varstrfastcmp_c or bpcharfastcmp_c,
     * 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))
    {
@@ -1839,14 +1833,8 @@ varstr_sortsupport(SortSupport ssup, Oid collid, bool bpchar)
 
        collate_c = true;
    }
-#ifdef WIN32
-   else if (GetDatabaseEncoding() == PG_UTF8)
-       return;
-#endif
    else
    {
-       ssup->comparator = varstrfastcmp_locale;
-
        /*
         * We need a collation-sensitive comparison.  To make things faster,
         * 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);
        }
+
+       /*
+        * 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;
    }
 
    /*