1_initdb_set_conf_when_specified.txt

text/plain

Filename: 1_initdb_set_conf_when_specified.txt
Type: text/plain
Part: 0
Message: initdb --no-locale=C doesn't work as specified when the environment is not C
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 0c6f5ceb0a..56a8c5b60e 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -144,6 +144,10 @@ static char *lc_monetary = NULL;
 static char *lc_numeric = NULL;
 static char *lc_time = NULL;
 static char *lc_messages = NULL;
+static bool lc_monetary_specified = false;
+static bool lc_numeric_specified = false;
+static bool lc_time_specified = false;
+static bool lc_messages_specified = false;
 static char locale_provider = COLLPROVIDER_LIBC;
 static char *icu_locale = NULL;
 static char *icu_rules = NULL;
@@ -1230,19 +1234,19 @@ setup_config(void)
 	 * Hack: don't replace the LC_XXX GUCs when their value is 'C', because
 	 * replace_guc_value will decide not to quote that, which looks strange.
 	 */
-	if (strcmp(lc_messages, "C") != 0)
+	if (strcmp(lc_messages, "C") != 0 || lc_messages_specified)
 		conflines = replace_guc_value(conflines, "lc_messages",
 									  lc_messages, false);
 
-	if (strcmp(lc_monetary, "C") != 0)
+	if (strcmp(lc_monetary, "C") != 0 || lc_monetary_specified)
 		conflines = replace_guc_value(conflines, "lc_monetary",
 									  lc_monetary, false);
 
-	if (strcmp(lc_numeric, "C") != 0)
+	if (strcmp(lc_numeric, "C") != 0 || lc_numeric_specified)
 		conflines = replace_guc_value(conflines, "lc_numeric",
 									  lc_numeric, false);
 
-	if (strcmp(lc_time, "C") != 0)
+	if (strcmp(lc_time, "C") != 0 || lc_time_specified)
 		conflines = replace_guc_value(conflines, "lc_time",
 									  lc_time, false);
 
@@ -2374,6 +2378,15 @@ setlocales(void)
 			icu_locale = locale;
 	}
 
+	/*
+	 * At this point, null means that the value is not specifed in the command
+	 * line.
+	 */
+	if (lc_numeric != NULL) lc_numeric_specified = true;
+	if (lc_time != NULL) lc_time_specified = true;
+	if (lc_monetary != NULL) lc_monetary_specified = true;
+	if (lc_messages != NULL) lc_messages_specified = true;
+
 	/*
 	 * canonicalize locale names, and obtain any missing values from our
 	 * current environment