diff options
author | Jeff Davis <jdavis@postgresql.org> | 2024-08-06 11:55:21 -0700 |
---|---|---|
committer | Jeff Davis <jdavis@postgresql.org> | 2024-08-06 12:25:12 -0700 |
commit | a890ad214942c9eab1b2f0c6997e7dc114f99e71 (patch) | |
tree | 7d3d4a461249eeb528a5739371c9cb6550daeb28 /src/backend/utils/adt/pg_locale.c | |
parent | a54d4ed183927f15e1853b83106acebeeeee11c8 (diff) | |
download | postgresql-a890ad214942c9eab1b2f0c6997e7dc114f99e71.tar.gz postgresql-a890ad214942c9eab1b2f0c6997e7dc114f99e71.zip |
selfuncs.c: use pg_strxfrm() instead of strxfrm().
pg_strxfrm() takes a pg_locale_t, so it works properly with all
providers. This improves estimates for ICU when performing linear
interpolation within a histogram bin.
Previously, convert_string_datum() always used strxfrm() and relied on
setlocale(). That did not produce good estimates for non-default or
non-libc collations.
Discussion: https://postgr.es/m/89475ee5487d795124f4e25118ea8f1853edb8cb.camel@j-davis.com
Diffstat (limited to 'src/backend/utils/adt/pg_locale.c')
-rw-r--r-- | src/backend/utils/adt/pg_locale.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 4e076904585..cd3661e7279 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -2124,14 +2124,7 @@ pg_strxfrm_libc(char *dest, const char *src, size_t destsize, pg_locale_t locale) { Assert(locale->provider == COLLPROVIDER_LIBC); - -#ifdef TRUST_STRXFRM return strxfrm_l(dest, src, destsize, locale->info.lt); -#else - /* shouldn't happen */ - PGLOCALE_SUPPORT_ERROR(locale->provider); - return 0; /* keep compiler quiet */ -#endif } static size_t @@ -2340,6 +2333,10 @@ pg_strxfrm_enabled(pg_locale_t locale) * The provided 'src' must be nul-terminated. If 'destsize' is zero, 'dest' * may be NULL. * + * Not all providers support pg_strxfrm() safely. The caller should check + * pg_strxfrm_enabled() first, otherwise this function may return wrong + * results or an error. + * * Returns the number of bytes needed (or more) to store the transformed * string, excluding the terminating nul byte. If the value returned is * 'destsize' or greater, the resulting contents of 'dest' are undefined. @@ -2372,6 +2369,10 @@ pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale) * 'src' does not need to be nul-terminated. If 'destsize' is zero, 'dest' may * be NULL. * + * Not all providers support pg_strnxfrm() safely. The caller should check + * pg_strxfrm_enabled() first, otherwise this function may return wrong + * results or an error. + * * Returns the number of bytes needed (or more) to store the transformed * string, excluding the terminating nul byte. If the value returned is * 'destsize' or greater, the resulting contents of 'dest' are undefined. @@ -2426,6 +2427,10 @@ pg_strxfrm_prefix_enabled(pg_locale_t locale) * * The provided 'src' must be nul-terminated. * + * Not all providers support pg_strxfrm_prefix() safely. The caller should + * check pg_strxfrm_prefix_enabled() first, otherwise this function may return + * wrong results or an error. + * * If destsize is not large enough to hold the resulting byte sequence, stores * only the first destsize bytes in 'dest'. Returns the number of bytes * actually copied to 'dest'. @@ -2455,6 +2460,10 @@ pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, * * The provided 'src' must be nul-terminated. * + * Not all providers support pg_strnxfrm_prefix() safely. The caller should + * check pg_strxfrm_prefix_enabled() first, otherwise this function may return + * wrong results or an error. + * * If destsize is not large enough to hold the resulting byte sequence, stores * only the first destsize bytes in 'dest'. Returns the number of bytes * actually copied to 'dest'. |