Fix lead/lag window is wrong type calc for the enumset
This commit is contained in:
		| @ -2422,7 +2422,7 @@ int ObRawExprDeduceType::visit(ObWinFunRawExpr &expr) | |||||||
|           LOG_WARN("failed to create raw expr.", K(ret)); |           LOG_WARN("failed to create raw expr.", K(ret)); | ||||||
|         } else { |         } else { | ||||||
|           func_params.at(0) = cast_expr; |           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()); |           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,这里不能在执行层转。 |     // lead和lag函数的第三个参数,应当转换为第一个参数的类型,加cast,这里不能在执行层转。 | ||||||
|     // bug: https://work.aone.alibaba-inc.com/issue/24115140 |     // bug: https://work.aone.alibaba-inc.com/issue/24115140 | ||||||
|     if (OB_SUCC(ret) && func_params.count() == 3) { |     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_)) { |       if (OB_ISNULL(expr_factory_)) { | ||||||
|         ret = OB_ERR_UNEXPECTED; |         ret = OB_ERR_UNEXPECTED; | ||||||
|         LOG_WARN("unexpect null pointer", K(ret)); |         LOG_WARN("unexpect null pointer", K(ret)); | ||||||
|       } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(*expr_factory_, |       } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(false, 0, my_session_, def_cast_mode))) { | ||||||
|                                                           func_params.at(2), |           LOG_WARN("get_default_cast_mode failed", K(ret)); | ||||||
|                                                           func_params.at(0)->get_result_type(), |       } 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))) { | ||||||
|                                                           cast_expr, |  | ||||||
|                                                           my_session_))) { |  | ||||||
|         LOG_WARN("failed to create raw expr.", K(ret)); |         LOG_WARN("failed to create raw expr.", K(ret)); | ||||||
|       } else { |       } else { | ||||||
|         func_params.at(2) = cast_expr; |         func_params.at(2) = cast_expr; | ||||||
|  | |||||||
| @ -261,10 +261,18 @@ int ObRawExprWrapEnumSet::visit(ObWinFunRawExpr &expr) | |||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   if (expr.has_enum_set_column() || expr.has_flag(CNT_SUB_QUERY)) { |   if (expr.has_enum_set_column() || expr.has_flag(CNT_SUB_QUERY)) { | ||||||
|     ObAggFunRawExpr *agg_raw_expr = expr.get_agg_expr(); |     if (T_WIN_FUN_LEAD == expr.get_func_type() || | ||||||
|     if (OB_ISNULL(agg_raw_expr)) { |           T_WIN_FUN_LAG == expr.get_func_type()) { | ||||||
|     } else if (OB_FAIL(ObRawExprWrapEnumSet::visit(*agg_raw_expr))) { |       ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_func_params(); | ||||||
|       LOG_WARN("fail to visit agg expr in window function", K(ret), K(agg_raw_expr)); |       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; |   return ret; | ||||||
| @ -739,24 +747,9 @@ int ObRawExprWrapEnumSet::visit(ObAggFunRawExpr &expr) | |||||||
|       T_FUN_JSON_ARRAYAGG == expr.get_expr_type() || |       T_FUN_JSON_ARRAYAGG == expr.get_expr_type() || | ||||||
|       T_FUN_ORA_JSON_ARRAYAGG == expr.get_expr_type() || |       T_FUN_ORA_JSON_ARRAYAGG == expr.get_expr_type() || | ||||||
|       T_FUN_ORA_JSON_OBJECTAGG == expr.get_expr_type())) { |       T_FUN_ORA_JSON_OBJECTAGG == expr.get_expr_type())) { | ||||||
|     const ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_real_param_exprs(); |     ObIArray<ObRawExpr*> &real_parm_exprs = expr.get_real_param_exprs_for_update(); | ||||||
|     const bool is_same_need = false; |     if (OB_FAIL(wrap_param_expr(real_parm_exprs, expr.get_data_type()))) { | ||||||
|     for (int64_t i = 0; OB_SUCC(ret) && i < real_parm_exprs.count(); ++i) { |       LOG_WARN("failed to warp param expr", K(ret)); | ||||||
|       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*/} |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
| @ -936,5 +929,28 @@ int ObRawExprWrapEnumSet::visit_query_ref_expr(ObQueryRefRawExpr &expr, | |||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int ObRawExprWrapEnumSet::wrap_param_expr(ObIArray<ObRawExpr*> ¶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 sql | ||||||
| }  // namespace oceanbase | }  // namespace oceanbase | ||||||
|  | |||||||
| @ -74,6 +74,7 @@ private: | |||||||
|   int visit_query_ref_expr(ObQueryRefRawExpr &expr, |   int visit_query_ref_expr(ObQueryRefRawExpr &expr, | ||||||
|                            const common::ObObjType dest_type, |                            const common::ObObjType dest_type, | ||||||
|                            const bool is_same_need); |                            const bool is_same_need); | ||||||
|  |   int wrap_param_expr(ObIArray<ObRawExpr*> ¶m_exprs, ObObjType dest_typ); | ||||||
| private: | private: | ||||||
|   ObDMLStmt *cur_stmt_; |   ObDMLStmt *cur_stmt_; | ||||||
|   ObRawExprFactory &expr_factory_; |   ObRawExprFactory &expr_factory_; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 hezuojiao
					hezuojiao