pgsql: Fix power_var_int() for large integer exponents.
От | Tom Lane |
---|---|
Тема | pgsql: Fix power_var_int() for large integer exponents. |
Дата | |
Msg-id | E1XSHa1-00086a-2A@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_0_STABLE Details ------- http://git.postgresql.org/pg/commitdiff/26f8a4691e2ab459e856ba513aa559e7043d08fa 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 по дате отправления: