[ARRAY] array_map bugfix

This commit is contained in:
helloamateur 2024-12-17 19:45:00 +00:00 committed by ob-robot
parent 3c608e442b
commit 65d39e1748
3 changed files with 37 additions and 7 deletions

View File

@ -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<int16_t> *arr_ptr = static_cast<ObArrayFixedSize<int16_t> *>(arr_obj[para_idx]);
int16_t val = (*arr_ptr)[i];
lambda_para->locate_datum_for_write(ctx).set_int(val);
break;
}
case ObInt32Type: {
ObArrayFixedSize<int32_t> *arr_ptr = static_cast<ObArrayFixedSize<int32_t> *>(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<float> *arr_ptr = static_cast<ObArrayFixedSize<float> *>(arr_obj[para_idx]);
float val = (*arr_ptr)[i];
lambda_para->locate_datum_for_write(ctx).set_float(val);
break;
}
case ObUTinyIntType: {
ObArrayFixedSize<uint8_t> *arr_ptr = static_cast<ObArrayFixedSize<uint8_t> *>(arr_obj[para_idx]);
uint8_t val = (*arr_ptr)[i];
lambda_para->locate_datum_for_write(ctx).set_uint(val);
break;
}
case ObUSmallIntType: {
ObArrayFixedSize<uint16_t> *arr_ptr = static_cast<ObArrayFixedSize<uint16_t> *>(arr_obj[para_idx]);
uint16_t val = (*arr_ptr)[i];
lambda_para->locate_datum_for_write(ctx).set_uint(val);
break;
}
case ObUInt32Type: {
ObArrayFixedSize<uint32_t> *arr_ptr = static_cast<ObArrayFixedSize<uint32_t> *>(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<double> *arr_ptr = static_cast<ObArrayFixedSize<double> *>(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<uint32_t> &param_idx,
int ObExprArrayMap::get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> &param_idx, int depth,
ObArray<ObExpr *> &param_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<ObExprArrayMapInfo *>(extra_info);
ObArray<ObExpr *> param_exprs;
ObArray<uint32_t> 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

View File

@ -68,7 +68,7 @@ public:
ObExpr &rt_expr) const override;
private:
int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> &param_idx,
int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> &param_idx, int depth,
ObArray<ObExpr *> &param_exprs) const;
DISALLOW_COPY_AND_ASSIGN(ObExprArrayMap);
};

View File

@ -3572,7 +3572,7 @@ int ObRawExprResolverImpl::extract_var_exprs(ObRawExpr *expr, ObIArray<ObVarRawE
}
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_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<ParseNode *>(curr_node->children_[i])))) {
LOG_WARN("fail to replace lambda params", K(ret));
}