From: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: clean up obsolete initdb locale handling
Date: Thu, 8 Aug 2019 16:27:25 +0200
Message-ID: <eeaf2f99-a1a6-8aca-3f43-9ab0b2fb112a@2ndquadrant.com> (raw)
A long time ago, we changed LC_COLLATE and LC_CTYPE from cluster-wide to
per-database (61d967498802ab86d8897cb3c61740d7e9d712f6). There is some
leftover code from that in initdb.c and backend/main/main.c to pass
these environment variables around in the expectations that the backend
will write them to pg_control during bootstrap, which is of course all a
lie now.
The attached patch cleans that up. (Not totally sure about the WIN32
block, but the change seems good to me.)
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 51568d2923ce26ecf43f028dd4075376cfb864fb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 8 Aug 2019 12:33:07 +0200
Subject: [PATCH] initdb: Remove obsolete locale handling
The method of passing LC_COLLATE and LC_CTYPE to the backend during
initdb is obsolete as of 61d967498802ab86d8897cb3c61740d7e9d712f6.
This can all be removed.
---
src/backend/main/main.c | 39 ++++++++++-----------------------------
src/bin/initdb/initdb.c | 14 --------------
2 files changed, 10 insertions(+), 43 deletions(-)
diff --git a/src/backend/main/main.c b/src/backend/main/main.cindex 7b18f8c758..1bd849fb51 100644--- a/src/backend/main/main.c+++ b/src/backend/main/main.c@@ -99,42 +99,23 @@ main(int argc, char *argv[])
MemoryContextInit();
/*
- * Set up locale information from environment. Note that LC_CTYPE and- * LC_COLLATE will be overridden later from pg_control if we are in an- * already-initialized database. We set them here so that they will be- * available to fill pg_control during initdb. LC_MESSAGES will get set- * later during GUC option processing, but we set it here to allow startup- * error messages to be localized.+ * Set up locale information
*/
-
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"));
-#ifdef WIN32-
/*
- * Windows uses codepages rather than the environment, so we work around- * that by querying the environment explicitly first for LC_COLLATE and- * LC_CTYPE. We have to do this because initdb passes those values in the- * environment. If there is nothing there we fall back on the codepage.+ * LC_COLLATE and LC_CTYPE are set at backend start to values from+ * pg_database. We start out LC_COLLATE as "C" (nothing in the postmaster+ * should care). But LC_CTYPE should be set to something reasonable so+ * that gettext can work.
*/
- {- char *env_locale;-- if ((env_locale = getenv("LC_COLLATE")) != NULL)- init_locale("LC_COLLATE", LC_COLLATE, env_locale);- else- init_locale("LC_COLLATE", LC_COLLATE, "");-- if ((env_locale = getenv("LC_CTYPE")) != NULL)- init_locale("LC_CTYPE", LC_CTYPE, env_locale);- else- init_locale("LC_CTYPE", LC_CTYPE, "");- }-#else- init_locale("LC_COLLATE", LC_COLLATE, "");+ init_locale("LC_COLLATE", LC_COLLATE, "C");
init_locale("LC_CTYPE", LC_CTYPE, "");
-#endif+ /*+ * LC_MESSAGES will get set later during GUC option processing, but we set+ * it here to allow startup error messages to be localized.+ */
#ifdef LC_MESSAGES
init_locale("LC_MESSAGES", LC_MESSAGES, "");
#endif
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.cindex 551d379d85..88a261d9bd 100644--- a/src/bin/initdb/initdb.c+++ b/src/bin/initdb/initdb.c@@ -1417,20 +1417,6 @@ bootstrap_template1(void)
bki_lines = replace_token(bki_lines, "LC_CTYPE",
escape_quotes_bki(lc_ctype));
- /*- * Pass correct LC_xxx environment to bootstrap.- *- * The shell script arranged to restore the LC settings afterwards, but- * there doesn't seem to be any compelling reason to do that.- */- snprintf(cmd, sizeof(cmd), "LC_COLLATE=%s", lc_collate);- putenv(pg_strdup(cmd));-- snprintf(cmd, sizeof(cmd), "LC_CTYPE=%s", lc_ctype);- putenv(pg_strdup(cmd));-- unsetenv("LC_ALL");-
/* Also ensure backend isn't confused by this environment var: */
unsetenv("PGCLIENTENCODING");
--
2.22.0
Attachments:
[text/plain] 0001-initdb-Remove-obsolete-locale-handling.patch (3.3K, ../eeaf2f99-a1a6-8aca-3f43-9ab0b2fb112a@2ndquadrant.com/2-0001-initdb-Remove-obsolete-locale-handling.patch)
download | inline diff:
From 51568d2923ce26ecf43f028dd4075376cfb864fb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 8 Aug 2019 12:33:07 +0200
Subject: [PATCH] initdb: Remove obsolete locale handling
The method of passing LC_COLLATE and LC_CTYPE to the backend during
initdb is obsolete as of 61d967498802ab86d8897cb3c61740d7e9d712f6.
This can all be removed.
---
src/backend/main/main.c | 39 ++++++++++-----------------------------
src/bin/initdb/initdb.c | 14 --------------
2 files changed, 10 insertions(+), 43 deletions(-)
diff --git a/src/backend/main/main.c b/src/backend/main/main.cindex 7b18f8c758..1bd849fb51 100644--- a/src/backend/main/main.c+++ b/src/backend/main/main.c@@ -99,42 +99,23 @@ main(int argc, char *argv[])
MemoryContextInit();
/*
- * Set up locale information from environment. Note that LC_CTYPE and- * LC_COLLATE will be overridden later from pg_control if we are in an- * already-initialized database. We set them here so that they will be- * available to fill pg_control during initdb. LC_MESSAGES will get set- * later during GUC option processing, but we set it here to allow startup- * error messages to be localized.+ * Set up locale information
*/
-
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"));
-#ifdef WIN32-
/*
- * Windows uses codepages rather than the environment, so we work around- * that by querying the environment explicitly first for LC_COLLATE and- * LC_CTYPE. We have to do this because initdb passes those values in the- * environment. If there is nothing there we fall back on the codepage.+ * LC_COLLATE and LC_CTYPE are set at backend start to values from+ * pg_database. We start out LC_COLLATE as "C" (nothing in the postmaster+ * should care). But LC_CTYPE should be set to something reasonable so+ * that gettext can work.
*/
- {- char *env_locale;-- if ((env_locale = getenv("LC_COLLATE")) != NULL)- init_locale("LC_COLLATE", LC_COLLATE, env_locale);- else- init_locale("LC_COLLATE", LC_COLLATE, "");-- if ((env_locale = getenv("LC_CTYPE")) != NULL)- init_locale("LC_CTYPE", LC_CTYPE, env_locale);- else- init_locale("LC_CTYPE", LC_CTYPE, "");- }-#else- init_locale("LC_COLLATE", LC_COLLATE, "");+ init_locale("LC_COLLATE", LC_COLLATE, "C");
init_locale("LC_CTYPE", LC_CTYPE, "");
-#endif+ /*+ * LC_MESSAGES will get set later during GUC option processing, but we set+ * it here to allow startup error messages to be localized.+ */
#ifdef LC_MESSAGES
init_locale("LC_MESSAGES", LC_MESSAGES, "");
#endif
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.cindex 551d379d85..88a261d9bd 100644--- a/src/bin/initdb/initdb.c+++ b/src/bin/initdb/initdb.c@@ -1417,20 +1417,6 @@ bootstrap_template1(void)
bki_lines = replace_token(bki_lines, "LC_CTYPE",
escape_quotes_bki(lc_ctype));
- /*- * Pass correct LC_xxx environment to bootstrap.- *- * The shell script arranged to restore the LC settings afterwards, but- * there doesn't seem to be any compelling reason to do that.- */- snprintf(cmd, sizeof(cmd), "LC_COLLATE=%s", lc_collate);- putenv(pg_strdup(cmd));-- snprintf(cmd, sizeof(cmd), "LC_CTYPE=%s", lc_ctype);- putenv(pg_strdup(cmd));-- unsetenv("LC_ALL");-
/* Also ensure backend isn't confused by this environment var: */
unsetenv("PGCLIENTENCODING");
--
2.22.0
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: peter.eisentraut@2ndquadrant.com
Subject: Re: clean up obsolete initdb locale handling
In-Reply-To: <eeaf2f99-a1a6-8aca-3f43-9ab0b2fb112a@2ndquadrant.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox