From: Jeff Davis <pgsql@j-davis.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
To: Regina Obe <lr@pcorp.us>
Cc: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Cc: Sandro Santilli <strk@kbt.io>
Cc: pgsql-hackers@lists.postgresql.org
Subject: Re: Order changes in PG16 since ICU introduction
Date: Fri, 21 Apr 2023 12:25:00 -0700
Message-ID: <f83f089ee1e9acd5dbbbf3353294d24e1f196e95.camel@j-davis.com> (raw)
In-Reply-To: <3372735.1682101425@sss.pgh.pa.us>
References: <000b01d97465$c34bbd60$49e33820$@pcorp.us>
<3353947.1682092131@sss.pgh.pa.us>
<ZELDOktA75yYG4Z2@hst.kbt.io>
<533d93c5-f604-8e5f-4a48-975c08c53d59@enterprisedb.com>
<3365333.1682098091@sss.pgh.pa.us>
<002d01d97477$f0395640$d0ac02c0$@pcorp.us>
<3367226.1682099185@sss.pgh.pa.us>
<003b01d9747a$910471c0$b30d5540$@pcorp.us>
<3368986.1682099982@sss.pgh.pa.us>
<000001d9747d$066b7560$13426020$@pcorp.us>
<3372735.1682101425@sss.pgh.pa.us>
On Fri, 2023-04-21 at 14:23 -0400, Tom Lane wrote:
> postgres=# CREATE DATABASE test1 TEMPLATE=template0 ENCODING = 'UTF8'
> LOCALE = 'C';
...
> test1 | postgres | UTF8 | icu | C |
> C | en-US | |
> (4 rows)
>
> Looks like the "pick en-US even when told not to" problem exists here
> too.
Both provider (ICU) and the icu locale (en-US) are inherited from
template0. The LOCALE parameter to CREATE DATABASE doesn't affect
either of those things, because there's a separate parameter
ICU_LOCALE.
This happens the same way in v15, and although it matches the
documentation technically, it is not a great user experience.
I have a couple ideas:
1. Introduce a "none" provider to separate the concept of C/POSIX
locales from the libc provider. It's not really using a provider
anyway, it's just using memcmp(), and I think it causes confusion to
combine them. Saying "LOCALE_PROVIDER=none" is less error-prone than
"LOCALE_PROVIDER=libc LOCALE='C'".
2. Change the CREATE DATABASE syntax to catch these errors better at
the possible expense of backwards compatibility.
I am also having second thoughts about accepting "C" or "POSIX" as an
ICU locale and transforming it to "en-US-u-va-posix" in v16. It's not
terribly useful (why not just use memcmp()?), it's not fast in my
measurements (en-US is faster), so maybe it's better to just throw an
error and tell the user to use C (or provider=none as I suggest
above)?
Obviously the user could manually type "en-US-u-va-posix" if that's the
locale they want. Throwing an error would be a backwards-compatibility
issue, but in v15 an ICU locale of "C" just gives the root locale
anyway, which is probably not what they want.
Regards,
Jeff Davis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: pgsql@j-davis.com, tgl@sss.pgh.pa.us, lr@pcorp.us, peter.eisentraut@enterprisedb.com, strk@kbt.io, pgsql-hackers@lists.postgresql.org
Subject: Re: Order changes in PG16 since ICU introduction
In-Reply-To: <f83f089ee1e9acd5dbbbf3353294d24e1f196e95.camel@j-davis.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox