From 4442e1975d3c4c96a0b573b7abd864b0cbe26f9d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Fri, 4 Mar 2011 22:14:37 +0200
Subject: [PATCH] When creating a collation, check that the locales can be
 loaded

This is the same check that would happen later when the collation is
used, but it's friendlier to check the collation already when it is
created.
---
 src/backend/commands/collationcmds.c             | 9 ++++++++-
 src/test/regress/expected/collate.linux.utf8.out | 2 ++
 src/test/regress/sql/collate.linux.utf8.sql      | 1 +
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c
index 6db72d919c..18e88d2653 100644
--- a/src/backend/commands/collationcmds.c
+++ b/src/backend/commands/collationcmds.c
@@ -15,6 +15,7 @@
 #include "postgres.h"
 
 #include "access/heapam.h"
+#include "access/xact.h"
 #include "catalog/dependency.h"
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
@@ -30,6 +31,7 @@
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
+#include "utils/pg_locale.h"
 #include "utils/syscache.h"
 
 static void AlterCollationOwner_internal(Relation rel, Oid collationOid,
@@ -51,6 +53,7 @@ DefineCollation(List *names, List *parameters)
 	DefElem	   *lcctypeEl = NULL;
 	char	   *collcollate = NULL;
 	char	   *collctype = NULL;
+	Oid			newoid;
 
 	collNamespace = QualifiedNameGetCreationNamespace(names, &collName);
 
@@ -130,12 +133,16 @@ DefineCollation(List *names, List *parameters)
 
 	check_encoding_locale_matches(GetDatabaseEncoding(), collcollate, collctype);
 
-	CollationCreate(collName,
+	newoid = CollationCreate(collName,
 					collNamespace,
 					GetUserId(),
 					GetDatabaseEncoding(),
 					collcollate,
 					collctype);
+
+	/* check that the locales can be loaded */
+	CommandCounterIncrement();
+	pg_newlocale_from_collation(newoid);
 }
 
 /*
diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out
index ff2678975e..c793918be4 100644
--- a/src/test/regress/expected/collate.linux.utf8.out
+++ b/src/test/regress/expected/collate.linux.utf8.out
@@ -744,6 +744,8 @@ ERROR:  encoding UTF8 does not match locale en_US
 DETAIL:  The chosen LC_CTYPE setting requires encoding LATIN1.
 CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail
 ERROR:  parameter "lc_ctype" must be specified
+CREATE COLLATION testx (locale = 'nonsense'); -- fail
+ERROR:  could not create locale "nonsense": No such file or directory
 CREATE COLLATION test4 FROM nonsense;
 ERROR:  collation "nonsense" for current database encoding "UTF8" does not exist
 CREATE COLLATION test5 FROM test0;
diff --git a/src/test/regress/sql/collate.linux.utf8.sql b/src/test/regress/sql/collate.linux.utf8.sql
index 856a497914..9fd55e817e 100644
--- a/src/test/regress/sql/collate.linux.utf8.sql
+++ b/src/test/regress/sql/collate.linux.utf8.sql
@@ -234,6 +234,7 @@ CREATE COLLATION test0 (locale = 'en_US.utf8'); -- fail
 CREATE COLLATION test1 (lc_collate = 'en_US.utf8', lc_ctype = 'de_DE.utf8');
 CREATE COLLATION test2 (locale = 'en_US'); -- fail
 CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail
+CREATE COLLATION testx (locale = 'nonsense'); -- fail
 
 CREATE COLLATION test4 FROM nonsense;
 CREATE COLLATION test5 FROM test0;
-- 
2.40.0