postgres.git / summary / log / commit / refs

commit    4442e1975d3c4c96a0b573b7abd864b0cbe26f9d
Author:   Peter Eisentraut <peter_e@gmx.net>
Date:     Fri Mar 04 20:14:37 2011 +0000
First released in: 9.1.0

    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 6db72d919cc..18e88d2653f 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 ff2678975e3..c793918be4f 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 856a497914f..9fd55e817e6 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; [parent: bd58d9d88311]