]> granicus.if.org Git - postgresql/commit
Change the way encoding and locale checks are done in pg_upgrade.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 10 Oct 2014 06:59:44 +0000 (09:59 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 10 Oct 2014 07:39:32 +0000 (10:39 +0300)
commit33755e8edf149dabfc0ed9b697a84f70b0cca0de
treedf2d6ce7daf787e3c27c9e0e1c65eae8dcefe9d0
parentf19f0ee7160e9aa0bec69146a02e544b9030191b
Change the way encoding and locale checks are done in pg_upgrade.

Lc_collate and lc_ctype have been per-database settings since server version
8.4, but pg_upgrade was still treating them as cluster-wide options. It
fetched the values for the template0 databases in old and new cluster, and
compared them. That's backwards; the encoding and locale of the template0
database doesn't matter, as template0 is guaranteed to contain only ASCII
characters. But if there are any other databases that exist on both clusters
(in particular template1 and postgres databases), their encodings and
locales must be compatible.

Also, make the locale comparison more lenient. If the locale names are not
equal, try to canonicalize both of them by passing them to setlocale(). We
used to do that only when upgrading from 9.1 or below, but it seems like a
good idea even with newer versions. If we change the canonical form of a
locale, this allows pg_upgrade to still work. I'm about to do just that to
fix bug #11431, by mapping a locale name that contains non-ASCII characters
to a pure-ASCII alias of the same locale.

No backpatching, because earlier versions of pg_upgrade still support
upgrading from 8.3 servers. That would be more complicated, so it doesn't
seem worth it, given that we haven't received any complaints about this
from users.
contrib/pg_upgrade/check.c
contrib/pg_upgrade/controldata.c
contrib/pg_upgrade/info.c
contrib/pg_upgrade/pg_upgrade.h