diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index cb7d667ce8..715ed93ae0 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -1700,13 +1700,14 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info) return ret; } -int ObDMLStmt::formalize_stmt_expr_reference() +int ObDMLStmt::formalize_stmt_expr_reference(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info) { int ret = OB_SUCCESS; ObSEArray stmt_exprs; if (OB_FAIL(clear_sharable_expr_reference())) { LOG_WARN("failed to clear sharable expr reference", K(ret)); - } else if (OB_FAIL(formalize_child_stmt_expr_reference())) { + } else if (OB_FAIL(formalize_child_stmt_expr_reference(expr_factory, session_info))) { LOG_WARN("failed to formalize child stmt expr reference", K(ret)); } else if (OB_FAIL(get_relation_exprs(stmt_exprs))) { LOG_WARN("get relation exprs failed", K(ret)); @@ -1737,9 +1738,7 @@ int ObDMLStmt::formalize_stmt_expr_reference() } else { /*do nothing*/ } } if (OB_SUCC(ret)) { - if (is_select_stmt() && OB_FAIL(static_cast(this)->maintain_scala_group_by_ref())) { - LOG_WARN("failed to meantain scala group by", K(ret)); - } else if (OB_FAIL(remove_useless_sharable_expr())) { + if (OB_FAIL(remove_useless_sharable_expr(expr_factory, session_info))) { LOG_WARN("failed to remove useless sharable expr", K(ret)); } else if (OB_FAIL(check_pseudo_column_valid())) { LOG_WARN("failed to check pseudo column", K(ret)); @@ -1749,7 +1748,10 @@ int ObDMLStmt::formalize_stmt_expr_reference() return ret; } -int ObDMLStmt::formalize_child_stmt_expr_reference() + + +int ObDMLStmt::formalize_child_stmt_expr_reference(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info) { int ret = OB_SUCCESS; ObSEArray child_stmts; @@ -1761,7 +1763,7 @@ int ObDMLStmt::formalize_child_stmt_expr_reference() if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("stmt is null", K(ret)); - } else if (OB_FAIL(SMART_CALL(stmt->formalize_stmt_expr_reference()))) { + } else if (OB_FAIL(SMART_CALL(stmt->formalize_stmt_expr_reference(expr_factory, session_info)))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else { /*do nothing*/ } } @@ -1924,9 +1926,12 @@ int ObDMLStmt::generated_column_depend_column_is_referred(ObRawExpr *expr, bool return ret; } -int ObDMLStmt::remove_useless_sharable_expr() +int ObDMLStmt::remove_useless_sharable_expr(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info) { int ret = OB_SUCCESS; + UNUSED(expr_factory); + UNUSED(session_info); for (int64_t i = column_items_.count() - 1; OB_SUCC(ret) && i >= 0; i--) { ObColumnRefRawExpr *expr = NULL; if (OB_ISNULL(expr = column_items_.at(i).expr_)) { diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index d3ffea8e13..e2cda01a85 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -807,12 +807,14 @@ public: int pull_all_expr_relation_id(); int formalize_stmt(ObSQLSessionInfo *session_info); int formalize_relation_exprs(ObSQLSessionInfo *session_info); - int formalize_stmt_expr_reference(); - int formalize_child_stmt_expr_reference(); + int formalize_stmt_expr_reference(ObRawExprFactory *expr_factory, ObSQLSessionInfo *session_info); + int formalize_child_stmt_expr_reference(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info); int set_sharable_expr_reference(ObRawExpr &expr, ExplicitedRefType ref_type); int check_pseudo_column_valid(); int get_ora_rowscn_column(const uint64_t table_id, ObPseudoColumnRawExpr *&ora_rowscn); - virtual int remove_useless_sharable_expr(); + virtual int remove_useless_sharable_expr(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info); virtual int clear_sharable_expr_reference(); virtual int get_from_subquery_stmts(common::ObIArray &child_stmts) const; virtual int get_subquery_stmts(common::ObIArray &child_stmts) const; diff --git a/src/sql/resolver/dml/ob_select_stmt.cpp b/src/sql/resolver/dml/ob_select_stmt.cpp index 573839f26c..076dfe3c43 100644 --- a/src/sql/resolver/dml/ob_select_stmt.cpp +++ b/src/sql/resolver/dml/ob_select_stmt.cpp @@ -800,13 +800,18 @@ int ObSelectStmt::clear_sharable_expr_reference() return ret; } -int ObSelectStmt::remove_useless_sharable_expr() +int ObSelectStmt::remove_useless_sharable_expr(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info) { int ret = OB_SUCCESS; - if (OB_FAIL(ObDMLStmt::remove_useless_sharable_expr())) { + if (OB_ISNULL(expr_factory)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else if (OB_FAIL(ObDMLStmt::remove_useless_sharable_expr(expr_factory, session_info))) { LOG_WARN("failed to remove useless sharable expr", K(ret)); } else { ObRawExpr *expr = NULL; + const bool is_scala = is_scala_group_by(); for (int64_t i = agg_items_.count() - 1; OB_SUCC(ret) && i >= 0; i--) { if (OB_ISNULL(expr = agg_items_.at(i))) { ret = OB_ERR_UNEXPECTED; @@ -831,6 +836,17 @@ int ObSelectStmt::remove_useless_sharable_expr() LOG_TRACE("succeed to remove win func exprs", K(*expr)); } } + if (OB_SUCC(ret) && is_scala && agg_items_.empty()) { + ObAggFunRawExpr *aggr_expr = NULL; + if (OB_FAIL(ObRawExprUtils::build_dummy_count_expr(*expr_factory, session_info, aggr_expr))) { + LOG_WARN("failed to build a dummy expr", K(ret)); + } else if (OB_FAIL(agg_items_.push_back(aggr_expr))) { + LOG_WARN("failed to push back", K(ret)); + } else if (OB_FAIL(set_sharable_expr_reference(*aggr_expr, + ExplicitedRefType::REF_BY_NORMAL))) { + LOG_WARN("failed to set sharable exprs reference", K(ret)); + } else {/* do nothing */} + } } return ret; } @@ -1305,28 +1321,3 @@ ObRawExpr* ObSelectStmt::get_pure_set_expr(ObRawExpr *expr) } return expr; } - -// add ref count to the last aggr item to maintain the scala group by -int ObSelectStmt::maintain_scala_group_by_ref() -{ - int ret = OB_SUCCESS; - bool has_ref = false; - if (is_scala_group_by()) { - for (int64_t i = 0; OB_SUCC(ret) && i < agg_items_.count(); ++i) { - ObAggFunRawExpr *agg_expr = agg_items_.at(i); - if (OB_ISNULL(agg_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("agg expr is NULL", K(ret)); - } else if (agg_expr->is_explicited_reference()) { - has_ref = true; - break; - } - } - if (OB_FAIL(ret) || has_ref) { - // do nothing - } else if (OB_FAIL(set_sharable_expr_reference(*agg_items_.at(0), ExplicitedRefType::REF_BY_NORMAL))) { - LOG_WARN("fail to set expr reference", K(ret)); - } - } - return ret; -} \ No newline at end of file diff --git a/src/sql/resolver/dml/ob_select_stmt.h b/src/sql/resolver/dml/ob_select_stmt.h index e3f498d85f..1aa22d0f18 100644 --- a/src/sql/resolver/dml/ob_select_stmt.h +++ b/src/sql/resolver/dml/ob_select_stmt.h @@ -437,8 +437,8 @@ public: bool is_from_pivot() const { return is_from_pivot_; } bool has_hidden_rowid() const; virtual int clear_sharable_expr_reference() override; - virtual int remove_useless_sharable_expr() override; - int maintain_scala_group_by_ref(); + virtual int remove_useless_sharable_expr(ObRawExprFactory *expr_factory, + ObSQLSessionInfo *session_info) override; const common::ObIArray& get_search_by_items() const { return search_by_items_; } const common::ObIArray& get_cycle_items() const { return cycle_by_items_; } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index a3979287be..1503876ab3 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -8789,5 +8789,29 @@ bool ObRawExprUtils::is_column_ref_skip_implicit_cast(const ObRawExpr *expr) return bret; } +int ObRawExprUtils::build_dummy_count_expr(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo *session_info, + ObAggFunRawExpr *&expr) +{ + int ret = OB_SUCCESS; + ObConstRawExpr *one_expr = NULL; + ObAggFunRawExpr *count_expr = NULL; + if (OB_FAIL(build_const_int_expr(expr_factory, ObInt32Type, static_cast(1), one_expr))) { + LOG_WARN("failed build const int expr for default expr", K(ret)); + } else if (OB_ISNULL(one_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("operator is unexpected null", K(ret)); + } else if (OB_FAIL(expr_factory.create_raw_expr(T_FUN_COUNT, count_expr))) { + LOG_WARN("fail to create const raw expr", K(ret)); + } else if (OB_FAIL(count_expr->add_real_param_expr(one_expr))) { + LOG_WARN("fail to push back", K(ret)); + } else if (OB_FAIL(count_expr->formalize(session_info))) { + LOG_WARN("failed to extract expr info", K(ret)); + } else { + expr = count_expr; + } + return ret; +} + } } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 28b3a5960a..a9d2e92498 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -1147,6 +1147,9 @@ public: static int check_is_valid_generated_col(ObRawExpr *expr, ObIAllocator &allocator); static bool is_column_ref_skip_implicit_cast(const ObRawExpr *expr); + static int build_dummy_count_expr(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo *session_info, + ObAggFunRawExpr *&expr); private : static int create_real_cast_expr(ObRawExprFactory &expr_factory, diff --git a/src/sql/rewrite/ob_transform_or_expansion.cpp b/src/sql/rewrite/ob_transform_or_expansion.cpp index 4741059eea..8daeca8bd5 100644 --- a/src/sql/rewrite/ob_transform_or_expansion.cpp +++ b/src/sql/rewrite/ob_transform_or_expansion.cpp @@ -1262,7 +1262,7 @@ int ObTransformOrExpansion::get_trans_view(ObDMLStmt *stmt, LOG_WARN("get unexpected error", K(ret), K(upper_stmt)); } else if (OB_FAIL(ObTransformUtils::create_simple_view(ctx_, upper_stmt, child_stmt, false))) { LOG_WARN("failed to create simple view", K(ret)); - } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference(expr_factory, ctx_->session_info_))) { LOG_WARN("failed to formalize stmt expr reference", K(ret)); } return ret; diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 4d44215164..42c1802465 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -2470,7 +2470,7 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt) LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } else if (OB_FAIL(stmt.formalize_stmt(session_info))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(stmt.formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt.formalize_stmt_expr_reference(expr_factory, session_info))) { LOG_WARN("failed to formalize stmt expr reference", K(ret)); } } @@ -4528,7 +4528,7 @@ int ObTransformPreProcess::transform_merge_into_subquery(ObMergeStmt *merge_stmt update_has_subquery, delete_subquery_exprs))) { LOG_WARN("failed to allocate delete condition subquery", K(ret)); - } else if (OB_FAIL(merge_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(merge_stmt->formalize_stmt_expr_reference(expr_factory, ctx_->session_info_))) { LOG_WARN("failed to formalize stmt expr reference", K(ret)); } return ret; diff --git a/src/sql/rewrite/ob_transform_rule.cpp b/src/sql/rewrite/ob_transform_rule.cpp index 0827317c47..516946417d 100644 --- a/src/sql/rewrite/ob_transform_rule.cpp +++ b/src/sql/rewrite/ob_transform_rule.cpp @@ -570,7 +570,8 @@ int ObTransformRule::prepare_eval_cost_stmt(common::ObIArray &p if (OB_FAIL(ret)) { } else if (OB_FAIL(copied_stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(copied_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(copied_stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, + ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); } return ret; @@ -779,7 +780,8 @@ int ObTransformRule::transform_self(common::ObIArray &parent_st // do nothing } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, + ctx_->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else if ((!stmt->is_delete_stmt() && !stmt->is_update_stmt()) || stmt->has_instead_of_trigger()) { diff --git a/src/sql/rewrite/ob_transform_simplify_winfunc.cpp b/src/sql/rewrite/ob_transform_simplify_winfunc.cpp index 253c5b7b7f..6422feadc9 100644 --- a/src/sql/rewrite/ob_transform_simplify_winfunc.cpp +++ b/src/sql/rewrite/ob_transform_simplify_winfunc.cpp @@ -543,7 +543,7 @@ int ObTransformSimplifyWinfunc::check_stmt_win_can_be_removed(ObSelectStmt *sele LOG_WARN("failed to check stmt unique", K(ret)); } else if (!is_unique) { /*do nothing*/ - } else if (BoundType::BOUND_CURRENT_ROW != win_expr->get_upper().type_ + } else if (BoundType::BOUND_CURRENT_ROW != win_expr->get_lower().type_ && BoundType::BOUND_CURRENT_ROW != win_expr->get_upper().type_ && win_expr->get_upper().is_preceding_ == win_expr->get_lower().is_preceding_) { //upper 与 lower 均非 BOUND_CURRENT_ROW 且 is_preceding 相同时, 可能出现不包含当前行的窗口, 禁止消除 diff --git a/src/sql/rewrite/ob_transform_temp_table.cpp b/src/sql/rewrite/ob_transform_temp_table.cpp index d89868d328..d4a0c0e10f 100644 --- a/src/sql/rewrite/ob_transform_temp_table.cpp +++ b/src/sql/rewrite/ob_transform_temp_table.cpp @@ -1176,7 +1176,8 @@ int ObTransformTempTable::create_temp_table(ObDMLStmt &root_stmt, if (OB_ISNULL(stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null stmt", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, + ctx_->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } } @@ -1186,7 +1187,8 @@ int ObTransformTempTable::create_temp_table(ObDMLStmt &root_stmt, LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } else if (OB_FAIL(temp_table_query->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(temp_table_query->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(temp_table_query->formalize_stmt_expr_reference(ctx_->expr_factory_, + ctx_->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } } @@ -2595,7 +2597,8 @@ int ObTransformTempTable::prepare_eval_cte_cost_stmt(ObDMLStmt &root_stmt, if (OB_FAIL(ret)) { } else if (OB_FAIL(copied_stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(copied_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(copied_stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, + ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); } return ret; diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index ccabc96a39..98ee529651 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -6725,7 +6725,8 @@ int ObTransformUtils::create_view_with_groupby_items(ObSelectStmt *stmt, LOG_WARN("failed to append", 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())) { + } else if (OB_FAIL(view_stmt->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { 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)); @@ -12985,7 +12986,8 @@ int ObTransformUtils::create_view_with_pre_aggregate(ObSelectStmt *stmt, 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())) { + } else if (OB_FAIL(view_stmt->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { 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)); @@ -13912,9 +13914,11 @@ int ObTransformUtils::expand_temp_table(ObTransformerCtx *ctx, ObDMLStmt::TempTa LOG_WARN("unexpect null stmt", K(ret)); } else if (OB_FAIL(temp_table_query->formalize_stmt(ctx->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(temp_table_query->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(temp_table_query->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); - } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } } else if (OB_FAIL(ctx->stmt_factory_->create_stmt(child_stmt))) { @@ -13928,7 +13932,8 @@ int ObTransformUtils::expand_temp_table(ObTransformerCtx *ctx, ObDMLStmt::TempTa LOG_WARN("failed to deep copy stmt", 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(child_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(child_stmt->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else if (OB_FAIL(child_stmt->recursive_adjust_statement_id(ctx->allocator_, ctx->src_hash_val_, @@ -13936,7 +13941,8 @@ int ObTransformUtils::expand_temp_table(ObTransformerCtx *ctx, ObDMLStmt::TempTa LOG_WARN("failed to recursive adjust statement id", K(ret)); } else if (OB_FAIL(child_stmt->update_stmt_table_id(*temp_table_query))) { LOG_WARN("failed to update table id", K(ret)); - } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(upper_stmt->formalize_stmt_expr_reference(ctx->expr_factory_, + ctx->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else { table->ref_query_ = child_stmt; diff --git a/src/sql/rewrite/ob_transformer_impl.cpp b/src/sql/rewrite/ob_transformer_impl.cpp index 1243370c58..6acdc14c72 100644 --- a/src/sql/rewrite/ob_transformer_impl.cpp +++ b/src/sql/rewrite/ob_transformer_impl.cpp @@ -74,13 +74,13 @@ int ObTransformerImpl::transform(ObDMLStmt *&stmt) LOG_WARN("failed to do transform pre_precessing", K(ret)); } else if (OB_FAIL(stmt->formalize_query_ref_exprs())) { LOG_WARN("failed to formalize query ref exprs"); - } else if (OB_FAIL(stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, ctx_->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else if (OB_FAIL(do_transform(stmt))) { LOG_WARN("failed to do transform", K(ret)); } else if (OB_FAIL(do_transform_dblink_read(stmt))) { LOG_WARN("failed to do transform dblink read", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, ctx_->session_info_))) { LOG_WARN("failed to formalize stmt reference", K(ret)); } else if (OB_FAIL(do_after_transform(stmt))) { LOG_WARN("failed deal after transform", K(ret)); @@ -302,7 +302,7 @@ int ObTransformerImpl::transform_rule_set(ObDMLStmt *&stmt, need_next_iteration = false; } else if (OB_FAIL(stmt->formalize_query_ref_exprs())) { LOG_WARN("failed to formalize subquery exprs", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt_expr_reference())) { + } else if (OB_FAIL(stmt->formalize_stmt_expr_reference(ctx_->expr_factory_, ctx_->session_info_))) { LOG_WARN("failed to formalize stmt expr", K(ret)); } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret));