summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro2020-11-20 08:49:57 +0000
committerThomas Munro2020-11-20 08:49:57 +0000
commitca051d8b101d3205f1c5faf0d1da8a523ffc95a1 (patch)
tree58ebdd4f80cdff1d6f7c6406adeb9123201c0fd2
parenta4ef0329c27156dca81714854599e7d82becb17f (diff)
Add collation versions for FreeBSD.
On FreeBSD 13, use querylocale() to read the current version of libc collations. Similar to commits 352f6f2d for Windows and d5ac14f9 for GNU/Linux. Discussion: https://postgr.es/m/CAEepm%3D0uEQCpfq_%2BLYFBdArCe4Ot98t1aR4eYiYTe%3DyavQygiQ%40mail.gmail.com
-rw-r--r--doc/src/sgml/charset.sgml3
-rw-r--r--src/backend/utils/adt/pg_locale.c20
2 files changed, 22 insertions, 1 deletions
diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml
index 832a701523d..e151987eff6 100644
--- a/doc/src/sgml/charset.sgml
+++ b/doc/src/sgml/charset.sgml
@@ -973,7 +973,8 @@ CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-tr
Version information is available from the
<literal>icu</literal> provider on all operating systems. For the
<literal>libc</literal> provider, versions are currently only available
- on systems using the GNU C library (most Linux systems) and Windows.
+ on systems using the GNU C library (most Linux systems), FreeBSD and
+ Windows.
</para>
<note>
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index cc4bf3b5009..b6d05ac98dd 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -1684,6 +1684,26 @@ get_collation_actual_version(char collprovider, const char *collcollate)
/* Use the glibc version because we don't have anything better. */
collversion = pstrdup(gnu_get_libc_version());
+#elif defined(LC_VERSION_MASK)
+ 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. */
+ loc = newlocale(LC_COLLATE, collcollate, NULL);
+ if (loc)
+ {
+ collversion =
+ pstrdup(querylocale(LC_COLLATE_MASK | LC_VERSION_MASK, loc));
+ freelocale(loc);
+ }
+ else
+ ereport(ERROR,
+ (errmsg("could not load locale \"%s\"", collcollate)));
#elif defined(WIN32) && _WIN32_WINNT >= 0x0600
/*
* If we are targeting Windows Vista and above, we can ask for a name