diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java index 0b2774acf1..074472c574 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java @@ -34,6 +34,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.Max; import org.apache.doris.nereids.trees.expressions.functions.agg.Min; import org.apache.doris.nereids.trees.expressions.functions.agg.Ndv; import org.apache.doris.nereids.trees.expressions.functions.agg.Sum; +import org.apache.doris.nereids.trees.expressions.functions.agg.Variance; import com.google.common.collect.ImmutableList; @@ -45,23 +46,25 @@ import com.google.common.collect.ImmutableList; */ public class BuiltinAggregateFunctions implements FunctionHelper { public final ImmutableList aggregateFunctions = ImmutableList.of( + agg(ApproxCountDistinct.class, "approx_count_distinct"), agg(Avg.class), agg(BitmapIntersect.class, "bitmap_intersect"), agg(BitmapUnion.class, "bitmap_union"), agg(BitmapUnionCount.class, "bitmap_union_count"), agg(BitmapUnionInt.class, "bitmap_union_int"), agg(Count.class), + + agg(GroupBitAnd.class, "group_bit_and"), agg(GroupBitmapXor.class, "group_bitmap_xor"), + agg(GroupBitOr.class, "group_bit_or"), + agg(GroupBitXor.class, "group_bit_xor"), agg(HllUnion.class, "hll_union", "hll_raw_agg"), agg(HllUnionAgg.class, "hll_union_agg"), agg(Max.class), agg(Min.class), - agg(Sum.class), - agg(GroupBitAnd.class, "group_bit_and"), - agg(GroupBitOr.class, "group_bit_or"), - agg(GroupBitXor.class, "group_bit_xor"), agg(Ndv.class), - agg(ApproxCountDistinct.class, "approx_count_distinct") + agg(Sum.class), + agg(Variance.class, "variance") ); public static final BuiltinAggregateFunctions INSTANCE = new BuiltinAggregateFunctions(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Variance.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Variance.java new file mode 100644 index 0000000000..85f08279d1 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Variance.java @@ -0,0 +1,86 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.agg; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.DecimalV2Type; +import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; +import org.apache.doris.nereids.types.IntegerType; +import org.apache.doris.nereids.types.LargeIntType; +import org.apache.doris.nereids.types.SmallIntType; +import org.apache.doris.nereids.types.TinyIntType; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * Variance function + */ +public class Variance extends AggregateFunction implements UnaryExpression, PropagateNullable, + ExplicitlyCastableSignature { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(FloatType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(LargeIntType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(BigIntType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(SmallIntType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(IntegerType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(TinyIntType.INSTANCE), + FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT).args(DecimalV2Type.SYSTEM_DEFAULT) + ); + + public Variance(Expression child) { + super("variance", child); + } + + public Variance(boolean isDistinct, Expression child) { + super("variance", isDistinct, child); + } + + @Override + public List getSignatures() { + return SIGNATURES; + } + + @Override + public AggregateFunction withChildren(List children) { + Preconditions.checkArgument(children.size() == 1); + return new Variance(isDistinct, children.get(0)); + } + + @Override + public AggregateFunction withDistinctAndChildren(boolean isDistinct, List children) { + Preconditions.checkArgument(children.size() == 1); + return new Variance(isDistinct, children.get(0)); + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitVariance(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java index 3ff809b119..a76093e80e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java @@ -33,6 +33,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.MultiDistinctCou import org.apache.doris.nereids.trees.expressions.functions.agg.MultiDistinctSum; import org.apache.doris.nereids.trees.expressions.functions.agg.Ndv; import org.apache.doris.nereids.trees.expressions.functions.agg.Sum; +import org.apache.doris.nereids.trees.expressions.functions.agg.Variance; /** AggregateFunctionVisitor. */ public interface AggregateFunctionVisitor { @@ -82,6 +83,10 @@ public interface AggregateFunctionVisitor { return visitAggregateFunction(bitmapUnionCount, context); } + default R visitVariance(Variance variance, C context) { + return visitAggregateFunction(variance, context); + } + default R visitNdv(Ndv ndv, C context) { return visitAggregateFunction(ndv, context); } diff --git a/regression-test/data/nereids_syntax_p0/test_variance_nereids.out b/regression-test/data/nereids_syntax_p0/test_variance_nereids.out new file mode 100644 index 0000000000..dc871ccda4 --- /dev/null +++ b/regression-test/data/nereids_syntax_p0/test_variance_nereids.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !variance -- +31200.0 + diff --git a/regression-test/suites/nereids_syntax_p0/test_variance_nereids.groovy b/regression-test/suites/nereids_syntax_p0/test_variance_nereids.groovy new file mode 100644 index 0000000000..a93db47e22 --- /dev/null +++ b/regression-test/suites/nereids_syntax_p0/test_variance_nereids.groovy @@ -0,0 +1,23 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_variance_nereids") { + sql "set enable_nereids_planner=true;" + sql "set enable_fallback_to_original_planner=false;" + + qt_variance "select variance(a) from (select 123 as a union select 423 as a union select 3 as a) t;" +} \ No newline at end of file