Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
oceanbase
提交
8aade630
O
oceanbase
项目概览
oceanbase
/
oceanbase
8 个月 前同步成功
通知
260
Star
6084
Fork
1301
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
8aade630
编写于
4月 23, 2024
作者:
H
hezuojiao
提交者:
ob-robot
4月 23, 2024
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix fixed float column convert range check
上级
4737fc89
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
24 addition
and
37 deletion
+24
-37
src/share/object/ob_obj_cast.cpp
src/share/object/ob_obj_cast.cpp
+5
-7
src/share/object/ob_obj_cast_util.h
src/share/object/ob_obj_cast_util.h
+5
-28
src/sql/engine/expr/ob_datum_cast.cpp
src/sql/engine/expr/ob_datum_cast.cpp
+14
-2
未找到文件。
src/share/object/ob_obj_cast.cpp
浏览文件 @
8aade630
...
...
@@ -598,13 +598,11 @@ int real_range_check_only(const ObAccuracy &accuracy, Type value)
if (OB_LIKELY(precision > 0) &&
OB_LIKELY(scale >= 0) &&
OB_LIKELY(precision >= scale)) {
// Because double type represents a larger width, use double type instead of float to check
// result range.
double integer_part = static_cast<double>(pow(10.0, static_cast<double>(precision - scale)));
double decimal_part = static_cast<double>(pow(10.0, static_cast<double>(scale)));
double max_value = integer_part - 1 / decimal_part;
double min_value = -max_value;
if (OB_FAIL(numeric_range_check(static_cast<double>(value), min_value, max_value, value))) {
Type integer_part = static_cast<Type>(pow(10.0, static_cast<double>(precision - scale)));
Type decimal_part = static_cast<Type>(pow(10.0, static_cast<double>(scale)));
Type max_value = integer_part - 1 / decimal_part;
Type min_value = -max_value;
if (OB_FAIL(numeric_range_check(value, min_value, max_value, value))) {
}
}
return ret;
...
...
src/share/object/ob_obj_cast_util.h
浏览文件 @
8aade630
...
...
@@ -84,27 +84,6 @@ OB_INLINE int numeric_range_check<double, float>(const double in_val,
return
ret
;
}
// check range using double type
OB_INLINE
int
numeric_range_check
(
const
double
in_val
,
const
double
min_out_val
,
const
double
max_out_val
,
float
&
out_val
)
{
int
ret
=
OB_SUCCESS
;
if
(
isinf
(
in_val
))
{
out_val
=
static_cast
<
float
>
(
in_val
);
}
else
{
if
(
in_val
<
min_out_val
)
{
ret
=
OB_DATA_OUT_OF_RANGE
;
out_val
=
static_cast
<
float
>
(
min_out_val
);
}
else
if
(
in_val
>
max_out_val
)
{
ret
=
OB_DATA_OUT_OF_RANGE
;
out_val
=
static_cast
<
float
>
(
max_out_val
);
}
}
return
ret
;
}
// check if is negative only.
template
<
typename
OutType
>
OB_INLINE
int
numeric_negative_check
(
OutType
&
out_val
)
...
...
@@ -191,13 +170,11 @@ int real_range_check(const ObAccuracy &accuracy, Type &value)
if
(
OB_LIKELY
(
precision
>
0
)
&&
OB_LIKELY
(
scale
>=
0
)
&&
OB_LIKELY
(
precision
>=
scale
))
{
// Because double type represents a larger width, use double type instead of float to check
// result range.
double
integer_part
=
static_cast
<
double
>
(
pow
(
10.0
,
static_cast
<
double
>
(
precision
-
scale
)));
double
decimal_part
=
static_cast
<
double
>
(
pow
(
10.0
,
static_cast
<
double
>
(
scale
)));
double
max_value
=
static_cast
<
double
>
(
integer_part
-
1
/
decimal_part
);
double
min_value
=
static_cast
<
double
>
(
-
max_value
);
if
(
OB_FAIL
(
numeric_range_check
(
static_cast
<
double
>
(
value
),
min_value
,
max_value
,
value
)))
{
Type
integer_part
=
static_cast
<
Type
>
(
pow
(
10.0
,
static_cast
<
double
>
(
precision
-
scale
)));
Type
decimal_part
=
static_cast
<
Type
>
(
pow
(
10.0
,
static_cast
<
double
>
(
scale
)));
Type
max_value
=
static_cast
<
Type
>
(
integer_part
-
1
/
decimal_part
);
Type
min_value
=
static_cast
<
Type
>
(
-
max_value
);
if
(
OB_FAIL
(
numeric_range_check
(
value
,
min_value
,
max_value
,
value
)))
{
}
else
{
value
=
static_cast
<
Type
>
(
rint
((
value
-
floor
(
static_cast
<
double
>
(
value
)))
*
decimal_part
)
/
...
...
src/sql/engine/expr/ob_datum_cast.cpp
浏览文件 @
8aade630
...
...
@@ -1092,8 +1092,20 @@ static OB_INLINE int common_double_float(const ObExpr &expr,
ObObjType out_type = expr.datum_meta_.type_;
// oracle support float/double infiniy, no need to verify data overflow.
// C language would cast value to infinity, which is correct behavor in oracle mode
if (lib::is_mysql_mode() && CAST_FAIL(real_range_check(out_type, in_val, out_val))) {
LOG_WARN("real_range_check failed", K(ret), K(in_val));
if (lib::is_mysql_mode()) {
double truncated_val = in_val;
if (ob_is_float_tc(out_type) && CM_IS_COLUMN_CONVERT(expr.extra_)) {
// truncate float value if its ps information is fixed.
ObAccuracy accuracy(expr.datum_meta_.precision_, expr.datum_meta_.scale_);
if (CAST_FAIL(real_range_check(accuracy, truncated_val))) {
LOG_WARN("fail to real range check", K(ret));
} else {
out_val = static_cast<float>(truncated_val);
}
}
if (OB_SUCC(ret) && CAST_FAIL(real_range_check(out_type, truncated_val, out_val))) {
LOG_WARN("real_range_check failed", K(ret), K(in_val));
}
}
return ret;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录