diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index a73a49f8da..cb7d667ce8 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -1737,7 +1737,9 @@ int ObDMLStmt::formalize_stmt_expr_reference() } else { /*do nothing*/ } } if (OB_SUCC(ret)) { - if (OB_FAIL(remove_useless_sharable_expr())) { + 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())) { 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)); diff --git a/src/sql/resolver/dml/ob_select_stmt.cpp b/src/sql/resolver/dml/ob_select_stmt.cpp index e999578597..573839f26c 100644 --- a/src/sql/resolver/dml/ob_select_stmt.cpp +++ b/src/sql/resolver/dml/ob_select_stmt.cpp @@ -1305,3 +1305,28 @@ 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 dc26c7d7c4..e3f498d85f 100644 --- a/src/sql/resolver/dml/ob_select_stmt.h +++ b/src/sql/resolver/dml/ob_select_stmt.h @@ -438,6 +438,7 @@ public: 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(); 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/rewrite/ob_transform_count_to_exists.cpp b/src/sql/rewrite/ob_transform_count_to_exists.cpp index 34447dd3b6..7a1218957c 100644 --- a/src/sql/rewrite/ob_transform_count_to_exists.cpp +++ b/src/sql/rewrite/ob_transform_count_to_exists.cpp @@ -434,6 +434,7 @@ int ObTransformCountToExists::do_transform(ObDMLStmt *stmt, } if (OB_FAIL(ret)) { } else if (OB_FALSE_IT(subquery->get_select_items().reuse())) { + } else if (OB_FALSE_IT(subquery->get_aggr_items().reuse())) { } else if (OB_FAIL(ObTransformUtils::create_dummy_select_item(*subquery, ctx_))) { LOG_WARN("failed to create dummy select item", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(),