mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Allow NULL version for individual collations.
Remove the documented restriction that collation providers must either return NULL for all collations or non-NULL for all collations. Use NULL for glibc collations like "C.UTF-8", which might otherwise lead future proposed commits to force unnecessary index rebuilds. Reviewed-by: Peter Eisentraut <peter.eisentraut@2ndquadrant.com> Discussion: https://postgr.es/m/CA%2BhUKGJvqup3s%2BJowVTcacZADO6dOhfdBmvOPHLS3KXUJu41Jw%40mail.gmail.com
This commit is contained in:
@ -1505,10 +1505,6 @@ pg_newlocale_from_collation(Oid collid)
|
|||||||
/*
|
/*
|
||||||
* Get provider-specific collation version string for the given collation from
|
* Get provider-specific collation version string for the given collation from
|
||||||
* the operating system/library.
|
* the operating system/library.
|
||||||
*
|
|
||||||
* A particular provider must always either return a non-NULL string or return
|
|
||||||
* NULL (if it doesn't support versions). It must not return NULL for some
|
|
||||||
* collcollate and not NULL for others.
|
|
||||||
*/
|
*/
|
||||||
char *
|
char *
|
||||||
get_collation_actual_version(char collprovider, const char *collcollate)
|
get_collation_actual_version(char collprovider, const char *collcollate)
|
||||||
@ -1540,6 +1536,23 @@ get_collation_actual_version(char collprovider, const char *collcollate)
|
|||||||
if (collprovider == COLLPROVIDER_LIBC)
|
if (collprovider == COLLPROVIDER_LIBC)
|
||||||
{
|
{
|
||||||
#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());
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user