Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
oceanbase
提交
e5bf87e2
O
oceanbase
项目概览
oceanbase
/
oceanbase
10 个月 前同步成功
通知
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,体验更适合开发者的 AI 搜索 >>
提交
e5bf87e2
编写于
1月 22, 2024
作者:
C
ChangerR
提交者:
ob-robot
1月 22, 2024
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix das path cannot generated in subquery inner path
上级
77f5c15b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
50 addition
and
31 deletion
+50
-31
src/sql/optimizer/ob_log_plan.cpp
src/sql/optimizer/ob_log_plan.cpp
+50
-31
未找到文件。
src/sql/optimizer/ob_log_plan.cpp
浏览文件 @
e5bf87e2
...
...
@@ -11626,17 +11626,23 @@ int ObLogPlan::get_source_table_info(ObLogicalOperator &top,
return ret;
}
int ObLogPlan::collect_subq_pushdown_filter_table_relids(const ObIArray<ObRawExpr*> &conditions)
{
int ret = OB_SUCCESS;
const ObDMLStmt *stmt = NULL;
ObSEArray<ObRawExpr*, 4> column_exprs;
ObSEArray<ObColumnRefRawExpr*, 4> pushdown_col_exprs;
ObSEArray<ObColumnRefRawExpr*, 4> all_pushdown_col_exprs;
ObSEArray<uint64_t, 4> table_ids;
bool contribute_query_range = false;
if (OB_ISNULL(stmt = get_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid stmt", K(ret));
} else {
for (int64_t i = 0; i < conditions.count(); ++i) {
ObRawExpr *expr = conditions.at(i);
column_exprs.reuse();
table_ids.reuse();
if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid expr", K(expr));
...
...
@@ -11647,40 +11653,53 @@ int ObLogPlan::collect_subq_pushdown_filter_table_relids(const ObIArray<ObRawExp
expr->has_flag(CNT_ROWNUM) ||
T_OP_NE == expr->get_expr_type()) {
// do nothing
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(expr, column_exprs))) {
LOG_WARN("failed to extract column exprs", K(ret));
} else {
for (int64_t j = 0; j < expr->get_children_count(); ++j) {
ObRawExpr *child = expr->get_param_expr(j);
if (OB_ISNULL(child)) {
for (int64_t j = 0; OB_SUCC(ret) && j < column_exprs.count(); ++j) {
ObColumnRefRawExpr *col_expr = NULL;
if (OB_ISNULL(column_exprs.at(j)) ||
!column_exprs.at(j)->is_column_ref_expr()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid child", K(child));
} else if (!child->is_column_ref_expr()) {
// do nothing
} else {
ObColumnRefRawExpr *col_expr = static_cast<ObColumnRefRawExpr*>(child);
ObSEArray<ObColumnRefRawExpr*, 4> pushdown_col_exprs;
bool contribute_query_range = false;
if (OB_FAIL(ObTransformUtils::get_simple_filter_column(stmt,
expr,
col_expr->get_table_id(),
pushdown_col_exprs))) {
LOG_WARN("failed to get simple filter column", K(ret));
} else if (!ObOptimizerUtil::find_item(pushdown_col_exprs, col_expr)) {
// do nothing
} else if (OB_FAIL(ObTransformUtils::is_match_index(get_optimizer_context().get_sql_schema_guard(),
stmt,
col_expr,
contribute_query_range))) {
LOG_WARN("failed to check is match index", K(ret));
} else if (!contribute_query_range) {
// do nothing
} else {
int64_t table_index = stmt->get_table_bit_index(col_expr->get_table_id());
if (OB_FAIL(subq_pushdown_filter_table_set_.add_member(table_index))) {
LOG_WARN("failed to add members", K(ret));
}
}
LOG_WARN("get unexpected null", K(ret));
} else if (OB_FALSE_IT(col_expr = static_cast<ObColumnRefRawExpr*>(column_exprs.at(j)))) {
} else if (OB_FAIL(add_var_to_array_no_dup(table_ids, col_expr->get_table_id()))) {
LOG_WARN("failed to add var to array no dup", K(ret));
}
}
for (int64_t j = 0; OB_SUCC(ret) && j < table_ids.count(); ++j) {
pushdown_col_exprs.reuse();
if (OB_FAIL(ObTransformUtils::get_simple_filter_column(stmt,
expr,
table_ids.at(j),
pushdown_col_exprs))) {
LOG_WARN("failed to get simple filter column", K(ret));
} else if (OB_FAIL(append_array_no_dup(all_pushdown_col_exprs,
pushdown_col_exprs))) {
LOG_WARN("failed to append array no dup", K(ret));
}
}
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < all_pushdown_col_exprs.count(); ++i) {
ObColumnRefRawExpr *col_expr = all_pushdown_col_exprs.at(i);
int64_t table_index = OB_INVALID_ID;
contribute_query_range = false;
if (OB_ISNULL(col_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret));
} else if (OB_FALSE_IT(table_index = stmt->get_table_bit_index(col_expr->get_table_id()))) {
} else if (subq_pushdown_filter_table_set_.has_member(table_index)) {
// do nothing
} else if (OB_FAIL(ObTransformUtils::is_match_index(get_optimizer_context().get_sql_schema_guard(),
stmt,
col_expr,
contribute_query_range))) {
LOG_WARN("failed to check is match index", K(ret));
} else if (!contribute_query_range) {
// do nothing
} else if (OB_FAIL(subq_pushdown_filter_table_set_.add_member(table_index))) {
LOG_WARN("failed to add members", K(ret));
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录