diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index 56af2edcbe..59ffa25561 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -1572,7 +1572,7 @@ int ObDMLStmt::remove_part_expr_items(ObIArray &table_ids) int ObDMLStmt::remove_part_expr_items(uint64_t table_id) { int ret = OB_SUCCESS; - for (int64_t i = part_expr_items_.count() - 1; i >= 0; --i) { + for (int64_t i = part_expr_items_.count() - 1; OB_SUCC(ret) && i >= 0; --i) { if (table_id == part_expr_items_.at(i).table_id_) { if (OB_FAIL(part_expr_items_.remove(i))) { LOG_WARN("fail to remove part expr item", K(table_id), K(ret)); @@ -4187,6 +4187,35 @@ int ObDMLStmt::set_check_constraint_item(CheckConstraintItem &check_constraint_i return ret; } +int ObDMLStmt::remove_check_constraint_item(const uint64_t table_id) +{ + int ret = OB_SUCCESS; + for (int64_t i = check_constraint_items_.count() - 1; OB_SUCC(ret) && i >= 0; --i) { + if (table_id == check_constraint_items_.at(i).table_id_) { + if (OB_FAIL(check_constraint_items_.remove(i))) { + LOG_WARN("failed to remove check constraint item", K(ret), K(table_id)); + } + } + } + return ret; +} + +int ObDMLStmt::get_check_constraint_items(const uint64_t table_id, + CheckConstraintItem &check_constraint_item) +{ + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < check_constraint_items_.count(); ++i) { + if (table_id != check_constraint_items_.at(i).table_id_) { + // do nothing + } else if (OB_FAIL(check_constraint_item.assign(check_constraint_items_.at(i)))) { + LOG_WARN("failed to assign check constraint item", K(ret)); + } else { + break; + } + } + return ret; +} + int ObDMLStmt::get_qb_name(ObString &qb_name) const { int ret = OB_SUCCESS; diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index b53af7d2ca..036cabd01d 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -970,6 +970,10 @@ public: const common::ObIArray &get_check_constraint_items() const { return check_constraint_items_; } int set_check_constraint_item(CheckConstraintItem &check_constraint_item); + int remove_check_constraint_item(const uint64_t table_id); + int get_check_constraint_items(const uint64_t table_id, + CheckConstraintItem &check_constraint_item); + int get_qb_name(ObString &qb_name) const; TO_STRING_KV(N_STMT_TYPE, ((int)stmt_type_), diff --git a/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp b/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp index 7624d0c52d..37f82e4812 100644 --- a/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp +++ b/src/sql/rewrite/ob_transform_join_limit_pushdown.cpp @@ -226,8 +226,10 @@ int ObTransformJoinLimitPushDown::transform_one_stmt(common::ObIArray(stmt), helpers))) { - LOG_WARN("failed to rename pushdown exprs", K(ret)); + 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 rel ids", K(ret)); } else if (OB_FAIL(add_transform_hint(*stmt))) { LOG_WARN("failed to add transform hint", K(ret)); } @@ -265,7 +267,6 @@ int ObTransformJoinLimitPushDown::check_stmt_validity(ObDMLStmt *stmt, bool has_cartesian = false; bool has_rownum = false; bool is_valid_limit = false; - TableItem *table_item = NULL; ObSelectStmt *select_stmt = NULL; if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; @@ -907,34 +908,57 @@ int ObTransformJoinLimitPushDown::do_transform(ObSelectStmt *select_stmt, 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::create_view_with_tables(select_stmt, - ctx_, - helper.pushdown_tables_, - helper.pushdown_semi_infos_, - helper.view_table_))) { - LOG_WARN("failed to create view with table", K(ret)); - //create new left join with lazy left join - } else if (!helper.lazy_join_tables_.empty() && - 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(add_order_by_limit_for_view(ref_query, - 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)); - } else if (OB_FAIL(select_stmt->adjust_subquery_list())) { - LOG_WARN("failed to stmt adjust subquery list", K(ret)); - } + } 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(select_stmt->add_from_item(helper.view_table_->table_id_, false))) { + LOG_WARN("failed to add from item", K(ret)); + } + + for (int64_t i = 0; OB_SUCC(ret) && i < helper.pushdown_tables_.count(); ++i) { + TableItem *table = helper.pushdown_tables_.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( + select_stmt, helper.view_table_, table))) { + LOG_WARN("failed to replace table in semi infos", K(ret)); + } else if (OB_FAIL(ObTransformUtils::replace_table_in_joined_tables( + select_stmt, helper.view_table_, table))) { + LOG_WARN("failed to replace table in joined tables", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (!helper.lazy_join_tables_.empty() && + 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(add_order_by_limit_for_view(ref_query, + 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)); + } 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_)); + } + } return ret; } @@ -1094,42 +1118,5 @@ int ObTransformJoinLimitPushDown::add_order_by_limit_for_view(ObSelectStmt *gene return ret; } -int ObTransformJoinLimitPushDown::rename_pushdown_exprs(ObSelectStmt *select_stmt, - ObIArray &helpers) -{ - int ret = OB_SUCCESS; - ObSEArray view_columns; - ObSEArray view_selects; - if (OB_ISNULL(ctx_) || OB_ISNULL(ctx_->expr_factory_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("params have null", K(ret)); - } - for (int64_t i = 0; OB_SUCC(ret) && i < helpers.count(); ++i) { - if (OB_ISNULL(helpers.at(i))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null helper", K(ret)); - } else if (OB_ISNULL(helpers.at(i)->view_table_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null table item", K(ret)); - } else if (OB_FAIL(select_stmt->get_view_output(*helpers.at(i)->view_table_, - view_selects, - view_columns))) { - LOG_WARN("failed to get view output exprs", K(ret)); - } - } - if (OB_SUCC(ret)) { - ObRawExprCopier copier(*ctx_->expr_factory_); - if (OB_FAIL(copier.add_replaced_expr(view_selects, view_columns))) { - LOG_WARN("failed to add replaced expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::copy_subquery_params(copier, - select_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to copy subquery params", K(ret)); - } else if (OB_FAIL(select_stmt->copy_and_replace_stmt_expr(copier))) { - LOG_WARN("failed to copy and replace stmt expr", K(ret)); - } - } - return ret; -} - } } diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index c6c8543eab..c1b07a3770 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -1798,7 +1798,7 @@ int ObTransformUtils::is_expr_not_null(ObNotNullContext &ctx, static_cast(expr), is_not_null, constraints))) { - LOG_WARN("failed to check expr not null", K(ret)); + LOG_WARN("failed to check expr not null", K(ret), K(*expr)); } } else if (expr->is_set_op_expr()) { if (OB_FAIL(is_set_expr_not_null(ctx, @@ -6819,136 +6819,6 @@ int ObTransformUtils::create_view_with_table(ObDMLStmt *stmt, 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 ret = OB_SUCCESS; - ObSelectStmt *simple_stmt = NULL; - ObSEArray tmp_column_exprs; - ObSEArray tmp_select_exprs; - ObSEArray new_column_exprs; - ObSEArray old_column_exprs; - ObSEArray old_table_ids; - TableItem *new_table = NULL; - 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)); - } else { - // 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(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 (OB_FAIL(create_columns_for_view(ctx, - *new_table, - stmt, - tmp_column_exprs))) { - LOG_WARN("failed to create columns for view", K(ret)); - } else if (OB_FAIL(convert_column_expr_to_select_expr(tmp_column_exprs, - *simple_stmt, - tmp_select_exprs))) { - LOG_WARN("failed to convert column expr to select expr", K(ret)); - } else if (OB_FAIL(generate_col_exprs(stmt, - tables, - tmp_select_exprs, - tmp_column_exprs, - old_column_exprs, - new_column_exprs))) { - LOG_WARN("failed to link view with upper stmt", K(ret)); - } - // 4. replace tables in stmt - for (int64_t i = 0; OB_SUCC(ret) && i < semi_infos.count(); ++i) { - SemiInfo *semi_info = semi_infos.at(i); - ObSEArray table_ids; - TableItem *table = NULL; - if (OB_ISNULL(semi_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null semi info", K(ret)); - } else if (OB_ISNULL(table = stmt->get_table_item_by_id(semi_info->right_table_id_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null table", K(ret)); - } else if (OB_FAIL(remove_tables_from_stmt(stmt, table, table_ids))) { - LOG_WARN("failed to remove tables from stmt", K(ret)); - } else if (OB_FAIL(stmt->remove_semi_info(semi_info))) { - LOG_WARN("failed to remove semi info", K(ret)); - } - } - for (int64_t i = 0; OB_SUCC(ret) && i < tables.count(); ++i) { - TableItem *table = tables.at(i); - ObSEArray table_ids; - if (OB_ISNULL(table)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null table", K(ret)); - } else if (OB_FAIL(remove_tables_from_stmt(stmt, table, table_ids))) { - LOG_WARN("failed to remove tables from stmt", 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)); - } else if (OB_FAIL(stmt->remove_from_item(table->table_id_))) { - LOG_WARN("failed to remove from item", K(ret)); - } else if (OB_FAIL(append(old_table_ids, table_ids))) { - LOG_WARN("failed to append table ids", K(ret)); - } - } - // 5. adjust structures - if (OB_FAIL(ret)) { - } else if (OB_FAIL(stmt->add_from_item(new_table->table_id_, false))) { - LOG_WARN("failed to add from item", K(ret)); - } else if (OB_FAIL(simple_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(simple_stmt->adjust_subquery_stmt_parent(stmt, simple_stmt))) { - LOG_WARN("failed to adjust subquery stmt parent", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to stmt 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(adjust_pseudo_column_like_exprs(*stmt))) { - LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(stmt->remove_table_item(new_table))) { - LOG_WARN("failed to remove table item", K(ret)); - } else if (OB_FAIL(stmt->replace_inner_stmt_expr(old_column_exprs, new_column_exprs))) { - LOG_WARN("failed to replace inner stmt expr", K(ret)); - } else if (OB_FAIL(stmt->get_table_items().push_back(new_table))) { - LOG_WARN("failed to push back table item", 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; - } - } - return ret; -} - int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, const ObIArray &tables, const ObIArray &semi_infos, @@ -6956,6 +6826,7 @@ int ObTransformUtils::construct_simple_view(ObDMLStmt *stmt, ObSelectStmt *&simple_stmt) { 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_)) { @@ -6965,117 +6836,264 @@ int ObTransformUtils::construct_simple_view(ObDMLStmt *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)); + 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)); } else { - simple_stmt->set_query_ctx(stmt->get_query_ctx()); simple_stmt->set_current_level(stmt->get_current_level()); simple_stmt->set_parent_namespace_stmt(stmt->get_parent_namespace_stmt()); - - ObSEArray all_tables; - ObSEArray all_table_ids; - // 1. collect tables and table ids - // 2. add from item according to the table id - 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 (table->is_joined_table()) { - ObSEArray joined_child_tables; - JoinedTable *joined_table = static_cast(table); - if (OB_FAIL(extract_table_items(joined_table, joined_child_tables))) { - LOG_WARN("failed to extract table items", K(ret)); - } else if (OB_FAIL(append(all_tables, joined_child_tables))) { - LOG_WARN("failed to append tables within joined table", K(ret)); - } else if (OB_FAIL(append(all_table_ids, joined_table->single_table_ids_))) { - LOG_WARN("failed to append single table ids", K(ret)); - } else if (OB_FAIL(simple_stmt->add_joined_table(joined_table))) { - LOG_WARN("failed to add joined table", K(ret)); - } else if (OB_FAIL(simple_stmt->add_from_item(joined_table->table_id_, - true))) { - LOG_WARN("failed to add from item", K(ret)); - } - } else { - if (OB_FAIL(all_tables.push_back(table))) { - LOG_WARN("failed to push back tables", K(ret)); - } else if (OB_FAIL(all_table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } else if (OB_FAIL(simple_stmt->add_from_item(table->table_id_, false))) { - LOG_WARN("failedto add from item", 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))) { + 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("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)); } - // 3. add semi table items - for (int i = 0; OB_SUCC(ret) && i < semi_infos.count(); ++i) { - SemiInfo *semi_info = semi_infos.at(i); - TableItem *table = NULL; - if (OB_ISNULL(semi_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpect null semi info", K(ret)); - } else if (OB_ISNULL(table = stmt->get_table_item_by_id(semi_info->right_table_id_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null table", K(ret)); - } else if (OB_FAIL(all_tables.push_back(table))) { - LOG_WARN("failed to push back tables", K(ret)); - } else if (OB_FAIL(all_table_ids.push_back(table->table_id_))) { - LOG_WARN("failed to push back table id", K(ret)); - } else if (OB_FAIL(simple_stmt->add_semi_info(semi_info))) { - LOG_WARN("failedto add from item", K(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))) { + 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)); } - // 4. adjust part expr items, column items, select items - ObSEArray part_items; - ObSEArray column_items; - ObSqlBitSet<> from_tables_set; - ObSEArray tmp_column_exprs; - ObSEArray select_exprs; - ObSEArray shared_exprs; - if (OB_FAIL(ret)) { - } else if (OB_FAIL(add_table_item(simple_stmt, all_tables))) { - LOG_WARN("failed to add table items", K(ret)); - } else if (OB_FAIL(stmt->get_part_expr_items(all_table_ids, part_items))) { - LOG_WARN("failed to get part expr items", K(ret)); - } else if (OB_FAIL(simple_stmt->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(all_table_ids))) { - LOG_WARN("failed to remove part items", K(ret)); - } else if (OB_FAIL(stmt->get_column_items(all_table_ids, column_items))) { + } + + // 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; + ObArray column_items; + ObArray part_expr_items; + ObDMLStmt::CheckConstraintItem check_constraint_item; + if (OB_ISNULL(table = stmt->get_table_item_by_id(table_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table is null", K(ret), K(table)); + } else if (OB_FAIL(stmt->get_column_items(table_id, column_items))) { LOG_WARN("failed to get column items", K(ret)); - } else if (OB_FAIL(simple_stmt->add_column_item(column_items))) { + } else if (OB_FAIL(stmt->get_part_expr_items(table_id, part_expr_items))) { + 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))) { + LOG_WARN("failed to add table item", K(ret)); + } else if (OB_FAIL(append(simple_stmt->get_column_items(), column_items))) { LOG_WARN("failed to add column items", K(ret)); - } else if (OB_FAIL(stmt->remove_column_item(all_table_ids))) { + } else if (OB_FAIL(simple_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))) { + 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)); + } else if (OB_FAIL(stmt->remove_column_item(basic_table_ids.at(i)))) { LOG_WARN("failed to remove column item", K(ret)); - } 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)); - } else if (OB_FAIL(simple_stmt->rebuild_tables_hash())) { + } else if (OB_FAIL(stmt->remove_part_expr_items(basic_table_ids.at(i)))) { + LOG_WARN("failed to remove part expr items", K(ret)); + } else if (OB_FAIL(stmt->remove_check_constraint_item(basic_table_ids.at(i)))) { + LOG_WARN("failed to remove check constraint item", K(ret)); + } + } + + // rebuild relation id info + if (OB_SUCC(ret)) { + 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(simple_stmt->get_column_exprs(tmp_column_exprs))) { - LOG_WARN("failed to get column exprs", K(ret)); - } else if (OB_FAIL(simple_stmt->get_from_tables(from_tables_set))) { - LOG_WARN("failed to get from tables", K(ret)); - } else if (OB_FAIL(extract_table_exprs(*simple_stmt, tmp_column_exprs, - from_tables_set, select_exprs))) { - LOG_WARN("failed to extract table exprs", K(ret)); - // TODO: extract inseparable query exprs if they can be shared - } else if (OB_FAIL(extract_shared_expr(stmt, - simple_stmt, - shared_exprs, - RelExprCheckerBase::JOIN_CONDITION_SCOPE))) { - LOG_WARN("failed to extract shared exprs", K(ret)); - } else if (OB_FAIL(append_array_no_dup(select_exprs, shared_exprs))) { - LOG_WARN("failed to append array", K(ret)); - } else if (OB_FAIL(create_select_item(*ctx->allocator_, - select_exprs, - simple_stmt))) { - LOG_WARN("failed to create select item", K(ret)); - } else if (OB_FAIL(simple_stmt->formalize_stmt(ctx->session_info_))) { - LOG_WARN("failed to formalize simple stmt", K(ret)); + } + } + return ret; +} + +int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *table) +{ + int ret = OB_SUCCESS; + ObSelectStmt *view_stmt = NULL; + ObArray shared_exprs; + ObArray column_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(extract_shared_exprs(stmt, view_stmt, shared_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))) { + 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->remove_table_item(table))) { + LOG_WARN("failed to remove table item", K(ret)); + } else if (OB_FAIL(stmt->replace_inner_stmt_expr(shared_exprs, column_exprs))) { + LOG_WARN("failed to replace inner stmt expr", K(ret)); + } else if (OB_FAIL(stmt->get_table_items().push_back(table))) { + LOG_WARN("failed to push back table", 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(view_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(view_stmt->adjust_subquery_stmt_parent(stmt, view_stmt))) { + LOG_WARN("failed to adjust subquery stmt parent", K(ret)); + } + } + return ret; +} + +int ObTransformUtils::extract_shared_exprs(ObDMLStmt *parent, + ObSelectStmt *view_stmt, + ObIArray &common_exprs) +{ + int ret = OB_SUCCESS; + int64_t set_size = 32; + hash::ObHashSet expr_set; + ObArray relation_exprs; + if (OB_ISNULL(parent) || OB_ISNULL(view_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("params have null", K(ret), K(parent), K(view_stmt)); + } else if (OB_FAIL(view_stmt->get_column_exprs(relation_exprs))) { + 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 (relation_exprs.count() > set_size) { + set_size = relation_exprs.count(); + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(expr_set.create(set_size, + "TransExprSet", "TransExprSet"))) { + LOG_WARN("failed to create expr set", K(ret)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < relation_exprs.count(); ++i) { + if (OB_FAIL(append_hashset(relation_exprs.at(i), expr_set))) { + LOG_WARN("failed to append hashset", K(ret)); + } + } + if (OB_SUCC(ret)) { + relation_exprs.reuse(); + if (OB_FAIL(parent->get_relation_exprs(relation_exprs))) { + LOG_WARN("failed to get relation exprs", K(ret)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < relation_exprs.count(); ++i) { + if (OB_FAIL(find_hashset(relation_exprs.at(i), expr_set, common_exprs))) { + LOG_WARN("failed to find expr in hashset", K(ret)); + } + } + if (expr_set.created()) { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = expr_set.destroy())) { + LOG_WARN("failed to destroy expr set", K(ret)); + ret = COVER_SUCC(tmp_ret); + } + } + return ret; +} + +int ObTransformUtils::remove_const_exprs(ObIArray &input_exprs, + ObIArray &output_exprs) +{ + int ret = OB_SUCCESS; + ObArray tmp; + for (int64_t i = 0; OB_SUCC(ret) && i < input_exprs.count(); ++i) { + if (OB_ISNULL(input_exprs.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("input expr is null", K(ret)); + } else if (input_exprs.at(i)->is_const_expr()) { + // do nothing + } else if (OB_FAIL(tmp.push_back(input_exprs.at(i)))) { + LOG_WARN("failed to push back input expr", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(output_exprs.assign(tmp))) { + LOG_WARN("failed to assign tmp expr", K(ret)); + } + } + return ret; +} + +int ObTransformUtils::append_hashset(ObRawExpr *expr, + hash::ObHashSet &expr_set) +{ + int ret = OB_SUCCESS; + uint64_t key = reinterpret_cast(expr); + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("expr is null", K(ret), K(expr)); + } else if (OB_HASH_EXIST == expr_set.exist_refactored(key)) { + // do nothing + } else if (OB_FAIL(expr_set.set_refactored(key))) { + LOG_WARN("failed to set key", K(ret), K(expr)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { + if (OB_FAIL(SMART_CALL(append_hashset(expr->get_param_expr(i), + expr_set)))) { + LOG_WARN("failed to append hashset", K(ret)); + } + } + } + return ret; +} + +int ObTransformUtils::find_hashset(ObRawExpr *expr, + hash::ObHashSet &expr_set, + ObIArray &common_exprs) +{ + int ret = OB_SUCCESS; + uint64_t key = reinterpret_cast(expr); + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("expr is null", K(ret), K(expr)); + } else if (OB_HASH_EXIST == expr_set.exist_refactored(key)) { + if (OB_FAIL(add_var_to_array_no_dup(common_exprs, expr))) { + LOG_WARN("failed to append expr", K(ret)); + } + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { + if (OB_FAIL(SMART_CALL(find_hashset(expr->get_param_expr(i), + expr_set, + common_exprs)))) { + LOG_WARN("failed to find hashset", K(ret)); + } } } return ret; diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index 59b850f737..6b8c078657 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -1100,11 +1100,6 @@ public: TableItem *table, TableItem *&view_table); - static int create_view_with_tables(ObDMLStmt *stmt, - ObTransformerCtx *ctx, - const ObIArray &tables, - const ObIArray &semi_infos, - TableItem *&view_table); static int extract_right_tables_from_semi_infos(ObDMLStmt *stmt, const ObIArray &semi_infos, ObIArray &tables); @@ -1574,13 +1569,27 @@ public: TableItem *target_table, bool is_right_child, bool &combinable); - + static int rebuild_win_compare_range_expr(ObRawExprFactory* expr_factory, ObWinFunRawExpr &win_expr, ObRawExpr* order_expr); static int check_expr_valid_for_stmt_merge(ObIArray &select_exprs, bool &is_valid); + + static int construct_simple_view(ObDMLStmt *stmt, + const ObIArray &tables, + const ObIArray &semi_infos, + ObTransformerCtx *ctx, + ObSelectStmt *&simple_stmt); + + static int generate_select_list(ObTransformerCtx *ctx, + ObDMLStmt *stmt, + TableItem *table); + + static int remove_const_exprs(ObIArray &input_exprs, + ObIArray &output_exprs); + private: static int inner_get_lazy_left_join(ObDMLStmt *stmt, TableItem *table, @@ -1611,11 +1620,18 @@ private: static int add_non_duplicated_select_expr(ObIArray &add_select_exprs, ObIArray &org_select_exprs); - static int construct_simple_view(ObDMLStmt *stmt, - const ObIArray &tables, - const ObIArray &semi_infos, - ObTransformerCtx *ctx, - ObSelectStmt *&simple_stmt); + + static int extract_shared_exprs(ObDMLStmt *parent, + ObSelectStmt *view_stmt, + ObIArray &common_exprs); + + static int append_hashset(ObRawExpr *expr, + hash::ObHashSet &expr_set); + + static int find_hashset(ObRawExpr *expr, + hash::ObHashSet &expr_set, + ObIArray &common_exprs); + static int generate_col_exprs(ObDMLStmt *stmt, const ObIArray &tables, const ObIArray &tmp_select_exprs,