summaryrefslogtreecommitdiff
path: root/src/bin/initdb/initdb.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2022-09-16 09:37:54 +0200
committerPeter Eisentraut <peter@eisentraut.org>2022-09-16 09:41:33 +0200
commitc7db01e325a530ec38ec7ba57cd3ed32e123e33c (patch)
tree699109735a34071a016940152cb6ab5e7960e74f /src/bin/initdb/initdb.c
parentcf2c7a736e4939ff0d6cf2acd29b17eea3bca7c2 (diff)
downloadpostgresql-c7db01e325a530ec38ec7ba57cd3ed32e123e33c.tar.gz
Don't allow creation of database with ICU locale with unsupported encoding
Check in CREATE DATABASE and initdb that the selected encoding is supported by ICU. Before, they would pass but users would later get an error from the server when they tried to use the database. Also document that initdb sets the encoding to UTF8 by default if the ICU locale provider is chosen. Author: Marina Polyakova <m.polyakova@postgrespro.ru> Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://www.postgresql.org/message-id/6dd6db0984d86a51b7255ba79f111971@postgrespro.ru
Diffstat (limited to 'src/bin/initdb/initdb.c')
-rw-r--r--src/bin/initdb/initdb.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 6aeec8d426..28f22b25b2 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -2043,6 +2043,27 @@ check_locale_encoding(const char *locale, int user_enc)
}
/*
+ * check if the chosen encoding matches is supported by ICU
+ *
+ * this should match the similar check in the backend createdb() function
+ */
+static bool
+check_icu_locale_encoding(int user_enc)
+{
+ if (!(is_encoding_supported_by_icu(user_enc)))
+ {
+ pg_log_error("encoding mismatch");
+ pg_log_error_detail("The encoding you selected (%s) is not supported with the ICU provider.",
+ pg_encoding_to_char(user_enc));
+ pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, "
+ "or choose a matching combination.",
+ progname);
+ return false;
+ }
+ return true;
+}
+
+/*
* set up the locale variables
*
* assumes we have called setlocale(LC_ALL, "") -- see set_pglocale_pgservice
@@ -2310,7 +2331,11 @@ setup_locale_encoding(void)
}
if (!encoding && locale_provider == COLLPROVIDER_ICU)
+ {
encodingid = PG_UTF8;
+ printf(_("The default database encoding has been set to \"%s\".\n"),
+ pg_encoding_to_char(encodingid));
+ }
else if (!encoding)
{
int ctype_enc;
@@ -2362,6 +2387,10 @@ setup_locale_encoding(void)
if (!check_locale_encoding(lc_ctype, encodingid) ||
!check_locale_encoding(lc_collate, encodingid))
exit(1); /* check_locale_encoding printed the error */
+
+ if (locale_provider == COLLPROVIDER_ICU &&
+ !check_icu_locale_encoding(encodingid))
+ exit(1);
}