Refactor get_collation_current_version().
authorThomas Munro <[email protected]>
Mon, 22 Feb 2021 10:03:27 +0000 (23:03 +1300)
committerThomas Munro <[email protected]>
Mon, 22 Feb 2021 10:32:16 +0000 (23:32 +1300)
The code paths for three different OSes finished up with three different
ways of excluding C[.xxx] and POSIX from consideration.  Merge them.

Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/20210117215940.GE8560%40telsasoft.com

src/backend/utils/adt/pg_locale.c

index 2e4c6e9a263917480dfe94a898c54792dd3ca567..df1f36132d38a8f6115b5782345bb75112ff5fa8 100644 (file)
@@ -1636,37 +1636,17 @@ get_collation_current_version(char collprovider, const char *collcollate)
    }
    else
 #endif
-   if (collprovider == COLLPROVIDER_LIBC)
+   if (collprovider == COLLPROVIDER_LIBC &&
+       pg_strcasecmp("C", collcollate) != 0 &&
+       pg_strncasecmp("C.", collcollate, 2) != 0 &&
+       pg_strcasecmp("POSIX", collcollate) != 0)
    {
 #if defined(__GLIBC__)
-       char       *copy = pstrdup(collcollate);
-       char       *copy_suffix = strstr(copy, ".");
-       bool        need_version = true;
-
-       /*
-        * Check for names like C.UTF-8 by chopping off the encoding suffix on
-        * our temporary copy, so we can skip the version.
-        */
-       if (copy_suffix)
-           *copy_suffix = '\0';
-       if (pg_strcasecmp("c", copy) == 0 ||
-           pg_strcasecmp("posix", copy) == 0)
-           need_version = false;
-       pfree(copy);
-       if (!need_version)
-           return NULL;
-
        /* Use the glibc version because we don't have anything better. */
        collversion = pstrdup(gnu_get_libc_version());
 #elif defined(LC_VERSION_MASK)
        locale_t    loc;
 
-       /* C[.encoding] and POSIX never change. */
-       if (strcmp("C", collcollate) == 0 ||
-           strncmp("C.", collcollate, 2) == 0 ||
-           strcmp("POSIX", collcollate) == 0)
-           return NULL;
-
        /* Look up FreeBSD collation version. */
        loc = newlocale(LC_COLLATE, collcollate, NULL);
        if (loc)
@@ -1687,12 +1667,6 @@ get_collation_current_version(char collprovider, const char *collcollate)
        NLSVERSIONINFOEX version = {sizeof(NLSVERSIONINFOEX)};
        WCHAR       wide_collcollate[LOCALE_NAME_MAX_LENGTH];
 
-       /* These would be invalid arguments, but have no version. */
-       if (pg_strcasecmp("c", collcollate) == 0 ||
-           pg_strcasecmp("posix", collcollate) == 0)
-           return NULL;
-
-       /* For all other names, ask the OS. */
        MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wide_collcollate,
                            LOCALE_NAME_MAX_LENGTH);
        if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version))