postgres.git / summary / log / commit / refs
commit e502f9aa817074d19fb12d9aa8de27ab3623e564
Author: Jeff Davis <jdavis@postgresql.org>
Date: Tue Sep 01 16:51:44 2026 +0000
Revert "Force LC_COLLATE to C in postmaster."
Out of an abundance of caution.
This reverts commit 5e6e42e44fe10cab616b4fbe9725df03c987c90a.
Requested-by: Daniel Verite <daniel@manitou-mail.org>
Requested-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/20260826232534.13.noahmisch@microsoft.com
Backpatch-through: 19
doc/src/sgml/catalogs.sgml | 2 +-
doc/src/sgml/charset.sgml | 2 +-
doc/src/sgml/ref/create_database.sgml | 45 +++++++++++++++++------------------
doc/src/sgml/ref/createdb.sgml | 3 +--
src/backend/main/main.c | 16 +++++--------
src/backend/utils/init/postinit.c | 11 +++++----
6 files changed, 37 insertions(+), 42 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 96a6677b284..ecac7332e8e 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -3199,7 +3199,7 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
<structfield>datcollate</structfield> <type>text</type>
</para>
<para>
- LC_COLLATE for this database (ignored unless <structfield>datlocprovider</structfield> is <literal>c</literal>)
+ LC_COLLATE for this database
</para></entry>
</row>
diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml
index 746e40bb9d2..89760466c1f 100644
--- a/doc/src/sgml/charset.sgml
+++ b/doc/src/sgml/charset.sgml
@@ -100,7 +100,7 @@ initdb --locale=sv_SE
<tbody>
<row>
<entry><envar>LC_COLLATE</envar></entry>
- <entry>String sort order (ignored unless the provider is <literal>libc</literal>)</entry>
+ <entry>String sort order</entry>
</row>
<row>
<entry><envar>LC_CTYPE</envar></entry>
diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml
index 3544b15efda..4da8aeebb50 100644
--- a/doc/src/sgml/ref/create_database.sgml
+++ b/doc/src/sgml/ref/create_database.sgml
@@ -150,12 +150,12 @@ CREATE DATABASE <replaceable class="parameter">name</replaceable>
<para>
Sets the default collation order and character classification in the
new database. Collation affects the sort order applied to strings,
- e.g., in queries with <literal>ORDER BY</literal>, as well as the
- order used in indexes on text columns. Character classification
- affects the categorization of characters, e.g., lower, upper, and
- digit. Also sets the <literal>LC_CTYPE</literal> aspect of the
- operating system environment. The default is the same setting as the
- template database. See <xref
+ e.g., in queries with <literal>ORDER BY</literal>, as well as the order used in indexes
+ on text columns. Character classification affects the categorization
+ of characters, e.g., lower, upper, and digit. Also sets the
+ associated aspects of the operating system environment,
+ <literal>LC_COLLATE</literal> and <literal>LC_CTYPE</literal>. The
+ default is the same setting as the template database. See <xref
linkend="collation-managing-create-libc"/> and <xref
linkend="collation-managing-create-icu"/> for details.
</para>
@@ -189,16 +189,17 @@ CREATE DATABASE <replaceable class="parameter">name</replaceable>
<term><replaceable class="parameter">lc_collate</replaceable></term>
<listitem>
<para>
- If <xref linkend="create-database-locale-provider"/> is
- <literal>libc</literal>, sets the default collation order to use in
- the new database, overriding the setting <xref
- linkend="create-database-locale"/>. Otherwise, this setting is
- ignored.
+ Sets <literal>LC_COLLATE</literal> in the database server's operating
+ system environment. The default is the setting of <xref
+ linkend="create-database-locale"/> if specified, otherwise the same
+ setting as the template database. See below for additional
+ restrictions.
</para>
<para>
- The default is the setting of <xref linkend="create-database-locale"/>
- if specified, otherwise the same setting as the template database.
- See below for additional restrictions.
+ If <xref linkend="create-database-locale-provider"/> is
+ <literal>libc</literal>, also sets the default collation order to use
+ in the new database, overriding the setting <xref
+ linkend="create-database-locale"/>.
</para>
</listitem>
</varlistentry>
@@ -207,18 +208,16 @@ CREATE DATABASE <replaceable class="parameter">name</replaceable>
<listitem>
<para>
Sets <literal>LC_CTYPE</literal> in the database server's operating
- system environment.
+ system environment. The default is the setting of <xref
+ linkend="create-database-locale"/> if specified, otherwise the same
+ setting as the template database. See below for additional
+ restrictions.
</para>
<para>
If <xref linkend="create-database-locale-provider"/> is
- <literal>libc</literal>, sets the default character classification to
- use in the new database, overriding the setting <xref
- linkend="create-database-locale"/>.
- </para>
- <para>
- The default is the setting of <xref linkend="create-database-locale"/>
- if specified, otherwise the same setting as the template database.
- See below for additional restrictions.
+ <literal>libc</literal>, also sets the default character
+ classification to use in the new database, overriding the setting
+ <xref linkend="create-database-locale"/>.
</para>
</listitem>
</varlistentry>
diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml
index 2ccbe13f390..5c4e0465ed9 100644
--- a/doc/src/sgml/ref/createdb.sgml
+++ b/doc/src/sgml/ref/createdb.sgml
@@ -136,8 +136,7 @@ PostgreSQL documentation
<term><option>--lc-collate=<replaceable class="parameter">locale</replaceable></option></term>
<listitem>
<para>
- Specifies the LC_COLLATE setting to be used in this database (ignored
- unless the locale provider is <literal>libc</literal>).
+ Specifies the LC_COLLATE setting to be used in this database.
</para>
</listitem>
</varlistentry>
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 8384b4f545e..f0580ae00d8 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -125,17 +125,13 @@ main(int argc, char *argv[])
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"));
/*
- * Collation is handled by pg_locale.c, and the behavior is dependent on
- * the provider. strcoll(), etc., should not be called directly.
- */
- init_locale("LC_COLLATE", LC_COLLATE, "C");
-
- /*
- * In the postmaster, absorb the environment value for LC_CTYPE.
- * Individual backends will change it later to pg_database.datctype, but
- * the postmaster cannot do that. If we leave it set to "C" then message
- * localization might not work well in the postmaster.
+ * In the postmaster, absorb the environment values for LC_COLLATE and
+ * LC_CTYPE. Individual backends will change these later to settings
+ * taken from pg_database, but the postmaster cannot do that. If we leave
+ * these set to "C" then message localization might not work well in the
+ * postmaster.
*/
+ init_locale("LC_COLLATE", LC_COLLATE, "");
init_locale("LC_CTYPE", LC_CTYPE, "");
/*
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 3d8c9bdebd5..8b6ea195eca 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -432,11 +432,12 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datctype);
ctype = TextDatumGetCString(datum);
- /*
- * Historically, we set LC_COLLATE from datcollate, as well. That's no
- * longer necessary because all collation behavior is handled through
- * pg_locale_t.
- */
+ if (pg_perm_setlocale(LC_COLLATE, collate) == NULL)
+ ereport(FATAL,
+ (errmsg("database locale is incompatible with operating system"),
+ errdetail("The database was initialized with LC_COLLATE \"%s\", "
+ " which is not recognized by setlocale().", collate),
+ errhint("Recreate the database with another locale or install the missing locale.")));
if (pg_perm_setlocale(LC_CTYPE, ctype) == NULL)
ereport(FATAL,
[parent: 07749290fd9b]