Skip to content

Commit 8667774

Browse files
committed
fix
1 parent d1f32e8 commit 8667774

File tree

1 file changed

+47
-56
lines changed

1 file changed

+47
-56
lines changed

src/query/functions/src/scalars/array.rs

+47-56
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use common_expression::types::nullable::NullableDomain;
2222
use common_expression::types::number::NumberScalar;
2323
use common_expression::types::number::SimpleDomain;
2424
use common_expression::types::number::UInt64Type;
25-
use common_expression::types::AnyType;
2625
use common_expression::types::ArgType;
2726
use common_expression::types::ArrayType;
2827
use common_expression::types::BooleanType;
@@ -47,7 +46,6 @@ use common_expression::with_number_mapped_type;
4746
use common_expression::Column;
4847
use common_expression::ColumnBuilder;
4948
use common_expression::Domain;
50-
use common_expression::EvalContext;
5149
use common_expression::Function;
5250
use common_expression::FunctionDomain;
5351
use common_expression::FunctionProperty;
@@ -644,68 +642,61 @@ fn register_array_aggr(registry: &mut FunctionRegistry) {
644642
Some(return_type)
645643
}
646644

647-
fn eval_array_aggr(
648-
name: &str,
649-
args: &[ValueRef<AnyType>],
650-
ctx: &mut EvalContext,
651-
) -> Value<AnyType> {
652-
match &args[0] {
653-
ValueRef::Scalar(scalar) => match scalar {
654-
ScalarRef::EmptyArray | ScalarRef::Null => {
655-
if name == "count" {
656-
Value::Scalar(Scalar::Number(NumberScalar::UInt64(0)))
657-
} else {
658-
Value::Scalar(Scalar::Null)
659-
}
660-
}
661-
ScalarRef::Array(col) => {
662-
let len = col.len();
663-
match eval_aggr(name, vec![], &[col.clone()], len) {
664-
Ok((res_col, _)) => {
665-
let val = unsafe { res_col.index_unchecked(0) };
666-
Value::Scalar(val.to_owned())
667-
}
668-
Err(err) => {
669-
ctx.set_error(0, err.to_string());
670-
Value::Scalar(Scalar::Null)
671-
}
672-
}
673-
}
674-
_ => unreachable!(),
675-
},
676-
ValueRef::Column(column) => {
677-
let return_type = eval_aggr_return_type(name, &[column.data_type()]).unwrap();
678-
let mut builder = ColumnBuilder::with_capacity(&return_type, column.len());
679-
for arr in column.iter() {
680-
let array_column = arr.as_array().unwrap();
681-
let len = array_column.len();
682-
match eval_aggr(name, vec![], &[array_column.clone()], len) {
683-
Ok((col, _)) => {
684-
let val = unsafe { col.index_unchecked(0) };
685-
builder.push(val)
686-
}
687-
Err(err) => {
688-
ctx.set_error(builder.len(), err.to_string());
689-
}
690-
}
691-
}
692-
Value::Column(builder.build())
693-
}
694-
}
695-
}
696-
697-
for (func_name, name) in ARRAY_AGGREGATE_FUNCTIONS {
698-
registry.register_function_factory(func_name, |_, args_type| {
645+
for (fn_name, name) in ARRAY_AGGREGATE_FUNCTIONS {
646+
registry.register_function_factory(fn_name, |_, args_type| {
699647
let return_type = eval_aggr_return_type(name, args_type)?;
700648
Some(Arc::new(Function {
701649
signature: FunctionSignature {
702-
name: func_name.to_string(),
650+
name: fn_name.to_string(),
703651
args_type: vec![args_type[0].clone()],
704652
return_type,
705653
property: FunctionProperty::default(),
706654
},
707655
calc_domain: Box::new(move |_| FunctionDomain::MayThrow),
708-
eval: Box::new(|args, ctx| eval_array_aggr(name, args, ctx)),
656+
eval: Box::new(|args, ctx| match &args[0] {
657+
ValueRef::Scalar(scalar) => match scalar {
658+
ScalarRef::EmptyArray | ScalarRef::Null => {
659+
if name == "count" {
660+
Value::Scalar(Scalar::Number(NumberScalar::UInt64(0)))
661+
} else {
662+
Value::Scalar(Scalar::Null)
663+
}
664+
}
665+
ScalarRef::Array(col) => {
666+
let len = col.len();
667+
match eval_aggr(name, vec![], &[col.clone()], len) {
668+
Ok((res_col, _)) => {
669+
let val = unsafe { res_col.index_unchecked(0) };
670+
Value::Scalar(val.to_owned())
671+
}
672+
Err(err) => {
673+
ctx.set_error(0, err.to_string());
674+
Value::Scalar(Scalar::Null)
675+
}
676+
}
677+
}
678+
_ => unreachable!(),
679+
},
680+
ValueRef::Column(column) => {
681+
let return_type =
682+
eval_aggr_return_type(name, &[column.data_type()]).unwrap();
683+
let mut builder = ColumnBuilder::with_capacity(&return_type, column.len());
684+
for arr in column.iter() {
685+
let array_column = arr.as_array().unwrap();
686+
let len = array_column.len();
687+
match eval_aggr(name, vec![], &[array_column.clone()], len) {
688+
Ok((col, _)) => {
689+
let val = unsafe { col.index_unchecked(0) };
690+
builder.push(val)
691+
}
692+
Err(err) => {
693+
ctx.set_error(builder.len(), err.to_string());
694+
}
695+
}
696+
}
697+
Value::Column(builder.build())
698+
}
699+
}),
709700
}))
710701
});
711702
}

0 commit comments

Comments
 (0)