提交 34ae4bac authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Detect possible overflow in integer division

上级 9aad5808
......@@ -75,7 +75,7 @@ public class ValueByte extends Value {
if (other.value == 0) {
throw DbException.get(ErrorCode.DIVISION_BY_ZERO_1, getSQL());
}
return ValueByte.get((byte) (value / other.value));
return checkRange(value / other.value);
}
@Override
......
......@@ -100,11 +100,15 @@ public class ValueInt extends Value {
@Override
public Value divide(Value v) {
ValueInt other = (ValueInt) v;
if (other.value == 0) {
int y = ((ValueInt) v).value;
if (y == 0) {
throw DbException.get(ErrorCode.DIVISION_BY_ZERO_1, getSQL());
}
return ValueInt.get(value / other.value);
int x = value;
if (x == Integer.MIN_VALUE && y == -1) {
throw DbException.get(ErrorCode.NUMERIC_VALUE_OUT_OF_RANGE_1, "2147483648");
}
return ValueInt.get(x / y);
}
@Override
......
......@@ -127,11 +127,15 @@ public class ValueLong extends Value {
@Override
public Value divide(Value v) {
ValueLong other = (ValueLong) v;
if (other.value == 0) {
long y = ((ValueLong) v).value;
if (y == 0) {
throw DbException.get(ErrorCode.DIVISION_BY_ZERO_1, getSQL());
}
return ValueLong.get(value / other.value);
long x = value;
if (x == Long.MIN_VALUE && y == -1) {
throw getOverflow();
}
return ValueLong.get(x / y);
}
@Override
......
......@@ -75,7 +75,7 @@ public class ValueShort extends Value {
if (other.value == 0) {
throw DbException.get(ErrorCode.DIVISION_BY_ZERO_1, getSQL());
}
return ValueShort.get((short) (value / other.value));
return checkRange(value / other.value);
}
@Override
......
......@@ -40,3 +40,14 @@ SELECT CAST(1 AS BIGINT) * CAST(-9223372036854775808 AS BIGINT);
SELECT CAST(-1 AS BIGINT) * CAST(-9223372036854775808 AS BIGINT);
> exception NUMERIC_VALUE_OUT_OF_RANGE_1
-- Division
SELECT CAST(1 AS BIGINT) / CAST(0 AS BIGINT);
> exception DIVISION_BY_ZERO_1
SELECT CAST(-9223372036854775808 AS BIGINT) / CAST(1 AS BIGINT);
>> -9223372036854775808
SELECT CAST(-9223372036854775808 AS BIGINT) / CAST(-1 AS BIGINT);
> exception NUMERIC_VALUE_OUT_OF_RANGE_1
......@@ -2,3 +2,14 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
-- Division
SELECT CAST(1 AS INT) / CAST(0 AS INT);
> exception DIVISION_BY_ZERO_1
SELECT CAST(-2147483648 AS INT) / CAST(1 AS INT);
>> -2147483648
SELECT CAST(-2147483648 AS INT) / CAST(-1 AS INT);
> exception NUMERIC_VALUE_OUT_OF_RANGE_1
......@@ -2,3 +2,14 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
-- Division
SELECT CAST(1 AS SMALLINT) / CAST(0 AS SMALLINT);
> exception DIVISION_BY_ZERO_1
SELECT CAST(-32768 AS SMALLINT) / CAST(1 AS SMALLINT);
>> -32768
SELECT CAST(-32768 AS SMALLINT) / CAST(-1 AS SMALLINT);
> exception NUMERIC_VALUE_OUT_OF_RANGE_1
......@@ -2,3 +2,14 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
--
-- Division
SELECT CAST(1 AS TINYINT) / CAST(0 AS TINYINT);
> exception DIVISION_BY_ZERO_1
SELECT CAST(-128 AS TINYINT) / CAST(1 AS TINYINT);
>> -128
SELECT CAST(-128 AS TINYINT) / CAST(-1 AS TINYINT);
> exception NUMERIC_VALUE_OUT_OF_RANGE_1
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论