Avoid generating invalid character encoding sequences in make_greater_string.
Not sure how this mistake evaded detection for so long.
This commit is contained in:
parent
b8362d465d
commit
9fe097577e
@ -15,7 +15,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.155 2004/01/17 20:09:35 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.156 2004/02/02 03:07:08 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -3742,6 +3742,11 @@ pattern_selectivity(Const *patt, Pattern_Type ptype)
|
|||||||
*
|
*
|
||||||
* This could be rather slow in the worst case, but in most cases we
|
* This could be rather slow in the worst case, but in most cases we
|
||||||
* won't have to try more than one or two strings before succeeding.
|
* won't have to try more than one or two strings before succeeding.
|
||||||
|
*
|
||||||
|
* NOTE: at present this assumes we are in the C locale, so that simple
|
||||||
|
* bytewise comparison applies. However, we might be in a multibyte
|
||||||
|
* encoding such as UTF-8, so we do have to watch out for generating
|
||||||
|
* invalid encoding sequences.
|
||||||
*/
|
*/
|
||||||
Const *
|
Const *
|
||||||
make_greater_string(const Const *str_const)
|
make_greater_string(const Const *str_const)
|
||||||
@ -3788,13 +3793,20 @@ make_greater_string(const Const *str_const)
|
|||||||
/*
|
/*
|
||||||
* Try to generate a larger string by incrementing the last byte.
|
* Try to generate a larger string by incrementing the last byte.
|
||||||
*/
|
*/
|
||||||
if (*lastchar < (unsigned char) 255)
|
while (*lastchar < (unsigned char) 255)
|
||||||
{
|
{
|
||||||
Const *workstr_const;
|
Const *workstr_const;
|
||||||
|
|
||||||
(*lastchar)++;
|
(*lastchar)++;
|
||||||
|
|
||||||
if (datatype != BYTEAOID)
|
if (datatype != BYTEAOID)
|
||||||
|
{
|
||||||
|
/* do not generate invalid encoding sequences */
|
||||||
|
if (!pg_verifymbstr((const unsigned char *) workstr,
|
||||||
|
len, true))
|
||||||
|
continue;
|
||||||
workstr_const = string_to_const(workstr, datatype);
|
workstr_const = string_to_const(workstr, datatype);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
workstr_const = string_to_bytea_const(workstr, len);
|
workstr_const = string_to_bytea_const(workstr, len);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user