diff --git a/src/sql/engine/expr/ob_expr_array_map.cpp b/src/sql/engine/expr/ob_expr_array_map.cpp index bfa4af859..30060d999 100644 --- a/src/sql/engine/expr/ob_expr_array_map.cpp +++ b/src/sql/engine/expr/ob_expr_array_map.cpp @@ -258,6 +258,12 @@ int ObExprArrayMap::eval_array_map(const ObExpr &expr, ObEvalCtx &ctx, ObDatum & lambda_para->locate_datum_for_write(ctx).set_int(val); break; } + case ObSmallIntType: { + ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); + int16_t val = (*arr_ptr)[i]; + lambda_para->locate_datum_for_write(ctx).set_int(val); + break; + } case ObInt32Type: { ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); int32_t val = (*arr_ptr)[i]; @@ -276,12 +282,32 @@ int ObExprArrayMap::eval_array_map(const ObExpr &expr, ObEvalCtx &ctx, ObDatum & lambda_para->locate_datum_for_write(ctx).set_uint(val); break; } + case ObUFloatType: case ObFloatType: { ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); float val = (*arr_ptr)[i]; lambda_para->locate_datum_for_write(ctx).set_float(val); break; } + case ObUTinyIntType: { + ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); + uint8_t val = (*arr_ptr)[i]; + lambda_para->locate_datum_for_write(ctx).set_uint(val); + break; + } + case ObUSmallIntType: { + ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); + uint16_t val = (*arr_ptr)[i]; + lambda_para->locate_datum_for_write(ctx).set_uint(val); + break; + } + case ObUInt32Type: { + ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); + uint32_t val = (*arr_ptr)[i]; + lambda_para->locate_datum_for_write(ctx).set_uint(val); + break; + } + case ObUDoubleType: case ObDoubleType: { ObArrayFixedSize *arr_ptr = static_cast *>(arr_obj[para_idx]); double val = (*arr_ptr)[i]; @@ -347,7 +373,7 @@ int ObExprArrayMap::eval_array_map(const ObExpr &expr, ObEvalCtx &ctx, ObDatum & return ret; } -int ObExprArrayMap::get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray ¶m_idx, +int ObExprArrayMap::get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray ¶m_idx, int depth, ObArray ¶m_exprs) const { int ret = OB_SUCCESS; @@ -380,9 +406,12 @@ int ObExprArrayMap::get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArr if (OB_ISNULL(child_expr = raw_expr->get_param_expr(i))) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(ret)); - } else if (child_expr->get_expr_type() == T_FUNC_SYS_ARRAY_MAP) { + } else if (raw_expr->get_expr_type() == T_FUNC_SYS_ARRAY_MAP && + ((depth > 0 && i == 0) || // inner array_map shouldn't handle lambda func para + ( depth == 0 && i > 0))) { // array_map shouldn't handle para other than lambda func para // do nothing - } else if (OB_FAIL(get_array_map_lambda_params(child_expr, param_idx, param_exprs))) { + } else if (OB_FAIL(get_array_map_lambda_params(child_expr, param_idx, + child_expr->get_expr_type() == T_FUNC_SYS_ARRAY_MAP ? depth + 1 : depth, param_exprs))) { LOG_WARN("construct array map info failed", K(ret)); } } @@ -407,7 +436,8 @@ int ObExprArrayMap::cg_expr(ObExprCGCtx &expr_cg_ctx, ObExprArrayMapInfo *var_params_info = static_cast(extra_info); ObArray param_exprs; ObArray param_idx; - if (OB_FAIL(get_array_map_lambda_params(&raw_expr, param_idx, param_exprs))) { + int depth = 0; + if (OB_FAIL(get_array_map_lambda_params(&raw_expr, param_idx, depth, param_exprs))) { LOG_WARN("get array map lambda params failed", K(ret)); } else if (param_exprs.count() == 0) { // do nothing diff --git a/src/sql/engine/expr/ob_expr_array_map.h b/src/sql/engine/expr/ob_expr_array_map.h index 9c20e67c2..fa1646c42 100644 --- a/src/sql/engine/expr/ob_expr_array_map.h +++ b/src/sql/engine/expr/ob_expr_array_map.h @@ -68,7 +68,7 @@ public: ObExpr &rt_expr) const override; private: - int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray ¶m_idx, + int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray ¶m_idx, int depth, ObArray ¶m_exprs) const; DISALLOW_COPY_AND_ASSIGN(ObExprArrayMap); }; diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 4ac9411d2..aa0989c1d 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -3572,7 +3572,7 @@ int ObRawExprResolverImpl::extract_var_exprs(ObRawExpr *expr, ObIArrayget_param_count(); ++i) { - if (expr->get_expr_type() == T_FUNC_SYS_ARRAY_MAP) { + if (expr->get_expr_type() == T_FUNC_SYS_ARRAY_MAP && i == 0) { } else if (OB_FAIL(SMART_CALL(extract_var_exprs(expr->get_param_expr(i), var_exprs)))) { LOG_WARN("Failed to extract var exprs", K(ret)); } @@ -3614,7 +3614,7 @@ int ObRawExprResolverImpl::check_replace_lambda_params_node(const ParseNode *par } else { for (uint32_t i = 0; OB_SUCC(ret) && i < curr_node->num_child_; ++i) { if (curr_node->children_[i] == NULL) { - } else if (curr_node->children_[i]->type_ == T_FUNC_SYS_ARRAY_MAP) { + } else if (curr_node->type_ == T_FUNC_SYS_ARRAY_MAP && i == 0) { } else if (OB_FAIL(check_replace_lambda_params_node(params_node, const_cast(curr_node->children_[i])))) { LOG_WARN("fail to replace lambda params", K(ret)); }