Need to use pg_perm_setlocale when setting LC_CTYPE and LC_COLLATE at startup.
authorHeikki Linnakangas <heikki@enterprisedb.com>
Wed, 8 Jul 2009 17:53:29 +0000 (17:53 +0000)
committerHeikki Linnakangas <heikki@enterprisedb.com>
Wed, 8 Jul 2009 17:53:29 +0000 (17:53 +0000)
Otherwise, the LC_CTYPE/COLLATE setting gets reverted when using plperl, which
leads to incorrect query results and index corruption.

This was accidentally broken in the per-database locale patch in 8.4. Pointed
out by Andrew Gierth.

src/backend/utils/init/postinit.c

index 6b98bedd5cd076bcf548072654602aee75df84d8..327ba7c180571db72d13e56a980a04176d3f8d45 100644 (file)
@@ -44,6 +44,7 @@
 #include "utils/acl.h"
 #include "utils/flatfiles.h"
 #include "utils/guc.h"
+#include "utils/pg_locale.h"
 #include "utils/plancache.h"
 #include "utils/portal.h"
 #include "utils/relcache.h"
@@ -247,14 +248,14 @@ CheckMyDatabase(const char *name, bool am_superuser)
        collate = NameStr(dbform->datcollate);
        ctype = NameStr(dbform->datctype);
 
-       if (setlocale(LC_COLLATE, collate) == NULL)
+       if (pg_perm_setlocale(LC_COLLATE, collate) == NULL)
                ereport(FATAL,
                        (errmsg("database locale is incompatible with operating system"),
                         errdetail("The database was initialized with LC_COLLATE \"%s\", "
                                           " which is not recognized by setlocale().", collate),
                         errhint("Recreate the database with another locale or install the missing locale.")));
 
-       if (setlocale(LC_CTYPE, ctype) == NULL)
+       if (pg_perm_setlocale(LC_CTYPE, ctype) == NULL)
                ereport(FATAL,
                        (errmsg("database locale is incompatible with operating system"),
                         errdetail("The database was initialized with LC_CTYPE \"%s\", "