diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 14b8c2ff54591b355bf59a96d5cbc785a073da87..72bc50252281ba455806524245947e1301193725 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3861,10 +3861,16 @@ convert_one_string_to_scalar(char *value, int rangelo, int rangehi) return 0.0; /* empty string has scalar value 0 */ /* - * Since base is at least 10, need not consider more than about 20 chars + * There seems little point in considering more than a dozen bytes from + * the string. Since base is at least 10, that will give us nominal + * resolution of at least 12 decimal digits, which is surely far more + * precision than this estimation technique has got anyway (especially in + * non-C locales). Also, even with the maximum possible base of 256, this + * ensures denom cannot grow larger than 256^13 = 2.03e31, which will not + * overflow on any known machine. */ - if (slen > 20) - slen = 20; + if (slen > 12) + slen = 12; /* Convert initial characters to fraction */ base = rangehi - rangelo + 1;