pgsql: setlocale() on Windows doesn't work correctly if the locale name

From: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: setlocale() on Windows doesn't work correctly if the locale name
Date: 2011-09-01 08:16:13
Message-ID: E1Qz2RZ-0004HN-N4@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

setlocale() on Windows doesn't work correctly if the locale name contains
dots. I previously worked around this in initdb, mapping the known
problematic locale names to aliases that work, but Hiroshi Inoue pointed
out that that's not enough because even if you use one of the aliases, like
"Chinese_HKG", setlocale(LC_CTYPE, NULL) returns back the long form, ie.
"Chinese_Hong Kong S.A.R.". When we try to restore an old locale value by
passing that value back to setlocale(), it fails. Note that you are affected
by this bug also if you use one of those short-form names manually, so just
reverting the hack in initdb won't fix it.

To work around that, move the locale name mapping from initdb to a wrapper
around setlocale(), so that the mapping is invoked on every setlocale() call.

Also, add a few checks for failed setlocale() calls in the backend. These
calls shouldn't fail, and if they do there isn't much we can do about it,
but at least you'll get a warning.

Backpatch to 9.1, where the initdb hack was introduced. The Windows bug
affects older versions too if you set locale manually to one of the aliases,
but given the lack of complaints from the field, I'm hesitent to backpatch.

Branch
------
REL9_1_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/83748f3a4e0a6bf3ea3d3da53dc507be038b3d1f

Modified Files
--------------
src/backend/utils/adt/pg_locale.c | 19 +++++--
src/bin/initdb/initdb.c | 70 +++----------------------
src/include/port.h | 13 ++++-
src/port/chklocale.c | 106 +++++++++++++++++++++++++++++++++++++
4 files changed, 138 insertions(+), 70 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Heikki Linnakangas 2011-09-01 11:05:00 pgsql: Fix MinGW build, broken by my previous patch to add a setlocale(
Previous Message Heikki Linnakangas 2011-09-01 06:37:13 pgsql: Move the line to undefine setlocale() macro on Win32 outside USE