Bug in numeric_power() if exponent is INT_MIN

Поиск
Список
Период
Сортировка
От Dean Rasheed
Тема Bug in numeric_power() if exponent is INT_MIN
Дата
Msg-id CAEZATCVd6pMkz=BrZEgBKyqqJrt2xghr=fNc8+Z=5xC6cgWrWA@mail.gmail.com
обсуждение исходный текст
Ответы Re: Bug in numeric_power() if exponent is INT_MIN  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
(Amusingly I only found this after discovering that Windows Calculator
has a similar bug which causes it to crash if you try to raise a
number to the power INT_MIN.)

On my machine, numeric_power() loses all precision if the exponent is
INT_MIN, though the actual failure mode might well be
platform-dependent:

SELECT n, 1.000000000123^n AS pow
  FROM (VALUES (-2147483647), (-2147483648), (-2147483649)) AS v(n);
      n      |        pow
-------------+--------------------
 -2147483647 | 0.7678656557347558
 -2147483648 | 1.0000000000000000
 -2147483649 | 0.7678656555458609
(3 rows)

The issue is in this line from power_var_int():

    sig_digits += (int) log(Abs(exp)) + 8;

because "exp" is a signed int, so Abs(exp) leaves INT_MIN unchanged.
The most straightforward fix is to use fabs() instead, so that "exp"
is cast to double *before* the absolute value is taken, as in the
attached patch.

This code was added in 7d9a4737c2, which first appeared in PG 9.6, so
barring objections, I'll push and back-patch this fix that far.

Regards,
Dean

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: "David G. Johnston"
Дата:
Сообщение: Re: set_config() documentation clarification
Следующее
От: Zhihong Yu
Дата:
Сообщение: Re: poc - possibility to write window function in PL languages