]> granicus.if.org Git - postgresql/commitdiff
When creating a collation, check that the locales can be loaded
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 4 Mar 2011 20:14:37 +0000 (22:14 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 4 Mar 2011 20:14:37 +0000 (22:14 +0200)
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
src/test/regress/expected/collate.linux.utf8.out
src/test/regress/sql/collate.linux.utf8.sql

index 6db72d919cc453880eea9ceea4e92bad2c51ad21..18e88d2653fc465fb8c6a072a88f8a5f2da55feb 100644 (file)
@@ -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);
 }
 
 /*
index ff2678975e354a76b0579d85021b9131790c206e..c793918be4f1d5cde24f0683347a53cf515e5487 100644 (file)
@@ -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;
index 856a497914fca3ae1e522c9ef60a226c60e13061..9fd55e817e63f8f1d4397d99809e5110176f0925 100644 (file)
@@ -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;