From: Thomas Munro Date: Wed, 25 Mar 2020 02:53:24 +0000 (+1300) Subject: Allow NULL version for individual collations. X-Git-Tag: REL_13_BETA1~467 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=382a821907e76bf6068492a164fdfc57578391f4;p=thirdparty%2Fpostgresql.git 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 Discussion: https://postgr.es/m/CA%2BhUKGJvqup3s%2BJowVTcacZADO6dOhfdBmvOPHLS3KXUJu41Jw%40mail.gmail.com --- diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 64fd3ae18a8..b42122f9cea 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1505,10 +1505,6 @@ pg_newlocale_from_collation(Oid collid) /* * Get provider-specific collation version string for the given collation from * 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 * 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 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()); #endif