diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 9e6ba4954b..b9a692f1bd 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -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; diff --git a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp index 2598bacba0..e2f42ebaf1 100644 --- a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.cpp @@ -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 &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 &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 &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 ¶m_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 diff --git a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.h b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.h index 4a0c9968a4..009cebc7d5 100644 --- a/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.h +++ b/src/sql/resolver/expr/ob_raw_expr_wrap_enum_set.h @@ -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 ¶m_exprs, ObObjType dest_typ); private: ObDMLStmt *cur_stmt_; ObRawExprFactory &expr_factory_;