• H
    setlocale() on Windows doesn't work correctly if the locale name contains · a88b6e4c
    Heikki Linnakangas 提交于
    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.
    a88b6e4c
chklocale.c 10.7 KB