Commit beb4480c authored by Thomas Munro's avatar Thomas Munro

Refactor get_collation_current_version().

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: default avatarMichael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/20210117215940.GE8560%40telsasoft.com
parent 9cf184cc
...@@ -1636,37 +1636,17 @@ get_collation_current_version(char collprovider, const char *collcollate) ...@@ -1636,37 +1636,17 @@ get_collation_current_version(char collprovider, const char *collcollate)
} }
else else
#endif #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__) #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. */ /* Use the glibc version because we don't have anything better. */
collversion = pstrdup(gnu_get_libc_version()); collversion = pstrdup(gnu_get_libc_version());
#elif defined(LC_VERSION_MASK) #elif defined(LC_VERSION_MASK)
locale_t loc; 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. */ /* Look up FreeBSD collation version. */
loc = newlocale(LC_COLLATE, collcollate, NULL); loc = newlocale(LC_COLLATE, collcollate, NULL);
if (loc) if (loc)
...@@ -1687,12 +1667,6 @@ get_collation_current_version(char collprovider, const char *collcollate) ...@@ -1687,12 +1667,6 @@ get_collation_current_version(char collprovider, const char *collcollate)
NLSVERSIONINFOEX version = {sizeof(NLSVERSIONINFOEX)}; NLSVERSIONINFOEX version = {sizeof(NLSVERSIONINFOEX)};
WCHAR wide_collcollate[LOCALE_NAME_MAX_LENGTH]; 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, MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wide_collcollate,
LOCALE_NAME_MAX_LENGTH); LOCALE_NAME_MAX_LENGTH);
if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version)) if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version))
......
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