Commit 9fe09757 authored by Tom Lane's avatar Tom Lane

Avoid generating invalid character encoding sequences in make_greater_string.

Not sure how this mistake evaded detection for so long.
parent b8362d46
...@@ -15,7 +15,7 @@ ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment