Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
野花太放肆
oceanbase
提交
a501ceac
O
oceanbase
项目概览
野花太放肆
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
1
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,发现更多精彩内容 >>
提交
a501ceac
编写于
2月 24, 2023
作者:
O
obdev
提交者:
ob-robot
2月 24, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[CP] Fix startup filter post bug(3.1_opensource < 3_2_x)
上级
a6956003
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
142 addition
and
11 deletion
+142
-11
src/sql/optimizer/ob_log_join.cpp
src/sql/optimizer/ob_log_join.cpp
+47
-2
src/sql/optimizer/ob_log_join.h
src/sql/optimizer/ob_log_join.h
+1
-0
src/sql/optimizer/ob_log_subplan_filter.cpp
src/sql/optimizer/ob_log_subplan_filter.cpp
+53
-2
src/sql/optimizer/ob_log_subplan_filter.h
src/sql/optimizer/ob_log_subplan_filter.h
+1
-0
src/sql/optimizer/ob_logical_operator.cpp
src/sql/optimizer/ob_logical_operator.cpp
+2
-4
src/sql/optimizer/ob_logical_operator.h
src/sql/optimizer/ob_logical_operator.h
+1
-1
src/sql/optimizer/ob_optimizer_util.cpp
src/sql/optimizer/ob_optimizer_util.cpp
+32
-0
src/sql/optimizer/ob_optimizer_util.h
src/sql/optimizer/ob_optimizer_util.h
+3
-0
unittest/sql/rewrite/result/test_transformer_plan_after_trans_aggr.result
...rite/result/test_transformer_plan_after_trans_aggr.result
+2
-2
未找到文件。
src/sql/optimizer/ob_log_join.cpp
浏览文件 @
a501ceac
...
...
@@ -2095,15 +2095,60 @@ int ObLogJoin::allocate_startup_expr_post()
}
}
else
if
(
LEFT_OUTER_JOIN
==
join_type_
||
CONNECT_BY_JOIN
==
join_type_
||
LEFT_SEMI_JOIN
==
join_type_
||
LEFT_ANTI_JOIN
==
join_type_
)
{
if
(
OB_FAIL
(
ObLogicalOperator
::
allocate_startup_expr_post
(
first_child
)))
{
if
(
OB_FAIL
(
allocate_startup_expr_post
(
first_child
)))
{
LOG_WARN
(
"failed to allocate startup expr post"
,
K
(
ret
));
}
}
else
if
(
RIGHT_OUTER_JOIN
==
join_type_
||
RIGHT_SEMI_JOIN
==
join_type_
||
RIGHT_ANTI_JOIN
==
join_type_
)
{
if
(
OB_FAIL
(
ObLogicalOperator
::
allocate_startup_expr_post
(
second_child
)))
{
if
(
OB_FAIL
(
allocate_startup_expr_post
(
second_child
)))
{
LOG_WARN
(
"failed to allocate startup expr post"
,
K
(
ret
));
}
}
else
if
(
FULL_OUTER_JOIN
==
join_type_
)
{
// do nothing
}
return
ret
;
}
int
ObLogJoin
::
allocate_startup_expr_post
(
int64_t
child_idx
)
{
int
ret
=
OB_SUCCESS
;
ObLogicalOperator
*
child
=
get_child
(
child_idx
);
if
(
OB_ISNULL
(
child
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null child"
,
K
(
ret
));
}
else
if
(
child
->
get_startup_exprs
().
empty
())
{
// do nothing
}
else
{
ObSEArray
<
ObRawExpr
*
,
4
>
non_startup_exprs
,
new_startup_exprs
;
ObIArray
<
ObRawExpr
*>
&
startup_exprs
=
child
->
get_startup_exprs
();
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
startup_exprs
.
count
();
++
i
)
{
if
(
OB_ISNULL
(
startup_exprs
.
at
(
i
)))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null expr"
,
K
(
ret
));
}
else
if
(
log_op_def
::
LOG_COUNT
==
child
->
get_type
()
&&
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_ROWNUM
))
{
if
(
OB_FAIL
(
non_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
}
else
if
(
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_EXEC_PARAM
))
{
bool
found
=
false
;
if
(
is_nlj_with_param_down
()
&&
OB_FAIL
(
ObOptimizerUtil
::
check_contain_my_exec_param
(
startup_exprs
.
at
(
i
),
get_nl_params
(),
found
)))
{
LOG_WARN
(
"fail to check if contain my exec param"
);
}
else
if
(
found
&&
OB_FAIL
(
non_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
else
if
(
!
found
&&
OB_FAIL
(
new_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
}
else
if
(
OB_FAIL
(
new_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"failed to push back expr"
,
K
(
ret
));
}
}
if
(
OB_SUCC
(
ret
))
{
if
(
OB_FAIL
(
append_array_no_dup
(
get_startup_exprs
(),
new_startup_exprs
)))
{
LOG_WARN
(
"failed to add startup exprs"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
child
->
get_startup_exprs
().
assign
(
non_startup_exprs
)))
{
LOG_WARN
(
"failed to assign exprs"
,
K
(
ret
));
}
}
}
return
ret
;
}
\ No newline at end of file
src/sql/optimizer/ob_log_join.h
浏览文件 @
a501ceac
...
...
@@ -336,6 +336,7 @@ private:
return
SM_NONE
!=
slave_mapping_type_
;
}
int
allocate_startup_expr_post
()
override
;
int
allocate_startup_expr_post
(
int64_t
child_idx
)
override
;
private:
// all join predicates
common
::
ObSEArray
<
ObRawExpr
*
,
8
,
common
::
ModulePageAllocator
,
true
>
join_conditions_
;
// equal join condition, for
...
...
src/sql/optimizer/ob_log_subplan_filter.cpp
浏览文件 @
a501ceac
...
...
@@ -710,8 +710,59 @@ int ObLogSubPlanFilter::compute_one_row_info()
int
ObLogSubPlanFilter
::
allocate_startup_expr_post
()
{
int
ret
=
OB_SUCCESS
;
if
(
OB_FAIL
(
ObLogicalOperator
::
allocate_startup_expr_post
(
first_child
)))
{
if
(
OB_FAIL
(
allocate_startup_expr_post
(
first_child
)))
{
LOG_WARN
(
"failed to allocate startup expr post"
,
K
(
ret
));
}
return
ret
;
}
\ No newline at end of file
}
int
ObLogSubPlanFilter
::
allocate_startup_expr_post
(
int64_t
child_idx
)
{
int
ret
=
OB_SUCCESS
;
ObLogicalOperator
*
child
=
get_child
(
child_idx
);
if
(
OB_ISNULL
(
child
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null child"
,
K
(
ret
));
}
else
if
(
child
->
get_startup_exprs
().
empty
())
{
// do nothing
}
else
{
ObSEArray
<
ObRawExpr
*
,
4
>
non_startup_exprs
,
new_startup_exprs
;
ObIArray
<
ObRawExpr
*>
&
startup_exprs
=
child
->
get_startup_exprs
();
ObSEArray
<
std
::
pair
<
int64_t
,
ObRawExpr
*>
,
8
>
my_exec_params
;
if
(
OB_FAIL
(
my_exec_params
.
assign
(
onetime_exprs_
)))
{
LOG_WARN
(
"fail to push back onetime exprs"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
append
(
my_exec_params
,
exec_params_
)))
{
LOG_WARN
(
"fail to push back exec param exprs"
,
K
(
ret
));
}
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
startup_exprs
.
count
();
++
i
)
{
if
(
OB_ISNULL
(
startup_exprs
.
at
(
i
)))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null expr"
,
K
(
ret
));
}
else
if
(
log_op_def
::
LOG_COUNT
==
child
->
get_type
()
&&
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_ROWNUM
))
{
if
(
OB_FAIL
(
non_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
}
else
if
(
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_EXEC_PARAM
))
{
bool
found
=
false
;
if
(
!
my_exec_params
.
empty
()
&&
OB_FAIL
(
ObOptimizerUtil
::
check_contain_my_exec_param
(
startup_exprs
.
at
(
i
),
my_exec_params
,
found
)))
{
LOG_WARN
(
"fail to check if contain onetime exec param"
,
K
(
ret
));
}
else
if
(
found
&&
OB_FAIL
(
non_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
else
if
(
!
found
&&
OB_FAIL
(
new_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"fail to push back non startup expr"
,
K
(
ret
));
}
}
else
if
(
OB_FAIL
(
new_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"failed to push back expr"
,
K
(
ret
));
}
}
if
(
OB_SUCC
(
ret
))
{
if
(
OB_FAIL
(
append_array_no_dup
(
get_startup_exprs
(),
new_startup_exprs
)))
{
LOG_WARN
(
"failed to add startup exprs"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
child
->
get_startup_exprs
().
assign
(
non_startup_exprs
)))
{
LOG_WARN
(
"failed to assign exprs"
,
K
(
ret
));
}
}
}
return
ret
;
}
src/sql/optimizer/ob_log_subplan_filter.h
浏览文件 @
a501ceac
...
...
@@ -127,6 +127,7 @@ public:
int
allocate_granule_post
(
AllocGIContext
&
ctx
)
override
;
virtual
int
compute_one_row_info
()
override
;
int
allocate_startup_expr_post
()
override
;
int
allocate_startup_expr_post
(
int64_t
child_idx
)
override
;
protected:
common
::
ObSEArray
<
std
::
pair
<
int64_t
,
ObRawExpr
*>
,
8
,
common
::
ModulePageAllocator
,
true
>
exec_params_
;
common
::
ObSEArray
<
std
::
pair
<
int64_t
,
ObRawExpr
*>
,
8
,
common
::
ModulePageAllocator
,
true
>
onetime_exprs_
;
...
...
src/sql/optimizer/ob_logical_operator.cpp
浏览文件 @
a501ceac
...
...
@@ -6824,8 +6824,7 @@ int ObLogicalOperator::allocate_startup_expr_post(int64_t child_idx)
if
(
OB_ISNULL
(
startup_exprs
.
at
(
i
)))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null expr"
,
K
(
ret
));
}
else
if
(
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_ROWNUM
)
||
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_EXEC_PARAM
))
{
}
else
if
(
startup_exprs
.
at
(
i
)
->
has_flag
(
CNT_ROWNUM
))
{
if
(
OB_FAIL
(
non_startup_exprs
.
push_back
(
startup_exprs
.
at
(
i
))))
{
LOG_WARN
(
"failed to push back expr"
,
K
(
ret
));
}
...
...
@@ -6834,8 +6833,7 @@ int ObLogicalOperator::allocate_startup_expr_post(int64_t child_idx)
}
}
if
(
OB_SUCC
(
ret
))
{
if
(
get_startup_exprs
().
empty
()
&&
OB_FAIL
(
add_startup_exprs
(
new_startup_exprs
)))
{
if
(
OB_FAIL
(
append_array_no_dup
(
get_startup_exprs
(),
new_startup_exprs
)))
{
LOG_WARN
(
"failed to add startup exprs"
,
K
(
ret
));
}
else
{
bool
mark_exchange_out
=
false
;
...
...
src/sql/optimizer/ob_logical_operator.h
浏览文件 @
a501ceac
...
...
@@ -1799,7 +1799,7 @@ public:
virtual
int
set_exchange_cnt_post
(
AdjustSortContext
*
ctx
);
virtual
int
allocate_link_post
();
virtual
int
allocate_startup_expr_post
();
int
allocate_startup_expr_post
(
int64_t
child_idx
);
virtual
int
allocate_startup_expr_post
(
int64_t
child_idx
);
int
allocate_link_node_above
(
int64_t
child_idx
);
virtual
int
generate_link_sql_pre
(
GenLinkStmtContext
&
link_ctx
);
...
...
src/sql/optimizer/ob_optimizer_util.cpp
浏览文件 @
a501ceac
...
...
@@ -6115,3 +6115,35 @@ int ObOptimizerUtil::check_pushdown_filter_to_base_table(ObLogPlan& plan, const
LOG_TRACE
(
"check pushdown filter to tables"
,
K
(
table_id
),
K
(
can_pushdown
));
return
ret
;
}
int
ObOptimizerUtil
::
check_contain_my_exec_param
(
ObRawExpr
*
expr
,
const
common
::
ObIArray
<
std
::
pair
<
int64_t
,
ObRawExpr
*>>
&
my_exec_params
,
bool
&
contain
)
{
int
ret
=
OB_SUCCESS
;
bool
is_stack_overflow
=
false
;
contain
=
false
;
if
(
OB_ISNULL
(
expr
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpect null expr"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
check_stack_overflow
(
is_stack_overflow
)))
{
LOG_WARN
(
"check stack overflow failed"
,
K
(
ret
));
}
else
if
(
is_stack_overflow
)
{
ret
=
OB_SIZE_OVERFLOW
;
LOG_WARN
(
"too deep recursive"
,
K
(
ret
));
}
else
if
(
!
expr
->
has_flag
(
CNT_EXEC_PARAM
))
{
// do nothing
}
else
if
(
expr
->
has_flag
(
IS_EXEC_PARAM
))
{
const
ObConstRawExpr
*
const_expr
=
static_cast
<
const
ObConstRawExpr
*>
(
expr
);
int64_t
param
=
const_expr
->
get_value
().
get_unknown
();
contain
=
NULL
!=
find_exec_param
(
my_exec_params
,
param
);
}
else
if
(
expr
->
is_set_op_expr
()
||
expr
->
is_query_ref_expr
()
||
expr
->
is_column_ref_expr
())
{
// do nothing
}
else
{
for
(
int64_t
i
=
0
;
!
contain
&&
OB_SUCC
(
ret
)
&&
i
<
expr
->
get_param_count
();
++
i
)
{
if
(
OB_FAIL
(
SMART_CALL
(
check_contain_my_exec_param
(
expr
->
get_param_expr
(
i
),
my_exec_params
,
contain
))))
{
LOG_WARN
(
"failed to check contain batch stmt parameter"
,
K
(
ret
));
}
}
}
return
ret
;
}
src/sql/optimizer/ob_optimizer_util.h
浏览文件 @
a501ceac
...
...
@@ -676,6 +676,9 @@ public:
static
int
check_pushdown_filter_to_base_table
(
ObLogPlan
&
plan
,
const
uint64_t
table_id
,
const
ObIArray
<
ObRawExpr
*>&
pushdown_filters
,
const
ObIArray
<
ObRawExpr
*>&
restrict_infos
,
bool
&
can_pushdown
);
static
int
check_contain_my_exec_param
(
ObRawExpr
*
expr
,
const
common
::
ObIArray
<
std
::
pair
<
int64_t
,
ObRawExpr
*>>
&
my_exec_params
,
bool
&
contain
);
private:
// disallow construct
ObOptimizerUtil
();
...
...
unittest/sql/rewrite/result/test_transformer_plan_after_trans_aggr.result
浏览文件 @
a501ceac
...
...
@@ -2514,9 +2514,9 @@ Outputs & filters:
access([t1.c1]), partitions(p0)
2 - output([T_FUN_MAX(VIEW1.c1)]), filter(nil),
group(nil), agg_func([T_FUN_MAX(VIEW1.c1)])
3 - output([VIEW1.c1]), filter(nil),
3 - output([VIEW1.c1]), filter(nil),
startup_filter([?]),
access([VIEW1.c1])
4 - output([t1.c1]), filter(nil),
startup_filter([?]),
4 - output([t1.c1]), filter(nil),
access([t1.c1]), partitions(p0),
limit(1), offset(nil)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录