]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix lc_collate_is_c() when LC_COLLATE != LC_CTYPE.
authorJeff Davis <jdavis@postgresql.org>
Wed, 6 Nov 2024 22:44:35 +0000 (14:44 -0800)
committerJeff Davis <jdavis@postgresql.org>
Wed, 6 Nov 2024 22:44:35 +0000 (14:44 -0800)
An unfortunate typo in commit 2d819a08a1 can cause wrong results when
the default collation provider is libc, LC_CTYPE=C, and LC_COLLATE is
a real locale. Users with this combination of settings must REINDEX
all affected indexes.

The same typo can also cause performance degradation when LC_COLLATE=C
and LC_CTYPE is a real locale.

Problem does not exist in master (due to refactoring), so fix only in
version 17.

Reported-by: Drew Callahan
Discussion: https://postgr.es/m/d5081a7f4f6d425c28dd69d1e09b2e78f149e726.camel@j-davis.com

src/backend/utils/adt/pg_locale.c

index cd5ad1e70566be5d251d99e6c60523185a9456c8..4c85a01b28479f8e7714c72ff0667f946fb425a2 100644 (file)
@@ -1370,9 +1370,9 @@ lc_collate_is_c(Oid collation)
                }
                else if (default_locale.provider == COLLPROVIDER_LIBC)
                {
-                       localeptr = setlocale(LC_CTYPE, NULL);
+                       localeptr = setlocale(LC_COLLATE, NULL);
                        if (!localeptr)
-                               elog(ERROR, "invalid LC_CTYPE setting");
+                               elog(ERROR, "invalid LC_COLLATE setting");
                }
                else
                        elog(ERROR, "unexpected collation provider '%c'",