[CP] [CP] [中信证券]support listagg aggr use group by column as separator

This commit is contained in:
wangt1xiuyi
2024-02-08 04:39:07 +00:00
committed by ob-robot
parent e43ed652cd
commit 154f795315
11 changed files with 311 additions and 44 deletions

View File

@ -5614,6 +5614,10 @@ int ObSelectResolver::add_aggr_expr(ObAggFunRawExpr *&final_aggr_expr)
LOG_WARN("failed to check and get same aggr item.", K(ret));
} else if (same_aggr_expr != NULL) {
final_aggr_expr = same_aggr_expr;
} else if (lib::is_oracle_mode() &&
final_aggr_expr->get_expr_type() == T_FUN_GROUP_CONCAT &&
OB_FAIL(check_listagg_aggr_param_valid(final_aggr_expr))) {
LOG_WARN("failed to check list agg param valid", K(ret));
} else if (OB_FAIL(select_stmt->add_agg_item(*final_aggr_expr))) {
LOG_WARN("add new aggregate function failed", K(ret));
}
@ -5953,7 +5957,7 @@ int ObSelectResolver::check_window_exprs()
//do nothing...
} else if (T_FUN_GROUP_CONCAT == win_expr->get_func_type() && NULL != win_expr->get_agg_expr() && is_oracle_mode()) {
if (win_expr->get_agg_expr()->get_real_param_exprs().count() > 2) {
ret = OB_INVALID_ARGUMENT_NUM;
ret = OB_ERR_PARAM_SIZE;
LOG_WARN("incorrect argument number to call listagg", K(win_expr->get_agg_expr()->get_real_param_exprs().count()));
} else if (win_expr->get_agg_expr()->get_real_param_exprs().count() == 2) {
if (OB_FAIL(arg_exprs.push_back(win_expr->get_agg_expr()->get_real_param_exprs().at(1)))) {
@ -6810,5 +6814,37 @@ int ObSelectResolver::adjust_recursive_cte_table_columns(const ObSelectStmt* par
return ret;
}
int ObSelectResolver::check_listagg_aggr_param_valid(ObAggFunRawExpr *aggr_expr)
{
int ret = OB_SUCCESS;
if (lib::is_oracle_mode()) {
ObSEArray<ObRawExpr*, 4> check_separator_exprs;
ObSEArray<ObRawExpr*, 4> all_group_by_exprs;
if (OB_ISNULL(aggr_expr) || OB_ISNULL(get_select_stmt())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret));
} else if (aggr_expr->get_expr_type() != T_FUN_GROUP_CONCAT ||
aggr_expr->get_real_param_count() < 2) {
//do nothing
} else if (OB_UNLIKELY(aggr_expr->get_real_param_count() > 2)) {
ret = OB_ERR_PARAM_SIZE;
LOG_WARN("invalid number of arguments", K(ret), KPC(aggr_expr));
} else if (aggr_expr->get_real_param_exprs().at(aggr_expr->get_real_param_count() - 1)->is_const_expr()) {
//do nothing
} else if (OB_FAIL(check_separator_exprs.push_back(aggr_expr->get_real_param_exprs().at(aggr_expr->get_real_param_count() - 1)))) {
LOG_WARN("failed to push back", K(ret));
} else if (get_select_stmt()->get_all_group_by_exprs(all_group_by_exprs)) {
LOG_WARN("failed to get all group by exprs", K(ret));
} else if (OB_FAIL(ObGroupByChecker::check_by_expr(params_.param_list_,
get_select_stmt(),
all_group_by_exprs,
check_separator_exprs,
OB_ERR_ARGUMENT_SHOULD_CONSTANT_OR_GROUP_EXPR))) {
LOG_WARN("fail to check by expr", K(ret));
}
}
return ret;
}
} // namespace sql
} // namespace oceanbase