mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/20210117215940.GE8560%40telsasoft.com
This commit is contained in:
parent
9cf184cc05
commit
beb4480c85
@ -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)
|
|||||||
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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user