Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
oceanbase
提交
104a9f60
O
oceanbase
项目概览
oceanbase
/
oceanbase
大约 1 年 前同步成功
通知
261
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,发现更多精彩内容 >>
提交
104a9f60
编写于
1月 10, 2024
作者:
Z
Zach41
提交者:
ob-robot
1月 10, 2024
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix range calculation of ObDecimalInt
上级
3dc90a84
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
6 deletion
+25
-6
src/sql/rewrite/ob_query_range.cpp
src/sql/rewrite/ob_query_range.cpp
+25
-6
未找到文件。
src/sql/rewrite/ob_query_range.cpp
浏览文件 @
104a9f60
...
...
@@ -23,6 +23,7 @@
#include "sql/optimizer/ob_optimizer_util.h"
#include "observer/omt/ob_tenant_srs.h"
#include "sql/engine/expr/ob_geo_expr_utils.h"
#include "sql/engine//expr/ob_datum_cast.h"
//if cnd is true get full range key part which is always true
//else, get empty key part which is always false
...
...
@@ -6146,6 +6147,14 @@ OB_NOINLINE int ObQueryRange::cold_cast_cur_node(const ObKeyPart *cur,
ObAccuracy
res_acc
;
if
(
cur
->
pos_
.
column_type_
.
is_decimal_int
())
{
res_acc
=
cur
->
pos_
.
column_type_
.
get_accuracy
();
ObScale
in_scale
=
cur_val
.
get_scale
();
int32_t
in_bytes
=
cur_val
.
get_int_bytes
();
ObScale
out_scale
=
res_acc
.
get_scale
();
int32_t
out_bytes
=
wide
::
ObDecimalIntConstValue
::
get_int_bytes_by_precision
(
res_acc
.
get_precision
());
if
(
ObDatumCast
::
need_scale_decimalint
(
in_scale
,
in_bytes
,
out_scale
,
out_bytes
))
{
// simply get range, using eq const mode
cast_ctx
.
cast_mode_
|=
CM_CONST_TO_DECIMAL_INT_EQ
;
}
cast_ctx
.
res_accuracy_
=
&
res_acc
;
}
EXPR_CAST_OBJ_V2
(
expect_type
,
cur_val
,
dest_val
);
...
...
@@ -6890,9 +6899,14 @@ if (OB_SUCC(ret) ) { \
if (!start.is_min_value() && !start.is_max_value() && !start.is_unknown() \
&& (!ObSQLUtils::is_same_type_for_compare(start.get_meta(), column_type.get_obj_meta()) || start.is_decimal_int())) { \
ObCastMode cm = CM_WARN_ON_FAIL;\
if (ObDecimalIntType == expect_type.get_type()\
&& start.get_int_bytes() > wide::ObDecimalIntConstValue::get_int_bytes_by_precision(column_type.get_accuracy().get_precision())) {\
cm |= CM_CONST_TO_DECIMAL_INT_EQ;\
if (ObDecimalIntType == expect_type.get_type() && start.is_decimal_int()) {\
int32_t in_bytes = wide::ObDecimalIntConstValue::get_int_bytes_by_precision(column_type.get_accuracy().get_precision());\
ObScale in_scale = column_type.get_accuracy().get_scale();\
int32_t out_bytes = start.get_int_bytes();\
ObScale out_scale = start.get_scale();\
if (ObDatumCast::need_scale_decimalint(in_scale, in_bytes, out_scale, out_bytes)) {\
cm |= ObRelationalExprOperator::get_const_cast_mode(T_OP_GE, true);\
}\
}\
ObCastCtx cast_ctx(&allocator, &dtc_params, cm, expect_type.get_collation_type()); \
if (ObDecimalIntType == expect_type.get_type()) {\
...
...
@@ -6935,9 +6949,14 @@ if (OB_SUCC(ret) ) { \
if (!end.is_min_value() && !end.is_max_value() && !end.is_unknown() \
&& (!ObSQLUtils::is_same_type_for_compare(end.get_meta(), column_type.get_obj_meta()) || end.is_decimal_int())) { \
ObCastMode cm = CM_WARN_ON_FAIL;\
if (ObDecimalIntType == expect_type.get_type()\
&& end.get_int_bytes() > wide::ObDecimalIntConstValue::get_int_bytes_by_precision(column_type.get_accuracy().get_precision())) {\
cm |= CM_CONST_TO_DECIMAL_INT_EQ;\
if (ObDecimalIntType == expect_type.get_type() && end.is_decimal_int()) {\
int32_t in_bytes = wide::ObDecimalIntConstValue::get_int_bytes_by_precision(column_type.get_accuracy().get_precision());\
ObScale in_scale = column_type.get_accuracy().get_scale();\
int32_t out_bytes = start.get_int_bytes();\
ObScale out_scale = start.get_scale();\
if (ObDatumCast::need_scale_decimalint(in_scale, in_bytes, out_scale, out_bytes)) {\
cm |= ObRelationalExprOperator::get_const_cast_mode(T_OP_LE, true);\
}\
}\
ObCastCtx cast_ctx(&allocator, &dtc_params, cm, expect_type.get_collation_type()); \
if (ObDecimalIntType == expect_type.get_type()) {\
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录