Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
clmforever
oceanbase
提交
cc0e6b8c
O
oceanbase
项目概览
clmforever
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
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,发现更多精彩内容 >>
提交
cc0e6b8c
编写于
8月 25, 2021
作者:
L
ls0
提交者:
wangzelin.wzl
8月 25, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement sql_mode NO_UNSIGNED_SUBTRACTION
上级
e142f566
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
49 addition
and
2 deletion
+49
-2
deps/oblib/src/common/object/ob_obj_type.h
deps/oblib/src/common/object/ob_obj_type.h
+32
-0
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
+1
-1
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.h
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.h
+6
-0
src/sql/engine/expr/ob_expr_minus.cpp
src/sql/engine/expr/ob_expr_minus.cpp
+10
-1
未找到文件。
deps/oblib/src/common/object/ob_obj_type.h
浏览文件 @
cc0e6b8c
...
...
@@ -1228,6 +1228,38 @@ inline bool ob_is_unsigned_type(ObObjType type)
ObUDoubleType
==
type
||
ObUNumberType
==
type
;
}
inline
void
convert_unsigned_type_to_signed
(
ObObjType
&
type
)
{
switch
(
type
)
{
case
(
ObUTinyIntType
):
type
=
ObTinyIntType
;
break
;
case
(
ObUSmallIntType
):
type
=
ObSmallIntType
;
break
;
case
(
ObUMediumIntType
):
type
=
ObMediumIntType
;
break
;
case
(
ObUInt32Type
):
type
=
ObInt32Type
;
break
;
case
(
ObUInt64Type
):
type
=
ObIntType
;
break
;
case
(
ObUFloatType
):
type
=
ObFloatType
;
break
;
case
(
ObUDoubleType
):
type
=
ObDoubleType
;
break
;
case
(
ObUNumberType
):
type
=
ObNumberType
;
break
;
default:
break
;
}
}
inline
bool
ob_is_oracle_numeric_type
(
ObObjType
type
)
{
return
ObIntType
==
type
||
ob_is_number_tc
(
type
)
||
ObFloatType
==
type
||
ObDoubleType
==
type
;
...
...
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
浏览文件 @
cc0e6b8c
...
...
@@ -60,7 +60,7 @@ ObSqlModeMap SQL_MODE_MAP[] = {{SMO_REAL_AS_FLOAT, STR_REAL_AS_FLOAT},
ObSQLMode
SUPPORT_MODE
=
SMO_STRICT_ALL_TABLES
|
SMO_STRICT_TRANS_TABLES
|
SMO_PAD_CHAR_TO_FULL_LENGTH
|
SMO_ONLY_FULL_GROUP_BY
|
SMO_NO_AUTO_VALUE_ON_ZERO
|
SMO_PIPES_AS_CONCAT
|
SMO_HIGH_NOT_PRECEDENCE
|
SMO_ERROR_ON_RESOLVE_CAST
;
SMO_HIGH_NOT_PRECEDENCE
|
SMO_ERROR_ON_RESOLVE_CAST
|
SMO_NO_UNSIGNED_SUBTRACTION
;
bool
is_sql_mode_supported
(
ObSQLMode
mode
)
{
...
...
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.h
浏览文件 @
cc0e6b8c
...
...
@@ -45,6 +45,12 @@ inline bool is_no_zero_date(ObSQLMode mode)
{
return
(
SMO_NO_ZERO_DATE
&
mode
);
}
inline
bool
is_no_unsigned_subtraction
(
ObSQLMode
mode
)
{
return
(
SMO_NO_UNSIGNED_SUBTRACTION
&
mode
);
}
inline
bool
is_mysql_compatible
(
ObCompatibilityMode
mode
)
{
return
OCEANBASE_MODE
==
mode
||
MYSQL_MODE
==
mode
;
...
...
src/sql/engine/expr/ob_expr_minus.cpp
浏览文件 @
cc0e6b8c
...
...
@@ -42,8 +42,12 @@ int ObExprMinus::calc_result_type2(
static
const
int64_t
CARRY_OFFSET
=
1
;
ObScale
scale
=
SCALE_UNKNOWN_YET
;
ObPrecision
precision
=
PRECISION_UNKNOWN_YET
;
const
ObSQLSessionInfo
*
session
=
nullptr
;
bool
is_oracle
=
share
::
is_oracle_mode
();
if
(
OB_FAIL
(
ObArithExprOperator
::
calc_result_type2
(
type
,
type1
,
type2
,
type_ctx
)))
{
if
(
OB_ISNULL
(
session
=
type_ctx
.
get_session
()))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"failed to get mysession"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
ObArithExprOperator
::
calc_result_type2
(
type
,
type1
,
type2
,
type_ctx
)))
{
LOG_WARN
(
"fail to calc result type"
,
K
(
ret
),
K
(
type
),
K
(
type1
),
K
(
type2
));
}
else
if
(
is_oracle
&&
type
.
is_oracle_decimal
())
{
type
.
set_scale
(
ORA_NUMBER_SCALE_UNKNOWN_YET
);
...
...
@@ -78,6 +82,11 @@ int ObExprMinus::calc_result_type2(
}
else
{
type
.
set_precision
(
precision
);
}
if
(
share
::
is_mysql_mode
()
&&
is_no_unsigned_subtraction
(
session
->
get_sql_mode
()))
{
ObObjType
convert_type
=
type
.
get_type
();
convert_unsigned_type_to_signed
(
convert_type
);
type
.
set_type
(
convert_type
);
}
LOG_DEBUG
(
"calc_result_type2"
,
K
(
scale
),
K
(
type1
),
K
(
type2
),
K
(
type
),
K
(
precision
));
}
return
ret
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录