提交 6eb1cb83 编写于 作者: J jz0 提交者: wangzelin.wzl

Fix view merge for join on condition containing subq

上级 c9521097
......@@ -505,6 +505,7 @@ int ObTransformViewMerge::transform_joined_table(
TableItem* left_table = NULL;
TableItem* right_table = NULL;
trans_happened = false;
bool cond_contain_subq = false;
if (OB_ISNULL(stmt) || OB_ISNULL(joined_table) || OB_ISNULL(left_table = joined_table->left_table_) ||
OB_ISNULL(right_table = joined_table->right_table_)) {
ret = OB_ERR_UNEXPECTED;
......@@ -516,6 +517,10 @@ int ObTransformViewMerge::transform_joined_table(
LOG_WARN("too deep recursive", K(ret));
} else if (joined_table->joined_type_ == CONNECT_BY_JOIN) {
// do nothing
} else if (OB_FAIL(check_outerjoin_condition_contain_subq(joined_table, cond_contain_subq))) {
LOG_WARN("failed to check outer join condition contain subq", K(ret));
} else if (cond_contain_subq) {
// do nothing
} else {
bool can_push_where = true;
bool need_check_where_condi = false;
......@@ -912,5 +917,26 @@ int ObTransformViewMerge::adjust_stmt_semi_infos(ObDMLStmt* parent_stmt, ObSelec
return ret;
}
int ObTransformViewMerge::check_outerjoin_condition_contain_subq(JoinedTable* joined_table,
bool &contains_subq)
{
int ret = OB_SUCCESS;
contains_subq = false;
if (joined_table->joined_type_ == FULL_OUTER_JOIN ||
joined_table->joined_type_ == LEFT_OUTER_JOIN ||
joined_table->joined_type_ == RIGHT_OUTER_JOIN) {
for (int64_t i = 0; OB_SUCC(ret) && !contains_subq && i < joined_table->get_join_conditions().count(); ++i) {
ObRawExpr* expr = joined_table->get_join_conditions().at(i);
if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid condition expr", K(ret));
} else if (expr->has_flag(CNT_SUB_QUERY)) {
contains_subq = true;
}
}
}
return ret;
}
} // namespace sql
} // namespace oceanbase
......@@ -100,6 +100,8 @@ private:
int transform_generated_table(ObDMLStmt* parent_stmt, TableItem* table_item, bool& trans_happened);
int transform_in_from_item(ObDMLStmt* stmt, bool& trans_happened);
int transform_in_semi_info(ObDMLStmt* stmt, bool& trans_happened);
int check_outerjoin_condition_contain_subq(JoinedTable* joined_table, bool &contains_subq);
bool for_post_process_;
DISALLOW_COPY_AND_ASSIGN(ObTransformViewMerge);
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册