pgsql: Fix power_var_int() for large integer exponents.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Fix power_var_int() for large integer exponents.
Дата
Msg-id E1XSHa1-00086Y-25@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Fix power_var_int() for large integer exponents.

The code for raising a NUMERIC value to an integer power wasn't very
careful about large powers.  It got an outright wrong answer for an
exponent of INT_MIN, due to failure to consider overflow of the Abs(exp)
operation; which is fixable by using an unsigned rather than signed
exponent value after that point.  Also, even though the number of
iterations of the power-computation loop is pretty limited, it's easy for
the repeated squarings to result in ridiculously enormous intermediate
values, which can take unreasonable amounts of time/memory to process,
or even overflow the internal "weight" field and so produce a wrong answer.
We can forestall misbehaviors of that sort by bailing out as soon as the
weight value exceeds what will fit in int16, since then the final answer
must overflow (if exp > 0) or underflow (if exp < 0) the packed numeric
format.

Per off-list report from Pavel Stehule.  Back-patch to all supported
branches.

Branch
------
REL9_1_STABLE

Details
-------
http://git.postgresql.org/pg/commitdiff/cf5c20b063fc362792be4202990e81928dbb68a1

Modified Files
--------------
src/backend/utils/adt/numeric.c       |   30 ++++++++++++++++++++++++++----
src/test/regress/expected/numeric.out |   19 +++++++++++++++++++
src/test/regress/sql/numeric.sql      |    9 +++++++++
3 files changed, 54 insertions(+), 4 deletions(-)


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

Предыдущее
От: Stephen Frost
Дата:
Сообщение: Re: pgsql: Fix JSON regression tests.
Следующее
От: Tom Lane
Дата:
Сообщение: pgsql: Fix power_var_int() for large integer exponents.