From 0664c26d304a07c0b209a28b9f3e26d0fa12c4de Mon Sep 17 00:00:00 2001 From: xianyu-w <707512433@qq.com> Date: Tue, 14 Feb 2023 12:12:15 +0000 Subject: [PATCH] Fix shared exprs bugs when create inline view --- src/sql/resolver/dml/ob_dml_stmt.cpp | 36 +- src/sql/resolver/dml/ob_dml_stmt.h | 19 +- .../rewrite/ob_transform_aggr_subquery.cpp | 65 +- src/sql/rewrite/ob_transform_dblink.cpp | 59 +- .../ob_transform_join_limit_pushdown.cpp | 99 +- .../ob_transform_join_limit_pushdown.h | 8 +- .../ob_transform_left_join_to_anti.cpp | 166 ++- .../rewrite/ob_transform_left_join_to_anti.h | 8 +- src/sql/rewrite/ob_transform_or_expansion.cpp | 105 +- src/sql/rewrite/ob_transform_or_expansion.h | 3 - src/sql/rewrite/ob_transform_pre_process.cpp | 106 +- src/sql/rewrite/ob_transform_pre_process.h | 2 +- .../ob_transform_predicate_move_around.cpp | 50 +- .../rewrite/ob_transform_semi_to_inner.cpp | 67 +- .../ob_transform_simplify_subquery.cpp | 54 +- .../rewrite/ob_transform_simplify_subquery.h | 3 - src/sql/rewrite/ob_transform_temp_table.cpp | 280 ++--- src/sql/rewrite/ob_transform_temp_table.h | 2 - src/sql/rewrite/ob_transform_utils.cpp | 997 +++++++----------- src/sql/rewrite/ob_transform_utils.h | 89 +- src/sql/rewrite/ob_transform_win_magic.cpp | 61 +- .../r/mysql/bushy_leading_hint.result | 72 +- ...for_producer_consumer_schedule_mode.result | 10 +- .../r/mysql/subquery_sj_innodb.result | 2 +- 24 files changed, 911 insertions(+), 1452 deletions(-) diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index 86a2dc8b1..87fb2720d 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -787,21 +787,6 @@ int ObDMLStmt::replace_relation_exprs(const common::ObIArray &other return ret; } -int ObDMLStmt::replace_inner_stmt_expr(const common::ObIArray &other_exprs, - const common::ObIArray &new_exprs) -{ - int ret = OB_SUCCESS; - ObStmtExprReplacer visitor; - visitor.remove_scope(SCOPE_BASIC_TABLE); - visitor.set_recursive(true); - if (OB_FAIL(visitor.add_replace_exprs(other_exprs, new_exprs))) { - LOG_WARN("failed to add replace exprs", K(ret)); - } else if (OB_FAIL(iterate_stmt_expr(visitor))) { - LOG_WARN("failed to iterate stmt expr", K(ret)); - } - return ret; -} - int ObDMLStmt::copy_and_replace_stmt_expr(ObRawExprCopier &copier) { int ret = OB_SUCCESS; @@ -3045,6 +3030,27 @@ int ObDMLStmt::get_from_tables(ObSqlBitSet<> &table_set) const return ret; } +int ObDMLStmt::get_from_tables(common::ObIArray& from_tables) const +{ + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < from_items_.count(); ++i) { + TableItem *table_item = NULL; + const FromItem &from_item = from_items_.at(i); + if (from_item.is_joined_ && + OB_ISNULL(table_item = get_joined_table(from_item.table_id_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (!from_item.is_joined_ && + OB_ISNULL(table_item = get_table_item_by_id(from_item.table_id_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (OB_FAIL(from_tables.push_back(table_item))) { + LOG_WARN("failed to push back", K(ret)); + } + } + return ret; +} + ColumnItem *ObDMLStmt::get_column_item(uint64_t table_id, const ObString &col_name) { ColumnItem *item = NULL; diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index acecb66b0..647412933 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -667,24 +667,6 @@ public: int replace_relation_exprs(const common::ObIArray &other_exprs, const common::ObIArray &new_exprs); - /** - * @brief replace_inner_stmt_expr - * 对本层出现的 expr 进行替换。 - * stmt 中有一些 expr 可能出现在多处。对 stmt 进行深拷贝后,要调整新stmt中对应expr的指向。 - * other_exprs 与 new_exprs 一一映射。函数会将 a \in other_exprs 替换为对应的 b \in new_exprs - * 构造 other_exprs 与 new_exprs 构成的映射关系需要包含以下几类表达式 - * 1. ObColumnRefRawExpr: 列表达式 - * 2. ObAggFunRawExpr: 聚合函数表达式 - * 3. ObQueryRefRawExpr: 子查询引用表达式 - * 4. ObWinFunRawExpr: 窗口函数表达式 - * 其中 2-4 仅出现在 ObSelectStmt 中。 - * @param other_exprs - * @param new_exprs - * @return - */ - int replace_inner_stmt_expr(const common::ObIArray &other_exprs, - const common::ObIArray &new_exprs); - int copy_and_replace_stmt_expr(ObRawExprCopier &copier); virtual int iterate_stmt_expr(ObStmtExprVisitor &vistor); @@ -899,6 +881,7 @@ public: int get_table_rel_ids(const ObIArray &tables, ObSqlBitSet<> &table_set) const; int get_from_tables(ObRelIds &table_set) const; int get_from_tables(ObSqlBitSet<> &table_set) const; + int get_from_tables(common::ObIArray& from_tables) const; int add_table_item(const ObSQLSessionInfo *session_info, TableItem *table_item); int add_table_item(const ObSQLSessionInfo *session_info, TableItem *table_item, bool &have_same_table_name); diff --git a/src/sql/rewrite/ob_transform_aggr_subquery.cpp b/src/sql/rewrite/ob_transform_aggr_subquery.cpp index 6283d7b85..f4cfe7fb3 100644 --- a/src/sql/rewrite/ob_transform_aggr_subquery.cpp +++ b/src/sql/rewrite/ob_transform_aggr_subquery.cpp @@ -220,8 +220,6 @@ int ObTransformAggrSubquery::transform_with_aggregation_first(ObDMLStmt *&stmt, int ObTransformAggrSubquery::transform_with_aggr_first_for_having(ObDMLStmt *&stmt, bool &trans_happened) { int ret = OB_SUCCESS; - ObSEArray exprs; - ObSelectStmt *sel_stmt = NULL; ObSelectStmt *view_stmt = NULL; bool need_spj = false; if (OB_ISNULL(stmt)) { @@ -233,9 +231,7 @@ int ObTransformAggrSubquery::transform_with_aggr_first_for_having(ObDMLStmt *&st LOG_WARN("check need spj failed", K(ret)); } else if (!need_spj) { //do nothing - } else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, stmt, view_stmt)) || - OB_FAIL(ObTransformUtils::push_down_groupby(ctx_, static_cast(stmt), - stmt->get_table_size() == 1 ? stmt->get_table_item(0) : NULL))) { + } else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, stmt, view_stmt, true, true, true))) { LOG_WARN("create simple view failed", K(ret)); } else if (OB_FAIL(transform_with_aggregation_first(stmt, trans_happened))) { LOG_WARN("transform with aggr first failed", K(ret)); @@ -1192,7 +1188,7 @@ int ObTransformAggrSubquery::transform_with_join_first(ObDMLStmt *&stmt, } else if (OB_UNLIKELY(!ObOptimizerUtil::find_item(view_stmt->get_subquery_exprs(), param.ja_query_ref_))) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("the subquery is not found in view stmt", K(ret)); + LOG_WARN("the subquery is not found in view stmt", K(ret), KPC(view_stmt), KPC(param.ja_query_ref_)); } else if (OB_FAIL(do_join_first_transform(*view_stmt, param, root_expr, !join_first_happened_))) { LOG_WARN("failed to do join first transform", K(ret)); } else if (OB_FAIL(ObTransformUtils::add_param_not_null_constraint(*ctx_, param.not_null_const_))) { @@ -1373,42 +1369,20 @@ int ObTransformAggrSubquery::get_trans_view(ObDMLStmt &stmt, } if (OB_SUCC(ret)) { TableItem *table = NULL; + ObAliasRefRawExpr *alias = NULL; + bool push_group_by = stmt.is_select_stmt() && post_group_by && has_groupby; + bool push_vector_assign = stmt.is_update_stmt() && root_expr->has_flag(CNT_ALIAS); if (!has_rownum && !has_groupby && stmt.is_select_stmt()) { view_stmt = static_cast(&stmt); - } else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, &stmt, view_stmt))) { + } else if (push_vector_assign && + OB_FAIL(ObRawExprUtils::find_alias_expr(root_expr, alias))) { + LOG_WARN("failed to find alias expr", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, &stmt, view_stmt, + true, true, push_group_by, + alias))) { LOG_WARN("failed to create simple view", K(ret)); - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_table_size(); ++i) { - if (OB_ISNULL(stmt.get_table_item(i))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); - } else if (stmt.get_table_item(i)->ref_query_ == view_stmt) { - table = stmt.get_table_item(i); - break; - } - } - if (OB_SUCC(ret) && stmt.is_select_stmt()) { - if (has_groupby && post_group_by) { - if (OB_FAIL(ObTransformUtils::push_down_groupby(ctx_, - static_cast(&stmt), - table))) { - LOG_WARN("failed to push down group by", K(ret)); - } else { - view_stmt = static_cast(&stmt); - } - } - } - if (OB_SUCC(ret) && stmt.is_update_stmt()) { - if (root_expr->has_flag(CNT_ALIAS)) { - ObAliasRefRawExpr *alias = NULL; - if (OB_FAIL(ObRawExprUtils::find_alias_expr(root_expr, alias))) { - LOG_WARN("failed to find alias expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::push_down_vector_assign( - ctx_, static_cast(&stmt), alias, table))) { - LOG_WARN("failed to push down vector query", K(ret)); - } - } - } + } else if (push_group_by) { + view_stmt = static_cast(&stmt); } } return ret; @@ -1751,7 +1725,7 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt, LOG_WARN("failed to get select exprs", K(ret)); } else if (OB_FAIL(modify_vector_comparison_expr_if_necessary(select_stmt, expr_factory, select_exprs, parent_expr_of_query_ref))) { LOG_WARN("failed to modify vector comparison expr", K(ret)); - } else if (OB_FAIL(select_stmt.replace_inner_stmt_expr(trans_param.query_refs_, + } else if (OB_FAIL(select_stmt.replace_relation_exprs(trans_param.query_refs_, select_exprs))) { LOG_WARN("failed to update query ref value expr", K(ret)); } @@ -1822,6 +1796,9 @@ int ObTransformAggrSubquery::modify_vector_comparison_expr_if_necessary( LOG_WARN("unexpected root_expr type", K(ret), K(value_cmp_type)); } else { ObOpRawExpr *new_parent_expr = NULL; + ObSEArray old_exprs; + ObSEArray new_exprs; + if (OB_FAIL(expr_factory->create_raw_expr(value_cmp_type, new_parent_expr))) { LOG_WARN("failed to build expr", K(ret), K(new_parent_expr)); } else { @@ -1830,12 +1807,12 @@ int ObTransformAggrSubquery::modify_vector_comparison_expr_if_necessary( LOG_WARN("failed to add param expr", K(ret)); } } - ObSEArray old_exprs; - ObSEArray new_exprs; - if (OB_FAIL(old_exprs.push_back(parent_expr_of_query_ref)) || OB_FAIL(new_exprs.push_back(new_parent_expr))) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(old_exprs.push_back(parent_expr_of_query_ref)) || + OB_FAIL(new_exprs.push_back(new_parent_expr))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to push back expr", K(ret)); - } else if (OB_FAIL(select_stmt.replace_inner_stmt_expr(old_exprs, new_exprs))) { + } else if (OB_FAIL(select_stmt.replace_relation_exprs(old_exprs, new_exprs))) { LOG_WARN("failed to replace expr in stmt", K(ret)); } } diff --git a/src/sql/rewrite/ob_transform_dblink.cpp b/src/sql/rewrite/ob_transform_dblink.cpp index fc5ecbffb..9dac0fa2a 100644 --- a/src/sql/rewrite/ob_transform_dblink.cpp +++ b/src/sql/rewrite/ob_transform_dblink.cpp @@ -1152,9 +1152,6 @@ int ObTransformDBlink::inner_pack_link_table(ObDMLStmt *stmt, LinkTableHelper &h { int ret = OB_SUCCESS; TableItem *view_table = NULL; - ObSelectStmt *ref_query = NULL; - ObSEArray dummy_semi_infos; - ObSEArray reverse_tables; if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null stmt", K(ret)); @@ -1164,50 +1161,24 @@ int ObTransformDBlink::inner_pack_link_table(ObDMLStmt *stmt, LinkTableHelper &h helper.is_reverse_link_ ? 0 : helper.dblink_id_))) { LOG_WARN("failed to reverse link table", K(ret)); - } else if (OB_FAIL(ObTransformUtils::construct_simple_view(stmt, - helper.table_items_, - helper.semi_infos_, - ctx_, - ref_query))) { - LOG_WARN("failed to construct simple view", K(ret)); - } else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, + } else if (ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), helper.conditions_)) { + LOG_WARN("failed to remove item", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + helper.table_items_, + &helper.semi_infos_))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, stmt, - ref_query, - view_table))) { - LOG_WARN("failed to add new table item", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (NULL == helper.parent_table_ && - NULL == helper.parent_semi_info_ && - OB_FAIL(stmt->add_from_item(view_table->table_id_, false))) { - LOG_WARN("failed to add from item", K(ret)); - } else if (OB_FAIL(append(ref_query->get_condition_exprs(), helper.conditions_))) { - LOG_WARN("failed to push back conditions", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), - helper.conditions_))) { - LOG_WARN("failed to remove extracted conditions from stmt", K(ret)); - } - - for (int64_t i = 0; OB_SUCC(ret) && i < helper.table_items_.count(); ++i) { - TableItem *table = helper.table_items_.at(i); - if (OB_ISNULL(table)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table is null", K(ret), K(table)); - } else if (OB_FAIL(ObTransformUtils::replace_table_in_semi_infos( - stmt, view_table, table))) { - LOG_WARN("failed to replace table in semi infos", K(ret)); - } else if (OB_FAIL(ObTransformUtils::replace_table_in_joined_tables( - stmt, view_table, table))) { - LOG_WARN("failed to replace table in joined tables", K(ret)); - } - } - - if (OB_FAIL(ret)) { + view_table, + helper.table_items_, + &helper.conditions_, + &helper.semi_infos_))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(view_table) || OB_ISNULL(view_table->ref_query_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null table item", K(ret)); - } else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, view_table))) { - LOG_WARN("failed to generate select list", K(ret), K(view_table)); } else if (OB_FAIL(formalize_link_table(view_table->ref_query_))) { LOG_WARN("failed to formalize link table", K(ret)); } else { @@ -1226,8 +1197,6 @@ int ObTransformDBlink::formalize_link_table(ObDMLStmt *stmt) LOG_WARN("failed to formalize select item", K(ret)); } else if (OB_FAIL(formalize_column_item(stmt))) { LOG_WARN("failed to formalize column item", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } return ret; } diff --git a/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp b/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp index 1a08ceff8..d9cdb6144 100644 --- a/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp +++ b/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp @@ -843,26 +843,23 @@ int ObTransformJoinLimitPushDown::do_transform(ObSelectStmt *select_stmt, LimitPushDownHelper &helper) { int ret = OB_SUCCESS; - ObSelectStmt *ref_query = NULL; - ObSEArray new_conds; if (OB_ISNULL(select_stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); } else if (!helper.lazy_join_tables_.empty() && OB_FAIL(remove_lazy_left_join(select_stmt, helper))) { LOG_WARN("failed to remove lazy left join table", K(ret)); - //pushdown other join table item - } else if (OB_FAIL(ObTransformUtils::construct_simple_view(select_stmt, - helper.pushdown_tables_, - helper.pushdown_semi_infos_, - ctx_, - ref_query))) { - LOG_WARN("failed to construct simple view", K(ret)); - } else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, - select_stmt, - ref_query, - helper.view_table_))) { - LOG_WARN("failed to add new table item", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_condition_exprs(), + helper.pushdown_conds_))) { + LOG_WARN("failed to remove conditions from stmt", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_semi_infos(), + helper.pushdown_semi_infos_))) { + LOG_WARN("failed to remove semi infos from stmt", K(ret)); + } else if (ObTransformUtils::add_new_table_item(ctx_, + select_stmt, + NULL, + helper.view_table_)) { + LOG_WARN("failed to create table item", K(ret)); } else if (OB_FAIL(select_stmt->add_from_item(helper.view_table_->table_id_, false))) { LOG_WARN("failed to add from item", K(ret)); } @@ -881,29 +878,30 @@ int ObTransformJoinLimitPushDown::do_transform(ObSelectStmt *select_stmt, } } - if (OB_SUCC(ret)) { - if (!helper.lazy_join_tables_.empty() && - OB_FAIL(build_lazy_left_join(select_stmt, helper))) { + if (OB_SUCC(ret) && !helper.lazy_join_tables_.empty()) { + if (OB_FAIL(build_lazy_left_join(select_stmt, helper))) { LOG_WARN("failed to build lazy left join table", K(ret)); - } else if (OB_ISNULL(helper.view_table_) || - OB_ISNULL(ref_query = helper.view_table_->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("target table should not be null", K(ret)); - } else if (OB_FAIL(append(ref_query->get_condition_exprs(), helper.pushdown_conds_))) { - LOG_WARN("failed to push back conditions", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt->get_condition_exprs(), - helper.pushdown_conds_))) { - LOG_WARN("failed to remove extracted conditions from stmt", K(ret)); - } else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, select_stmt, helper.view_table_))) { - LOG_WARN("failed to generate select list", K(ret), K(helper.view_table_)); - } else if (OB_FAIL(add_order_by_limit_for_view(ref_query, - *helper.view_table_, - select_stmt, - helper.pushdown_order_items_, - helper.all_lazy_join_is_unique_join_))) { - LOG_WARN("failed to add limit for generated view table", K(ret)); } } + + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + select_stmt, + helper.view_table_, + helper.pushdown_tables_, + &helper.pushdown_conds_, + &helper.pushdown_semi_infos_, + NULL, + NULL, + NULL, + NULL, + &helper.pushdown_order_items_))) { + LOG_WARN("failed to create inline view", K(ret)); + } else if (OB_FAIL(add_limit_for_view(helper.view_table_->ref_query_, + select_stmt, + helper.all_lazy_join_is_unique_join_))) { + LOG_WARN("failed to add order by limit for view", K(ret)); + } return ret; } @@ -1017,11 +1015,9 @@ int ObTransformJoinLimitPushDown::build_lazy_left_join(ObDMLStmt *stmt, return ret; } -int ObTransformJoinLimitPushDown::add_order_by_limit_for_view(ObSelectStmt *generated_view, - TableItem &view, - ObSelectStmt *upper_stmt, - ObIArray &order_items, - bool pushdown_offset) +int ObTransformJoinLimitPushDown::add_limit_for_view(ObSelectStmt *generated_view, + ObSelectStmt *upper_stmt, + bool pushdown_offset) { int ret = OB_SUCCESS; if (OB_ISNULL(generated_view) || OB_ISNULL(upper_stmt) || @@ -1029,36 +1025,11 @@ int ObTransformJoinLimitPushDown::add_order_by_limit_for_view(ObSelectStmt *gene ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid parameter", K(ret), K(generated_view), K(upper_stmt), K(ctx_)); } else { - ObSEArray old_order_exprs; - ObSEArray new_order_exprs; - for (int64_t i = 0; OB_SUCC(ret) && i < order_items.count(); i++) { - if (OB_FAIL(old_order_exprs.push_back(order_items.at(i).expr_))) { - LOG_WARN("failed to push back", K(ret)); - } - } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_, - *upper_stmt, - view, - old_order_exprs, - new_order_exprs))) { - LOG_WARN("failed to move expr into view", K(ret)); - } else if (OB_UNLIKELY(new_order_exprs.count() != order_items.count())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected exprs count", K(ret), K(new_order_exprs), K(order_items)); - } else { - for (int64_t i = 0; i < order_items.count(); i++) { - order_items.at(i).expr_ = new_order_exprs.at(i); - } - } - ObRawExpr *offset_expr = upper_stmt->get_offset_expr(); ObRawExpr *limit_expr = upper_stmt->get_limit_expr(); if (OB_ISNULL(limit_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("illegal limit expr", K(ret)); - } else if (OB_FAIL(generated_view->get_order_items().assign(order_items))) { - LOG_WARN("failed to copy order by items", K(ret)); } else if (pushdown_offset) { generated_view->set_limit_offset(limit_expr, offset_expr); upper_stmt->set_limit_offset(NULL, NULL); diff --git a/src/sql/rewrite/ob_transform_join_limit_pushdown.h b/src/sql/rewrite/ob_transform_join_limit_pushdown.h index 3ffd5de65..c4f50cb2a 100644 --- a/src/sql/rewrite/ob_transform_join_limit_pushdown.h +++ b/src/sql/rewrite/ob_transform_join_limit_pushdown.h @@ -146,11 +146,9 @@ private: int build_lazy_left_join(ObDMLStmt *stmt, LimitPushDownHelper &helper); - int add_order_by_limit_for_view(ObSelectStmt *generated_view, - TableItem &view, - ObSelectStmt *upper_stmt, - ObIArray &order_items, - bool pushdown_offset); + int add_limit_for_view(ObSelectStmt *generated_view, + ObSelectStmt *upper_stmt, + bool pushdown_offset); int rename_pushdown_exprs(ObSelectStmt *select_stmt, ObIArray &helpers); diff --git a/src/sql/rewrite/ob_transform_left_join_to_anti.cpp b/src/sql/rewrite/ob_transform_left_join_to_anti.cpp index 88c93fe03..b4e143bf0 100644 --- a/src/sql/rewrite/ob_transform_left_join_to_anti.cpp +++ b/src/sql/rewrite/ob_transform_left_join_to_anti.cpp @@ -40,18 +40,20 @@ int ObTransformLeftJoinToAnti::transform_one_stmt(common::ObIArrayis_set_stmt()) { // do nothing } else { - JoinedTable *joined_table = NULL; ObSEArray, 4> trans_tables; - for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_from_item_size(); ++i) { - FromItem &from_item = stmt->get_from_item(i); - if (!from_item.is_joined_) { - } else if (OB_ISNULL(joined_table = stmt->get_joined_table(from_item.table_id_))) { + ObSEArray joined_tables; + if (OB_FAIL(joined_tables.assign(stmt->get_joined_tables()))) { + LOG_WARN("failed to assign joined table", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < joined_tables.count(); ++i) { + TableItem *table = NULL; + if (OB_ISNULL(table = joined_tables.at(i))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null table", K(ret)); } else if (OB_FAIL(SMART_CALL(transform_left_join_to_anti_join_rec(stmt, - joined_table, + table, trans_tables, - joined_table->table_id_, + true, trans_happened)))) { LOG_WARN("failed to transform left join to anti join", K(ret)); } @@ -103,35 +105,31 @@ int ObTransformLeftJoinToAnti::construct_transform_hint(ObDMLStmt &stmt, void *t } int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join_rec(ObDMLStmt *stmt, - JoinedTable *joined_table, + TableItem *table, ObIArray> &trans_tables, - uint64_t root_table_id, + bool is_root_table, bool &trans_happened) { int ret = OB_SUCCESS; bool left_trans = false; bool cur_trans = false; - bool is_root_table = false; ; - TableItem *left_table = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(joined_table) || - OB_ISNULL(left_table = joined_table->left_table_) || - OB_ISNULL(joined_table->right_table_)) { + JoinedTable *joined_table = static_cast(table); + if (OB_ISNULL(stmt) || OB_ISNULL(table) || OB_UNLIKELY(!table->is_joined_table())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(joined_table)); - } else if (joined_table->joined_type_ == LEFT_OUTER_JOIN) { - is_root_table = joined_table->table_id_ == root_table_id; - if (left_table->is_joined_table()) { + LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(table)); + } else if (joined_table->is_left_join()) { + if (joined_table->left_table_->is_joined_table()) { if (OB_FAIL(SMART_CALL(transform_left_join_to_anti_join_rec(stmt, - static_cast(left_table), + joined_table->left_table_, trans_tables, - root_table_id, + false, left_trans)))) { LOG_WARN("failed to transform joined table to anti join", K(ret)); } } OPT_TRACE("try transform left join to anti join:", joined_table); if (OB_SUCC(ret) && OB_FAIL(transform_left_join_to_anti_join(stmt, - joined_table, + table, trans_tables, is_root_table, cur_trans))) { @@ -143,8 +141,9 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join_rec(ObDMLStmt *s return ret; } + int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt, - JoinedTable *joined_table, + TableItem *table, ObIArray> &trans_tables, bool is_root_table, bool &trans_happened) @@ -152,16 +151,13 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt int ret = OB_SUCCESS; trans_happened = false; bool is_valid = false; - TableItem *right_table = NULL; - TableItem *view_table = NULL; + JoinedTable *joined_table = static_cast(table); ObSEArray target_exprs; ObArray constraints; - if (OB_ISNULL(stmt) || OB_ISNULL(joined_table) || - OB_ISNULL(joined_table->left_table_) || - OB_ISNULL(right_table = joined_table->right_table_)) { + if (OB_ISNULL(stmt) || OB_UNLIKELY(!table->is_joined_table())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(joined_table)); - } else if (OB_FAIL(check_hint_valid(*stmt, *right_table, is_valid))) { + LOG_WARN("get unexpected null stmt or table item", K(ret), K(stmt), K(table)); + } else if (OB_FAIL(check_hint_valid(*stmt, *joined_table->right_table_, is_valid))) { LOG_WARN("failed to check hint valid", K(ret)); } else if (!is_valid) { // do nothing @@ -181,37 +177,27 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), target_exprs))) { LOG_WARN("failed to remove condition exprs", K(ret)); - } else if (OB_FAIL(construct_trans_table_list(stmt, right_table, trans_tables))) { + } else if (OB_FAIL(construct_trans_table_list(stmt, joined_table->right_table_, trans_tables))) { LOG_WARN("failed to construct transformed table list", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), target_exprs))) { - LOG_WARN("failed to remove condition exprs", K(ret)); } else if (is_root_table) { - if ((right_table->is_joined_table() || - (lib::is_mysql_mode() && right_table->has_for_update())) && - OB_FAIL(ObTransformUtils::create_view_with_table(stmt, - ctx_, - right_table, - view_table))) { - LOG_WARN("failed to create semi view", K(ret)); - } else if (OB_FAIL(trans_stmt_to_anti(stmt, joined_table))) { + if (OB_FAIL(trans_stmt_to_anti(stmt, joined_table))) { LOG_WARN("failed to create semi stmt", K(ret)); } else { trans_happened = true; } } else { - TableItem *table = joined_table; + TableItem *view_table = NULL; ObDMLStmt *ref_query = NULL; - TableItem *view_table_for_update = NULL; - if (lib::is_mysql_mode() && right_table->has_for_update() && - OB_FAIL(ObTransformUtils::create_view_with_table(stmt, - ctx_, - right_table, - view_table_for_update))) { - LOG_WARN("failed to create semi view", K(ret)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, - ctx_, - table, - view_table))) { + TableItem *push_table = table; + if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + push_table))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_table, + push_table))) { LOG_WARN("failed to create semi view", K(ret)); } else if (OB_ISNULL(view_table) || !view_table->is_generated_table() || @@ -233,21 +219,20 @@ int ObTransformLeftJoinToAnti::transform_left_join_to_anti_join(ObDMLStmt *&stmt return ret; } -int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedTable *joined_table) +int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, JoinedTable *joined_table) { int ret = OB_SUCCESS; // 1. create semi info, adjust from item SemiInfo *semi_info = NULL; - int64_t idx = OB_INVALID_INDEX; TableItem *left_table = NULL; TableItem *right_table = NULL; - TableItem *right_view_table = NULL; - uint64_t right_table_id = OB_INVALID_ID; + TableItem *view_table = NULL; if (OB_ISNULL(ctx_) || OB_ISNULL(ctx_->allocator_) || OB_ISNULL(ctx_->session_info_) || OB_ISNULL(ctx_->expr_factory_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret), K(ctx_)); - } else if (OB_ISNULL(joined_table) || OB_ISNULL(left_table = joined_table->left_table_) || + } else if (OB_ISNULL(joined_table) || + OB_ISNULL(left_table = joined_table->left_table_) || OB_ISNULL(right_table = joined_table->right_table_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null table", K(ret), K(joined_table)); @@ -260,18 +245,30 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT } else if (lib::is_oracle_mode() && OB_FAIL(clear_for_update(right_table))) { // avoid for update op in the right side of the anti/semi. LOG_WARN("failed to clear for update", K(ret)); - } else if (right_table->is_joined_table() && - OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, right_table, right_view_table))) { + } else if (!right_table->has_for_update() && !right_table->is_joined_table()) { + // do nothing + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + right_table))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_table, + right_table))) { LOG_WARN("failed to create right view table", K(ret)); } else { - right_table_id = right_view_table == NULL ? right_table->table_id_ : right_view_table->table_id_; + right_table = view_table; + } + + if (OB_SUCC(ret)) { semi_info->join_type_ = LEFT_ANTI_JOIN; - semi_info->right_table_id_ = right_table_id; + semi_info->right_table_id_ = right_table->table_id_; semi_info->semi_id_ = stmt->get_query_ctx()->available_tb_id_--; - idx = stmt->get_from_item_idx(joined_table->table_id_); + int64_t idx = stmt->get_from_item_idx(joined_table->table_id_); if (OB_UNLIKELY(idx < 0 || idx >= stmt->get_from_item_size())) { - ret = OB_INVALID_INDEX; - LOG_WARN("invalid index", K(ret)); + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid index", K(ret), K(idx)); } else { stmt->get_from_item(idx).table_id_ = left_table->table_id_; stmt->get_from_item(idx).is_joined_ = left_table->is_joined_table(); @@ -296,12 +293,8 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT } // 2. generate null exprs for exprs in right side of the joined table if (OB_SUCC(ret)) { - ObSEArray relation_exprs; ObSEArray from_exprs; ObSEArray to_exprs; - if (OB_FAIL(stmt->get_relation_exprs(relation_exprs))) { - LOG_WARN("failed to get relation exprs", K(ret)); - } for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_column_size(); ++i) { const ColumnItem *col_item = NULL; ObRawExpr *from_expr = NULL; @@ -310,7 +303,7 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT OB_ISNULL(from_expr = col_item->expr_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null column", K(ret)); - } else if (right_table_id != col_item->table_id_) { + } else if (right_table->table_id_ != col_item->table_id_) { // do nothing } else if (OB_FAIL(ObRawExprUtils::build_null_expr(*ctx_->expr_factory_, to_expr))) { @@ -329,23 +322,13 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT } } // do in-place modification - for (int64_t i = 0; OB_SUCC(ret) && i < relation_exprs.count(); ++i) { - ObRawExpr *expr = NULL; - if (OB_FAIL(relation_exprs.at(i).get(expr))) { - LOG_WARN("failed to get expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::replace_expr(from_exprs, - to_exprs, - expr))) { - LOG_WARN("failed to replace expr", K(ret)); - } else if (OB_FAIL(relation_exprs.at(i).set(expr))) { - LOG_WARN("failed to set expr", K(ret)); - } - } // a shared expr in semi_condition may be modified by the above replacemenet, // we revert the replacement in the following. if (OB_SUCC(ret)) { ObRawExprCopier copier(*ctx_->expr_factory_); - if (OB_FAIL(copier.add_replaced_expr(to_exprs, from_exprs))) { + if (OB_FAIL(stmt->replace_relation_exprs(from_exprs, to_exprs))) { + LOG_WARN("failed to replace relation exprs", K(ret)); + } else if (OB_FAIL(copier.add_replaced_expr(to_exprs, from_exprs))) { LOG_WARN("failed to add replaced expr", K(ret)); } else if (OB_FAIL(copier.copy_on_replace(semi_info->semi_conditions_, semi_info->semi_conditions_))) { @@ -353,15 +336,16 @@ int ObTransformLeftJoinToAnti::trans_stmt_to_anti(ObDMLStmt *stmt, const JoinedT } } } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(stmt->get_semi_infos().push_back(semi_info))) { - LOG_WARN("failed to assign semi infos", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item rel id", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { - LOG_WARN("failed to formlize stmt", K(ret)); + if (OB_SUCC(ret)) { + if (OB_FAIL(stmt->get_semi_infos().push_back(semi_info))) { + LOG_WARN("failed to assign semi infos", K(ret)); + } else if (OB_FAIL(stmt->rebuild_tables_hash())) { + LOG_WARN("failed to rebuild table hash", K(ret)); + } else if (OB_FAIL(stmt->update_column_item_rel_id())) { + LOG_WARN("failed to update column item rel id", K(ret)); + } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formlize stmt", K(ret)); + } } return ret; } diff --git a/src/sql/rewrite/ob_transform_left_join_to_anti.h b/src/sql/rewrite/ob_transform_left_join_to_anti.h index 16186e11c..da93ea28b 100644 --- a/src/sql/rewrite/ob_transform_left_join_to_anti.h +++ b/src/sql/rewrite/ob_transform_left_join_to_anti.h @@ -40,17 +40,17 @@ private: const TableItem &table, bool &is_valid); int transform_left_join_to_anti_join_rec(ObDMLStmt *stmt, - JoinedTable *joined_table, + TableItem *table, ObIArray> &trans_tables, - uint64_t root_table_id, + bool is_root_table, bool &trans_happened); int transform_left_join_to_anti_join(ObDMLStmt *&stmt, - JoinedTable *joined_table, + TableItem *table, ObIArray> &trans_tables, bool is_root_table, bool &trans_happened); int trans_stmt_to_anti(ObDMLStmt *stmt, - const JoinedTable *joined_table); + JoinedTable *joined_table); int construct_trans_table_list(const ObDMLStmt *stmt, const TableItem *table, ObIArray> &trans_tables); diff --git a/src/sql/rewrite/ob_transform_or_expansion.cpp b/src/sql/rewrite/ob_transform_or_expansion.cpp index a4c978283..cdeb97519 100644 --- a/src/sql/rewrite/ob_transform_or_expansion.cpp +++ b/src/sql/rewrite/ob_transform_or_expansion.cpp @@ -35,8 +35,6 @@ int ObTransformOrExpansion::transform_one_stmt(ObIArray &parent bool &trans_happened) { int ret = OB_SUCCESS; - ObDMLStmt *upper_stmt = NULL; - ObSelectStmt *spj_stmt = NULL; trans_happened = false; if (OB_FAIL(transform_in_joined_table(parent_stmts, stmt, trans_happened))) { LOG_WARN("failed to do or expansion in joined condition", K(ret)); @@ -589,12 +587,19 @@ int ObTransformOrExpansion::create_single_joined_table_stmt(ObDMLStmt *trans_stm } else if (OB_ISNULL(cur_table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret), K(cur_table)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(trans_stmt, ctx_, cur_table, - view_table))) { - LOG_WARN("failed to create view with table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + trans_stmt, + view_table, + cur_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + trans_stmt, + view_table, + cur_table))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(view_table)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret), K(view_table)); + LOG_WARN("view table is null", K(ret), K(view_table)); } else { ref_query = view_table->ref_query_; } @@ -3033,10 +3038,10 @@ int ObTransformOrExpansion::get_condition_related_tables(ObSelectStmt &stmt, // (t1.c = 1 or t3.c = 1)) v // where v.d in (select d from t4 where t4.a > v.a limit 10) or_expr_tables.reuse(); - if (OB_FAIL(get_all_tables(stmt, - or_expr_tables, - or_semi_infos))) { - LOG_WARN("failed to get all tables", K(ret)); + if (OB_FAIL(or_semi_infos.assign(stmt.get_semi_infos()))) { + LOG_WARN("failed to assign semi infos", K(ret)); + } else if (OB_FAIL(stmt.get_from_tables(or_expr_tables))) { + LOG_WARN("failed to get from tables", K(ret)); } } } @@ -3067,7 +3072,7 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt, bool create_view = false; ObSEArray or_expr_tables; ObSEArray or_semi_infos; - ObSqlBitSet<> view_table_set; + ObSqlBitSet<> table_set; int64_t new_expr_pos = OB_INVALID_ID; if (OB_ISNULL(ctx_) || OB_ISNULL(stmt) || OB_ISNULL(stmt_factory = ctx_->stmt_factory_) || OB_ISNULL(expr_factory = ctx_->expr_factory_) || OB_ISNULL(conds_exprs) @@ -3083,21 +3088,15 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt, LOG_WARN("failed to get condition related tables", K(ret)); } else if (!create_view) { // do nothing - } else if (OB_FAIL(ObTransformUtils::create_view_with_tables(stmt, ctx_, - or_expr_tables, or_semi_infos, view_table))) { - LOG_WARN("failed to create simple view", K(ret)); - } else if (OB_ISNULL(view_stmt = view_table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("failed to get view stmt", K(ret)); - } else if (OB_FAIL(stmt->get_table_rel_ids(*view_table, view_table_set))) { - LOG_WARN("failed to get rel ids", K(ret)); } else { // push down a predicate, if: // 1. it is the or expansion cond; or // 2. a. it does not contain not onetime subquery; and // b. it is only related to view tables - ObSEArray new_conds; - ObSEArray old_push_conds; + ObSEArray push_conditions; + if (OB_FAIL(stmt->get_table_rel_ids(or_expr_tables, table_set))) { + LOG_WARN("failed to get table rel ids", K(ret)); + } for (int64_t i = 0; OB_SUCC(ret) && i < conds_exprs->count(); i++) { ObRawExpr *cond = NULL; if (OB_ISNULL(cond = (conds_exprs->at(i)))) { @@ -3105,27 +3104,36 @@ int ObTransformOrExpansion::get_condition_related_view(ObSelectStmt *stmt, LOG_WARN("unexpected null", K(ret)); } else if (i != expr_pos && (conds_exprs->at(i)->has_flag(CNT_SUB_QUERY) || - !cond->get_relation_ids().is_subset(view_table_set))) { + !cond->get_relation_ids().is_subset(table_set))) { // do not push - } else if (OB_FAIL(old_push_conds.push_back(cond))) { + } else if (OB_FAIL(push_conditions.push_back(cond))) { LOG_WARN("failed to push cond", K(ret)); } else if (i == expr_pos){ - new_expr_pos = old_push_conds.count() - 1; + new_expr_pos = push_conditions.count() - 1; } } - + // get push down conditions if (OB_FAIL(ret)) { - } else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*expr_factory, - *stmt, - *view_table, - old_push_conds, - new_conds))) { - LOG_WARN("failed to move expr into view", K(ret)); - } else if (OB_FAIL(view_stmt->add_condition_exprs(new_conds))) { - LOG_WARN("failed to add view conditions exprs", K(ret)); + // do nothing } else if (OB_FAIL(ObOptimizerUtil::remove_item(*conds_exprs, - old_push_conds))) { - LOG_WARN("failed to remove push down filters", K(ret)); + push_conditions))) { + LOG_WARN("failed to remove pushed conditions", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + or_expr_tables, + &or_semi_infos))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_table, + or_expr_tables, + &push_conditions, + &or_semi_infos))) { + LOG_WARN("failed to create inline view", K(ret)); + } else if (OB_ISNULL(view_table) || OB_ISNULL(view_stmt = view_table->ref_query_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("view table is null", K(ret), K(view_table), K(view_stmt)); } else { expr_pos = new_expr_pos; conds_exprs = &view_stmt->get_condition_exprs(); @@ -3216,32 +3224,5 @@ int ObTransformOrExpansion::check_left_bottom_table(ObSelectStmt &stmt, return ret; } -int ObTransformOrExpansion::get_all_tables(ObSelectStmt &stmt, - ObIArray &all_tables, - ObIArray &or_semi_infos) -{ - int ret = OB_SUCCESS; - if (OB_FAIL(or_semi_infos.assign(stmt.get_semi_infos()))) { - LOG_WARN("failed to assign semi infos", K(ret)); - } - ObSqlBitSet<> from_table_ids; - for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_from_item_size(); i ++) { - TableItem *table_item = NULL; - FromItem &from_item = stmt.get_from_item(i); - if (from_item.is_joined_ && - OB_ISNULL(table_item = stmt.get_joined_table(from_item.table_id_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret)); - } else if (!from_item.is_joined_ && - OB_ISNULL(table_item = stmt.get_table_item_by_id(from_item.table_id_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null", K(ret)); - } else if (OB_FAIL(all_tables.push_back(table_item))) { - LOG_WARN("failed to push back", K(ret)); - } - } - return ret; -} - } /* namespace sql */ } /* namespace oceanbase */ diff --git a/src/sql/rewrite/ob_transform_or_expansion.h b/src/sql/rewrite/ob_transform_or_expansion.h index 927923c0b..6c8563086 100644 --- a/src/sql/rewrite/ob_transform_or_expansion.h +++ b/src/sql/rewrite/ob_transform_or_expansion.h @@ -373,9 +373,6 @@ private: TableItem *&view_table, int64_t &expr_pos, ObIArray *&conds_exprs); - int get_all_tables(ObSelectStmt &stmt, - ObIArray &rel_tables, - ObIArray &or_semi_infos); int check_delay_expr(ObRawExpr* expr, bool &delay); int check_valid_rel_table(ObSelectStmt &stmt, ObRelIds &rel_ids, diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index f8469678a..b0fc02d31 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -3023,9 +3023,16 @@ int ObTransformPreProcess::transform_for_temporary_table(ObDMLStmt *&stmt, } else { trans_happened = true; } - } else if(OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, table_item, - view_table))) { - LOG_WARN("failed to create view with table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + table_item))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_table, + table_item))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (!view_table->is_generated_table() || OB_ISNULL(ref_query = view_table->ref_query_) || !ref_query->is_single_table_stmt() @@ -3693,9 +3700,16 @@ int ObTransformPreProcess::add_filter_for_rls_select(ObDMLStmt &stmt, if (OB_FAIL(add_filter_for_rls(stmt, table_item, columns, expr))) { LOG_WARN("failed to add filter for rls table", K(ret)); } - } else if(OB_FAIL(ObTransformUtils::create_view_with_table(&stmt, ctx_, &table_item, - view_table))) { - LOG_WARN("failed to create view with table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + &stmt, + view_table, + &table_item))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + &stmt, + view_table, + &table_item))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (!view_table->is_generated_table() || OB_ISNULL(ref_query = view_table->ref_query_) || !ref_query->is_single_table_stmt() @@ -4714,7 +4728,6 @@ int ObTransformPreProcess::create_source_view_for_merge_into(ObMergeStmt *merge_ const int64_t SOURCE_TABLE_IDX = 1; TableItem *source_table = NULL; ObSEArray insert_values_subquery_exprs; - if (OB_ISNULL(merge_stmt) || OB_ISNULL(ctx_) || OB_ISNULL(ctx_->allocator_)) { ret = OB_ERR_UNEXPECTED; @@ -4722,10 +4735,15 @@ int ObTransformPreProcess::create_source_view_for_merge_into(ObMergeStmt *merge_ } else if (OB_ISNULL(source_table = merge_stmt->get_table_item(SOURCE_TABLE_IDX))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table item is null", K(ret), K(merge_stmt), K(ctx_)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(merge_stmt, - ctx_, - source_table, - view_table))) { + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + merge_stmt, + view_table, + source_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + merge_stmt, + view_table, + source_table))) { LOG_WARN("failed to create view with table", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::get_subquery_exprs(merge_stmt->get_values_vector(), insert_values_subquery_exprs))) { @@ -7263,7 +7281,7 @@ int ObTransformPreProcess::transform_full_outer_join(ObDMLStmt *&stmt, bool &tra if (OB_ISNULL(joined_tables.at(i))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret), K(i), K(joined_tables)); - } else if (OB_FAIL(recursively_eliminate_full_join(*stmt, *joined_tables.at(i), + } else if (OB_FAIL(recursively_eliminate_full_join(*stmt, joined_tables.at(i), is_happened))) { LOG_WARN("failed to recursively eliminate full join", K(ret)); } else { @@ -7275,24 +7293,26 @@ int ObTransformPreProcess::transform_full_outer_join(ObDMLStmt *&stmt, bool &tra } int ObTransformPreProcess::recursively_eliminate_full_join(ObDMLStmt &stmt, - TableItem &table_item, - bool &trans_happened) + TableItem *table_item, + bool &trans_happened) { int ret = OB_SUCCESS; - JoinedTable *joined_table = NULL; - TableItem *view_table = NULL; bool has_euqal = false; bool has_subquery = false; - if (!table_item.is_joined_table()) { - /* do nothing */ - } else if (OB_FALSE_IT(joined_table = static_cast(&table_item))) { - } else if (OB_ISNULL(joined_table->left_table_) || OB_ISNULL(joined_table->right_table_)) { + JoinedTable *joined_table = static_cast(table_item); + TableItem *view_table = NULL; + TableItem *from_table = table_item; + if (OB_ISNULL(table_item)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null.", K(ret)); - } else if (OB_FAIL(recursively_eliminate_full_join(stmt, *joined_table->left_table_, + LOG_WARN("table item is null", K(ret), K(table_item)); + } else if (!table_item->is_joined_table()) { + /* do nothing */ + } else if (OB_FAIL(recursively_eliminate_full_join(stmt, + joined_table->left_table_, trans_happened))) { LOG_WARN("failed to transform full nl join.", K(ret)); - } else if (OB_FAIL(recursively_eliminate_full_join(stmt, *joined_table->right_table_, + } else if (OB_FAIL(recursively_eliminate_full_join(stmt, + joined_table->right_table_, trans_happened))) { LOG_WARN("failed to transform full nl join.", K(ret)); } else if (!joined_table->is_full_join()) { @@ -7301,13 +7321,24 @@ int ObTransformPreProcess::recursively_eliminate_full_join(ObDMLStmt &stmt, LOG_WARN("failed to check join condition", K(ret)); } else if (has_euqal || has_subquery) { /* do nothing */ - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(&stmt, ctx_, joined_table, - view_table))) { - LOG_WARN("failed to create view with table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + &stmt, + view_table, + from_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + &stmt, + view_table, + from_table))) { + LOG_WARN("failed to create inline view", K(ret)); + } else if (OB_ISNULL(view_table)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("view table is null", K(ret), K(view_table)); } else if (OB_FAIL(expand_full_outer_join(view_table->ref_query_))) { LOG_WARN("failed to create view for full nl join.", K(ret)); } else { trans_happened = true; + view_table->for_update_ = false; } return ret; } @@ -7410,7 +7441,6 @@ int ObTransformPreProcess::switch_left_outer_to_semi_join(ObSelectStmt *&sub_stm int ret = OB_SUCCESS; SemiInfo *semi_info = NULL; ObSEArray output_select_items; - TableItem *view_item = NULL; ObSEArray from_items; ObSEArray semi_infos; ObSEArray joined_tables; @@ -7421,10 +7451,24 @@ int ObTransformPreProcess::switch_left_outer_to_semi_join(ObSelectStmt *&sub_stm } else if (OB_ISNULL(joined_table->left_table_) || OB_ISNULL(joined_table->right_table_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null pointer.", K(ret)); - } else if (joined_table->left_table_->is_joined_table() && - OB_FAIL(ObTransformUtils::create_view_with_table(sub_stmt, ctx_, - joined_table->left_table_, view_item))) { - LOG_WARN("failed to create view with table", K(ret)); + } else if (joined_table->left_table_->is_joined_table()) { + TableItem *view_table = NULL; + TableItem *push_table = joined_table->left_table_; + if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + sub_stmt, + view_table, + push_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + sub_stmt, + view_table, + push_table))) { + LOG_WARN("failed to create inline view with table", K(ret)); + } else { + joined_table->left_table_ = view_table; + } + } + if (OB_FAIL(ret)) { } else if (OB_ISNULL(semi_info = static_cast(ctx_->allocator_->alloc( sizeof(SemiInfo))))) { ret = OB_ALLOCATE_MEMORY_FAILED; diff --git a/src/sql/rewrite/ob_transform_pre_process.h b/src/sql/rewrite/ob_transform_pre_process.h index 40711300d..62423d40d 100644 --- a/src/sql/rewrite/ob_transform_pre_process.h +++ b/src/sql/rewrite/ob_transform_pre_process.h @@ -559,7 +559,7 @@ struct DistinctObjMeta * 以左-右-后的方式后续遍历from item及semi from item中的joined_table结构 */ int recursively_eliminate_full_join(ObDMLStmt &stmt, - TableItem &table_item, + TableItem *table_item, bool &trans_happened); /** diff --git a/src/sql/rewrite/ob_transform_predicate_move_around.cpp b/src/sql/rewrite/ob_transform_predicate_move_around.cpp index 1de5a522d..0b8e37234 100644 --- a/src/sql/rewrite/ob_transform_predicate_move_around.cpp +++ b/src/sql/rewrite/ob_transform_predicate_move_around.cpp @@ -2510,10 +2510,9 @@ int ObTransformPredicateMoveAround::pushdown_semi_info_right_filter(ObDMLStmt *s { int ret = OB_SUCCESS; TableItem *right_table = NULL; - ObSelectStmt *child_stmt = NULL; + TableItem *view_table = NULL; bool can_push = false; ObSEArray right_filters; - ObSEArray new_right_filters; if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(semi_info) || OB_ISNULL(ctx->expr_factory_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret), K(stmt), K(ctx), K(semi_info), K(ctx->expr_factory_)); @@ -2524,37 +2523,32 @@ int ObTransformPredicateMoveAround::pushdown_semi_info_right_filter(ObDMLStmt *s LOG_WARN("failed to extract table exprs", K(ret)); } else if (right_filters.empty()) { // do nothing + } else if (OB_FAIL(ObOptimizerUtil::remove_item(semi_info->semi_conditions_, right_filters))) { + LOG_WARN("failed to remove right filters", K(ret)); } else if (OB_FAIL(ObTransformUtils::can_push_down_filter_to_table(*right_table, can_push))) { LOG_WARN("failed to check can push down", K(ret), K(*right_table)); } else if (can_push) { - // do nothing - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx, right_table, right_table))) { - LOG_WARN("failed to create view with table", K(ret)); - } else if (FALSE_IT(right_filters.reuse())) { - // do nothing - } else if (OB_FAIL(extract_semi_right_table_filter(stmt, semi_info, right_filters))) { - LOG_WARN("failed to extract table exprs", K(ret)); - } - - if (OB_SUCC(ret) && !right_filters.empty()) { - if (OB_ISNULL(right_table) || OB_UNLIKELY(!right_table->is_generated_table()) - || OB_ISNULL(child_stmt = right_table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected right table", K(ret), K(right_table), K(child_stmt)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(semi_info->semi_conditions_, - right_filters))) { - LOG_WARN("failed to remove item", K(ret)); - } else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx->expr_factory_, - *stmt, - *right_table, - right_filters, - new_right_filters))) { + ObArray new_right_filters; + if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_, + *stmt, + *right_table, + right_filters, + new_right_filters))) { LOG_WARN("failed to move expr into view", K(ret)); - } else if (OB_FAIL(child_stmt->add_condition_exprs(new_right_filters))) { - LOG_WARN("failed to add condotion exprs", K(ret)); - } else if (OB_FAIL(child_stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); + } else if (OB_FAIL(right_table->ref_query_->add_condition_exprs(new_right_filters))) { + LOG_WARN("failed to add condition exprs", K(ret)); } + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_table, + right_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_table, + right_table, + &right_filters))) { + LOG_WARN("failed to create view with table", K(ret)); } return ret; } diff --git a/src/sql/rewrite/ob_transform_semi_to_inner.cpp b/src/sql/rewrite/ob_transform_semi_to_inner.cpp index c242646bc..b34bc1a4d 100644 --- a/src/sql/rewrite/ob_transform_semi_to_inner.cpp +++ b/src/sql/rewrite/ob_transform_semi_to_inner.cpp @@ -293,9 +293,11 @@ int ObTransformSemiToInner::do_transform_by_rewrite_form(ObDMLStmt* stmt, trans_param))) { LOG_WARN("failed to do transform (INNER)", K(ret)); // Just in case different parameters hit same plan, we need add const param constraint - } else if (trans_param.need_add_limit_constraint_ && OB_FAIL(ObTransformUtils::add_const_param_constraints( - stmt->get_limit_expr(), ctx_))) { - LOG_WARN("failed to add const param constraints", K(ret)); + } else if (!trans_param.need_add_limit_constraint_) { + // do nothing + } else if (OB_FAIL(ObTransformUtils::add_const_param_constraints( + stmt->get_limit_expr(), ctx_))) { + LOG_WARN("failed to add const param constriants", K(ret)); } } else if (trans_param.use_aggr_inner()) { if (OB_FAIL(do_transform_with_aggr(*stmt, semi_info, ctx, trans_param))) { @@ -1098,13 +1100,11 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt, TransformParam &trans_param) { int ret = OB_SUCCESS; + TableItem *right_table = NULL; TableItem *view_table = NULL; ObSelectStmt *ref_query = NULL; - bool is_all_equal_cond = false; - bool is_multi_join_cond = false; bool need_add_distinct = trans_param.need_add_distinct_; bool right_table_need_add_limit = trans_param.right_table_need_add_limit_; - ObSEArray view_filter_conds; ObSEArray new_condition_exprs; if (OB_ISNULL(ctx_) || OB_ISNULL(semi_info)) { ret = OB_ERR_UNEXPECTED; @@ -1121,18 +1121,29 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt, } else if (OB_FAIL(ObTransformUtils::add_limit_to_semi_right_table(&stmt, ctx_, semi_info))) { LOG_WARN("failed to add limit to semi right table", K(ret), K(stmt)); } - } else if (OB_FAIL(view_filter_conds.assign(trans_param.filter_conds_on_right_))) { - LOG_WARN("failed to assign view filter conditions", K(ret)); } else if (OB_FAIL(new_condition_exprs.assign(semi_info->semi_conditions_))) { LOG_WARN("failed to assign semi join conditions", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(new_condition_exprs, view_filter_conds))) { + } else if (OB_FAIL(ObOptimizerUtil::remove_item(new_condition_exprs, + trans_param.filter_conds_on_right_))) { LOG_WARN("failed to remove non-correlated filter conditions on right table", K(ret)); } else if (OB_FAIL(append(stmt.get_condition_exprs(), new_condition_exprs))) { LOG_WARN("failed to append semi conditions", K(ret)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_from_items(&stmt, ctx_, - stmt.get_table_item_by_id(semi_info->right_table_id_), - trans_param.equal_right_exprs_, view_filter_conds, view_table))) { - LOG_WARN("failed to merge from items as inner join", K(ret)); + } else if (OB_ISNULL(right_table = stmt.get_table_item_by_id(semi_info->right_table_id_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("right table item is null", K(ret), K(right_table)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + &stmt, + view_table, + right_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + &stmt, + view_table, + right_table, + &trans_param.filter_conds_on_right_, + NULL, + &trans_param.equal_right_exprs_))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(view_table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null table item", K(ret)); @@ -1144,8 +1155,6 @@ int ObTransformSemiToInner::do_transform(ObDMLStmt &stmt, LOG_WARN("unexpect null ref query", K(ret)); } else if (OB_FAIL(add_distinct(*ref_query, trans_param.equal_left_exprs_, trans_param.equal_right_exprs_))) { LOG_WARN("failed to add distinct exprs", K(ret)); - } else if (OB_FAIL(ref_query->add_from_item(semi_info->right_table_id_, false))) { - LOG_WARN("failed to add from items", K(ret)); } else if (OB_FAIL(stmt.add_from_item(view_table->table_id_, false))) { LOG_WARN("failed to add from items", K(ret)); } else if (OB_FAIL(find_basic_table(ref_query, ctx.table_id_))) { @@ -1193,6 +1202,7 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt, TransformParam& trans_param) { int ret = OB_SUCCESS; + TableItem *right_table = NULL; TableItem* view_table = NULL; ObSelectStmt* ref_query = NULL; ObSEArray new_condition_exprs; @@ -1223,13 +1233,22 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt, LOG_WARN("failed to remove semi info", K(ret)); } else if (OB_FAIL(append(stmt.get_condition_exprs(), new_condition_exprs))) { LOG_WARN("failed to append semi conditions", K(ret)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_from_items(&stmt, - ctx_, - stmt.get_table_item_by_id(semi_info->right_table_id_), - view_select_exprs, - view_filter_conds, - view_table))) { - LOG_WARN("failed to merge from items as inner join", K(ret)); + } else if (OB_ISNULL(right_table = stmt.get_table_item_by_id(semi_info->right_table_id_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("right table item is null", K(ret), K(right_table)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + &stmt, + view_table, + right_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + &stmt, + view_table, + right_table, + &view_filter_conds, + NULL, + &view_select_exprs))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(view_table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null table item", K(ret)); @@ -1239,12 +1258,8 @@ int ObTransformSemiToInner::do_transform_with_aggr(ObDMLStmt& stmt, } else if (OB_ISNULL(ref_query = view_table->ref_query_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null ref query", K(ret)); - } else if (OB_FAIL(ref_query->add_from_item(semi_info->right_table_id_, false))) { - LOG_WARN("failed to add from items", K(ret)); } else if (OB_FAIL(stmt.add_from_item(view_table->table_id_, false))) { LOG_WARN("failed to add from items", K(ret)); - } else if (OB_FAIL(ref_query->add_agg_item(*static_cast(view_aggr_expr)))) { - LOG_WARN("failed to add aggr item in view", K(ret)); } else if (need_add_group_by) { if (OB_FAIL(add_group_by_with_cast(*ref_query, trans_param.equal_left_exprs_, trans_param.equal_right_exprs_))) { LOG_WARN("failed to add group by expr in view", K(ret)); diff --git a/src/sql/rewrite/ob_transform_simplify_subquery.cpp b/src/sql/rewrite/ob_transform_simplify_subquery.cpp index ea279d262..929aca1d4 100644 --- a/src/sql/rewrite/ob_transform_simplify_subquery.cpp +++ b/src/sql/rewrite/ob_transform_simplify_subquery.cpp @@ -588,6 +588,7 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt, } else { ObSEArray push_down_conds; TableItem *view_item = NULL; + TableItem *right_table = join_table->right_table_; if (OB_FAIL(get_push_down_conditions(stmt, join_table, join_table->get_join_conditions(), @@ -595,12 +596,19 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt, LOG_WARN("failed to get_push_down_conditions", K(ret), K(join_table)); } else if (push_down_conds.empty()) { /*do nothing*/ - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(stmt, ctx_, - join_table->right_table_, - view_item))) { - LOG_WARN("failed to create view with table", K(ret)); - } else if (OB_FAIL(push_down_on_condition(stmt, join_table, push_down_conds))) { - LOG_WARN("failed to push down on condition", K(ret)); + } else if (ObOptimizerUtil::remove_item(join_table->get_join_conditions(), push_down_conds)) { + LOG_WARN("failed to remove item", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + stmt, + view_item, + right_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + stmt, + view_item, + right_table, + &push_down_conds))) { + LOG_WARN("failed to create inline view", K(ret)); } else { trans_happened = true; } @@ -608,40 +616,6 @@ int ObTransformSimplifySubquery::try_push_down_outer_join_conds(ObDMLStmt *stmt, return ret; } -//将left join 部分连接条件conds 下推到 right generate table -//right table 为仅含 select 输出的 generate table -int ObTransformSimplifySubquery::push_down_on_condition(ObDMLStmt *stmt, - JoinedTable *join_table, - ObIArray &conds) { - int ret = OB_SUCCESS; - ObSEArray new_conds; - ObSelectStmt *child_stmt = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(ctx_) || OB_ISNULL(join_table) || - OB_ISNULL(ctx_->expr_factory_) || OB_ISNULL(ctx_->allocator_) || - OB_ISNULL(join_table->right_table_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected NULL", K(ret)); - } else if (!join_table->is_left_join() || !join_table->right_table_->is_generated_table() - || OB_ISNULL(child_stmt = join_table->right_table_->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected join table", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(join_table->get_join_conditions(), conds))) { - LOG_WARN("failed to remove item", K(ret)); - } else if (OB_FAIL(ObTransformUtils::move_expr_into_view(*ctx_->expr_factory_, - *stmt, - *join_table->right_table_, - conds, - new_conds))) { - LOG_WARN("failed to move expr into view", K(ret)); - } else if (OB_FAIL(child_stmt->add_condition_exprs(new_conds))) { - LOG_WARN("failed to add new conditions exprs", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } - return ret; -} - - int ObTransformSimplifySubquery::add_limit_for_exists_subquery(ObDMLStmt *stmt, bool &trans_happened) { diff --git a/src/sql/rewrite/ob_transform_simplify_subquery.h b/src/sql/rewrite/ob_transform_simplify_subquery.h index b87acc301..25691a54c 100644 --- a/src/sql/rewrite/ob_transform_simplify_subquery.h +++ b/src/sql/rewrite/ob_transform_simplify_subquery.h @@ -51,9 +51,6 @@ private: int try_push_down_outer_join_conds(ObDMLStmt *stmt, JoinedTable *join_table, bool &trans_happened); - int push_down_on_condition(ObDMLStmt *stmt, - JoinedTable *join_table, - ObIArray &conds); ObItemType get_opposite_expr_type(ObItemType item_type); diff --git a/src/sql/rewrite/ob_transform_temp_table.cpp b/src/sql/rewrite/ob_transform_temp_table.cpp index 7cee34e07..163287723 100644 --- a/src/sql/rewrite/ob_transform_temp_table.cpp +++ b/src/sql/rewrite/ob_transform_temp_table.cpp @@ -976,9 +976,7 @@ int ObTransformTempTable::inner_create_temp_table(ObSelectStmt *parent_stmt, ObStmtMapInfo& common_map_info) { int ret = OB_SUCCESS; - ObSelectStmt *child_stmt = NULL; - ObSEArray pushdown_exprs; - if (OB_ISNULL(parent_stmt)) { + if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null stmt", K(ret)); } else if (parent_stmt->is_set_stmt()) { @@ -988,46 +986,81 @@ int ObTransformTempTable::inner_create_temp_table(ObSelectStmt *parent_stmt, LOG_TRACE("succeed to create temp table", KPC(parent_stmt)); } } else { - if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, - parent_stmt, - child_stmt, - false, - false))) { - LOG_WARN("failed to create simple view", K(ret)); - //下压condition - } else if (parent_stmt->get_condition_size() > 0 && + TableItem *view_table = NULL; + ObSEArray from_tables; + ObSEArray semi_infos; + ObSEArray pushdown_select; + ObSEArray pushdown_where; + ObSEArray pushdown_groupby; + ObSEArray pushdown_rollup; + ObSEArray pushdown_having; + + if (parent_stmt->get_condition_size() > 0 && OB_FAIL(pushdown_conditions(parent_stmt, map_info.cond_map_, common_map_info.cond_map_, - pushdown_exprs))) { + pushdown_where))) { LOG_WARN("failed to pushdown conditions", K(ret)); } else if (!common_map_info.is_cond_equal_ || !common_map_info.is_group_equal_) { //do nothing //下压group by } else if (parent_stmt->has_group_by() && - OB_FAIL(pushdown_group_by(parent_stmt, pushdown_exprs))) { + OB_FAIL(ObTransformUtils::pushdown_group_by(parent_stmt, + pushdown_groupby, + pushdown_rollup, + pushdown_select))) { LOG_WARN("failed to pushdown group by", K(ret)); //下压having } else if (parent_stmt->get_having_expr_size() > 0 && OB_FAIL(pushdown_having_conditions(parent_stmt, map_info.having_map_, common_map_info.having_map_, - pushdown_exprs))) { + pushdown_having))) { LOG_WARN("failed to pushdown having conditions", K(ret)); - } else if (is_mysql_mode() && !pushdown_exprs.empty() && OB_FAIL(pushdown_shared_subqueries(parent_stmt, pushdown_exprs))) { - LOG_WARN("failed to extract shared expr", K(ret)); } - if (OB_SUCC(ret)) { - if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*parent_stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*child_stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(parent_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(child_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } + + ObSEArray origin_tables; + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ObTransformUtils::pushdown_pseudo_column_like_exprs(*parent_stmt, pushdown_select))) { + LOG_WARN("failed to pushdown pseudo column like exprs", K(ret)); + } else if (OB_FAIL(origin_tables.assign(parent_stmt->get_table_items()))) { + LOG_WARN("failed to get table items", K(ret)); + } else if (OB_FAIL(parent_stmt->get_from_tables(from_tables))) { + LOG_WARN("failed to get from tables", K(ret)); + } else if (OB_FAIL(semi_infos.assign(parent_stmt->get_semi_infos()))) { + LOG_WARN("failed to assign semi info", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + parent_stmt, + view_table, + from_tables, + &semi_infos))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + parent_stmt, + view_table, + from_tables, + &pushdown_where, + &semi_infos, + &pushdown_select, + &pushdown_groupby, + &pushdown_rollup, + &pushdown_having))) { + LOG_WARN("failed to create inline view", K(ret)); + } else if (OB_ISNULL(view_table->ref_query_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null view query", K(ret)); + + // recover the order of table items, + // the table_map in ObStmtMapInfo will be used in apply_temp_table + } else if (OB_FAIL(view_table->ref_query_->get_table_items().assign(origin_tables))) { + LOG_WARN("failed to adjust table map", K(ret)); + } else if (OB_FAIL(view_table->ref_query_->rebuild_tables_hash())) { + LOG_WARN("failed to rebuild table hash", K(ret)); + } else if (OB_FAIL(view_table->ref_query_->update_column_item_rel_id())) { + LOG_WARN("failed to update column item by id", K(ret)); + } else if (OB_FAIL(view_table->ref_query_->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); } } return ret; @@ -1107,35 +1140,13 @@ int ObTransformTempTable::create_spj(ObSelectStmt *parent_stmt) int ObTransformTempTable::pushdown_conditions(ObSelectStmt *parent_stmt, const ObIArray &cond_map, const ObIArray &common_cond_map, - ObIArray &pushdown_exprs) + ObIArray &pushdown_conds) { int ret = OB_SUCCESS; - ObSQLSessionInfo *session_info = NULL; - ObRawExprFactory *expr_factory = NULL; - ObSelectStmt *subquery = NULL; - TableItem *table = NULL; - int64_t table_id = OB_INVALID_ID; ObSEArray keep_conds; - ObSEArray pushdown_conds; - ObSEArray rename_conds; - if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) || - OB_ISNULL(session_info = ctx_->session_info_) || - OB_ISNULL(expr_factory = ctx_->expr_factory_)) { + if (OB_ISNULL(parent_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null param", K(ret)); - } else if (1 != parent_stmt->get_table_size()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret)); - } else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null table item", K(ret)); - } else if (!table->is_generated_table()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect generate table item", KPC(table), K(ret)); - } else if (OB_ISNULL(subquery = table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null ref query", K(ret)); - } else if (OB_FALSE_IT(table_id = table->table_id_)) { } else if (cond_map.count() != common_cond_map.count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect map info", K(cond_map), K(common_cond_map), K(ret)); @@ -1164,135 +1175,6 @@ int ObTransformTempTable::pushdown_conditions(ObSelectStmt *parent_stmt, if (OB_SUCC(ret) && !pushdown_conds.empty()) { if (OB_FAIL(parent_stmt->get_condition_exprs().assign(keep_conds))) { LOG_WARN("failed to assign exprs", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt, - *subquery, - table_id, - session_info, - *expr_factory, - pushdown_conds, - rename_conds))) { - LOG_WARN("failed to rename pushdown filter", K(ret)); - } else if (OB_FAIL(append(subquery->get_condition_exprs(), rename_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } - } - } - return ret; -} - -/** - * @brief pushdown_group_by - * 下压所有的group by expr、rollup expr到视图中 - * 同时需要把上层stmt的所有aggr expr下压到视图中计算 - */ -int ObTransformTempTable::pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray &pushdown_exprs) -{ - int ret = OB_SUCCESS; - ObSQLSessionInfo *session_info = NULL; - ObRawExprFactory *expr_factory = NULL; - ObSelectStmt *subquery = NULL; - TableItem *table = NULL; - int64_t table_id = OB_INVALID_ID; - ObSEArray pushdown_conds; - ObSEArray rename_conds; - ObSEArray aggr_items; - - if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) || - OB_ISNULL(session_info = ctx_->session_info_) || - OB_ISNULL(expr_factory = ctx_->expr_factory_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null param", K(ret)); - } else if (1 != parent_stmt->get_table_size()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret)); - } else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null table item", K(ret)); - } else if (!table->is_generated_table()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect generate table item", KPC(table), K(ret)); - } else if (OB_ISNULL(subquery = table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null ref query", K(ret)); - } else if (OB_FALSE_IT(table_id = table->table_id_)) { - //下推group by exprs - } else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_group_exprs()))) { - LOG_WARN("failed to append group by rollup exprs.", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt, - *subquery, - table_id, - session_info, - *expr_factory, - pushdown_conds, - rename_conds))) { - LOG_WARN("failed to rename pushdown filter", K(ret)); - } else if (OB_FAIL(append(subquery->get_group_exprs(), rename_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FALSE_IT(pushdown_conds.reuse()) || - OB_FALSE_IT(rename_conds.reuse()) || - OB_FALSE_IT(parent_stmt->get_group_exprs().reset())) { - //下推rollup exprs - } else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_rollup_exprs()))) { - LOG_WARN("failed to append group by rollup exprs.", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt, - *subquery, - table_id, - session_info, - *expr_factory, - pushdown_conds, - rename_conds))) { - LOG_WARN("failed to rename pushdown filter", K(ret)); - } else if (OB_FAIL(append(subquery->get_rollup_exprs(), rename_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FALSE_IT(pushdown_conds.reuse()) || - OB_FALSE_IT(rename_conds.reuse()) || - OB_FALSE_IT(parent_stmt->get_rollup_exprs().reset())) { - //下推aggr items - } else if (OB_FAIL(append(pushdown_conds, parent_stmt->get_aggr_items()))) { - LOG_WARN("failed to append group by rollup exprs.", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt, - *subquery, - table_id, - session_info, - *expr_factory, - pushdown_conds, - rename_conds))) { - LOG_WARN("failed to rename pushdown filter", K(ret)); - } else { - //下推group by的同时需要把parent stmt的所有聚合函数下推到子查询,并输出 - parent_stmt->get_aggr_items().reset(); - for (int64_t i = 0; OB_SUCC(ret) && i < rename_conds.count(); ++i) { - ObRawExpr *expr = rename_conds.at(i); - if (OB_ISNULL(expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null expr", K(ret)); - } else if (!expr->is_aggr_expr()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect aggr expr", KPC(expr), K(ret)); - } else if (OB_FAIL(aggr_items.push_back(static_cast(expr)))) { - LOG_WARN("failed to push back aggr expr", K(ret)); - } - } - if (OB_SUCC(ret)) { - ObSEArray new_column_list; - if (OB_FAIL(append(subquery->get_aggr_items(), aggr_items))) { - LOG_WARN("failed to append aggr items", K(ret)); - } else if (OB_FAIL(ObTransformUtils::create_columns_for_view(ctx_, - *table, - parent_stmt, - rename_conds, - new_column_list))) { - LOG_WARN("failed to create columns for view", K(ret)); - } else if (OB_FAIL(parent_stmt->replace_relation_exprs(pushdown_conds, new_column_list))) { - LOG_WARN("failed to replace relation exprs", K(ret)); - } else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) { - LOG_WARN("failed to append exprs", K(ret)); } } } @@ -1306,36 +1188,14 @@ int ObTransformTempTable::pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray< int ObTransformTempTable::pushdown_having_conditions(ObSelectStmt *parent_stmt, const ObIArray &having_map, const ObIArray &common_having_map, - ObIArray &pushdown_exprs) + ObIArray &pushdown_conds) { int ret = OB_SUCCESS; - ObSQLSessionInfo *session_info = NULL; - ObRawExprFactory *expr_factory = NULL; - ObSelectStmt *subquery = NULL; - TableItem *table = NULL; - int64_t table_id = OB_INVALID_ID; ObSEArray keep_conds; - ObSEArray pushdown_conds; - ObSEArray rename_conds; - if (OB_ISNULL(parent_stmt) || OB_ISNULL(ctx_) || - OB_ISNULL(session_info = ctx_->session_info_) || - OB_ISNULL(expr_factory = ctx_->expr_factory_)) { + if (OB_ISNULL(parent_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null param", K(ret)); - } else if (1 != parent_stmt->get_table_size()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect one table item in stmt", KPC(parent_stmt), K(ret)); - } else if (OB_ISNULL(table = parent_stmt->get_table_item(0))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null table item", K(ret)); - } else if (!table->is_generated_table()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expect generate table item", KPC(table), K(ret)); - } else if (OB_ISNULL(subquery = table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null ref query", K(ret)); - } else if (OB_FALSE_IT(table_id = table->table_id_)) { } else if (having_map.count() != common_having_map.count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect map info", K(having_map), K(common_having_map), K(ret)); @@ -1365,20 +1225,6 @@ int ObTransformTempTable::pushdown_having_conditions(ObSelectStmt *parent_stmt, parent_stmt->get_having_exprs().reset(); if (OB_FAIL(append(parent_stmt->get_condition_exprs(), keep_conds))) { LOG_WARN("failed to assign exprs", K(ret)); - } else if (pushdown_conds.empty()) { - //do nothing - } else if (OB_FAIL(ObOptimizerUtil::rename_pushdown_filter(*parent_stmt, - *subquery, - table_id, - session_info, - *expr_factory, - pushdown_conds, - rename_conds))) { - LOG_WARN("failed to rename pushdown filter", K(ret)); - } else if (OB_FAIL(append(subquery->get_having_exprs(), rename_conds))) { - LOG_WARN("failed to append exprs", K(ret)); - } else if (OB_FAIL(append(pushdown_exprs, pushdown_conds))) { - LOG_WARN("failed to append exprs", K(ret)); } } } diff --git a/src/sql/rewrite/ob_transform_temp_table.h b/src/sql/rewrite/ob_transform_temp_table.h index 7a59aa9d3..6aea98877 100644 --- a/src/sql/rewrite/ob_transform_temp_table.h +++ b/src/sql/rewrite/ob_transform_temp_table.h @@ -184,8 +184,6 @@ public: const ObIArray &common_cond_map, ObIArray &pushdown_exprs); - int pushdown_group_by(ObSelectStmt *parent_stmt, ObIArray &pushdown_exprs); - int pushdown_having_conditions(ObSelectStmt *parent_stmt, const ObIArray &having_map, const ObIArray &common_having_map, diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index ac4ac2255..420acb48a 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -538,7 +538,7 @@ int ObTransformUtils::add_new_table_item(ObTransformerCtx *ctx, { int ret = OB_SUCCESS; TableItem *table_item = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(subquery) + if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(ctx->allocator_) || OB_ISNULL(stmt->get_query_ctx())) { ret = OB_ERR_UNEXPECTED; @@ -854,7 +854,7 @@ int ObTransformUtils::create_columns_for_view(ObTransformerCtx *ctx, } int ObTransformUtils::create_select_item(ObIAllocator &allocator, - ObIArray &select_exprs, + const ObIArray &select_exprs, ObSelectStmt *select_stmt) { int ret = OB_SUCCESS; @@ -6228,27 +6228,66 @@ int ObTransformUtils::create_set_stmt(ObTransformerCtx *ctx, return ret; } +int ObTransformUtils::pushdown_group_by(ObSelectStmt *parent_stmt, + ObIArray &pushdown_groupby, + ObIArray &pushdown_rollup, + ObIArray &pushdown_aggr) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(parent_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect null param", K(ret)); + } else if (OB_FAIL(pushdown_groupby.assign(parent_stmt->get_group_exprs()))) { + LOG_WARN("failed to assign group by exprs.", K(ret)); + } else if (OB_FAIL(pushdown_rollup.assign(parent_stmt->get_rollup_exprs()))) { + LOG_WARN("failed to assign rollup exprs.", K(ret)); + } + + for (int64_t i = 0; OB_SUCC(ret) && i < parent_stmt->get_aggr_item_size(); i++) { + if (OB_FAIL(add_var_to_array_no_dup(pushdown_aggr, + static_cast(parent_stmt->get_aggr_items().at(i))))) { + LOG_WARN("failed to add var", K(ret)); + } + } + + if (OB_SUCC(ret)) { + parent_stmt->get_group_exprs().reset(); + parent_stmt->get_rollup_exprs().reset(); + parent_stmt->get_aggr_items().reset(); + } + return ret; +} + /** - * @brief ObTransformOrExpansion::create_simple_view - * 将 stmt 分解成两层: + * @brief ObTransformUtils::create_simple_view + * 在 push_group_by 为 false 时,将 stmt 分解成两层: * 内层做 table scan, join 和 filter,构成一次 SPJ 查询 * 外层做 distinct, group-by, order-by, window function 等非 SPJ 的操作 * * push_subquery: 是否在视图中提前计算好一些子查询的值,把子查询留在 view 中可以做 JA 改写之类的。 * 对于 or expansion,最好不要下降子查询,否则在union分支中,同一个子查询就会被计算多次 + * + * push_group_by:将聚合函数也移入 view 中计算 */ int ObTransformUtils::create_simple_view(ObTransformerCtx *ctx, ObDMLStmt *stmt, ObSelectStmt *&view_stmt, bool push_subquery, - bool push_conditions) + bool push_conditions, + bool push_group_by, + ObAliasRefRawExpr *alias_expr) { int ret = OB_SUCCESS; ObStmtFactory *stmt_factory = NULL; ObRawExprFactory *expr_factory = NULL; ObSQLSessionInfo *session_info = NULL; ObSEArray select_list; - ObSEArray scalar_query_refs; + ObSEArray norm_conds; + ObSEArray from_tables; + ObSEArray semi_infos; + ObSEArray group_exprs; + ObSEArray rollup_exprs; + TableItem *view_table_item = NULL; if (OB_ISNULL(ctx) || OB_ISNULL(stmt) || OB_ISNULL(session_info = ctx->session_info_) || OB_ISNULL(stmt_factory = ctx->stmt_factory_) || @@ -6262,153 +6301,99 @@ int ObTransformUtils::create_simple_view(ObTransformerCtx *ctx, LOG_WARN("can not create spj stmt", K(ret), K(stmt->is_set_stmt()), K(stmt->is_hierarchical_query()), K(stmt->is_sel_del_upd())); - } else if (OB_FAIL(stmt_factory->create_stmt(view_stmt))) { - LOG_WARN("failed to create stmt", K(ret)); - } else if (OB_FAIL(view_stmt->ObDMLStmt::assign(*stmt))) { - LOG_WARN("failed to assign stmt", K(ret)); } else if (OB_FAIL(ctx->add_src_hash_val(ObTransformerCtx::SRC_STR_CREATE_SIMPLE_VIEW))) { LOG_WARN("failed to add src hash val", K(ret)); - } else { - view_stmt->set_stmt_type(stmt::T_SELECT); - // 1. handle table, columns, from - // dml_stmt: from table, semi table, joined table - stmt->reset_table_items(); - stmt->get_joined_tables().reuse(); - stmt->get_semi_infos().reuse(); - stmt->get_column_items().reuse(); - stmt->clear_from_items(); - stmt->get_part_exprs().reset(); - stmt->get_check_constraint_items().reset(); - view_stmt->get_condition_exprs().reset(); - if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild tables hash", K(ret)); - } } - // 2. handle where conditions + + // handle where conditions if (OB_SUCC(ret) && push_conditions) { - ObSEArray norm_conds; ObSEArray rownum_conds; if (OB_FAIL(classify_rownum_conds(*stmt, norm_conds, rownum_conds))) { LOG_WARN("failed to classify rownum conditions", K(ret)); - } else if (OB_FAIL(stmt->get_condition_exprs().assign(rownum_conds))) { - LOG_WARN("failed to assign rownum conditions", K(ret)); - } else if (OB_FAIL(view_stmt->get_condition_exprs().assign(norm_conds))) { - LOG_WARN("failed to assign normal conditions", K(ret)); } } - // 3. handle clauses processed by the upper_stmt - if (OB_SUCC(ret)) { - // consider following parts: - // select: group-by, rollup, select subquery, window function, distinct, sequence, - // order by, limit, select into - // update: order-by, limit, sequence, assignments, returning - // delete: order-by, limit, returning - view_stmt->get_order_items().reset(); - view_stmt->set_limit_offset(NULL, NULL); - view_stmt->set_limit_percent_expr(NULL); - view_stmt->set_fetch_with_ties(false); - view_stmt->set_has_fetch(false); - view_stmt->clear_sequence(); - view_stmt->set_select_into(NULL); - view_stmt->get_pseudo_column_like_exprs().reset(); - } - // 4. let the view_stmt process some subqueries + + // let the view_stmt process some subqueries if (OB_SUCC(ret) && push_subquery) { ObSEArray post_join_exprs; ObSEArray non_scalar_query_refs; if (OB_FAIL(get_post_join_exprs(stmt, post_join_exprs))) { LOG_WARN("failed to get additional push down exprs", K(ret)); } else if (OB_FAIL(classify_scalar_query_ref(post_join_exprs, - scalar_query_refs, + select_list, non_scalar_query_refs))) { LOG_WARN("failed to classify scalar query ref", K(ret)); } } - // 5. finish creating the child stmts - if (OB_SUCC(ret)) { - // create select list - ObSEArray columns; - ObSqlBitSet<> from_tables; - ObSEArray shared_exprs; - if (OB_FAIL(view_stmt->get_from_tables(from_tables))) { - LOG_WARN("failed to get from tables", K(ret)); - } else if (OB_FAIL(view_stmt->get_column_exprs(columns))) { - LOG_WARN("failed to get column exprs", K(ret)); - } else if (OB_FAIL(pushdown_pseudo_column_like_exprs(*stmt, *view_stmt, select_list))) { - LOG_WARN("failed to pushdown pseudo column like exprs", K(ret)); - } else if (OB_FAIL(extract_table_exprs(*view_stmt, columns, from_tables, select_list))) { - LOG_WARN("failed to extract table exprs", K(ret)); - } else if (OB_FAIL(append(select_list, scalar_query_refs))) { - LOG_WARN("failed to append scalar query refs", K(ret)); - } else if (OB_FAIL(extract_shared_expr(stmt, view_stmt, shared_exprs))) { - LOG_WARN("failed to extract shared expr", K(ret)); - } else if (OB_FAIL(append_array_no_dup(select_list, shared_exprs))) { - LOG_WARN("failed to append shared exprs", K(ret)); - } else if (OB_FAIL(create_select_item(*(ctx->allocator_), select_list, view_stmt))) { - LOG_WARN("failed to create select items", K(ret)); - } else if (OB_FAIL(view_stmt->formalize_stmt_expr_reference())) { - LOG_WARN("failed to formalize stmt expr reference", K(ret)); - } else if (OB_FAIL(view_stmt->get_stmt_hint().set_simple_view_hint())) { - LOG_WARN("failed to set simple view hint", K(ret)); - } else if (OB_FAIL(view_stmt->adjust_statement_id(ctx->allocator_, - ctx->src_qb_name_, - ctx->src_hash_val_))) { - LOG_WARN("failed to adjust statement id", K(ret)); - } - } - if (OB_SUCC(ret) && view_stmt->get_select_items().empty()) { - if (OB_FAIL(create_dummy_select_item(*view_stmt, ctx))) { - LOG_WARN("failed to create dummy select item", K(ret)); - } else if (OB_FAIL(select_list.push_back(view_stmt->get_select_item(0).expr_))) { - LOG_WARN("failed to push back dummy select expr", K(ret)); - } - } - // 6. link upper stmt and view stmt - TableItem *view_table_item = NULL; - ObSEArray new_cols; - if (OB_SUCC(ret)) { - if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), - view_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to remove subqueries", K(ret)); - } else if (OB_FAIL(add_new_table_item(ctx, stmt, view_stmt, view_table_item))) { - LOG_WARN("failed to add new table item", K(ret)); - } else if (OB_ISNULL(view_table_item)) { + // push down all group by + if (OB_SUCC(ret) && push_group_by) { + ObSelectStmt *sel_stmt = static_cast(stmt); + if (OB_UNLIKELY(!stmt->is_select_stmt())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); - } else if (OB_FAIL(stmt->add_from_item(view_table_item->table_id_))) { - LOG_WARN("failed to add from item", K(ret)); - } else if (OB_FAIL(create_columns_for_view(ctx, *view_table_item, stmt, new_cols))) { - LOG_WARN("failed to create columns for view", K(ret)); - } else if (!stmt->is_delete_stmt() && !stmt->is_update_stmt()) { - // do nothing - } else if (OB_FAIL(adjust_updatable_view(*expr_factory, - static_cast(stmt), - *view_table_item))) { - LOG_WARN("failed to adjust updatable view", K(ret)); + LOG_WARN("unexpected stmt", K(ret), KPC(stmt)); + } else if (OB_FAIL(pushdown_group_by(sel_stmt, group_exprs, rollup_exprs, select_list))) { + LOG_WARN("failed to push down group exprs", K(ret)); + } else if (OB_FAIL(append(sel_stmt->get_condition_exprs(), sel_stmt->get_having_exprs()))) { + LOG_WARN("failed to push back having exprs into where", K(ret)); + } else if (FALSE_IT(sel_stmt->get_having_exprs().reset())) { + // never reach + } else if (OB_FAIL(append_array_no_dup(select_list, group_exprs))) { + LOG_WARN("failed to push back having exprs into where", K(ret)); } } - if (OB_SUCC(ret)) { - if (view_stmt->has_for_update() && lib::is_oracle_mode()) { - view_table_item->for_update_ = true; + // push down vector assign + if (OB_SUCC(ret) && NULL != alias_expr) { + ObQueryRefRawExpr *query_ref = NULL; + ObUpdateStmt *upd_stmt = static_cast(stmt); + ObSEArray alias_exprs; + if (OB_UNLIKELY(!stmt->is_update_stmt()) || + OB_ISNULL(query_ref = static_cast( + alias_expr->get_param_expr(0))) || + OB_ISNULL(query_ref->get_ref_stmt())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected stmt", K(ret), KPC(stmt)); + } else if (OB_FAIL(upd_stmt->get_vector_assign_values(query_ref, alias_exprs))) { + LOG_WARN("failed to get vector assign values", K(ret)); + } else if (OB_FAIL(append_array_no_dup(select_list, alias_exprs))) { + LOG_WARN("failed to append array", K(ret)); } } - // 7. do replace and formalize - if (OB_SUCC(ret)) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(pushdown_pseudo_column_like_exprs(*stmt, select_list))) { + LOG_WARN("failed to pushdown pseudo column like exprs", K(ret)); + } else if (OB_FAIL(stmt->get_from_tables(from_tables))) { + LOG_WARN("failed to get from tables", K(ret)); + } else if (OB_FAIL(semi_infos.assign(stmt->get_semi_infos()))) { + LOG_WARN("failed to assign semi info", K(ret)); + } else if (ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), norm_conds)) { + LOG_WARN("failed to remove item", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx, + stmt, + view_table_item, + from_tables, + &semi_infos))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(create_inline_view(ctx, + stmt, + view_table_item, + from_tables, + &norm_conds, + &semi_infos, + &select_list, + &group_exprs, + &rollup_exprs))) { + LOG_WARN("failed to create inline view", K(ret)); + } else { ctx->src_hash_val_.pop_back(); - if (OB_FAIL(stmt->replace_relation_exprs(select_list, new_cols))) { - LOG_WARN("failed to replace inner stmt expr", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(session_info))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } + view_stmt = view_table_item->ref_query_; } return ret; } int ObTransformUtils::pushdown_pseudo_column_like_exprs(ObDMLStmt &upper_stmt, - ObSelectStmt &view_stmt, ObIArray &pushdown_exprs) { int ret = OB_SUCCESS; @@ -6416,17 +6401,18 @@ int ObTransformUtils::pushdown_pseudo_column_like_exprs(ObDMLStmt &upper_stmt, ObSEArray new_upper_pseudo_columns; ObIArray &upper_pseudo_columns = upper_stmt.get_pseudo_column_like_exprs(); ObRawExpr *expr = NULL; - bool need_pushdown = false; for (int64_t i = 0; OB_SUCC(ret) && i < upper_pseudo_columns.count(); ++i) { if (OB_ISNULL(expr = upper_pseudo_columns.at(i))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(ret)); - } else if (OB_FAIL(check_need_pushdown_pseudo_column(view_stmt, *expr, need_pushdown))) { - LOG_WARN("failed to check need pushdown pseudo column like exprs", K(ret)); - } else if (need_pushdown && OB_FAIL(new_pushdown_exprs.push_back(expr))) { - LOG_WARN("failed to push back pushdown expr", K(ret)); - } else if (!need_pushdown && OB_FAIL(new_upper_pseudo_columns.push_back(expr))) { - LOG_WARN("failed to push back upper expr", K(ret)); + } else if (T_ORA_ROWSCN == expr->get_expr_type()) { + if (OB_FAIL(new_pushdown_exprs.push_back(expr))) { + LOG_WARN("failed to push back pushdown expr", K(ret)); + } + } else { + if (OB_FAIL(new_upper_pseudo_columns.push_back(expr))) { + LOG_WARN("failed to push back upper expr", K(ret)); + } } } @@ -6435,29 +6421,6 @@ int ObTransformUtils::pushdown_pseudo_column_like_exprs(ObDMLStmt &upper_stmt, LOG_WARN("failed to assign pseudo column like exprs", K(ret)); } else if (OB_FAIL(append_array_no_dup(pushdown_exprs, new_pushdown_exprs))) { LOG_WARN("failed to append pushdown exprs", K(ret)); - } else if (OB_FAIL(append_array_no_dup(view_stmt.get_pseudo_column_like_exprs(), - new_pushdown_exprs))) { - LOG_WARN("failed to append pseudo column like exprs", K(ret)); - } - return ret; -} - -int ObTransformUtils::check_need_pushdown_pseudo_column(ObDMLStmt &view_stmt, - ObRawExpr &expr, - bool &need_pushdown) -{ - int ret = OB_SUCCESS; - need_pushdown = false; - switch (expr.get_expr_type()) { - case T_ORA_ROWSCN: { - // before call this function, if table has removed, pushdown this ora_rowscn - if (NULL != view_stmt.get_table_item_by_id(static_cast(expr).get_table_id())) { - need_pushdown = true; - } - break; - } - default: /* other type pseudo column like expr do not pushdown */ - break; } return ret; } @@ -6527,107 +6490,6 @@ int ObTransformUtils::adjust_updatable_view(ObRawExprFactory &expr_factory, return ret; } -/** - * @brief ObTransformUtils::push_down_groupby - * SELECT ... FROM (SELECT ... FROM ... WHERE ...) GROUP BY ... HAVING ... - * SELECT ... FROM (SELECT ..., aggs, FROM ... WHERE ... GROUP BY ...) WHERE ... - * @return - */ -int ObTransformUtils::push_down_groupby(ObTransformerCtx *ctx, - ObSelectStmt *stmt, - TableItem *view_table) -{ - int ret = OB_SUCCESS; - ObSelectStmt *view_stmt = NULL; - ObSEArray view_select_list; - ObSEArray view_column_list; - ObSEArray view_aggr_list; - ObSEArray view_aggr_cols; - if (OB_ISNULL(ctx) || OB_ISNULL(view_table) || - OB_ISNULL(view_stmt = view_table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("view stmt is invalid", K(ret), K(view_table), K(view_stmt), K(ctx)); - } else if (OB_FAIL(view_stmt->get_group_exprs().assign(stmt->get_group_exprs()))) { - LOG_WARN("failed to push down group exprs", K(ret)); - } else if (OB_FAIL(view_stmt->get_aggr_items().assign(stmt->get_aggr_items()))) { - LOG_WARN("failed to push down aggregation exprs", K(ret)); - } else if (OB_FAIL(append(stmt->get_condition_exprs(), stmt->get_having_exprs()))) { - LOG_WARN("failed to push back having exprs into where", K(ret)); - } else if (OB_FAIL(stmt->get_view_output(*view_table, view_select_list, view_column_list))) { - LOG_WARN("failed to get view output", K(ret)); - } else if (OB_FAIL(replace_exprs(view_column_list, - view_select_list, - view_stmt->get_group_exprs()))) { - LOG_WARN("failed to replace group exprs", K(ret)); - } else if (OB_FAIL(replace_exprs(view_column_list, - view_select_list, - view_stmt->get_aggr_items()))) { - LOG_WARN("failed to replace aggregation exprs", K(ret)); - } else if (OB_FAIL(append(view_aggr_list, view_stmt->get_group_exprs()))) { - LOG_WARN("failed to append aggr list", K(ret)); - } else if (OB_FAIL(append(view_aggr_list, view_stmt->get_aggr_items()))) { - LOG_WARN("failed to append aggr list", K(ret)); - } else if (OB_FAIL(create_columns_for_view(ctx, - *view_table, - stmt, - view_aggr_list, - view_aggr_cols))) { - LOG_WARN("failed to create columns for view", K(ret)); - } else { - stmt->get_group_exprs().reset(); - stmt->get_aggr_items().reset(); - stmt->get_having_exprs().reset(); - } - if (OB_SUCC(ret)) { - if (OB_FAIL(stmt->replace_relation_exprs(view_aggr_list, view_aggr_cols))) { - LOG_WARN("failed to replace relation exprs", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } - } - return ret; -} - -int ObTransformUtils::push_down_vector_assign(ObTransformerCtx *ctx, - ObUpdateStmt *stmt, - ObAliasRefRawExpr *root_expr, - TableItem *view_table) -{ - int ret = OB_SUCCESS; - ObSEArray alias_exprs; - ObSEArray column_exprs; - ObSEArray query_refs; - ObSEArray new_query_refs; - ObQueryRefRawExpr *query_ref = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(root_expr) || OB_ISNULL(view_table) || - OB_ISNULL(view_table->ref_query_) || - OB_ISNULL(root_expr->get_param_expr(0)) || - OB_UNLIKELY(!root_expr->is_ref_query_output()) || - OB_ISNULL(query_ref = static_cast( - root_expr->get_param_expr(0))) || - OB_ISNULL(query_ref->get_ref_stmt()) || - OB_ISNULL(ctx) || OB_ISNULL(ctx->expr_factory_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("params are invalid", K(ret), K(stmt), K(root_expr), K(view_table), K(ctx)); - } else if (OB_FAIL(stmt->get_vector_assign_values(query_ref, alias_exprs))) { - LOG_WARN("failed to get vector assign values", K(ret)); - } else if (OB_FAIL(query_refs.push_back(query_ref))) { - LOG_WARN("failed to push back query_ref", K(ret)); - } else if (OB_FAIL(move_expr_into_view(*ctx->expr_factory_, - *stmt, - *view_table, - query_refs, - new_query_refs))) { - LOG_WARN("failed to move expr into view", K(ret)); - } else if (OB_FAIL(create_columns_for_view( - ctx, *view_table, stmt, alias_exprs, column_exprs))) { - LOG_WARN("failed to create columns for view", K(ret)); - } else if (OB_FAIL(stmt->replace_relation_exprs(alias_exprs, column_exprs))) { - LOG_WARN("failed to replace relation exprs", K(ret)); - } - return ret; -} - int ObTransformUtils::create_stmt_with_generated_table(ObTransformerCtx *ctx, ObSelectStmt *child_stmt, ObSelectStmt *&parent_stmt) @@ -6828,101 +6690,6 @@ int ObTransformUtils::create_stmt_with_basic_table(ObTransformerCtx *ctx, return ret; } -//由 table 生成 generate table view_table 并替换 stmt 中 table -int ObTransformUtils::create_view_with_table(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - TableItem *table, - TableItem *&view_table) -{ - int ret = OB_SUCCESS; - view_table = NULL; - TableItem *new_table = NULL; - ObSEArray old_column_exprs; - ObSEArray new_column_exprs; - ObSEArray old_table_ids; - ObSelectStmt *view_stmt = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(ctx->expr_factory_) || OB_ISNULL(table)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(stmt), K(ctx), K(table)); - } else if (table->is_generated_table()) { - if (OB_FAIL(create_stmt_with_generated_table(ctx, table->ref_query_, view_stmt))) { - LOG_WARN("failed to create stmt with generated table", K(ret)); - } else if (OB_FAIL(old_table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } - } else if (table->is_basic_table() || table->is_temp_table() - || table->is_link_table() - || table->is_function_table()) { - if (OB_FAIL(create_stmt_with_basic_table(ctx, stmt, table, view_stmt))) { - LOG_WARN("failed to create stmt with basic table", K(ret)); - } else if (OB_FAIL(old_table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } - } else if (table->is_joined_table()) { - JoinedTable *joined_table = static_cast(table); - if (OB_FAIL(copy_joined_table_expr(*ctx->expr_factory_, stmt, joined_table))) { - LOG_WARN("failed to copy joined table", K(ret)); - } else if (OB_FAIL(create_stmt_with_joined_table(ctx, stmt, joined_table, view_stmt))) { - LOG_WARN("failed to create stmt with joined table", K(ret)); - } else if (OB_FAIL(old_table_ids.assign(joined_table->single_table_ids_))) { - LOG_WARN("failed to assign table id", K(ret)); - } - } else { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected table type", K(ret), K(table->type_)); - } - - if (OB_SUCC(ret)) {// 添加 view_table 及 column expr - ObSEArray tmp_column_exprs; - ObSEArray tmp_select_exprs; - ObSEArray dummy_tables; - if (OB_FAIL(add_new_table_item(ctx, stmt, view_stmt, new_table))) { - LOG_WARN("failed to add table items", K(ret)); - } else if (OB_FAIL(create_columns_for_view(ctx, *new_table, stmt, tmp_column_exprs))) { - LOG_WARN("failed to create column items", K(ret)); - } else if (OB_FAIL(convert_column_expr_to_select_expr(tmp_column_exprs, *view_stmt, - tmp_select_exprs))) { - LOG_WARN("failed to convert column expr to select expr", K(ret)); - } else if (OB_FAIL(dummy_tables.push_back(table))) { - LOG_WARN("failed to push back table", K(ret)); - } else if (OB_FAIL(generate_col_exprs(stmt, - dummy_tables, - tmp_select_exprs, - tmp_column_exprs, - old_column_exprs, - new_column_exprs))) { - LOG_WARN("failed to generate target column exprs", K(ret)); - } else if (OB_FAIL(replace_table_in_stmt(stmt, new_table, table))) { - LOG_WARN("failed to replace table in stmt", K(ret)); - } else if (table->is_basic_table() - && OB_FAIL(stmt->remove_part_expr_items(table->table_id_))) { - LOG_WARN("failed to remove part expr items", K(ret)); - } else if (table->is_joined_table() && OB_FAIL(stmt->remove_part_expr_items( - static_cast(table)->single_table_ids_))) { - LOG_WARN("failed to remove part expr items", K(ret)); - } else if (OB_FAIL(view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if ((stmt->is_delete_stmt() || stmt->is_update_stmt() || stmt->is_merge_stmt()) && - OB_FAIL(adjust_updatable_view(*ctx->expr_factory_, static_cast(stmt), - *new_table, &old_table_ids))) { - LOG_WARN("failed to adjust updatable view", K(ret)); - } else if (OB_FAIL(stmt->replace_relation_exprs(old_column_exprs, new_column_exprs))) { - LOG_WARN("failed to replace inner stmt expr", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item rel id", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } else { - view_table = new_table; - } - } - return ret; -} - int ObTransformUtils::copy_joined_table_expr(ObRawExprFactory &expr_factory, ObDMLStmt *stmt, JoinedTable *table) @@ -6982,168 +6749,181 @@ int ObTransformUtils::inner_copy_joined_table_expr(ObRawExprCopier &copier, return ret; } -/** - * @brief - * create view with tables, the tables must be a not-empty subset of - * tables in FROM ITEMs - * the tables can be basic table / generated table / joined table - * @param stmt - * @param ctx - * @param tables - * @param view_table - * @return int - */ -int ObTransformUtils::create_view_with_tables(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - const ObIArray &tables, - const ObIArray &semi_infos, - TableItem *&view_table) +int ObTransformUtils::replace_with_empty_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + TableItem *from_table, + ObIArray *semi_infos/* = NULL*/) { int ret = OB_SUCCESS; - ObSelectStmt *simple_stmt = NULL; - ObSEArray single_table_ids; - ObSEArray table_ids; - TableItem *new_table = NULL; - bool add_from = false; - if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(ctx->expr_factory_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(stmt), K(ctx)); + ObSEArray tables; + if (OB_FAIL(tables.push_back(from_table))) { + LOG_WARN("failed to push back", K(ret)); } else { - for (int64_t i = 0; OB_SUCC(ret) && i < tables.count(); ++i) { - TableItem *table = tables.at(i); - if (OB_ISNULL(table)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null table", K(ret)); - } else if (OB_FAIL(table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } else if (table->is_joined_table()) { - if (OB_FAIL(append(single_table_ids, static_cast(table)->single_table_ids_))) { - LOG_WARN("failed to append single table ids", K(ret)); - } - } else if (OB_FAIL(single_table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } - } - for (int64_t i = 0; OB_SUCC(ret) && !add_from && i < stmt->get_from_item_size(); ++i) { - if (is_contain(table_ids, stmt->get_from_item(i).table_id_)) { - add_from = true; - } - } - - // 1. construct simple stmt - // 2. generate a view table for simple stmt, add the table into stmt - // 3. generate new column exprs - if (OB_FAIL(ret)) { - } else if (OB_FAIL(construct_simple_view(stmt, - tables, - semi_infos, - ctx, - simple_stmt))) { - LOG_WARN("failed to construct simple view with tables", K(ret)); - } else if (OB_FAIL(add_new_table_item(ctx, - stmt, - simple_stmt, - new_table))) { - LOG_WARN("failed to add new table item", K(ret)); - } else if (add_from && OB_FAIL(stmt->add_from_item(new_table->table_id_, false))) { - LOG_WARN("failed to add from item", K(ret)); - } - for (int64_t i = 0; OB_SUCC(ret) && i < tables.count(); ++i) { - TableItem *table = tables.at(i); - if (OB_ISNULL(table)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null table", K(ret)); - } else if (OB_FAIL(replace_table_in_semi_infos(stmt, new_table, table))) { - LOG_WARN("failed to replace semi infos from stmt", K(ret)); - } else if (OB_FAIL(replace_table_in_joined_tables(stmt, new_table, table))) { - LOG_WARN("failed to replace table in joined tables", K(ret)); - } - } - // 5. adjust structures - if (OB_FAIL(ret)) { - } else if (OB_FAIL(generate_select_list(ctx, stmt, new_table))) { - LOG_WARN("failed to generate select list", K(ret)); - } else if ((stmt->is_delete_stmt() || stmt->is_update_stmt() || stmt->is_merge_stmt()) && - OB_FAIL(adjust_updatable_view(*ctx->expr_factory_, static_cast(stmt), - *new_table, &single_table_ids))) { - LOG_WARN("failed to adjust updatable view", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild tables hash", K(ret)); - } else if (OB_FAIL(stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item rel ids", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } else { - view_table = new_table; - } + ret = replace_with_empty_view(ctx, stmt, view_table, tables, semi_infos); } return ret; } -int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, - const ObIArray &tables, - const ObIArray &semi_infos, - ObTransformerCtx *ctx, - ObSelectStmt *&simple_stmt) +int ObTransformUtils::replace_with_empty_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + ObIArray &from_tables, + ObIArray *semi_infos/* = NULL*/) { int ret = OB_SUCCESS; - ObArray basic_table_ids; - simple_stmt = NULL; - if (OB_ISNULL(stmt) || OB_ISNULL(ctx) || OB_ISNULL(ctx->stmt_factory_) - || OB_ISNULL(ctx->allocator_)) { + int add_to_from = false; + if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(stmt), K(ctx)); - } else if (OB_FAIL(ctx->stmt_factory_->create_stmt(simple_stmt))) { - LOG_WARN("failed to create stmt", K(ret)); - } else if (OB_ISNULL(simple_stmt)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(simple_stmt)); - } else if (OB_FAIL(simple_stmt->get_stmt_hint().set_simple_view_hint(&stmt->get_stmt_hint()))) { - LOG_WARN("failed to set simple view hint", K(ret)); - } else if (FALSE_IT(simple_stmt->set_query_ctx(stmt->get_query_ctx()))) { - // do nothing - } else if (OB_FAIL(simple_stmt->adjust_statement_id(ctx->allocator_, - ctx->src_qb_name_, - ctx->src_hash_val_))) { - LOG_WARN("failed to adjust statement id", K(ret)); + LOG_WARN("unexpected null", K(ret)); + } else if (OB_FAIL(add_new_table_item(ctx, + stmt, + NULL, + view_table))) { + LOG_WARN("failed to add new table item", K(ret)); + } else if (NULL != semi_infos && + OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_semi_infos(), + *semi_infos))) { + LOG_WARN("failed to remove semi infos from stmt", K(ret)); } - - // move from table - for (int64_t i = 0; OB_SUCC(ret) && i < tables.count(); ++i) { - bool is_joined_table = (NULL != tables.at(i) && tables.at(i)->is_joined_table()); - if (OB_ISNULL(tables.at(i))) { + for (int64_t i = 0; OB_SUCC(ret) && i < from_tables.count(); ++i) { + TableItem *table = from_tables.at(i); + bool remove_happened = false; + if (OB_ISNULL(table)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("table is null", K(ret), K(tables.at(i))); - } else if (OB_FAIL(stmt->remove_from_item(tables.at(i)->table_id_))) { + LOG_WARN("get unexpected null table", K(ret)); + } else if (OB_FAIL(replace_table_in_semi_infos(stmt, view_table, table))) { + LOG_WARN("failed to replace semi infos from stmt", K(ret)); + } else if (OB_FAIL(replace_table_in_joined_tables(stmt, view_table, table))) { + LOG_WARN("failed to replace table in joined tables", K(ret)); + } else if (OB_FAIL(stmt->remove_from_item(table->table_id_, &remove_happened))) { LOG_WARN("failed to remove from item", K(ret)); - } else if (OB_FAIL(simple_stmt->add_from_item(tables.at(i)->table_id_, is_joined_table))) { - LOG_WARN("failed to add from item", K(ret)); - } else if (!is_joined_table) { - ret = basic_table_ids.push_back(tables.at(i)->table_id_); - } else if (OB_FAIL(append(basic_table_ids, - static_cast(tables.at(i))->single_table_ids_))) { - LOG_WARN("failed to append basic table ids", K(ret)); - } else if (OB_FAIL(simple_stmt->add_joined_table(static_cast(tables.at(i))))) { - LOG_WARN("failed to add joined table", K(ret)); + } else { + add_to_from |= remove_happened; } } + if (OB_SUCC(ret) && add_to_from && + OB_FAIL(stmt->add_from_item(view_table->table_id_, false))) { + LOG_WARN("failed to add from item", K(ret)); + } + return ret; +} - // move semi filter info - for (int64_t i = 0; OB_SUCC(ret) && i < semi_infos.count(); ++i) { - SemiInfo *semi = NULL; - if (OB_ISNULL(semi = semi_infos.at(i))) { +int ObTransformUtils::create_inline_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + TableItem * push_table, + ObIArray *conditions/* = NULL*/, + ObIArray *semi_infos/* = NULL*/, + ObIArray *select_exprs/* = NULL*/, + ObIArray *group_exprs/* = NULL*/, + ObIArray *rollup_exprs/* = NULL*/, + ObIArray *having_exprs/* = NULL*/, + ObIArray *order_items/* = NULL*/) +{ + int ret = OB_SUCCESS; + ObSEArray tables; + if (OB_FAIL(tables.push_back(push_table))) { + LOG_WARN("failed to push back", K(ret)); + } else { + ret = create_inline_view(ctx, stmt, view_table, tables, conditions, + semi_infos, select_exprs, group_exprs, + rollup_exprs, having_exprs, order_items); + } + return ret; +} + + +int ObTransformUtils::create_inline_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + ObIArray &from_tables, + ObIArray *conditions/* = NULL*/, + ObIArray *semi_infos/* = NULL*/, + ObIArray *select_exprs/* = NULL*/, + ObIArray *group_exprs/* = NULL*/, + ObIArray *rollup_exprs/* = NULL*/, + ObIArray *having_exprs/* = NULL*/, + ObIArray *order_items/* = NULL*/) +{ + int ret = OB_SUCCESS; + ObSelectStmt *view_stmt = NULL; + ObSEArray basic_table_ids; + ObSEArray basic_table_ids_exclude_semi; + bool add_to_from = false; + + if (OB_ISNULL(stmt) || OB_ISNULL(ctx) + || OB_ISNULL(ctx->expr_factory_) + || OB_ISNULL(ctx->allocator_) + || OB_ISNULL(view_table) + || OB_UNLIKELY(!view_table->is_generated_table()) + || OB_UNLIKELY(NULL != view_table->ref_query_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected params", K(ret), K(stmt), K(ctx), K(view_table)); + } else if (OB_FAIL(ctx->stmt_factory_->create_stmt(view_stmt))) { + LOG_WARN("failed to create stmt", K(ret)); + } else if (OB_ISNULL(view_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret), K(view_stmt)); + } else if (OB_FAIL(view_stmt->get_stmt_hint().set_simple_view_hint(&stmt->get_stmt_hint()))) { + LOG_WARN("failed to set simple view hint", K(ret)); + } else if (FALSE_IT(view_stmt->set_query_ctx(stmt->get_query_ctx()))) { + // never reach + } else if (OB_FAIL(view_stmt->adjust_statement_id(ctx->allocator_, + ctx->src_qb_name_, + ctx->src_hash_val_))) { + LOG_WARN("failed to adjust statement id", K(ret)); + } else { + view_table->ref_query_ = view_stmt; + } + + // 1. construct view stmt + // 1.1 move from tables + for (int64_t i = 0; OB_SUCC(ret) && i < from_tables.count(); ++i) { + bool is_joined_table = (NULL != from_tables.at(i) && from_tables.at(i)->is_joined_table()); + TableItem *table = from_tables.at(i); + bool remove_happened = false; + if (OB_ISNULL(table)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("semi info is null", K(ret), K(semi)); - } else if (OB_FAIL(stmt->remove_semi_info(semi))) { - LOG_WARN("failed to remove semi info", K(ret)); - } else if (OB_FAIL(simple_stmt->add_semi_info(semi))) { - LOG_WARN("failed to add semi info", K(ret)); - } else if (OB_FAIL(basic_table_ids.push_back(semi->right_table_id_))) { - LOG_WARN("failed to push back right table id", K(ret)); + LOG_WARN("table is null", K(ret), K(table)); + } else if (OB_FAIL(stmt->remove_from_item(table->table_id_, &remove_happened))) { + LOG_WARN("failed to remove from item", K(ret)); + } else if (OB_FAIL(view_stmt->add_from_item(from_tables.at(i)->table_id_, is_joined_table))) { + LOG_WARN("failed to add from item", K(ret)); + } else if (is_joined_table) { + if (OB_FAIL(append(basic_table_ids, static_cast(table)->single_table_ids_))) { + LOG_WARN("failed to append single table ids", K(ret)); + } else if (OB_FAIL(view_stmt->add_joined_table(static_cast(table)))) { + LOG_WARN("failed to add joined table", K(ret)); + } + } else if (OB_FAIL(basic_table_ids.push_back(table->table_id_))) { + LOG_WARN("failed to push back table id", K(ret)); + } + add_to_from |= remove_happened; + } + + if (OB_SUCC(ret) && OB_FAIL(basic_table_ids_exclude_semi.assign(basic_table_ids))) { + LOG_WARN("failed to assign", K(ret)); + } + + // 1.2 move semi filter info + if (NULL != semi_infos){ + for (int64_t i = 0; OB_SUCC(ret) && i < semi_infos->count(); ++i) { + SemiInfo *semi = NULL; + if (OB_ISNULL(semi = semi_infos->at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("semi info is null", K(ret), K(semi)); + } else if (OB_FAIL(stmt->remove_semi_info(semi))) { + LOG_WARN("failed to remove semi info", K(ret)); + } else if (OB_FAIL(view_stmt->add_semi_info(semi))) { + LOG_WARN("failed to add semi info", K(ret)); + } else if (OB_FAIL(basic_table_ids.push_back(semi->right_table_id_))) { + LOG_WARN("failed to push back right table id", K(ret)); + } } } - // move table item + // 1.3 move table item for (int64_t i = 0; OB_SUCC(ret) && i < basic_table_ids.count(); ++i) { uint64_t table_id = basic_table_ids.at(i); TableItem *table = NULL; @@ -7159,13 +6939,13 @@ int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, LOG_WARN("failed to get part expr items", K(ret)); } else if (OB_FAIL(stmt->get_check_constraint_items(table_id, check_constraint_item))) { LOG_WARN("failed to get check constraint item", K(ret)); - } else if (OB_FAIL(simple_stmt->get_table_items().push_back(table))) { + } else if (OB_FAIL(view_stmt->get_table_items().push_back(table))) { LOG_WARN("failed to add table item", K(ret)); - } else if (OB_FAIL(append(simple_stmt->get_column_items(), column_items))) { + } else if (OB_FAIL(append(view_stmt->get_column_items(), column_items))) { LOG_WARN("failed to add column items", K(ret)); - } else if (OB_FAIL(simple_stmt->set_part_expr_items(part_expr_items))) { + } else if (OB_FAIL(view_stmt->set_part_expr_items(part_expr_items))) { LOG_WARN("failed to set part expr items", K(ret)); - } else if (OB_FAIL(simple_stmt->set_check_constraint_item(check_constraint_item))) { + } else if (OB_FAIL(view_stmt->set_check_constraint_item(check_constraint_item))) { LOG_WARN("failed to add check constraint items", K(ret)); } else if (OB_FAIL(stmt->remove_table_item(table))) { LOG_WARN("failed to remove table item", K(ret)); @@ -7178,18 +6958,59 @@ int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, } } - // rebuild subquery list and relation id info - if (OB_SUCC(ret)) { - if (OB_FAIL(simple_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(simple_stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(simple_stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item by id", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item by id", K(ret)); + // 1.4 construct conditions, group exprs and order items. + if (OB_FAIL(ret)) { + } else if (NULL != conditions && + OB_FAIL(view_stmt->get_condition_exprs().assign(*conditions))) { + LOG_WARN("failed to assign conditions", K(ret)); + } else if (NULL != group_exprs && + OB_FAIL(view_stmt->get_group_exprs().assign(*group_exprs))) { + LOG_WARN("failed to assign group exprs", K(ret)); + } else if (NULL != rollup_exprs && + OB_FAIL(view_stmt->get_rollup_exprs().assign(*rollup_exprs))) { + LOG_WARN("failed to assign rollup exprs", K(ret)); + } else if (NULL != having_exprs && + OB_FAIL(view_stmt->get_having_exprs().assign(*having_exprs))) { + LOG_WARN("failed to assign having exprs", K(ret)); + } else if (NULL != order_items && + OB_FAIL(view_stmt->get_order_items().assign(*order_items))) { + LOG_WARN("failed to assign order items", K(ret)); + + // 2 extract aggr and winfun + } else if (NULL != select_exprs && + (OB_FAIL(extract_aggr_expr(*select_exprs, view_stmt->get_aggr_items())))) { + LOG_WARN("failed to extract aggr expr", K(ret)); + } else if (NULL != select_exprs && + (OB_FAIL(extract_winfun_expr(*select_exprs, view_stmt->get_window_func_exprs())))) { + LOG_WARN("failed to extract aggr expr", K(ret)); + } else if (NULL != having_exprs && + (OB_FAIL(extract_aggr_expr(*having_exprs, view_stmt->get_aggr_items())))) { + LOG_WARN("failed to extract aggr expr", K(ret)); + } else if (NULL != having_exprs && + (OB_FAIL(extract_winfun_expr(*having_exprs, view_stmt->get_window_func_exprs())))) { + LOG_WARN("failed to extract aggr expr", K(ret)); + + + // 3 generate select list and adjust structures + } else if (OB_FAIL(view_stmt->rebuild_tables_hash())) { + LOG_WARN("failed to rebuild table hash", K(ret)); + } else if (OB_FAIL(view_stmt->update_column_item_rel_id())) { + LOG_WARN("failed to update column item by id", K(ret)); + } else if (OB_FAIL(generate_select_list(ctx, stmt, view_table, select_exprs))) { + LOG_WARN("failed to generate select list", K(ret)); + } else if ((stmt->is_delete_stmt() || stmt->is_update_stmt() || stmt->is_merge_stmt()) && + OB_FAIL(adjust_updatable_view(*ctx->expr_factory_, static_cast(stmt), + *view_table, &basic_table_ids_exclude_semi))) { + LOG_WARN("failed to adjust updatable view", K(ret)); + } else if (OB_FAIL(stmt->rebuild_tables_hash())) { + LOG_WARN("failed to rebuild table hash", K(ret)); + } else if (OB_FAIL(stmt->update_column_item_rel_id())) { + LOG_WARN("failed to update column item by id", K(ret)); + } else if (OB_FAIL(stmt->formalize_stmt(ctx->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); + } else { + if (view_stmt->has_for_update() && lib::is_oracle_mode()) { + view_table->for_update_ = true; } } return ret; @@ -7197,48 +7018,50 @@ int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx, ObDMLStmt *stmt, - TableItem *table) + TableItem *table, + ObIArray *basic_select_exprs/*= NULL*/) { int ret = OB_SUCCESS; ObSelectStmt *view_stmt = NULL; ObArray shared_exprs; ObArray column_exprs; + ObArray select_exprs; if (OB_ISNULL(stmt) || OB_ISNULL(table) || OB_ISNULL(ctx) || OB_ISNULL(ctx->expr_factory_) || OB_UNLIKELY(!table->is_generated_table()) || OB_ISNULL(view_stmt = table->ref_query_)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("params have null", K(ret), K(stmt), K(table)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), - view_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to remove item", K(ret)); - } else if (OB_FAIL(extract_shared_exprs(stmt, view_stmt, shared_exprs))) { + LOG_WARN("params have null", K(ret), K(stmt), KPC(table)); + } else if (NULL != basic_select_exprs && + OB_FAIL(select_exprs.assign(*basic_select_exprs))) { + LOG_WARN("failed to assign", K(ret)); + // The shared child exprs of basic_select_exprs should be extracted + } else if (OB_FAIL(extract_shared_exprs(stmt, view_stmt, shared_exprs, basic_select_exprs))) { LOG_WARN("failed to extract shared expr", K(ret)); } else if (OB_FAIL(remove_const_exprs(shared_exprs, shared_exprs))) { LOG_WARN("failed to remove const exprs", K(ret)); - } else if (OB_FAIL(create_columns_for_view(ctx, *table, stmt, shared_exprs, column_exprs))) { + } else if (OB_FAIL(append(select_exprs, shared_exprs))) { + LOG_WARN("failed to append", K(ret)); + } else if (OB_FAIL(create_columns_for_view(ctx, *table, stmt, select_exprs, column_exprs))) { LOG_WARN("failed to create columns for view", K(ret)); - } else if (shared_exprs.empty()) { - ret = create_dummy_select_item(*view_stmt, ctx); - } else if (OB_FAIL(stmt->replace_relation_exprs(shared_exprs, column_exprs))) { + } else if (OB_FAIL(stmt->replace_relation_exprs(select_exprs, column_exprs))) { LOG_WARN("failed to replace inner stmt expr", K(ret)); - } - - if (OB_SUCC(ret)) { - if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*view_stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } + } else if (OB_FAIL(stmt->adjust_subquery_list())) { + LOG_WARN("failed to adjust subquery list", K(ret)); + } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*stmt))) { + LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); + } else if (OB_FAIL(view_stmt->adjust_subquery_list())) { + LOG_WARN("failed to adjust subquery list", K(ret)); + } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*view_stmt))) { + LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } return ret; } int ObTransformUtils::extract_shared_exprs(ObDMLStmt *parent, ObSelectStmt *view_stmt, - ObIArray &common_exprs) + ObIArray &common_exprs, + const ObIArray *extra_view_exprs/* = NULL*/) { int ret = OB_SUCCESS; ObArray relation_exprs; @@ -7249,6 +7072,9 @@ int ObTransformUtils::extract_shared_exprs(ObDMLStmt *parent, LOG_WARN("failed to get column exprs", K(ret)); } else if (OB_FAIL(view_stmt->get_relation_exprs(relation_exprs))) { LOG_WARN("failed to get relation exprs", K(ret)); + } else if (NULL != extra_view_exprs && + OB_FAIL(append(relation_exprs, *extra_view_exprs))) { + LOG_WARN("failed to append exprs", K(ret)); } else if (OB_FAIL(extract_shared_exprs(parent, relation_exprs, common_exprs))) { LOG_WARN("failed to extract shared exprs from relation exprs", K(ret)); } @@ -7523,8 +7349,16 @@ int ObTransformUtils::add_limit_to_semi_right_table(ObDMLStmt *stmt, 1, const_one))) { LOG_WARN("failed to build const int expr", K(ret)); } else if (!right_table->is_generated_table()) { - if (OB_FAIL(create_view_with_table(stmt, ctx, right_table, view_item))) { - LOG_WARN("failed to create view with table", K(ret)); + if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx, + stmt, + view_item, + right_table))) { + LOG_WARN("failed to create empty view", K(ret)); + } else if (OB_FAIL(create_inline_view(ctx, + stmt, + view_item, + right_table))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(view_item) || OB_ISNULL(ref_query = view_item->ref_query_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("view_item is null", K(ret), K(view_item), K(ref_query)); @@ -9490,115 +9324,6 @@ int ObTransformUtils::check_has_rownum(const ObIArray &exprs, bool return ret; } -int ObTransformUtils::create_view_with_from_items(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - TableItem *table_item, - const ObIArray &new_select_exprs, - const ObIArray &new_conds, - TableItem *&view_table) -{ - int ret = OB_SUCCESS; - ObSelectStmt *view = NULL; - //1. create stmt - if (OB_ISNULL(ctx) || OB_ISNULL(stmt) || OB_ISNULL(table_item) || OB_ISNULL(ctx->allocator_) || - OB_ISNULL(ctx->stmt_factory_) || OB_ISNULL(ctx->session_info_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(ctx->stmt_factory_->create_stmt(view))) { - LOG_WARN("failed to create stmt", K(ret)); - } else if (OB_ISNULL(view)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } - //2. set baisc info - if (OB_SUCC(ret)) { - view->set_query_ctx(stmt->get_query_ctx()); - if (OB_FAIL(view->adjust_statement_id(ctx->allocator_, - ctx->src_qb_name_, - ctx->src_hash_val_))) { - LOG_WARN("failed to adjust statement id", K(ret)); - } - } - //3. add table_item、column items、part expr items - if (OB_SUCC(ret)) { - ObSEArray part_items; - ObSEArray column_items; - if (OB_FAIL(add_table_item(view, table_item))) { - LOG_WARN("failed to add table item", K(ret)); - } else if (OB_FAIL(stmt->remove_table_item(table_item))) { - LOG_WARN("failed to add table item", K(ret)); - } else if (OB_FAIL(stmt->remove_from_item(table_item->table_id_))) { - LOG_WARN("failed to add from item", K(ret)); - } else if (OB_FAIL(stmt->get_part_expr_items(table_item->table_id_, part_items))) { - LOG_WARN("failed to get part expr items", K(ret)); - } else if (OB_FAIL(view->set_part_expr_items(part_items))) { - LOG_WARN("failed to set part expr items", K(ret)); - } else if (OB_FAIL(stmt->remove_part_expr_items(table_item->table_id_))) { - LOG_WARN("failed to get part expr items", K(ret)); - } else if (OB_FAIL(stmt->get_column_items(table_item->table_id_, column_items))) { - LOG_WARN("failed to get column items", K(ret)); - } else if (OB_FAIL(view->add_column_item(column_items))) { - LOG_WARN("failed to add column items", K(ret)); - } else if (OB_FAIL(stmt->remove_column_item(table_item->table_id_))) { - LOG_WARN("failed to get column items", K(ret)); - } - } - //4. formalize view - if (OB_FAIL(ret)) { - } else if (OB_FAIL(view->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(view->update_column_item_rel_id())) { - LOG_WARN("failed to update column item rel id", K(ret)); - } else if (OB_FAIL(view->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } - //5. create new table item for view - ObSEArray select_exprs; - ObSEArray column_exprs; - if (OB_FAIL(ret)) { - } else if (OB_FAIL(append(view->get_condition_exprs(), new_conds))) { - LOG_WARN("failed to append conditions", K(ret)); - } else if (OB_FAIL(select_exprs.assign(new_select_exprs))) { - LOG_WARN("failed to assgin exprs", K(ret)); - } else if (new_select_exprs.empty() && - OB_FAIL(view->get_column_exprs(select_exprs))) { - LOG_WARN("failed to get column exprs", K(ret)); - } else if (OB_FAIL(add_new_table_item(ctx, stmt, view, view_table))) { - LOG_WARN("failed to add table items", K(ret)); - } else if (OB_ISNULL(view_table->ref_query_)) { - LOG_WARN("get unexpected ref query", K(ret)); - } else if (select_exprs.empty() && - OB_FAIL(ObTransformUtils::create_dummy_select_item(*view_table->ref_query_, ctx))) { - LOG_WARN("failed to create dummy select item", K(ret)); - } else if (OB_FAIL(create_columns_for_view(ctx, - *view_table, - stmt, - select_exprs, - column_exprs))) { - LOG_WARN("failed to create column items", K(ret)); - } else if (OB_FAIL(view->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*view))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(stmt->replace_relation_exprs(select_exprs, column_exprs))) { - LOG_WARN("failed to replace relation expr", K(ret)); - } - //6. final format - if (OB_FAIL(ret)) { - } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(stmt->rebuild_tables_hash())) { - LOG_WARN("failed to rebuild table hash", K(ret)); - } else if (OB_FAIL(stmt->update_column_item_rel_id())) { - LOG_WARN("failed to update column item rel id", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } - return ret; -} - int ObTransformUtils::add_table_item(ObDMLStmt *stmt, TableItem *table_item) { int ret = OB_SUCCESS; diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index 3b6bb07a1..a81d6ab49 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -288,7 +288,7 @@ public: ObSelectStmt *select_stmt); static int create_select_item(ObIAllocator &allocator, - common::ObIArray &select_exprs, + const common::ObIArray &select_exprs, ObSelectStmt *select_stmt); static int copy_stmt(ObStmtFactory &stmt_factory, @@ -1090,31 +1090,27 @@ public: ObSelectStmt *right_stmt, ObSelectStmt *&union_stmt); + static int pushdown_group_by(ObSelectStmt *parent_stmt, + ObIArray &pushdown_groupby, + ObIArray &pushdown_rollup, + ObIArray &pushdown_aggr); + static int create_simple_view(ObTransformerCtx *ctx, ObDMLStmt *stmt, ObSelectStmt *&view_stmt, bool push_subquery = true, - bool push_conditions = true); + bool push_conditions = true, + bool push_group_by = false, + ObAliasRefRawExpr *alias_expr = NULL); static int pushdown_pseudo_column_like_exprs(ObDMLStmt &upper_stmt, - ObSelectStmt &view_stmt, ObIArray &pushdown_exprs); - static int check_need_pushdown_pseudo_column(ObDMLStmt &view_stmt, - ObRawExpr &expr, - bool &need_pushdown); static int adjust_updatable_view(ObRawExprFactory &expr_factory, ObDelUpdStmt *stmt, TableItem &view_table_item, ObIArray* origin_table_ids = NULL); - static int push_down_groupby(ObTransformerCtx *ctx, ObSelectStmt *stmt, TableItem *view_table); - - static int push_down_vector_assign(ObTransformerCtx *ctx, - ObUpdateStmt *stmt, - ObAliasRefRawExpr *root_expr, - TableItem *view_table); - static int create_stmt_with_generated_table(ObTransformerCtx *ctx, ObSelectStmt *child_stmt, ObSelectStmt *&parent_stmt); @@ -1136,11 +1132,6 @@ public: static int inner_copy_joined_table_expr(ObRawExprCopier &copier, JoinedTable *table); - static int create_view_with_table(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - TableItem *table, - TableItem *&view_table); - static int extract_right_tables_from_semi_infos(ObDMLStmt *stmt, const ObIArray &semi_infos, ObIArray &tables); @@ -1358,18 +1349,6 @@ public: ObQueryRefRawExpr *query_ref, ObSelectStmt *subquery, bool &is_match); - /** - * @brief create_view_with_from_items - * 使用给定的from items,创建一个generate table聚合这些表 - * 如果给定了new_select_exprs,则使用给定的表达式创建新的select item - * 如果new_select_exprs为空,则使用from items包含表的所有列创建新的select item - */ - static int create_view_with_from_items(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - TableItem *table_item, - const ObIArray &new_select_exprs, - const ObIArray &new_conds, - TableItem *&view_table); static int add_table_item(ObDMLStmt *stmt, TableItem *table_item); @@ -1651,21 +1630,46 @@ public: static int check_expr_valid_for_stmt_merge(ObIArray &select_exprs, bool &is_valid); - static int create_view_with_tables(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - const ObIArray &tables, - const ObIArray &semi_infos, - TableItem *&view_table); + static int replace_with_empty_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + TableItem *from_table, + ObIArray *semi_infos = NULL); - static int construct_simple_view(ObDMLStmt *stmt, - const ObIArray &tables, - const ObIArray &semi_infos, - ObTransformerCtx *ctx, - ObSelectStmt *&simple_stmt); + static int replace_with_empty_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + ObIArray &from_tables, + ObIArray *semi_infos = NULL); + + static int create_inline_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + TableItem * push_table, + ObIArray *conditions = NULL, + ObIArray *semi_infos = NULL, + ObIArray *select_exprs = NULL, + ObIArray *group_exprs = NULL, + ObIArray *rollup_exprs = NULL, + ObIArray *having_exprs = NULL, + ObIArray *order_items = NULL); + + static int create_inline_view(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *&view_table, + ObIArray &from_tables, + ObIArray *conditions = NULL, + ObIArray *semi_infos = NULL, + ObIArray *select_exprs = NULL, + ObIArray *group_exprs = NULL, + ObIArray *rollup_exprs = NULL, + ObIArray *having_exprs = NULL, + ObIArray *order_items = NULL); static int generate_select_list(ObTransformerCtx *ctx, ObDMLStmt *stmt, - TableItem *table); + TableItem *table, + ObIArray *basic_select_exprs = NULL); static int remove_const_exprs(ObIArray &input_exprs, ObIArray &output_exprs); @@ -1735,7 +1739,8 @@ private: static int extract_shared_exprs(ObDMLStmt *parent, ObSelectStmt *view_stmt, - ObIArray &common_exprs); + ObIArray &common_exprs, + const ObIArray *extra_view_exprs = NULL); static int generate_col_exprs(ObDMLStmt *stmt, const ObIArray &tables, diff --git a/src/sql/rewrite/ob_transform_win_magic.cpp b/src/sql/rewrite/ob_transform_win_magic.cpp index 3883a2fa6..b077efc28 100644 --- a/src/sql/rewrite/ob_transform_win_magic.cpp +++ b/src/sql/rewrite/ob_transform_win_magic.cpp @@ -274,41 +274,31 @@ int ObTransformWinMagic::do_transform_from_type(ObDMLStmt *&stmt, int ret = OB_SUCCESS; ObDMLStmt *main_stmt = stmt; TableItem *drill_down_table = NULL; - TableItem *&rewrite_table = drill_down_table; TableItem *roll_up_table = NULL; ObSelectStmt *drill_down_stmt = NULL; - ObSelectStmt *&rewrite_view_stmt = drill_down_stmt; ObDMLStmt *roll_up_stmt = NULL; bool match_main =false; - if (OB_ISNULL(stmt)) { + if (OB_ISNULL(stmt) || + OB_ISNULL(drill_down_table = main_stmt->get_table_item(main_stmt->get_from_item(drill_down_idx))) || + OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("stmt is null", K(ret)); - } else if (OB_ISNULL(drill_down_table = main_stmt->get_table_item_by_id( - main_stmt->get_from_item(drill_down_idx).table_id_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); - } else if (OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); + LOG_WARN("stmt is null", K(ret), K(stmt), K(drill_down_table), K(drill_down_stmt)); } else if (roll_up_idx == -1) { roll_up_stmt = main_stmt; match_main = true; - } else if (OB_ISNULL(roll_up_table = main_stmt->get_table_item_by_id( - main_stmt->get_from_item(roll_up_idx).table_id_))) { + } else if (OB_ISNULL(roll_up_table = main_stmt->get_table_item(main_stmt->get_from_item(roll_up_idx))) || + OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); - } else if (OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table item is null", K(ret)); + LOG_WARN("rollup table is invalid", K(roll_up_table), K(roll_up_stmt)); } if (OB_FAIL(ret)) { //do nothing } else if (match_main) { - if (OB_FAIL(adjust_column_and_table(main_stmt, rewrite_table, map_info))) { + if (OB_FAIL(adjust_column_and_table(main_stmt, drill_down_table, map_info))) { LOG_WARN("adjust column and table failed"); - } else if (OB_FAIL(adjust_agg_to_win(rewrite_view_stmt))) { + } else if (OB_FAIL(adjust_agg_to_win(drill_down_stmt))) { LOG_WARN("adjust agg to win faield", K(ret)); } } else { @@ -338,7 +328,6 @@ int ObTransformWinMagic::do_transform_from_type(ObDMLStmt *&stmt, LOG_WARN("failed to formalize stmt info", K(ret)); } } - LOG_DEBUG("transformed stmt: ",K(*stmt)); return ret; } @@ -1352,12 +1341,12 @@ int ObTransformWinMagic::adjust_agg_to_win(ObSelectStmt *view_stmt) } int ObTransformWinMagic::adjust_view_for_trans(ObDMLStmt *main_stmt, - TableItem *&drill_down_table, - TableItem *roll_up_table, - TableItem *&transed_view_table, - ObIArray &new_transed_output, - ObStmtCompareContext &context, - ObStmtMapInfo &map_info) + TableItem *&drill_down_table, + TableItem *roll_up_table, + TableItem *&transed_view_table, + ObIArray &new_transed_output, + ObStmtCompareContext &context, + ObStmtMapInfo &map_info) { int ret = OB_SUCCESS; ObSelectStmt *drill_down_stmt = NULL; @@ -1369,21 +1358,27 @@ int ObTransformWinMagic::adjust_view_for_trans(ObDMLStmt *main_stmt, ObSEArray new_select_exprs_for_trans; ObSEArray old_roll_up_view_output_columns; ObSEArray new_transed_view_output_columns; + if (OB_ISNULL(main_stmt) || OB_ISNULL(drill_down_table) || OB_ISNULL(roll_up_table) || OB_ISNULL(drill_down_stmt = drill_down_table->ref_query_) || OB_ISNULL(roll_up_stmt = roll_up_table->ref_query_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("pointer is null", K(ret)); - } else if (OB_FAIL(ObTransformUtils::create_view_with_table(main_stmt, - ctx_, - drill_down_table, - transed_view_table))) { - LOG_WARN("create view with table failed", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, + main_stmt, + transed_view_table, + drill_down_table))) { + LOG_WARN("failed to create empty view table", K(ret)); + } else if (OB_FAIL(ObTransformUtils::create_inline_view(ctx_, + main_stmt, + transed_view_table, + drill_down_table))) { + LOG_WARN("failed to create inline view", K(ret)); } else if (OB_ISNULL(transed_view_table) || OB_ISNULL(transed_view_table->ref_query_) || - transed_view_table->ref_query_->get_table_size() != 1 ) { + OB_UNLIKELY(transed_view_table->ref_query_->get_table_size() != 1)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("transed view table is null", K(ret)); + LOG_WARN("transed view table is null", K(ret), K(transed_view_table)); } else { drill_down_table = transed_view_table->ref_query_->get_table_item(0); } diff --git a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result index 0e3bb9520..f9430fb5a 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result +++ b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result @@ -926,16 +926,16 @@ Query Plan ======================================================================= |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| ----------------------------------------------------------------------- -|0 |TEMP TABLE TRANSFORMATION | |2 |79 | -|1 | TEMP TABLE INSERT |TEMP1 |11 |78 | -|2 | HASH JOIN | |11 |76 | -|3 | HASH JOIN | |121 |36 | -|4 | HASH JOIN | |11 |15 | +|0 |TEMP TABLE TRANSFORMATION | |2 |78 | +|1 | TEMP TABLE INSERT |TEMP1 |11 |76 | +|2 | HASH JOIN | |11 |74 | +|3 | HASH JOIN | |121 |35 | +|4 | HASH JOIN | |11 |14 | |5 | TABLE SCAN |t6 |11 |3 | |6 | HASH JOIN | |11 |9 | |7 | TABLE SCAN |t5 |11 |3 | |8 | TABLE SCAN |t4 |11 |3 | -|9 | NESTED-LOOP JOIN CARTESIAN | |121 |9 | +|9 | NESTED-LOOP JOIN CARTESIAN | |121 |8 | |10| TABLE SCAN |t3 |11 |3 | |11| MATERIAL | |11 |3 | |12| TABLE SCAN |t1 |11 |3 | @@ -950,17 +950,17 @@ Outputs & filters: ------------------------------------- 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256 1 - output(nil), filter(nil), rowset=256 - 2 - output([t1.c1], [t2.c1], [t2.c2], [t5.c1], [t5.c2], [t6.c2]), filter(nil), rowset=256 + 2 - output([t5.c2], [t2.c1], [t1.c1], [t2.c2], [t5.c1], [t6.c2]), filter(nil), rowset=256 equal_conds([t1.c1 = t2.c1], [t2.c2 = t3.c1]), other_conds(nil) - 3 - output([t1.c1], [t5.c1], [t5.c2], [t6.c2], [t3.c1]), filter(nil), rowset=256 + 3 - output([t5.c2], [t1.c1], [t5.c1], [t6.c2], [t3.c1]), filter(nil), rowset=256 equal_conds([t3.c2 = t4.c1]), other_conds(nil) - 4 - output([t5.c1], [t5.c2], [t6.c2], [t4.c1]), filter(nil), rowset=256 + 4 - output([t5.c2], [t5.c1], [t6.c2], [t4.c1]), filter(nil), rowset=256 equal_conds([t5.c2 = t6.c1]), other_conds(nil) 5 - output([t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true - 6 - output([t5.c1], [t5.c2], [t4.c1]), filter(nil), rowset=256 + 6 - output([t5.c2], [t5.c1], [t4.c1]), filter(nil), rowset=256 equal_conds([t4.c2 = t5.c1]), other_conds(nil) 7 - output([t5.c1], [t5.c2]), filter([t5.c2 != 44 OR t5.c2 != 55]), rowset=256 access([t5.c1], [t5.c2]), partitions(p0) @@ -989,11 +989,11 @@ Outputs & filters: 15 - output([cast(T_FUN_COUNT(*), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.t2.c1)]), filter(nil), rowset=256 group(nil), agg_func([T_FUN_COUNT(*)], [T_FUN_SUM(VIEW1.t2.c1)]) 16 - output([VIEW1.t2.c1]), filter([VIEW1.t5.c2 != 44]), rowset=256 - access([VIEW1.t2.c1], [VIEW1.t5.c2]) + access([VIEW1.t5.c2], [VIEW1.t2.c1]) 17 - output([T_FUN_SUM(VIEW2.t1.c1)], [cast(T_FUN_MAX(VIEW2.t2.c2), DECIMAL(11, 0)) + T_FUN_SUM(VIEW2.t5.c1 - VIEW2.t6.c2)]), filter(nil), rowset=256 group(nil), agg_func([T_FUN_SUM(VIEW2.t1.c1)], [T_FUN_MAX(VIEW2.t2.c2)], [T_FUN_SUM(VIEW2.t5.c1 - VIEW2.t6.c2)]) 18 - output([VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t6.c2]), filter([VIEW2.t5.c2 != 55]), rowset=256 - access([VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t5.c2], [VIEW2.t6.c2]) + access([VIEW2.t5.c2], [VIEW2.t1.c1], [VIEW2.t2.c2], [VIEW2.t5.c1], [VIEW2.t6.c2]) select /*+ leading(t6, (t5, t4), (t3, t1), (t2)) */ count(*), sum(t2.c1) from nn1 t1, nn1 t2 , nn1 t3, nn1 t4, nn1 t5, nn1 t6 where t1.c1 = t2.c1 and t2.c2 = t3.c1 and t3.c2 = t4.c1 and t4.c2 = t5.c1 and t5.c2 = t6.c1 and t5.c2 <> 44 union ALL @@ -2479,10 +2479,10 @@ Outputs & filters: conds(nil), nl_params_(nil), batch_join=false 5 - output(nil), filter(nil), rowset=256 access(nil) - 6 - output([UNION([1])]), filter(nil), rowset=256 + 6 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 7 - output([UNION([1])]), filter(nil), rowset=256 - 8 - output([1]), filter(nil), rowset=256 + 7 - output(nil), filter(nil), rowset=256 + 8 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 9 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds(nil) @@ -2494,7 +2494,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 12 - output([1]), filter(nil), rowset=256 + 12 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 13 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) @@ -2509,10 +2509,10 @@ Outputs & filters: 16 - output(nil), filter(nil), rowset=256 17 - output(nil), filter(nil), rowset=256 access(nil) - 18 - output([UNION([1])]), filter(nil), rowset=256 + 18 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 19 - output([UNION([1])]), filter(nil), rowset=256 - 20 - output([1]), filter(nil), rowset=256 + 19 - output(nil), filter(nil), rowset=256 + 20 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 21 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds(nil) @@ -2524,7 +2524,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 24 - output([1]), filter(nil), rowset=256 + 24 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 25 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) @@ -2611,10 +2611,10 @@ Outputs & filters: conds(nil), nl_params_(nil), batch_join=false 5 - output(nil), filter(nil), rowset=256 access(nil) - 6 - output([UNION([1])]), filter(nil), rowset=256 + 6 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 7 - output([UNION([1])]), filter(nil), rowset=256 - 8 - output([1]), filter(nil), rowset=256 + 7 - output(nil), filter(nil), rowset=256 + 8 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 9 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds(nil) @@ -2626,7 +2626,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 12 - output([1]), filter(nil), rowset=256 + 12 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 13 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) @@ -2641,10 +2641,10 @@ Outputs & filters: 16 - output(nil), filter(nil), rowset=256 17 - output(nil), filter(nil), rowset=256 access(nil) - 18 - output([UNION([1])]), filter(nil), rowset=256 + 18 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 19 - output([UNION([1])]), filter(nil), rowset=256 - 20 - output([1]), filter(nil), rowset=256 + 19 - output(nil), filter(nil), rowset=256 + 20 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 21 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds(nil) @@ -2656,7 +2656,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 24 - output([1]), filter(nil), rowset=256 + 24 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 25 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) @@ -2743,10 +2743,10 @@ Outputs & filters: conds(nil), nl_params_(nil), batch_join=false 5 - output(nil), filter(nil), rowset=256 access(nil) - 6 - output([UNION([1])]), filter(nil), rowset=256 + 6 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 7 - output([UNION([1])]), filter(nil), rowset=256 - 8 - output([1]), filter(nil), rowset=256 + 7 - output(nil), filter(nil), rowset=256 + 8 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 9 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds(nil) @@ -2758,7 +2758,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 12 - output([1]), filter(nil), rowset=256 + 12 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 13 - output(nil), filter(nil), rowset=256 equal_conds([a.c1 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) @@ -2773,10 +2773,10 @@ Outputs & filters: 16 - output(nil), filter(nil), rowset=256 17 - output(nil), filter(nil), rowset=256 access(nil) - 18 - output([UNION([1])]), filter(nil), rowset=256 + 18 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) - 19 - output([UNION([1])]), filter(nil), rowset=256 - 20 - output([1]), filter(nil), rowset=256 + 19 - output(nil), filter(nil), rowset=256 + 20 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 21 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds(nil) @@ -2788,7 +2788,7 @@ Outputs & filters: access([b.d1]), partitions(p0) is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true - 24 - output([1]), filter(nil), rowset=256 + 24 - output(nil), filter(nil), rowset=256 limit(1), offset(nil) 25 - output(nil), filter(nil), rowset=256 equal_conds([a.c2 = b.d1]), other_conds([lnnvl(cast(a.c1 = b.d1, TINYINT(-1, 0)))]) diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result index 80b966554..b091e67c7 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result @@ -35,7 +35,7 @@ Outputs & filters: 2 - output(nil), filter(nil), rowset=256 dop=2 3 - output(nil), filter(nil), rowset=256 - 4 - output([t1.c1], [t1.c2], [T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256 + 4 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))], [t1.c1], [t1.c2]), filter(nil), rowset=256 group([t1.c1], [t1.c2]), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 5 - output([t1.c1], [t1.c2], [T_FUN_COUNT(*)]), filter(nil), rowset=256 6 - output([t1.c1], [t1.c2], [T_FUN_COUNT(*)]), filter(nil), rowset=256 @@ -62,10 +62,10 @@ Outputs & filters: dop=2 18 - output([VIEW2.t1.c1], [VIEW2.t1.c2]), filter(nil), rowset=256 access([VIEW2.t1.c1], [VIEW2.t1.c2]) - 19 - output([VIEW3.t1.c1], [VIEW3.T_FUN_COUNT(*)]), filter(nil), rowset=256 - access([VIEW3.t1.c1], [VIEW3.T_FUN_COUNT(*)]) - 20 - output([VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)]), filter(nil), rowset=256 - access([VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)]) + 19 - output([VIEW3.T_FUN_COUNT(*)], [VIEW3.t1.c1]), filter(nil), rowset=256 + access([VIEW3.T_FUN_COUNT(*)], [VIEW3.t1.c1]) + 20 - output([VIEW1.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2]), filter(nil), rowset=256 + access([VIEW1.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2]) explain select /*+ use_px parallel(2) use_merge(a b) */ b.c2, sum(a.c3) from (select /*+ NO_USE_HASH_AGGREGATION */ c1, c2, count(*) c3 from t1 group by 1, 2) a, t2 b where a.c1 = b.c1 group by 1; Query Plan ========================================================================= diff --git a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result index 92d0ace87..31a4440d0 100644 --- a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result +++ b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result @@ -221,7 +221,7 @@ Outputs & filters: 3 - output(nil), filter(nil), rowset=256 4 - output(nil), filter(nil), rowset=256 access(nil) - 5 - output([1]), filter(nil), rowset=256 + 5 - output(nil), filter(nil), rowset=256 access(nil), partitions(p0) limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true