Add collation versions for FreeBSD.
authorThomas Munro <tmunro@postgresql.org>
Fri, 20 Nov 2020 08:49:57 +0000 (21:49 +1300)
committerThomas Munro <tmunro@postgresql.org>
Fri, 20 Nov 2020 08:49:57 +0000 (21:49 +1300)
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

doc/src/sgml/charset.sgml
src/backend/utils/adt/pg_locale.c

index 832a701523de314f6e38756635e401e5c80a9b54..e151987eff686b2cd3908fbcea889627b30434eb 100644 (file)
@@ -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>
index cc4bf3b50096e1952a5037c55455dc22e939ee90..b6d05ac98ddd3f78fa1f28d6eab2ee3be5d78141 100644 (file)
@@ -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