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
* 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.
* '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.
*
* 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'.
*
* 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'.
* On failure (e.g., unsupported typid), set *failure to true;
* otherwise, that variable is not changed. (We'll return NULL on failure.)
*
- * When using a non-C locale, we must pass the string through strxfrm()
+ * When using a non-C locale, we must pass the string through pg_strxfrm()
* before continuing, so as to generate correct locale-specific results.
*/
static char *
if (!lc_collate_is_c(collid))
{
+ pg_locale_t mylocale = pg_newlocale_from_collation(collid);
char *xfrmstr;
size_t xfrmlen;
size_t xfrmlen2 PG_USED_FOR_ASSERTS_ONLY;
/*
* XXX: We could guess at a suitable output buffer size and only call
- * strxfrm twice if our guess is too small.
+ * pg_strxfrm() twice if our guess is too small.
*
* XXX: strxfrm doesn't support UTF-8 encoding on Win32, it can return
* bogus data or set an error. This is not really a problem unless it
* crashes since it will only give an estimation error and nothing
* fatal.
+ *
+ * XXX: we do not check pg_strxfrm_enabled(). On some platforms and in
+ * some cases, libc strxfrm() may return the wrong results, but that
+ * will only lead to an estimation error.
*/
- xfrmlen = strxfrm(NULL, val, 0);
+ xfrmlen = pg_strxfrm(NULL, val, 0, mylocale);
#ifdef WIN32
/*
return val;
#endif
xfrmstr = (char *) palloc(xfrmlen + 1);
- xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1);
+ xfrmlen2 = pg_strxfrm(xfrmstr, val, xfrmlen + 1, mylocale);
/*
* Some systems (e.g., glibc) can return a smaller value from the