[ARRAY] array_map bugfix
This commit is contained in:
parent
3c608e442b
commit
65d39e1748
@ -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> ¶m_idx,
|
||||
int ObExprArrayMap::get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> ¶m_idx, int depth,
|
||||
ObArray<ObExpr *> ¶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<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
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
ObExpr &rt_expr) const override;
|
||||
private:
|
||||
|
||||
int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> ¶m_idx,
|
||||
int get_array_map_lambda_params(const ObRawExpr *raw_expr, ObArray<uint32_t> ¶m_idx, int depth,
|
||||
ObArray<ObExpr *> ¶m_exprs) const;
|
||||
DISALLOW_COPY_AND_ASSIGN(ObExprArrayMap);
|
||||
};
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user