Commit 382a8219 authored by Thomas Munro's avatar Thomas Munro

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: default avatarPeter Eisentraut <peter.eisentraut@2ndquadrant.com>
Discussion: https://postgr.es/m/CA%2BhUKGJvqup3s%2BJowVTcacZADO6dOhfdBmvOPHLS3KXUJu41Jw%40mail.gmail.com
parent dd8e1913
...@@ -1505,10 +1505,6 @@ pg_newlocale_from_collation(Oid collid) ...@@ -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) ...@@ -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
......
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