Fix lead/lag window is wrong type calc for the enumset

This commit is contained in:
hezuojiao
2023-01-28 20:01:52 +08:00
committed by ob-robot
parent 629db12031
commit cdc45b3bb7
3 changed files with 45 additions and 29 deletions

View File

@ -2422,7 +2422,7 @@ int ObRawExprDeduceType::visit(ObWinFunRawExpr &expr)
LOG_WARN("failed to create raw expr.", K(ret));
} else {
func_params.at(0) = cast_expr;
expr.set_result_type(func_params.at(0)->get_result_type());
expr.set_result_type(res_type);
expr.set_enum_set_values(func_params.at(0)->get_enum_set_values());
}
}
@ -2434,15 +2434,14 @@ int ObRawExprDeduceType::visit(ObWinFunRawExpr &expr)
// lead和lag函数的第三个参数,应当转换为第一个参数的类型,加cast,这里不能在执行层转。
// bug: https://work.aone.alibaba-inc.com/issue/24115140
if (OB_SUCC(ret) && func_params.count() == 3) {
ObSysFunRawExpr *cast_expr = NULL;
ObRawExpr *cast_expr = NULL;
ObCastMode def_cast_mode = CM_NONE;
if (OB_ISNULL(expr_factory_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpect null pointer", K(ret));
} else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*expr_factory_,
func_params.at(2),
func_params.at(0)->get_result_type(),
cast_expr,
my_session_))) {
} else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(false, 0, my_session_, def_cast_mode))) {
LOG_WARN("get_default_cast_mode failed", K(ret));
} else if (OB_FAIL(try_add_cast_expr_above_for_deduce_type(*func_params.at(2), cast_expr, expr.get_result_type(), def_cast_mode))) {
LOG_WARN("failed to create raw expr.", K(ret));
} else {
func_params.at(2) = cast_expr;

View File

@ -261,10 +261,18 @@ int ObRawExprWrapEnumSet::visit(ObWinFunRawExpr &expr)
{
int ret = OB_SUCCESS;
if (expr.has_enum_set_column() || expr.has_flag(CNT_SUB_QUERY)) {
ObAggFunRawExpr *agg_raw_expr = expr.get_agg_expr();
if (OB_ISNULL(agg_raw_expr)) {
} else if (OB_FAIL(ObRawExprWrapEnumSet::visit(*agg_raw_expr))) {
LOG_WARN("fail to visit agg expr in window function", K(ret), K(agg_raw_expr));
if (T_WIN_FUN_LEAD == expr.get_func_type() ||
T_WIN_FUN_LAG == expr.get_func_type()) {
ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_func_params();
if (OB_FAIL(wrap_param_expr(real_parm_exprs, expr.get_data_type()))) {
LOG_WARN("failed to warp param expr", K(ret));
}
} else {
ObAggFunRawExpr *agg_raw_expr = expr.get_agg_expr();
if (OB_ISNULL(agg_raw_expr)) {
} else if (OB_FAIL(ObRawExprWrapEnumSet::visit(*agg_raw_expr))) {
LOG_WARN("fail to visit agg expr in window function", K(ret), K(agg_raw_expr));
}
}
}
return ret;
@ -739,24 +747,9 @@ int ObRawExprWrapEnumSet::visit(ObAggFunRawExpr &expr)
T_FUN_JSON_ARRAYAGG == expr.get_expr_type() ||
T_FUN_ORA_JSON_ARRAYAGG == expr.get_expr_type() ||
T_FUN_ORA_JSON_OBJECTAGG == expr.get_expr_type())) {
const ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_real_param_exprs();
const bool is_same_need = false;
for (int64_t i = 0; OB_SUCC(ret) && i < real_parm_exprs.count(); ++i) {
ObRawExpr *real_param_expr = real_parm_exprs.at(i);
if (OB_ISNULL(real_param_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("real param expr is null", K(i));
} else if (ob_is_enumset_tc(real_param_expr->get_data_type())) {
//here is special
ObObjType calc_type = expr.get_data_type();
ObSysFunRawExpr *wrapped_expr = NULL;
if (OB_FAIL(wrap_type_to_str_if_necessary(real_param_expr, calc_type,
is_same_need, wrapped_expr))) {
LOG_WARN("failed to wrap_type_to_str_if_necessary", K(i), K(ret));
} else if ((NULL != wrapped_expr) && OB_FAIL(expr.replace_real_param_expr(i, wrapped_expr))) {
LOG_WARN("failed to replace param expr", K(i), K(ret));
} else {/*do nothing*/}
} else {/*do nothing*/}
ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_real_param_exprs_for_update();
if (OB_FAIL(wrap_param_expr(real_parm_exprs, expr.get_data_type()))) {
LOG_WARN("failed to warp param expr", K(ret));
}
}
return ret;
@ -936,5 +929,28 @@ int ObRawExprWrapEnumSet::visit_query_ref_expr(ObQueryRefRawExpr &expr,
}
return ret;
}
int ObRawExprWrapEnumSet::wrap_param_expr(ObIArray<ObRawExpr*> &param_exprs, ObObjType dest_type)
{
int ret = OB_SUCCESS;
const bool is_same_need = false;
for (int64_t i = 0; OB_SUCC(ret) && i < param_exprs.count(); ++i) {
ObRawExpr *param_expr = param_exprs.at(i);
if (OB_ISNULL(param_expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("real param expr is null", K(i));
} else if (ob_is_enumset_tc(param_expr->get_data_type())) {
ObSysFunRawExpr *wrapped_expr = NULL;
if (OB_FAIL(wrap_type_to_str_if_necessary(param_expr, dest_type,
is_same_need, wrapped_expr))) {
LOG_WARN("failed to wrap_type_to_str_if_necessary", K(i), K(ret));
} else if (NULL != wrapped_expr) {
param_exprs.at(i) = wrapped_expr;
} else {/*do nothing*/}
} else {/*do nothing*/}
}
return ret;
}
} // namespace sql
} // namespace oceanbase

View File

@ -74,6 +74,7 @@ private:
int visit_query_ref_expr(ObQueryRefRawExpr &expr,
const common::ObObjType dest_type,
const bool is_same_need);
int wrap_param_expr(ObIArray<ObRawExpr*> &param_exprs, ObObjType dest_typ);
private:
ObDMLStmt *cur_stmt_;
ObRawExprFactory &expr_factory_;