Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
天地威能
oceanbase
提交
143dd5e6
O
oceanbase
项目概览
天地威能
/
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,发现更多精彩内容 >>
提交
143dd5e6
编写于
11月 11, 2022
作者:
O
obdev
提交者:
wangzelin.wzl
11月 11, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[CP] fix shared expr issue in view merge/query push down
上级
618341bd
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
54 addition
and
0 deletion
+54
-0
src/sql/rewrite/ob_transform_query_push_down.cpp
src/sql/rewrite/ob_transform_query_push_down.cpp
+9
-0
src/sql/rewrite/ob_transform_utils.cpp
src/sql/rewrite/ob_transform_utils.cpp
+31
-0
src/sql/rewrite/ob_transform_utils.h
src/sql/rewrite/ob_transform_utils.h
+3
-0
src/sql/rewrite/ob_transform_view_merge.cpp
src/sql/rewrite/ob_transform_view_merge.cpp
+9
-0
tools/deploy/mysql_test/test_suite/static_engine/t/expr_sign.test
...ploy/mysql_test/test_suite/static_engine/t/expr_sign.test
+2
-0
未找到文件。
src/sql/rewrite/ob_transform_query_push_down.cpp
浏览文件 @
143dd5e6
...
...
@@ -485,6 +485,8 @@ int ObTransformQueryPushDown::check_select_item_push_down(ObSelectStmt *select_s
int
ret
=
OB_SUCCESS
;
can_be
=
false
;
bool
check_status
=
false
;
bool
is_select_expr_valid
=
false
;
ObSEArray
<
ObRawExpr
*
,
8
>
select_exprs
;
if
(
OB_ISNULL
(
select_stmt
)
||
OB_ISNULL
(
view_stmt
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"stmt is NULL"
,
K
(
select_stmt
),
K
(
view_stmt
),
K
(
ret
));
...
...
@@ -494,6 +496,13 @@ int ObTransformQueryPushDown::check_select_item_push_down(ObSelectStmt *select_s
can_be
=
false
;
}
else
if
(
view_stmt
->
is_contains_assignment
()
||
select_stmt
->
is_contains_assignment
())
{
can_be
=
false
;
}
else
if
(
OB_FAIL
(
view_stmt
->
get_select_exprs
(
select_exprs
)))
{
LOG_WARN
(
"failed to get select exprs"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
ObTransformUtils
::
check_expr_valid_for_stmt_merge
(
select_exprs
,
is_select_expr_valid
)))
{
LOG_WARN
(
"failed to check select expr valid"
,
K
(
ret
));
}
else
if
(
!
is_select_expr_valid
)
{
can_be
=
false
;
}
else
if
(
OB_FAIL
(
is_select_item_same
(
select_stmt
,
view_stmt
,
check_status
,
...
...
src/sql/rewrite/ob_transform_utils.cpp
浏览文件 @
143dd5e6
...
...
@@ -11504,5 +11504,36 @@ int ObTransformUtils::rebuild_win_compare_range_expr(ObRawExprFactory* expr_fact
return
ret
;
}
int
ObTransformUtils
::
check_expr_valid_for_stmt_merge
(
ObIArray
<
ObRawExpr
*>
&
select_exprs
,
bool
&
is_valid
)
{
int
ret
=
OB_SUCCESS
;
is_valid
=
true
;
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
is_valid
&&
i
<
select_exprs
.
count
();
++
i
)
{
ObRawExpr
*
expr
=
select_exprs
.
at
(
i
);
if
(
OB_ISNULL
(
expr
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null expr"
,
K
(
ret
));
}
else
if
(
expr
->
has_flag
(
IS_CONST
)
||
expr
->
has_generalized_column
())
{
// do nothing
}
else
if
(
expr
->
has_flag
(
CNT_STATE_FUNC
)
||
expr
->
has_flag
(
CNT_USER_VARIABLE
)
||
expr
->
has_flag
(
CNT_ALIAS
)
||
expr
->
has_flag
(
CNT_VALUES
)
||
expr
->
has_flag
(
CNT_SEQ_EXPR
)
||
expr
->
has_flag
(
CNT_SYS_CONNECT_BY_PATH
)
||
expr
->
has_flag
(
CNT_RAND_FUNC
)
||
expr
->
has_flag
(
CNT_SO_UDF
)
||
expr
->
has_flag
(
CNT_PRIOR
)
||
expr
->
has_flag
(
CNT_VOLATILE_CONST
)
||
expr
->
has_flag
(
CNT_ASSIGN_EXPR
))
{
// the list is aligned with ObRawExprInfoExtractor::not_calculable_expr
is_valid
=
false
;
}
}
return
ret
;
}
}
// namespace sql
}
// namespace oceanbase
src/sql/rewrite/ob_transform_utils.h
浏览文件 @
143dd5e6
...
...
@@ -1567,6 +1567,9 @@ public:
static
int
rebuild_win_compare_range_expr
(
ObRawExprFactory
*
expr_factory
,
ObWinFunRawExpr
&
win_expr
,
ObRawExpr
*
order_expr
);
static
int
check_expr_valid_for_stmt_merge
(
ObIArray
<
ObRawExpr
*>
&
select_exprs
,
bool
&
is_valid
);
private:
static
int
inner_get_lazy_left_join
(
ObDMLStmt
*
stmt
,
TableItem
*
table
,
...
...
src/sql/rewrite/ob_transform_view_merge.cpp
浏览文件 @
143dd5e6
...
...
@@ -486,6 +486,8 @@ int ObTransformViewMerge::check_basic_validity(ObDMLStmt *parent_stmt,
bool
has_ref_assign_user_var
=
false
;
bool
force_merge
=
false
;
bool
force_no_merge
=
false
;
bool
is_select_expr_valid
=
false
;
ObSEArray
<
ObRawExpr
*
,
8
>
select_exprs
;
if
(
OB_ISNULL
(
parent_stmt
)
||
OB_ISNULL
(
child_stmt
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"get unexpected null"
,
K
(
ret
));
...
...
@@ -515,6 +517,13 @@ int ObTransformViewMerge::check_basic_validity(ObDMLStmt *parent_stmt,
LOG_WARN
(
"failed to check has rownum expr"
,
K
(
ret
));
}
else
if
(
has_rownum_expr
)
{
can_be
=
false
;
}
else
if
(
OB_FAIL
(
child_stmt
->
get_select_exprs
(
select_exprs
)))
{
LOG_WARN
(
"failed to get select exprs"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
ObTransformUtils
::
check_expr_valid_for_stmt_merge
(
select_exprs
,
is_select_expr_valid
)))
{
LOG_WARN
(
"failed to check select expr valid"
,
K
(
ret
));
}
else
if
(
!
is_select_expr_valid
)
{
can_be
=
false
;
}
else
if
(
0
==
child_stmt
->
get_from_item_size
())
{
//当 view 为 select ... from dual, 若上层非层次查询, 允许视图合并
can_be
=
parent_stmt
->
is_single_table_stmt
()
...
...
tools/deploy/mysql_test/test_suite/static_engine/t/expr_sign.test
浏览文件 @
143dd5e6
--
source
mysql_test
/
include
/
explain_init
.
inc
# owner: dachuan.sdc
# owner group: sql2
# tags: optimizer
...
...
@@ -149,3 +150,4 @@ select sign( cast(a2 as char(1024)) ) , sign( cast(a4 as char(1024)) ) from t2 f
--
echo
#https://work.aone.alibaba-inc.com/issue/32398792
select
sign
(
1
E
-
300
)
from
dual
;
select
sign
(
1
E
-
400
)
from
dual
;
--
source
mysql_test
/
include
/
explain_end
.
inc
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录