mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Check return code from strxfrm on Windows since it has a
non-standard way of indicating errors, so we don't try to allocate INT_MAX bytes to store a result in.
This commit is contained in:
parent
61f9c3a54d
commit
ff5ff47b5d
@ -15,7 +15,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.214.2.4 2007/01/28 02:53:42 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.214.2.5 2007/05/05 17:05:55 mha Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -3126,6 +3126,10 @@ convert_string_datum(Datum value, Oid typid)
|
|||||||
* from the second call than the first; thus the Assert must be <= not
|
* from the second call than the first; thus the Assert must be <= not
|
||||||
* == as you'd expect. Can't any of these people program their way
|
* == as you'd expect. Can't any of these people program their way
|
||||||
* out of a paper bag?
|
* out of a paper bag?
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
*/
|
*/
|
||||||
#if _MSC_VER == 1400 /* VS.Net 2005 */
|
#if _MSC_VER == 1400 /* VS.Net 2005 */
|
||||||
|
|
||||||
@ -3140,6 +3144,15 @@ convert_string_datum(Datum value, Oid typid)
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
xfrmlen = strxfrm(NULL, val, 0);
|
xfrmlen = strxfrm(NULL, val, 0);
|
||||||
|
#endif
|
||||||
|
#ifdef WIN32
|
||||||
|
/*
|
||||||
|
* On Windows, strxfrm returns INT_MAX when an error occurs. Instead of
|
||||||
|
* trying to allocate this much memory (and fail), just return the
|
||||||
|
* original string unmodified as if we were in the C locale.
|
||||||
|
*/
|
||||||
|
if (xfrmlen == INT_MAX)
|
||||||
|
return val;
|
||||||
#endif
|
#endif
|
||||||
xfrmstr = (char *) palloc(xfrmlen + 1);
|
xfrmstr = (char *) palloc(xfrmlen + 1);
|
||||||
xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1);
|
xfrmlen2 = strxfrm(xfrmstr, val, xfrmlen + 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user