From ee66fa7b75dafa87e134a820bbd55efda82a5b2d Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Fri, 10 Oct 2025 11:03:59 -0700
Subject: [PATCH v3 2/2] initdb: add PG_LOCALE_PROVIDER environment variable.

Discussion: https://postgr.es/m/7d424dc0b032b30a22220634d12377bf59524bdb.camel@j-davis.com
---
 doc/src/sgml/ref/initdb.sgml                  | 11 +++++++++++
 src/bin/initdb/initdb.c                       | 19 ++++++++++++++++++-
 .../modules/test_escape/t/001_test_escape.pl  |  2 +-
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index 7613174c18b..e0437357d27 100644
--- a/doc/src/sgml/ref/initdb.sgml
+++ b/doc/src/sgml/ref/initdb.sgml
@@ -662,6 +662,17 @@ PostgreSQL documentation
     </listitem>
    </varlistentry>
 
+   <varlistentry id="app-initdb-environment-pg-locale-provider">
+    <term><envar>PG_LOCALE_PROVIDER</envar></term>
+
+    <listitem>
+     <para>
+      Sets the locale provider; can be overridden using the
+      <option>--locale-provider</option> option.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="app-initdb-environment-pg-color">
     <term><envar>PG_COLOR</envar></term>
     <listitem>
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index e2960e5f17c..3b3ca9c377f 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -82,6 +82,7 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 
+#define DEFAULT_LOCALE_PROVIDER		COLLPROVIDER_LIBC
 #define DEFAULT_BUILTIN_LOCALE		"C.UTF-8"
 #define DEFAULT_ICU_LOCALE			"und"
 
@@ -146,7 +147,7 @@ static char *lc_monetary = NULL;
 static char *lc_numeric = NULL;
 static char *lc_time = NULL;
 static char *lc_messages = NULL;
-static char locale_provider = COLLPROVIDER_LIBC;
+static char locale_provider = '\0';
 static bool builtin_locale_specified = false;
 static char *datlocale = NULL;
 static bool icu_locale_specified = false;
@@ -3484,6 +3485,22 @@ main(int argc, char *argv[])
 		exit(1);
 	}
 
+	if (locale_provider == '\0')
+	{
+		char	   *provider_name = getenv("PG_LOCALE_PROVIDER");
+
+		if (!provider_name)
+			locale_provider = DEFAULT_LOCALE_PROVIDER;
+		else if (strcmp(provider_name, "builtin") == 0)
+			locale_provider = COLLPROVIDER_BUILTIN;
+		else if (strcmp(provider_name, "icu") == 0)
+			locale_provider = COLLPROVIDER_ICU;
+		else if (strcmp(provider_name, "libc") == 0)
+			locale_provider = COLLPROVIDER_LIBC;
+		else
+			pg_fatal("unrecognized locale provider: %s", provider_name);
+	}
+
 	if (builtin_locale_specified && locale_provider != COLLPROVIDER_BUILTIN)
 		pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen",
 				 "--builtin-locale", "builtin");
diff --git a/src/test/modules/test_escape/t/001_test_escape.pl b/src/test/modules/test_escape/t/001_test_escape.pl
index 0d5aec3ed74..b29f093db28 100644
--- a/src/test/modules/test_escape/t/001_test_escape.pl
+++ b/src/test/modules/test_escape/t/001_test_escape.pl
@@ -12,7 +12,7 @@ $node->init();
 $node->start();
 
 $node->safe_psql('postgres',
-	q(CREATE DATABASE db_sql_ascii ENCODING "sql_ascii" TEMPLATE template0;));
+	q(CREATE DATABASE db_sql_ascii LOCALE_PROVIDER "builtin" LOCALE "C" ENCODING "sql_ascii" TEMPLATE template0;));
 
 my $cmd =
   [ 'test_escape', '--conninfo', $node->connstr . " dbname=db_sql_ascii" ];
-- 
2.43.0

