diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2022-01-20 09:38:05 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2022-01-20 09:50:18 +0100 |
commit | b99ccd2cb2178b62b613edaf427fda8deace5bbf (patch) | |
tree | ec3beac28658ae0fd3cfd5078c4b6a9a1b9ebb17 /src/backend/regex/regc_pg_locale.c | |
parent | b2a76bb7d0550fbfdc028e5bda4853d05444398a (diff) | |
download | postgresql-b99ccd2cb2178b62b613edaf427fda8deace5bbf.tar.gz postgresql-b99ccd2cb2178b62b613edaf427fda8deace5bbf.zip |
Call pg_newlocale_from_collation() also with default collation
Previously, callers of pg_newlocale_from_collation() did not call it
if the collation was DEFAULT_COLLATION_OID and instead proceeded with
a pg_locale_t of 0. Instead, now we call it anyway and have it return
0 if the default collation was passed. It already did this, so we
just have to adjust the callers. This simplifies all the call sites
and also makes future enhancements easier.
After discussion and testing, the previous comment in pg_locale.c
about avoiding this for performance reasons may have been mistaken
since it was testing a very different patch version way back when.
Reviewed-by: Julien Rouhaud <rjuju123@gmail.com>
Discussion: https://www.postgresql.org/message-id/ed3baa81-7fac-7788-cc12-41e3f7917e34@enterprisedb.com
Diffstat (limited to 'src/backend/regex/regc_pg_locale.c')
-rw-r--r-- | src/backend/regex/regc_pg_locale.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/src/backend/regex/regc_pg_locale.c b/src/backend/regex/regc_pg_locale.c index e0d93eab321..6e84f42cb24 100644 --- a/src/backend/regex/regc_pg_locale.c +++ b/src/backend/regex/regc_pg_locale.c @@ -231,6 +231,18 @@ static const unsigned char pg_char_properties[128] = { void pg_set_regex_collation(Oid collation) { + if (!OidIsValid(collation)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for regular expression"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } + if (lc_ctype_is_c(collation)) { /* C/POSIX collations use this path regardless of database encoding */ @@ -240,28 +252,12 @@ pg_set_regex_collation(Oid collation) } else { - if (collation == DEFAULT_COLLATION_OID) - pg_regex_locale = 0; - else if (OidIsValid(collation)) - { - /* - * NB: pg_newlocale_from_collation will fail if not HAVE_LOCALE_T; - * the case of pg_regex_locale != 0 but not HAVE_LOCALE_T does not - * have to be considered below. - */ - pg_regex_locale = pg_newlocale_from_collation(collation); - } - else - { - /* - * This typically means that the parser could not resolve a - * conflict of implicit collations, so report it that way. - */ - ereport(ERROR, - (errcode(ERRCODE_INDETERMINATE_COLLATION), - errmsg("could not determine which collation to use for regular expression"), - errhint("Use the COLLATE clause to set the collation explicitly."))); - } + /* + * NB: pg_newlocale_from_collation will fail if not HAVE_LOCALE_T; + * the case of pg_regex_locale != 0 but not HAVE_LOCALE_T does not + * have to be considered below. + */ + pg_regex_locale = pg_newlocale_from_collation(collation); if (pg_regex_locale && !pg_regex_locale->deterministic) ereport(ERROR, |