summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2021-09-03 20:38:55 +0000
committerTom Lane2021-09-03 20:39:03 +0000
commitdb2760a84191c329c0cdfaa1dae048c32b0c1752 (patch)
treeabc3ee169d0764e84bcb0644a22239a7ad2d666d
parent0c6a6a0ab7675e151a6e46d3ec0846bfce9e030a (diff)
Disallow creating an ICU collation if the DB encoding won't support it.
Previously this was allowed, but the collation effectively vanished into the ether because of the way lookup_collation() works: you could not use the collation, nor even drop it. Seems better to give an error up front than to leave the user wondering why it doesn't work. (Because this test is in DefineCollation not CreateCollation, it does not prevent pg_import_system_collations from creating ICU collations, regardless of the initially-chosen encoding.) Per bug #17170 from Andrew Bille. Back-patch to v10 where ICU support was added. Discussion: https://postgr.es/m/17170-95845cf3f0a9c36d@postgresql.org
-rw-r--r--src/backend/commands/collationcmds.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c
index 5a2ba56ceca..4075f991a03 100644
--- a/src/backend/commands/collationcmds.c
+++ b/src/backend/commands/collationcmds.c
@@ -215,7 +215,26 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
if (!fromEl)
{
if (collprovider == COLLPROVIDER_ICU)
+ {
+#ifdef USE_ICU
+ /*
+ * We could create ICU collations with collencoding == database
+ * encoding, but it seems better to use -1 so that it matches the
+ * way initdb would create ICU collations. However, only allow
+ * one to be created when the current database's encoding is
+ * supported. Otherwise the collation is useless, plus we get
+ * surprising behaviors like not being able to drop the collation.
+ *
+ * Skip this test when !USE_ICU, because the error we want to
+ * throw for that isn't thrown till later.
+ */
+ if (!is_encoding_supported_by_icu(GetDatabaseEncoding()))
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("current database's encoding is not supported with this provider")));
+#endif
collencoding = -1;
+ }
else
{
collencoding = GetDatabaseEncoding();