Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
9aad5808
提交
9aad5808
authored
6 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Do not use BigInteger in ValueLong.multiply()
上级
b80fcd53
无相关合并请求
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
48 行增加
和
23 行删除
+48
-23
ValueLong.java
h2/src/main/org/h2/value/ValueLong.java
+10
-23
bigint.sql
h2/src/test/org/h2/test/scripts/datatypes/bigint.sql
+38
-0
没有找到文件。
h2/src/main/org/h2/value/ValueLong.java
浏览文件 @
9aad5808
...
@@ -43,7 +43,6 @@ public class ValueLong extends Value {
...
@@ -43,7 +43,6 @@ public class ValueLong extends Value {
*/
*/
public
static
final
int
DISPLAY_SIZE
=
20
;
public
static
final
int
DISPLAY_SIZE
=
20
;
private
static
final
BigInteger
MIN_BI
=
BigInteger
.
valueOf
(
Long
.
MIN_VALUE
);
private
static
final
int
STATIC_SIZE
=
100
;
private
static
final
int
STATIC_SIZE
=
100
;
private
static
final
ValueLong
[]
STATIC_CACHE
;
private
static
final
ValueLong
[]
STATIC_CACHE
;
...
@@ -110,32 +109,20 @@ public class ValueLong extends Value {
...
@@ -110,32 +109,20 @@ public class ValueLong extends Value {
return
add
(
other
.
negate
());
return
add
(
other
.
negate
());
}
}
private
static
boolean
isInteger
(
long
a
)
{
return
a
>=
Integer
.
MIN_VALUE
&&
a
<=
Integer
.
MAX_VALUE
;
}
@Override
@Override
public
Value
multiply
(
Value
v
)
{
public
Value
multiply
(
Value
v
)
{
ValueLong
other
=
(
ValueLong
)
v
;
long
x
=
value
;
long
result
=
value
*
other
.
value
;
long
y
=
((
ValueLong
)
v
).
value
;
if
(
value
==
0
||
value
==
1
||
other
.
value
==
0
||
other
.
value
==
1
)
{
long
result
=
x
*
y
;
return
ValueLong
.
get
(
result
);
// Check whether numbers are large enough to overflow and second value != 0
}
if
((
Math
.
abs
(
x
)
|
Math
.
abs
(
y
))
>>>
31
!=
0
&&
y
!=
0
if
(
isInteger
(
value
)
&&
isInteger
(
other
.
value
))
{
// Check with division
return
ValueLong
.
get
(
result
);
&&
(
result
/
y
!=
x
}
// Also check the special condition that is not handled above
// just checking one case is not enough: Long.MIN_VALUE * -1
||
x
==
Long
.
MIN_VALUE
&&
y
==
-
1
))
{
// probably this is correct but I'm not sure
// if (result / value == other.value && result / other.value == value) {
// return ValueLong.get(result);
//}
BigInteger
bv
=
BigInteger
.
valueOf
(
value
);
BigInteger
bo
=
BigInteger
.
valueOf
(
other
.
value
);
BigInteger
br
=
bv
.
multiply
(
bo
);
if
(
br
.
compareTo
(
MIN_BI
)
<
0
||
br
.
compareTo
(
MAX_BI
)
>
0
)
{
throw
getOverflow
();
throw
getOverflow
();
}
}
return
ValueLong
.
get
(
br
.
longValue
()
);
return
ValueLong
.
get
(
result
);
}
}
@Override
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/scripts/datatypes/bigint.sql
浏览文件 @
9aad5808
...
@@ -2,3 +2,41 @@
...
@@ -2,3 +2,41 @@
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- and the EPL 1.0 (http://h2database.com/html/license.html).
-- Initial Developer: H2 Group
-- Initial Developer: H2 Group
--
--
-- Multiplication
SELECT
CAST
(
-
4294967296
AS
BIGINT
)
*
CAST
(
2147483648
AS
BIGINT
);
>>
-
9223372036854775808
SELECT
CAST
(
4294967296
AS
BIGINT
)
*
CAST
(
-
2147483648
AS
BIGINT
);
>>
-
9223372036854775808
SELECT
CAST
(
-
2147483648
AS
BIGINT
)
*
CAST
(
4294967296
AS
BIGINT
);
>>
-
9223372036854775808
SELECT
CAST
(
2147483648
AS
BIGINT
)
*
CAST
(
-
4294967296
AS
BIGINT
);
>>
-
9223372036854775808
SELECT
CAST
(
4294967296
AS
BIGINT
)
*
CAST
(
2147483648
AS
BIGINT
);
>
exception
NUMERIC_VALUE_OUT_OF_RANGE_1
SELECT
CAST
(
-
4294967296
AS
BIGINT
)
*
CAST
(
-
2147483648
AS
BIGINT
);
>
exception
NUMERIC_VALUE_OUT_OF_RANGE_1
SELECT
CAST
(
2147483648
AS
BIGINT
)
*
CAST
(
4294967296
AS
BIGINT
);
>
exception
NUMERIC_VALUE_OUT_OF_RANGE_1
SELECT
CAST
(
-
2147483648
AS
BIGINT
)
*
CAST
(
-
4294967296
AS
BIGINT
);
>
exception
NUMERIC_VALUE_OUT_OF_RANGE_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
SELECT
CAST
(
1
AS
BIGINT
)
*
CAST
(
-
9223372036854775808
AS
BIGINT
);
>>
-
9223372036854775808
SELECT
CAST
(
-
1
AS
BIGINT
)
*
CAST
(
-
9223372036854775808
AS
BIGINT
);
>
exception
NUMERIC_VALUE_OUT_OF_RANGE_1
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论