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;