#6779 internal error: division overflow. Previous error handling (see #4520) was too restrictive.

This commit is contained in:
Alexander Mai 2015-06-20 23:15:35 +02:00
parent 4172011e78
commit b6858622eb
2 changed files with 3 additions and 2 deletions

View File

@ -617,10 +617,10 @@ std::string MathLib::divide(const std::string &first, const std::string &second)
if (MathLib::isInt(first) && MathLib::isInt(second)) { if (MathLib::isInt(first) && MathLib::isInt(second)) {
const bigint a = toLongNumber(first); const bigint a = toLongNumber(first);
const bigint b = toLongNumber(second); const bigint b = toLongNumber(second);
if (a == std::numeric_limits<bigint>::min())
throw InternalError(0, "Internal Error: Division overflow");
if (b == 0) if (b == 0)
throw InternalError(0, "Internal Error: Division by zero"); throw InternalError(0, "Internal Error: Division by zero");
if (a == std::numeric_limits<bigint>::min() && std::abs(b)<=1)
throw InternalError(0, "Internal Error: Division overflow");
return toString(toLongNumber(first) / b) + intsuffix(first, second); return toString(toLongNumber(first) / b) + intsuffix(first, second);
} else if (isNullValue(second)) { } else if (isNullValue(second)) {
if (isNullValue(first)) if (isNullValue(first))

View File

@ -139,6 +139,7 @@ private:
ASSERT_EQUALS("1" , MathLib::divide("3", "2")); ASSERT_EQUALS("1" , MathLib::divide("3", "2"));
ASSERT_THROW(MathLib::divide("123", "0"), InternalError); // throw ASSERT_THROW(MathLib::divide("123", "0"), InternalError); // throw
ASSERT_THROW(MathLib::divide("-9223372036854775808", "-1"), InternalError); // #4520 - out of range => throw ASSERT_THROW(MathLib::divide("-9223372036854775808", "-1"), InternalError); // #4520 - out of range => throw
ASSERT_EQUALS("4611686018427387904", MathLib::divide("-9223372036854775808", "-2")); // #6679
MathLib::divide("123", "0.0"); // don't throw MathLib::divide("123", "0.0"); // don't throw
// Unknown action should throw exception // Unknown action should throw exception