adjust subquery_exprs in formalize_stmt
This commit is contained in:
parent
4d516e64c7
commit
0487d20e6d
@ -9848,7 +9848,7 @@ int ObLogPlan::check_if_subplan_filter_match_repart(ObLogicalOperator *top,
|
||||
right_keys,
|
||||
null_safe_info))) {
|
||||
LOG_WARN("failed to get equal join key", K(ret));
|
||||
} else if (child->get_strong_sharding()->get_all_partition_keys(target_part_keys, true)) {
|
||||
} else if (OB_FAIL(child->get_strong_sharding()->get_all_partition_keys(target_part_keys, true))) {
|
||||
LOG_WARN("failed to get partition keys", K(ret));
|
||||
} else if (OB_FAIL(ObShardingInfo::check_if_match_repart_or_rehash(input_esets,
|
||||
left_keys,
|
||||
|
@ -3223,10 +3223,11 @@ int ObOptimizerUtil::get_fd_set_parent_exprs(const ObIArray<ObFdItem *> &fd_item
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < fd_item_set.count(); ++i) {
|
||||
if (OB_ISNULL(fd_item = fd_item_set.at(i))
|
||||
|| OB_ISNULL(parent_exprs = fd_item->get_parent_exprs())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret));
|
||||
} else {
|
||||
for (int64_t j = 0; OB_SUCC(ret) && j < parent_exprs->count(); ++j) {
|
||||
if (add_var_to_array_no_dup(fd_set_parent_exprs, parent_exprs->at(j))) {
|
||||
if (OB_FAIL(add_var_to_array_no_dup(fd_set_parent_exprs, parent_exprs->at(j)))) {
|
||||
LOG_WARN("failed to append array no dup", K(ret));
|
||||
}
|
||||
}
|
||||
|
@ -1754,6 +1754,7 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info)
|
||||
LOG_WARN("get relation exprs failed", K(ret));
|
||||
} else {
|
||||
// rel id maintenance of dependent exprs
|
||||
subquery_exprs_.reset();
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < column_items_.count(); i++) {
|
||||
ObColumnRefRawExpr *column_expr = NULL;
|
||||
if (OB_ISNULL(column_expr = column_items_.at(i).expr_)) {
|
||||
@ -1777,6 +1778,7 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info)
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expr is NULL", K(ret));
|
||||
} else if (OB_FAIL(expr->formalize(session_info))) {
|
||||
// 'formalize' method calls 'extract_info' and 'decude_type' methods inside
|
||||
LOG_WARN("failed to formalize expr", K(ret));
|
||||
} else if (OB_FAIL(expr->pull_relation_id())) {
|
||||
LOG_WARN("pull expr relation ids failed", K(ret), K(*expr));
|
||||
@ -1784,6 +1786,8 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info)
|
||||
// zhanyue todo: adjust this.
|
||||
// Add IS_JOIN_COND flag need use expr relation_ids, here call extract_info() again.
|
||||
LOG_WARN("failed to extract info", K(*expr));
|
||||
} else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(expr, subquery_exprs_, true))) {
|
||||
LOG_WARN("failed to extract query ref expr", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1802,6 +1806,17 @@ int ObDMLStmt::formalize_stmt_expr_reference(ObRawExprFactory *expr_factory,
|
||||
} else if (OB_FAIL(get_relation_exprs(stmt_exprs))) {
|
||||
LOG_WARN("get relation exprs failed", K(ret));
|
||||
} else {
|
||||
// SQL DEFENSIVE CODE
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < subquery_exprs_.count(); ++i) {
|
||||
ObQueryRefRawExpr *query_ref = subquery_exprs_.at(i);
|
||||
if (OB_ISNULL(query_ref)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("query ref expr is null", K(ret));
|
||||
} else if (OB_UNLIKELY(query_ref->is_explicited_reference())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("query ref expr is referenced at two different levels", K(ret));
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < stmt_exprs.count(); i++) {
|
||||
if (OB_ISNULL(stmt_exprs.at(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -1838,8 +1853,6 @@ int ObDMLStmt::formalize_stmt_expr_reference(ObRawExprFactory *expr_factory,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ObDMLStmt::formalize_child_stmt_expr_reference(ObRawExprFactory *expr_factory,
|
||||
ObSQLSessionInfo *session_info)
|
||||
{
|
||||
@ -1952,10 +1965,12 @@ int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, ExplicitedRefType re
|
||||
LOG_WARN("failed to find pseudo column", K(ret), K(expr));
|
||||
} else if (expr.is_query_ref_expr() &&
|
||||
!ObRawExprUtils::find_expr(get_subquery_exprs(), &expr)) {
|
||||
// SQL DEFENSIVE CODE
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("query ref expr does not exist in the stmt", K(ret), K(expr));
|
||||
} else if (is_select_stmt() &&
|
||||
OB_FAIL(static_cast<ObSelectStmt *>(this)->check_aggr_and_winfunc(expr))) {
|
||||
// SQL DEFENSIVE CODE
|
||||
LOG_WARN("failed to check aggr and winfunc validity", K(ret));
|
||||
}
|
||||
} else if (expr.is_exec_param_expr()) {
|
||||
@ -2146,14 +2161,6 @@ int ObDMLStmt::clear_sharable_expr_reference()
|
||||
expr->clear_explicited_referece();
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < subquery_exprs_.count(); i++) {
|
||||
if (OB_ISNULL(subquery_exprs_.at(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret));
|
||||
} else {
|
||||
subquery_exprs_.at(i)->clear_explicited_referece();
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < pseudo_column_like_exprs_.count(); i++) {
|
||||
if (OB_ISNULL(pseudo_column_like_exprs_.at(i))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -2168,6 +2175,7 @@ int ObDMLStmt::clear_sharable_expr_reference()
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("query ref expr is null", K(ret));
|
||||
} else {
|
||||
query_ref->clear_explicited_referece();
|
||||
for (int64_t j = 0; OB_SUCC(ret) && j < query_ref->get_exec_params().count(); ++j) {
|
||||
ObExecParamRawExpr *exec_param = query_ref->get_exec_params().at(j);
|
||||
if (OB_ISNULL(exec_param)) {
|
||||
|
@ -415,10 +415,9 @@ int ObRawExprResolverImpl::do_recursive_resolve(const ParseNode *node, ObRawExpr
|
||||
uint64_t dep_obj_id = ctx_.view_ref_id_;
|
||||
if (OB_FAIL(stmt->add_global_dependency_table(udt_schema_version))) {
|
||||
LOG_WARN("failed to add global dependency", K(ret));
|
||||
} else if (stmt->add_ref_obj_version(dep_obj_id, db_id,
|
||||
ObObjectType::VIEW,
|
||||
udt_schema_version,
|
||||
ctx_.expr_factory_.get_allocator())) {
|
||||
} else if (OB_FAIL(stmt->add_ref_obj_version(dep_obj_id, db_id,
|
||||
ObObjectType::VIEW, udt_schema_version,
|
||||
ctx_.expr_factory_.get_allocator()))) {
|
||||
LOG_WARN("failed to add ref obj version", K(ret));
|
||||
}
|
||||
}
|
||||
@ -3540,6 +3539,7 @@ int ObRawExprResolverImpl::process_between_node(const ParseNode *node, ObRawExpr
|
||||
if (OB_FAIL(recursive_resolve(node->children_[0], btw_params[BTW_PARAM_NUM]))) {
|
||||
SQL_RESV_LOG(WARN, "resolve child expr failed", K(ret), K(BTW_PARAM_NUM));
|
||||
} else if (OB_ISNULL(btw_params[BTW_PARAM_NUM])) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected null", K(ret), K(BTW_PARAM_NUM));
|
||||
}
|
||||
}
|
||||
|
@ -949,8 +949,6 @@ int ObTransformAggrSubquery::transform_upper_stmt(ObDMLStmt &stmt, TransformPara
|
||||
OB_ISNULL(subquery = query_expr->get_ref_stmt())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("params are invalid", K(ret), K(ctx_), K(subquery));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt.get_subquery_exprs(), query_expr))) {
|
||||
LOG_WARN("failed to remove subquery expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, &stmt, subquery, view_table))) {
|
||||
LOG_WARN("failed to add new table item", K(ret));
|
||||
} else if (OB_ISNULL(view_table)) {
|
||||
@ -1724,10 +1722,7 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt,
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt.get_subquery_exprs(),
|
||||
query_ref_expr))) {
|
||||
LOG_WARN("failed to remove query ref expr", K(ret));
|
||||
} else if (is_exists_op(root_expr->get_expr_type())) {
|
||||
if (is_exists_op(root_expr->get_expr_type())) {
|
||||
bool need_lnnvl = root_expr->get_expr_type() == T_OP_NOT_EXISTS;
|
||||
if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt.get_condition_exprs(), root_expr))) {
|
||||
LOG_WARN("failed to remove exprs", K(ret));
|
||||
@ -1768,8 +1763,6 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt,
|
||||
LOG_WARN("failed to append check constraint items", K(ret));
|
||||
} else if (OB_FAIL(append(select_stmt.get_aggr_items(), subquery->get_aggr_items()))) {
|
||||
LOG_WARN("failed to append aggr items", K(ret));
|
||||
} else if (OB_FAIL(append(select_stmt.get_subquery_exprs(), subquery->get_subquery_exprs()))) {
|
||||
LOG_WARN("failed to append subquery exprs", K(ret));
|
||||
} else if (OB_FAIL(select_stmt.rebuild_tables_hash())) {
|
||||
LOG_WARN("failed to rebuild table hash", K(ret));
|
||||
} else if (OB_FAIL(select_stmt.update_column_item_rel_id())) {
|
||||
|
@ -1368,7 +1368,8 @@ 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 (ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), helper.conditions_)) {
|
||||
} else if (OB_FAIL(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,
|
||||
@ -1425,7 +1426,8 @@ int ObTransformDBlink::extract_limit(ObDMLStmt *stmt, ObDMLStmt *&dblink_stmt)
|
||||
|| stmt->is_fetch_with_ties()
|
||||
|| NULL != stmt->get_limit_percent_expr()) {
|
||||
dblink_stmt = stmt;
|
||||
} else if (ObTransformUtils::pack_stmt(ctx_, static_cast<ObSelectStmt *>(stmt), &child_stmt)) {
|
||||
} else if (OB_FAIL(ObTransformUtils::pack_stmt(ctx_, static_cast<ObSelectStmt *>(stmt),
|
||||
&child_stmt))) {
|
||||
LOG_WARN("failed to pack the stmt", K(ret));
|
||||
} else {
|
||||
stmt->set_limit_offset(child_stmt->get_limit_expr(), child_stmt->get_offset_expr());
|
||||
|
@ -546,29 +546,6 @@ int ObTransformExprPullup::search_expr_cannot_pullup(ObRawExpr *expr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformExprPullup::adjust_subquery(ObRawExpr *expr,
|
||||
ObSelectStmt &child,
|
||||
ObSelectStmt &parent)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_ISNULL(expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
} else if (expr->is_query_ref_expr()
|
||||
&& !ObRawExprUtils::find_expr(parent.get_subquery_exprs(), expr)) {
|
||||
ObQueryRefRawExpr &query_ref = static_cast<ObQueryRefRawExpr &>(*expr);
|
||||
if (OB_FAIL(parent.add_subquery_ref(&query_ref))) {
|
||||
LOG_WARN("fail to add subquery ref", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); i++) {
|
||||
if (OB_FAIL(SMART_CALL(adjust_subquery(expr->get_param_expr(i), child, parent)))) {
|
||||
LOG_WARN("fail to preorder search expr", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTransformExprPullup::rewrite_decision_by_hint(ObSelectStmt &parent,
|
||||
ObSelectStmt &child,
|
||||
bool stmt_may_reduce_row_count,
|
||||
@ -793,8 +770,6 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view,
|
||||
expr_params,
|
||||
new_child_project_columns))) {
|
||||
LOG_WARN("failed to create select item", K(ret));
|
||||
} else if (OB_FAIL(child.adjust_subquery_list())) {
|
||||
LOG_WARN("fail to adjust subquery list", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
@ -809,8 +784,6 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view,
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < select_exprs_can_pullup.count(); i++) {
|
||||
if (OB_FAIL(select_exprs_can_pullup.at(i)->formalize(ctx_->session_info_))) {
|
||||
LOG_WARN("fail to formalize expr", K(ret));
|
||||
} else if (OB_FAIL(adjust_subquery(select_exprs_can_pullup.at(i), child, parent))) {
|
||||
LOG_WARN("fail to add subquery ref", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -822,6 +795,8 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view,
|
||||
LOG_WARN("fail to replace inner stmt expr", K(ret));
|
||||
} else if (OB_FAIL(parent.formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("fail to formalize stmt", K(ret));
|
||||
} else if (OB_FAIL(child.formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("fail to formalize stmt", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,6 @@ private:
|
||||
int search_expr_cannot_pullup(ObRawExpr *expr,
|
||||
ObExprNodeMap &expr_map,
|
||||
common::ObIArray<ObRawExpr *> &expr_cannot_pullup);
|
||||
int adjust_subquery(ObRawExpr *expr, ObSelectStmt &child, ObSelectStmt &parent);
|
||||
int is_stmt_may_reduce_row_count(const ObSelectStmt &stmt, bool &is_true);
|
||||
|
||||
static bool is_view_acceptable_for_rewrite(TableItem &view);
|
||||
|
@ -788,9 +788,7 @@ int ObTransformGroupByPullup::do_groupby_pull_up(ObSelectStmt *stmt,
|
||||
subquery->get_group_exprs().reset();
|
||||
subquery->get_aggr_items().reset();
|
||||
subquery->get_having_exprs().reset();
|
||||
if (OB_FAIL(subquery->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, table_item))) {
|
||||
if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, table_item))) {
|
||||
LOG_WARN("failed to generate select list", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
|
@ -2299,9 +2299,6 @@ int ObTransformJoinElimination::try_remove_semi_info(ObDMLStmt *stmt,
|
||||
LOG_WARN("failed to replace relation expr", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_semi_infos(), semi_info))) {
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(child_stmt->get_condition_exprs(),
|
||||
stmt->get_subquery_exprs()))) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(append(semi_info->semi_conditions_, child_stmt->get_condition_exprs()))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else if (OB_FAIL(trans_semi_condition_exprs(stmt, semi_info))) {
|
||||
|
@ -2277,6 +2277,7 @@ int ObTransformOrExpansion::adjust_or_expansion_stmt(ObIArray<ObRawExpr*> *conds
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObRawExpr *transformed_expr = NULL;
|
||||
ObSEArray<ObQueryRefRawExpr *, 4> removed_subqueries;
|
||||
ObSEArray<ObRawExpr*, 4> generated_exprs;
|
||||
if (OB_ISNULL(conds_exprs) || OB_ISNULL(ctx_)
|
||||
|| OB_ISNULL(session_info = ctx_->session_info_)
|
||||
|| OB_ISNULL(expr_factory = ctx_->expr_factory_)) {
|
||||
@ -2291,54 +2292,28 @@ int ObTransformOrExpansion::adjust_or_expansion_stmt(ObIArray<ObRawExpr*> *conds
|
||||
} else if (OB_ISNULL(transformed_expr = conds_exprs->at(expr_pos))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("null transformed expr", K(ret));
|
||||
} else if (OB_FAIL(conds_exprs->remove(expr_pos))) {
|
||||
LOG_WARN("failed to remove condition expr", K(ret));
|
||||
} else if (T_OP_OR == transformed_expr->get_expr_type()) {
|
||||
ObSEArray<ObRawExpr*, 4> generated_exprs;
|
||||
if (OB_FAIL(create_expr_for_or_expr(*transformed_expr,
|
||||
param_pos,
|
||||
ctx,
|
||||
generated_exprs))) {
|
||||
LOG_WARN("failed to create expr", K(ret));
|
||||
} else if (OB_FAIL(append(*conds_exprs, generated_exprs))) {
|
||||
LOG_WARN("failed to append expr", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
} else if (T_OP_IN == transformed_expr->get_expr_type()) {
|
||||
ObSEArray<ObRawExpr*, 4> generated_exprs;
|
||||
if (OB_FAIL(create_expr_for_in_expr(*transformed_expr,
|
||||
param_pos,
|
||||
ctx,
|
||||
generated_exprs))) {
|
||||
LOG_WARN("failed to create expr", K(ret), K(generated_exprs));
|
||||
} else if (OB_FAIL(append(*conds_exprs, generated_exprs))) {
|
||||
LOG_WARN("failed to append exprs", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
} else {
|
||||
} else if (OB_UNLIKELY(T_OP_IN != transformed_expr->get_expr_type() &&
|
||||
T_OP_OR != transformed_expr->get_expr_type())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("unexpected expr type", K(transformed_expr->get_expr_type()), K(ret));
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(or_expansion_stmt->formalize_stmt(session_info))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
} else {
|
||||
// clean unused subqueries
|
||||
ObSEArray<ObRawExpr*, 4> relation_exprs;
|
||||
ObSEArray<ObQueryRefRawExpr *, 8> used_subquery_exprs;
|
||||
if (OB_FAIL(or_expansion_stmt->get_relation_exprs(relation_exprs))) {
|
||||
LOG_WARN("failed to get relation exprs");
|
||||
} else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(relation_exprs, used_subquery_exprs))) {
|
||||
LOG_WARN("failed to get query exprs");
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < or_expansion_stmt->get_subquery_exprs().count(); ++i) {
|
||||
ObQueryRefRawExpr *expr = or_expansion_stmt->get_subquery_exprs().at(i);
|
||||
if (ObOptimizerUtil::find_item(used_subquery_exprs, expr)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(or_expansion_stmt->get_subquery_exprs(), expr))) {
|
||||
LOG_WARN("failed to remove item from subquery exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (OB_FAIL(conds_exprs->remove(expr_pos))) {
|
||||
LOG_WARN("failed to remove condition expr", K(ret));
|
||||
} else if (T_OP_OR == transformed_expr->get_expr_type() &&
|
||||
OB_FAIL(create_expr_for_or_expr(*transformed_expr,
|
||||
param_pos,
|
||||
ctx,
|
||||
generated_exprs))) {
|
||||
LOG_WARN("failed to create expr", K(ret));
|
||||
} else if (T_OP_IN == transformed_expr->get_expr_type() &&
|
||||
OB_FAIL(create_expr_for_in_expr(*transformed_expr,
|
||||
param_pos,
|
||||
ctx,
|
||||
generated_exprs))) {
|
||||
LOG_WARN("failed to create expr", K(ret), K(generated_exprs));
|
||||
} else if (OB_FAIL(append(*conds_exprs, generated_exprs))) {
|
||||
LOG_WARN("failed to append expr", K(ret));
|
||||
} else if (OB_FAIL(or_expansion_stmt->formalize_stmt(session_info))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -2173,8 +2173,6 @@ int ObTransformPreProcess::create_connect_by_view(ObSelectStmt &stmt)
|
||||
} else if (view_stmt->get_select_item_size() == 0 &&
|
||||
OB_FAIL(ObTransformUtils::create_dummy_select_item(*view_stmt, ctx_))) {
|
||||
LOG_WARN("failed to create dummy select item", K(ret));
|
||||
} else if (OB_FAIL(view_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*view_stmt))) {
|
||||
LOG_WARN("failed to adjust pseudo column like exprs", K(ret));
|
||||
}
|
||||
@ -2183,13 +2181,7 @@ int ObTransformPreProcess::create_connect_by_view(ObSelectStmt &stmt)
|
||||
TableItem *table_item = NULL;
|
||||
ObSEArray<ObRawExpr *, 4> columns;
|
||||
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(ObTransformUtils::add_new_table_item(ctx_,
|
||||
&stmt,
|
||||
view_stmt,
|
||||
table_item))) {
|
||||
if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, &stmt, view_stmt, table_item))) {
|
||||
LOG_WARN("failed to add new table item", K(ret));
|
||||
} else if (OB_ISNULL(table_item)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -2337,8 +2329,8 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt)
|
||||
} else if (left_view_stmt->get_select_item_size() == 0 &&
|
||||
OB_FAIL(ObTransformUtils::create_dummy_select_item(*left_view_stmt, ctx_))) {
|
||||
LOG_WARN("failed to create dummy select item", K(ret));
|
||||
} else if (OB_FAIL(left_view_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(left_view_stmt->formalize_stmt(session_info))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
}
|
||||
}
|
||||
// 5. copy left stmt to right stmt
|
||||
@ -2398,10 +2390,6 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt)
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(left_view_stmt->add_condition_exprs(left_view_stmt->get_start_with_exprs()))) {
|
||||
LOG_WARN("failed to push start with exprs to view", K(ret));
|
||||
} else if (OB_FAIL(left_view_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(right_view_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*left_view_stmt))) {
|
||||
LOG_WARN("failed to adjust pseudo column like exprs", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*right_view_stmt))) {
|
||||
@ -2488,11 +2476,7 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt)
|
||||
|
||||
// 11. replace expr in parent stmt and formalize
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(ObOptimizerUtil::remove_item(stmt.get_subquery_exprs(),
|
||||
left_view_stmt->get_subquery_exprs()))) {
|
||||
LOG_WARN("failed to remove subqueries", K(ret));
|
||||
} else if (!select_list.empty()
|
||||
&& OB_FAIL(stmt.replace_relation_exprs(select_list, right_columns))) {
|
||||
if (!select_list.empty() && OB_FAIL(stmt.replace_relation_exprs(select_list, right_columns))) {
|
||||
LOG_WARN("failed to replace inner stmt expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(stmt))) {
|
||||
LOG_WARN("failed to adjust pseudo column like exprs", K(ret));
|
||||
@ -5233,12 +5217,12 @@ int ObTransformPreProcess::transform_insert_only_merge_into(ObDMLStmt* stmt, ObD
|
||||
LOG_WARN("failed to assign semi infos", K(ret));
|
||||
} else if (OB_FAIL(select_stmt->replace_relation_exprs(old_column_exprs, new_column_exprs))) {
|
||||
LOG_WARN("failed to replace relation exprs", K(ret));
|
||||
} else if (OB_FAIL(select_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(transform_exprs(select_stmt, dummy))) {
|
||||
LOG_WARN("failed to transform exprs", K(ret));
|
||||
} else if (OB_FAIL(insert_stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(select_stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
} else if (OB_FAIL(insert_stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("failed to formalize stmt", K(ret));
|
||||
} else {
|
||||
out = insert_stmt;
|
||||
}
|
||||
|
@ -74,14 +74,8 @@ int ObTransformSimplifySet::transform_one_stmt(common::ObIArray<ObParentDMLStmt>
|
||||
}
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (!trans_happened) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(add_transform_hint(*stmt, NULL))) {
|
||||
LOG_WARN("failed to add transform hint", K(ret));
|
||||
}
|
||||
if (OB_SUCC(ret) && trans_happened && OB_FAIL(add_transform_hint(*stmt, NULL))) {
|
||||
LOG_WARN("failed to add transform hint", K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -905,15 +905,9 @@ int ObTransformSubqueryCoalesce::coalesce_diff_any_all_exprs(ObDMLStmt *stmt,
|
||||
LOG_WARN("failed to remove item", K(ret));
|
||||
} else if (OB_FAIL(cond_exprs.push_back(new_any_all_expr))) {
|
||||
LOG_WARN("failed to push back new any all expr", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), any_ref_expr))) {
|
||||
LOG_WARN("failed to remove subquery ref expr", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), all_ref_expr))) {
|
||||
LOG_WARN("failed to remove subquery ref expr", K(ret));
|
||||
} else if (OB_ISNULL(new_any_all_query = get_any_all_query_expr(new_any_all_expr))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("the new any all expr is invalid", K(ret));
|
||||
} else if (OB_FAIL(stmt->get_subquery_exprs().push_back(new_any_all_query))) {
|
||||
LOG_WARN("failed to push back new any all query", K(ret));
|
||||
} else if (OB_FAIL(stmt->pull_all_expr_relation_id())) {
|
||||
LOG_WARN("failed to form pull up expr id and level", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
@ -933,14 +927,13 @@ int ObTransformSubqueryCoalesce::merge_exists_subqueries(TransformParam &trans_p
|
||||
int ret = OB_SUCCESS;
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObStmtFactory *stmt_factory = NULL;
|
||||
ObSEArray<ObRawExpr *, 4> old_cols;
|
||||
ObSEArray<ObRawExpr *, 4> new_cols;
|
||||
ObSEArray<ObRawExpr *, 4> extra_conds;
|
||||
ObQueryRefRawExpr *exist_query_ref = NULL;
|
||||
ObQueryRefRawExpr *not_exist_query_ref = NULL;
|
||||
ObQueryRefRawExpr *new_query_ref = NULL;
|
||||
ObSelectStmt *exist_stmt = NULL;
|
||||
ObSelectStmt *not_exist_stmt = NULL;
|
||||
ObDMLStmt *tmp_stmt = NULL;
|
||||
ObSelectStmt *new_exist_stmt = NULL;
|
||||
ObSEArray<ObRawExpr *, 4> old_exec_params;
|
||||
ObSEArray<ObRawExpr *, 4> new_exec_params;
|
||||
@ -967,85 +960,67 @@ int ObTransformSubqueryCoalesce::merge_exists_subqueries(TransformParam &trans_p
|
||||
LOG_WARN("failed to create query ref expr", K(ret));
|
||||
} else if (OB_FAIL(new_query_ref->assign(*exist_query_ref))) {
|
||||
LOG_WARN("failed to assign query ref expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::copy_stmt(*stmt_factory,
|
||||
exist_stmt,
|
||||
reinterpret_cast<ObDMLStmt *&>(new_exist_stmt)))) {
|
||||
LOG_WARN("failed to copy exist stmt", K(ret));
|
||||
} else if (OB_FAIL(new_exist_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(ObTransformUtils::deep_copy_stmt(*stmt_factory, *expr_factory, exist_stmt,
|
||||
tmp_stmt))) {
|
||||
LOG_WARN("failed to deep copy stmt", K(ret));
|
||||
} else {
|
||||
new_exist_stmt = static_cast<ObSelectStmt*>(tmp_stmt);
|
||||
new_query_ref->set_ref_stmt(new_exist_stmt);
|
||||
new_exist_expr->get_param_expr(0) = new_query_ref;
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(merge_exec_params(not_exist_query_ref,
|
||||
new_query_ref,
|
||||
old_exec_params,
|
||||
new_exec_params))) {
|
||||
LOG_WARN("failed to merge exec params", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = not_exist_stmt->get_column_items().at(i);
|
||||
ObColumnRefRawExpr *col_expr = not_exist_stmt->get_column_items().at(i).expr_;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
ObRawExpr *error_expr = NULL;
|
||||
ObRawExpr *empty_expr = NULL;
|
||||
int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size() ||
|
||||
OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id(new_table_item->table_id_,
|
||||
col_item.column_id_))) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.expr_, new_expr))) {
|
||||
LOG_WARN("failed to copy expr node", K(ret));
|
||||
} else if (OB_NOT_NULL(col_item.default_value_expr_)
|
||||
&& OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_value_expr_, error_expr))) {
|
||||
LOG_WARN("failed to error expr node", K(ret));
|
||||
} else if (OB_NOT_NULL(col_item.default_empty_expr_)
|
||||
&& OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_empty_expr_, empty_expr))) {
|
||||
LOG_WARN("failed to empty expr node", K(ret));
|
||||
} else {
|
||||
ColumnItem new_col_item;
|
||||
new_col_item.table_id_ = new_table_item->table_id_;
|
||||
new_col_item.column_id_ = col_item.column_id_;
|
||||
new_col_item.column_name_ = col_item.column_name_;
|
||||
new_col_item.default_value_expr_ = error_expr;
|
||||
new_col_item.default_empty_expr_ = empty_expr;
|
||||
new_col_item.expr_ = static_cast<ObColumnRefRawExpr *>(new_expr);
|
||||
new_col_item.expr_->set_table_id(new_table_item->table_id_);
|
||||
new_col_item.expr_->set_table_name(new_table_item->table_name_);
|
||||
new_col_item.is_geo_ = col_item.is_geo_;
|
||||
new_col_item.col_idx_= col_item.col_idx_;
|
||||
if (OB_FAIL(new_exist_stmt->add_column_item(new_col_item))) {
|
||||
LOG_WARN("failed to add column item", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(old_cols.push_back(col_expr))) {
|
||||
LOG_WARN("failed to append column expr", K(ret));
|
||||
} else if (OB_FAIL(new_cols.push_back(new_expr))) {
|
||||
LOG_WARN("failed to append column expr", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
ObRawExprCopier copier(*expr_factory);
|
||||
if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
} else if (OB_FAIL(copier.add_replaced_expr(old_cols, new_cols))) {
|
||||
if (OB_FAIL(merge_exec_params(not_exist_query_ref, new_query_ref,
|
||||
old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to merge exec params", K(ret));
|
||||
} else if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
} else { /* do nothing */ }
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = not_exist_stmt->get_column_items().at(i);
|
||||
ColumnItem new_col_item;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size()) ||
|
||||
OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id(
|
||||
new_table_item->table_id_, col_item.column_id_))) {
|
||||
if (OB_FAIL(copier.add_replaced_expr(col_item.expr_, new_expr))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
}
|
||||
} else { /* do nothing */ }
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = not_exist_stmt->get_column_items().at(i);
|
||||
ColumnItem new_col_item;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size()) ||
|
||||
OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id(
|
||||
new_table_item->table_id_, col_item.column_id_))) {
|
||||
/* do nothing */
|
||||
} else if (OB_FAIL(new_col_item.deep_copy(copier, col_item))) {
|
||||
LOG_WARN("failed to deep copy column items", K(ret));
|
||||
} else if (OB_ISNULL(new_col_item.expr_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("column item isn't init", K(ret));
|
||||
} else {
|
||||
new_col_item.table_id_ = new_table_item->table_id_;
|
||||
new_col_item.expr_->set_table_id(new_table_item->table_id_);
|
||||
new_col_item.expr_->set_table_name(new_table_item->table_name_);
|
||||
if (OB_FAIL(new_exist_stmt->add_column_item(new_col_item))) {
|
||||
LOG_WARN("failed to add column item", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_condition_size(); ++i) {
|
||||
ObRawExpr *new_cond_expr = NULL;
|
||||
@ -1124,14 +1099,13 @@ int ObTransformSubqueryCoalesce::merge_any_all_subqueries(ObQueryRefRawExpr *any
|
||||
int ret = OB_SUCCESS;
|
||||
ObRawExprFactory *expr_factory = NULL;
|
||||
ObStmtFactory *stmt_factory = NULL;
|
||||
ObSEArray<ObRawExpr *, 4> old_cols;
|
||||
ObSEArray<ObRawExpr *, 4> new_cols;
|
||||
ObSEArray<ObRawExpr *, 4> extra_conds;
|
||||
ObSEArray<ObRawExpr *, 4> old_exec_params;
|
||||
ObSEArray<ObRawExpr *, 4> new_exec_params;
|
||||
ObQueryRefRawExpr *new_query_ref = NULL;
|
||||
ObSelectStmt *any_stmt = NULL;
|
||||
ObSelectStmt *all_stmt = NULL;
|
||||
ObDMLStmt *tmp_stmt = NULL;
|
||||
ObSelectStmt *new_any_stmt = NULL;
|
||||
const ObStmtMapInfo &map_info = trans_param.map_info_;
|
||||
if (OB_ISNULL(ctx_) ||
|
||||
@ -1147,90 +1121,74 @@ int ObTransformSubqueryCoalesce::merge_any_all_subqueries(ObQueryRefRawExpr *any
|
||||
LOG_WARN("any/all exprs are not valid", K(ret), K(expr_factory), K(stmt_factory),
|
||||
K(any_query_ref), K(all_query_ref), K(any_stmt), K(all_stmt));
|
||||
} else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory,
|
||||
trans_param.any_expr_,
|
||||
new_any_all_query))) {
|
||||
trans_param.any_expr_,
|
||||
new_any_all_query))) {
|
||||
LOG_WARN("failed to copy expr node", K(ret));
|
||||
} else if (OB_FAIL(expr_factory->create_raw_expr(T_REF_QUERY, new_query_ref))) {
|
||||
LOG_WARN("failed to create query ref expr", K(ret));
|
||||
} else if (OB_FAIL(new_query_ref->assign(*any_query_ref))) {
|
||||
LOG_WARN("failed to assign query ref expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::copy_stmt(*stmt_factory,
|
||||
any_stmt,
|
||||
reinterpret_cast<ObDMLStmt *&>(new_any_stmt)))) {
|
||||
LOG_WARN("failed to copy any stmt", K(ret));
|
||||
} else if (OB_FAIL(new_any_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(ObTransformUtils::deep_copy_stmt(*stmt_factory, *expr_factory, any_stmt,
|
||||
tmp_stmt))) {
|
||||
LOG_WARN("failed to deep copy stmt", K(ret));
|
||||
} else {
|
||||
new_any_stmt = static_cast<ObSelectStmt*>(tmp_stmt);
|
||||
new_query_ref->set_ref_stmt(new_any_stmt);
|
||||
new_any_all_query->get_param_expr(1) = new_query_ref;
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(merge_exec_params(all_query_ref,
|
||||
any_query_ref,
|
||||
old_exec_params,
|
||||
new_exec_params))) {
|
||||
LOG_WARN("failed to merge exec params", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = all_stmt->get_column_items().at(i);
|
||||
ObColumnRefRawExpr *col_expr = all_stmt->get_column_items().at(i).expr_;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
ObRawExpr *error_expr = NULL;
|
||||
ObRawExpr *empty_expr = NULL;
|
||||
int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_any_stmt->get_table_size() ||
|
||||
OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx))))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id(new_table_item->table_id_,
|
||||
col_item.column_id_))) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.expr_, new_expr))) {
|
||||
LOG_WARN("failed to copy expr node", K(ret));
|
||||
} else if (OB_NOT_NULL(col_item.default_value_expr_)
|
||||
&& OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_value_expr_, error_expr))) {
|
||||
LOG_WARN("failed to error expr node", K(ret));
|
||||
} else if (OB_NOT_NULL(col_item.default_empty_expr_)
|
||||
&& OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_empty_expr_, empty_expr))) {
|
||||
LOG_WARN("failed to empty expr node", K(ret));
|
||||
} else {
|
||||
ColumnItem new_col_item;
|
||||
new_col_item.table_id_ = new_table_item->table_id_;
|
||||
new_col_item.column_id_ = col_item.column_id_;
|
||||
new_col_item.column_name_ = col_item.column_name_;
|
||||
new_col_item.expr_ = static_cast<ObColumnRefRawExpr *>(new_expr);
|
||||
new_col_item.expr_->set_table_id(new_table_item->table_id_);
|
||||
new_col_item.expr_->set_table_name(new_table_item->table_name_);
|
||||
new_col_item.is_geo_ = col_item.is_geo_;
|
||||
new_col_item.default_value_expr_ = error_expr;
|
||||
new_col_item.default_empty_expr_ = empty_expr;
|
||||
new_col_item.col_idx_= col_item.col_idx_;
|
||||
if (OB_FAIL(new_any_stmt->add_column_item(new_col_item))) {
|
||||
LOG_WARN("failed to add column item", K(ret));
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(old_cols.push_back(col_expr))) {
|
||||
LOG_WARN("failed to append column expr", K(ret));
|
||||
} else if (OB_FAIL(new_cols.push_back(new_expr))) {
|
||||
LOG_WARN("failed to append column expr", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
ObRawExprCopier copier(*expr_factory);
|
||||
if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
} else if (OB_FAIL(copier.add_replaced_expr(old_cols, new_cols))) {
|
||||
if (OB_FAIL(merge_exec_params(all_query_ref, any_query_ref,
|
||||
old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to merge exec params", K(ret));
|
||||
} else if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
} else { /* do nothing */ }
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = all_stmt->get_column_items().at(i);
|
||||
ColumnItem new_col_item;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_any_stmt->get_table_size()) ||
|
||||
OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx)))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id(
|
||||
new_table_item->table_id_, col_item.column_id_))) {
|
||||
if (OB_FAIL(copier.add_replaced_expr(col_item.expr_, new_expr))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
}
|
||||
} else { /* do nothing */ }
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) {
|
||||
ColumnItem &col_item = all_stmt->get_column_items().at(i);
|
||||
ColumnItem new_col_item;
|
||||
ObRawExpr *new_expr = NULL;
|
||||
TableItem *new_table_item = NULL;
|
||||
int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1;
|
||||
if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() ||
|
||||
map_info.table_map_.at(idx) < 0 ||
|
||||
map_info.table_map_.at(idx) >= new_any_stmt->get_table_size()) ||
|
||||
OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx)))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table is not mapped", K(ret), K(idx));
|
||||
} else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id(
|
||||
new_table_item->table_id_, col_item.column_id_))) {
|
||||
/* do nothing */
|
||||
} else if (OB_FAIL(new_col_item.deep_copy(copier, col_item))) {
|
||||
LOG_WARN("failed to deep copy column items", K(ret));
|
||||
} else if (OB_ISNULL(new_col_item.expr_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("column item isn't init", K(ret));
|
||||
} else {
|
||||
new_col_item.table_id_ = new_table_item->table_id_;
|
||||
new_col_item.expr_->set_table_id(new_table_item->table_id_);
|
||||
new_col_item.expr_->set_table_name(new_table_item->table_name_);
|
||||
if (OB_FAIL(new_any_stmt->add_column_item(new_col_item))) {
|
||||
LOG_WARN("failed to add column item", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_condition_size(); ++i) {
|
||||
ObRawExpr *new_cond_expr = NULL;
|
||||
|
@ -7580,6 +7580,8 @@ int ObTransformUtils::pushdown_qualify_filters(ObSelectStmt *stmt)
|
||||
return ret;
|
||||
}
|
||||
|
||||
// stmt should call formalize_stmt after generate select_list,
|
||||
// and ref_query inside ths table has no need to call formalize again
|
||||
int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx,
|
||||
ObDMLStmt *stmt,
|
||||
TableItem *table,
|
||||
@ -7618,12 +7620,8 @@ int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx,
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
// do nothing
|
||||
} 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));
|
||||
}
|
||||
@ -13330,10 +13328,7 @@ int ObTransformUtils::create_view_with_pre_aggregate(ObSelectStmt *stmt,
|
||||
}
|
||||
// 4. link stmt and view_stmt
|
||||
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))) {
|
||||
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)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
@ -13358,8 +13353,6 @@ int ObTransformUtils::create_view_with_pre_aggregate(ObSelectStmt *stmt,
|
||||
LOG_WARN("failed to copy and replace stmt expr", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(session_info))) {
|
||||
LOG_WARN("failed to formalize stmt", 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));
|
||||
}
|
||||
|
@ -531,8 +531,6 @@ int ObWhereSubQueryPullup::pullup_correlated_subquery_as_view(ObDMLStmt *stmt,
|
||||
LOG_WARN("right_table should not be null", K(ret), K(right_table));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), expr))) {
|
||||
LOG_WARN("failed to remove condition expr", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_ref))) {
|
||||
LOG_WARN("failed to remove subquery expr", K(ret));
|
||||
} else {
|
||||
// select * from t1 where exists (select 1 from t2 where t1.c1 = c1 and c2 = 2 limit 1);
|
||||
// for the query contains correlated subquery above, limit 1 should be removed after transform.
|
||||
@ -594,11 +592,7 @@ int ObWhereSubQueryPullup::pullup_correlated_subquery_as_view(ObDMLStmt *stmt,
|
||||
LOG_WARN("failed to decorrelate semi conditions", K(ret));
|
||||
} else if (OB_FAIL(generate_semi_info(stmt, expr, right_table, semi_conds, info))) {
|
||||
LOG_WARN("failed to generate semi info", K(ret));
|
||||
} else if (OB_FAIL(stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(subquery->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(subquery->formalize_stmt(ctx_->session_info_))) {
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("formalize child stmt failed", K(ret));
|
||||
}
|
||||
}
|
||||
@ -1017,8 +1011,6 @@ int ObWhereSubQueryPullup::pullup_non_correlated_subquery_as_view(ObDMLStmt *stm
|
||||
LOG_WARN("table_item should not be null", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), expr))) {
|
||||
LOG_WARN("failed to remove condition expr", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), subquery_expr))) {
|
||||
LOG_WARN("failed to remove subquery expr", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::create_columns_for_view(ctx_, *table_item,
|
||||
stmt, column_exprs))) {
|
||||
LOG_WARN("failed to create columns for view", K(ret));
|
||||
@ -1027,11 +1019,7 @@ int ObWhereSubQueryPullup::pullup_non_correlated_subquery_as_view(ObDMLStmt *stm
|
||||
LOG_WARN("failed to generate new condition exprs", K(ret));
|
||||
} else if (OB_FAIL(generate_semi_info(stmt, expr, table_item, new_conditions, info))) {
|
||||
LOG_WARN("generate semi info failed", K(ret));
|
||||
} else if (OB_FAIL(stmt->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(subquery->adjust_subquery_list())) {
|
||||
LOG_WARN("failed to adjust subquery list", K(ret));
|
||||
} else if (OB_FAIL(subquery->formalize_stmt(ctx_->session_info_))) {
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
LOG_WARN("formalize child stmt failed", K(ret));
|
||||
}
|
||||
return ret;
|
||||
@ -1419,8 +1407,6 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt,
|
||||
} else if (OB_FAIL(stmt->get_stmt_hint().merge_stmt_hint(subquery->get_stmt_hint(),
|
||||
LEFT_HINT_DOMINATED))) {
|
||||
LOG_WARN("failed to merge subquery stmt hint", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_expr))) {
|
||||
LOG_WARN("remove expr failed", K(ret));
|
||||
} else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) {
|
||||
LOG_WARN("failed to replace inner stmt expr", K(ret));
|
||||
} else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user