On 2019-08-08 17:51, Tom Lane wrote: > However, I don't much like the choice to set LC_COLLATE and LC_CTYPE > differently. That seems to be risking weird behavior, and for what? > I'd be inclined to just remove the WIN32 stanza, initialize all > three of these variables with "", and explain it along the lines of > > * 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.
OK, let's do it like that. Updated patch attached. -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From e3deca5b7236d1f83a286f347338f320ca952147 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <pe...@eisentraut.org> Date: Mon, 12 Aug 2019 20:09:40 +0200 Subject: [PATCH v2] 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. Discussion: https://www.postgresql.org/message-id/flat/eeaf2f99-a1a6-8aca-3f43-9ab0b2fb112a%402ndquadrant.com --- src/backend/main/main.c | 38 ++++++++++---------------------------- src/bin/initdb/initdb.c | 14 -------------- 2 files changed, 10 insertions(+), 42 deletions(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 7b18f8c758..a9edbfd4a4 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -99,42 +99,24 @@ 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. + * 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. */ - { - 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_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.c index 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