diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateAggCaseWhen.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateAggCaseWhen.java index 33a9bbd9242ec6..bd24c50f87df49 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateAggCaseWhen.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateAggCaseWhen.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction; +import org.apache.doris.nereids.trees.expressions.functions.agg.NullIgnoringAggregateFunction; import org.apache.doris.nereids.trees.expressions.functions.scalar.If; import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; import org.apache.doris.nereids.trees.plans.Plan; @@ -57,6 +58,9 @@ public Rule build() { return null; } for (AggregateFunction aggFun : aggFunctions) { + if (!(aggFun instanceof NullIgnoringAggregateFunction)) { + return null; + } // check whether we only have on case when/if in aggregate function if (aggFun.getArguments().size() != 1) { return null; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AIAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AIAgg.java index 4785718b9faee8..5235b243d783ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AIAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AIAgg.java @@ -40,7 +40,7 @@ * AggregateFunction 'AI_AGG'. */ public class AIAgg extends NullableAggregateFunction - implements ExplicitlyCastableSignature, NotSupportAggState { + implements ExplicitlyCastableSignature, NotSupportAggState, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE, StringType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java index 40f792c9569934..016fb817c4a068 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AnyValue.java @@ -34,7 +34,8 @@ * AggregateFunction 'any_value'. This class is generated by GenerateFunction. */ public class AnyValue extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.retArgType(0).args(AnyDataType.INSTANCE_WITHOUT_INDEX) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AvgWeighted.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AvgWeighted.java index d57958cd056826..adf16b7c493c05 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AvgWeighted.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/AvgWeighted.java @@ -33,7 +33,7 @@ * AggregateFunction 'avg_weighted'. This class is generated by GenerateFunction. */ public class AvgWeighted extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapAgg.java index 7083e7f0fe75c4..2b3eaef9661fd6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapAgg.java @@ -37,7 +37,7 @@ * AggregateFunction 'bitmap_agg'. */ public class BitmapAgg extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BitmapType.INSTANCE).args(BigIntType.INSTANCE), FunctionSignature.ret(BitmapType.INSTANCE).args(IntegerType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapIntersect.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapIntersect.java index 382b242123aa1f..5865e638d4d66d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapIntersect.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapIntersect.java @@ -35,7 +35,8 @@ * AggregateFunction 'bitmap_intersect'. This class is generated by GenerateFunction. */ public class BitmapIntersect extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction { + implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BitmapType.INSTANCE).args(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnion.java index 01cecaff52b532..1370889c32efcc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnion.java @@ -36,7 +36,8 @@ * AggregateFunction 'bitmap_union'. This class is generated by GenerateFunction. */ public class BitmapUnion extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BitmapType.INSTANCE).args(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionCount.java index 185af63fac4c7e..2be34c5f4e7dfa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionCount.java @@ -37,7 +37,8 @@ * AggregateFunction 'bitmap_union_count'. This class is generated by GenerateFunction. */ public class BitmapUnionCount extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, BitmapFunction, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionInt.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionInt.java index 9ce84a0f0843ab..8de87e71bc2f7c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionInt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BitmapUnionInt.java @@ -41,7 +41,7 @@ * AggregateFunction 'bitmap_union_int'. This class is generated by GenerateFunction. */ public class BitmapUnionInt extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(SmallIntType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolAnd.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolAnd.java index 02f8dbec79a475..4569144ce28d47 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolAnd.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolAnd.java @@ -35,7 +35,7 @@ * AggregateFunction 'bool_and'. */ public class BoolAnd extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(BooleanType.INSTANCE) ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolOr.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolOr.java index 3eefb907d68e4c..e81d9a460cd213 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolOr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolOr.java @@ -35,7 +35,7 @@ * AggregateFunction 'bool_or'. */ public class BoolOr extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(BooleanType.INSTANCE) ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolXor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolXor.java index 6e84899ec9163c..471fe3a33de35f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolXor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/BoolXor.java @@ -35,7 +35,7 @@ * AggregateFunction 'bool_xor'. */ public class BoolXor extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE).args(BooleanType.INSTANCE) ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectList.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectList.java index 6c447a22b6defc..6d2f715230f52b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectList.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectList.java @@ -39,7 +39,7 @@ * AggregateFunction 'collect_list'. This class is generated by GenerateFunction. */ public class CollectList extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(ArrayType.of(new FollowToAnyDataType(0))).args(new AnyDataType(0)), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectSet.java index 66f17dd5c16fa3..e252ab4368e2fb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CollectSet.java @@ -38,7 +38,7 @@ * AggregateFunction 'collect_set'. This class is generated by GenerateFunction. */ public class CollectSet extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(ArrayType.of(new FollowToAnyDataType(0))).args(new AnyDataType(0)), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Corr.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Corr.java index 5d9f9ac5f23c4e..68b06a35e79dde 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Corr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Corr.java @@ -33,7 +33,7 @@ * AggregateFunction 'corr'. This class is generated by GenerateFunction. */ public class Corr extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CorrWelford.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CorrWelford.java index b0d51f1a26b6b1..bd36cc4de08f11 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CorrWelford.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CorrWelford.java @@ -33,7 +33,7 @@ * AggregateFunction 'corr_welford'. This class is generated by GenerateFunction. */ public class CorrWelford extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Covar.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Covar.java index 2043ce716d100d..6f63538b42838a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Covar.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Covar.java @@ -33,7 +33,7 @@ * AggregateFunction 'covar'. This class is generated by GenerateFunction. */ public class Covar extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CovarSamp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CovarSamp.java index 5f100b6460f10f..e5adeec8f23e6c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CovarSamp.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/CovarSamp.java @@ -33,7 +33,7 @@ * AggregateFunction 'covar_samp'. This class is generated by GenerateFunction. */ public class CovarSamp extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/DataSketchesHllUnionAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/DataSketchesHllUnionAgg.java index 9fe46d2a77dd45..5091c45ca19ec9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/DataSketchesHllUnionAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/DataSketchesHllUnionAgg.java @@ -39,7 +39,8 @@ /** datasketches_hll_union_agg agg function. */ public class DataSketchesHllUnionAgg extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, FunctionTrait, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, FunctionTrait, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(StringType.INSTANCE), FunctionSignature.ret(DoubleType.INSTANCE).args(VarcharType.SYSTEM_DEFAULT), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ExponentialMovingAverage.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ExponentialMovingAverage.java index 7ceda4cf912d32..03966416c3673b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ExponentialMovingAverage.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ExponentialMovingAverage.java @@ -43,7 +43,7 @@ * timestamp columns use {@code intDiv(toUnixTimestamp(ts), interval_seconds)}. */ public class ExponentialMovingAverage extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayIntersect.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayIntersect.java index ea0ea216fc9c9f..aa0f87ae3e22ee 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayIntersect.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayIntersect.java @@ -36,7 +36,7 @@ * AggregateFunction 'group_array_intersect'. */ public class GroupArrayIntersect extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.retArgType(0) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayUnion.java index a760b18ef37e50..5d4efdd27333f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupArrayUnion.java @@ -36,7 +36,7 @@ * AggregateFunction 'group_array_union'. */ public class GroupArrayUnion extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.retArgType(0) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitAnd.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitAnd.java index f85f9cef42cd81..7f7e119b1d6ff9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitAnd.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitAnd.java @@ -37,7 +37,7 @@ * AggregateFunction 'group_bit_and'. This class is generated by GenerateFunction. */ public class GroupBitAnd extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(LargeIntType.INSTANCE).args(LargeIntType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitOr.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitOr.java index 86463f004f94e6..9e8006d32f3272 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitOr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitOr.java @@ -38,7 +38,7 @@ * AggregateFunction 'group_bit_or'. This class is generated by GenerateFunction. */ public class GroupBitOr extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(LargeIntType.INSTANCE).args(LargeIntType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitXor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitXor.java index aca1fca059f881..b81c9b6ea4b44a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitXor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitXor.java @@ -38,7 +38,7 @@ * AggregateFunction 'group_bit_xor'. This class is generated by GenerateFunction. */ public class GroupBitXor extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(LargeIntType.INSTANCE).args(LargeIntType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitmapXor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitmapXor.java index f276f935048c9e..bffa3a54c85778 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitmapXor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupBitmapXor.java @@ -35,7 +35,7 @@ * AggregateFunction 'group_bitmap_xor'. This class is generated by GenerateFunction. */ public class GroupBitmapXor extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BitmapType.INSTANCE).args(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Histogram.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Histogram.java index 01486ff2bd6f03..d803552098fae1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Histogram.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Histogram.java @@ -37,7 +37,7 @@ * AggregateFunction 'histogram'. This class is generated by GenerateFunction. */ public class Histogram extends NotNullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnion.java index 37f1e206a4b10e..5eb0b3a5227c3c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnion.java @@ -36,7 +36,8 @@ * AggregateFunction 'hll_union'. This class is generated by GenerateFunction. */ public class HllUnion extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, HllFunction, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, HllFunction, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(HllType.INSTANCE).args(HllType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnionAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnionAgg.java index ab37fa279276e2..ce516da455e06c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnionAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/HllUnionAgg.java @@ -37,7 +37,8 @@ * AggregateFunction 'hll_union_agg'. This class is generated by GenerateFunction. */ public class HllUnionAgg extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, HllFunction, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, HllFunction, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(HllType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java index 5c178210e0f461..994a173bb79a89 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/IntersectCount.java @@ -37,7 +37,7 @@ * AggregateFunction 'intersect_count'. This class is generated by GenerateFunction. */ public class IntersectCount extends NotNullableAggregateFunction - implements ExplicitlyCastableSignature, BitmapIntersectFunction { + implements ExplicitlyCastableSignature, BitmapIntersectFunction, NullIgnoringAggregateFunction { public static final List SIGNATURES = DataType.trivialTypes().stream() .map(type -> FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BitmapType.INSTANCE, type, type)) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Kurt.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Kurt.java index d48cf37089cc07..4c48d53fd282a4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Kurt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Kurt.java @@ -34,7 +34,8 @@ * AggregateFunction 'Kurt'. */ public class Kurt extends AggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements UnaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java index f5e2893e4a3279..ec7384bbfe2543 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/LinearHistogram.java @@ -35,7 +35,8 @@ /** * AggregateFunction 'linear_histogram'. */ -public class LinearHistogram extends NotNullableAggregateFunction implements ExplicitlyCastableSignature { +public class LinearHistogram extends NotNullableAggregateFunction + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAggregateFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAggregateFunction.java index bc961b3d657764..2722e47f690e83 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAggregateFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAggregateFunction.java @@ -32,7 +32,7 @@ /** Base class for aggregate functions that aggregate Map values by key. */ public abstract class MapAggregateFunction extends NotNullableAggregateFunction - implements UnaryExpression, CustomSignature { + implements UnaryExpression, CustomSignature, NullIgnoringAggregateFunction { protected MapAggregateFunction(String name, Expression arg) { this(name, false, arg); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MaxBy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MaxBy.java index 63ca76c4800165..96e6c040577ab0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MaxBy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MaxBy.java @@ -35,7 +35,7 @@ * AggregateFunction 'max_by'. This class is generated by GenerateFunction. */ public class MaxBy extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.retArgType(0).args(AnyDataType.INSTANCE_WITHOUT_INDEX, AnyDataType.INSTANCE_WITHOUT_INDEX) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Median.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Median.java index f91af0352deef4..7c396c90bf410b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Median.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Median.java @@ -41,7 +41,7 @@ * AggregateFunction 'median'. This class is generated by GenerateFunction. */ public class Median extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MinBy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MinBy.java index ab3f7a68e74da8..b59c1a630620aa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MinBy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MinBy.java @@ -35,7 +35,7 @@ * AggregateFunction 'min_by'. This class is generated by GenerateFunction. */ public class MinBy extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.retArgType(0).args(AnyDataType.INSTANCE_WITHOUT_INDEX, AnyDataType.INSTANCE_WITHOUT_INDEX) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java index 014c1652d9a864..65155cd3033326 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctCount.java @@ -35,7 +35,7 @@ /** MultiDistinctCount */ public class MultiDistinctCount extends NotNullableAggregateFunction - implements ExplicitlyCastableSignature, MultiDistinction { + implements ExplicitlyCastableSignature, MultiDistinction, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).varArgs(AnyDataType.INSTANCE_WITHOUT_INDEX) ); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum.java index 0e34ea50ba5f15..8d3f3500c6a274 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum.java @@ -33,7 +33,8 @@ /** MultiDistinctSum */ public class MultiDistinctSum extends NullableAggregateFunction implements UnaryExpression, - ExplicitlyCastableSignature, ComputePrecisionForSum, MultiDistinction, NeedSessionVarGuard { + ExplicitlyCastableSignature, ComputePrecisionForSum, MultiDistinction, NeedSessionVarGuard, + NullIgnoringAggregateFunction { public MultiDistinctSum(Expression arg0) { this(false, arg0); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum0.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum0.java index f47adeac7d30c0..61e17bbf909a73 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum0.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MultiDistinctSum0.java @@ -40,7 +40,8 @@ /** MultiDistinctSum0 */ public class MultiDistinctSum0 extends NotNullableAggregateFunction implements UnaryExpression, - ExplicitlyCastableSignature, ComputePrecisionForSum, MultiDistinction, NeedSessionVarGuard { + ExplicitlyCastableSignature, ComputePrecisionForSum, MultiDistinction, NeedSessionVarGuard, + NullIgnoringAggregateFunction { public MultiDistinctSum0(Expression arg0) { this(false, arg0); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Ndv.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Ndv.java index 760a702d27b526..a10a1dd60b23fd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Ndv.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Ndv.java @@ -38,7 +38,8 @@ * AggregateFunction 'ndv'. This class is generated by GenserateFunction. */ public class Ndv extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, RollUpTrait { + implements UnaryExpression, ExplicitlyCastableSignature, RollUpTrait, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(AnyDataType.INSTANCE_WITHOUT_INDEX) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/NullIgnoringAggregateFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/NullIgnoringAggregateFunction.java index 90b959b3ef749a..6726922615c20b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/NullIgnoringAggregateFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/NullIgnoringAggregateFunction.java @@ -21,8 +21,12 @@ * Marker for aggregate functions that ignore a row when any aggregate argument is SQL NULL. * *

Removing such rows does not change the aggregate result, so {@code InferAggNotNull} may add - * inferred not-null predicates for their arguments. This describes input-row handling and is - * independent of whether the aggregate result itself is nullable. + * inferred not-null predicates for their arguments. Equivalently, adding or removing rows with a + * NULL aggregate argument is result-invariant; in particular, an input consisting only of rows in + * which at least one aggregate argument is NULL must produce the same result as an empty input. + * This describes input-row handling and is independent of whether the aggregate result itself is + * nullable. A not-null result such as zero or an empty collection can therefore satisfy this + * contract. * *

Implement this interface only when the contract holds for every signature and mode of the * aggregate function, including DISTINCT. diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculate.java index 6ddd211764df4e..eb17c454ee9708 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculate.java @@ -34,7 +34,8 @@ /** OrthogonalBitmapExprCalculate */ public class OrthogonalBitmapExprCalculate extends NotNullableAggregateFunction - implements OrthogonalBitmapFunction, ExplicitlyCastableSignature { + implements OrthogonalBitmapFunction, ExplicitlyCastableSignature, + NullIgnoringAggregateFunction { static final List FUNCTION_SIGNATURES = ImmutableList.of( FunctionSignature.ret(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculateCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculateCount.java index 21b3232d4f75f2..f5f347f80d8535 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculateCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapExprCalculateCount.java @@ -35,7 +35,8 @@ /** OrthogonalBitmapExprCalculateCount */ public class OrthogonalBitmapExprCalculateCount extends NotNullableAggregateFunction - implements OrthogonalBitmapFunction, ExplicitlyCastableSignature { + implements OrthogonalBitmapFunction, ExplicitlyCastableSignature, + NullIgnoringAggregateFunction { static final List FUNCTION_SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersect.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersect.java index 691f2866e77a9b..6d1334f6418af8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersect.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersect.java @@ -34,7 +34,7 @@ * AggregateFunction 'orthogonal_bitmap_intersect'. This class is generated by GenerateFunction. */ public class OrthogonalBitmapIntersect extends NotNullableAggregateFunction - implements OrthogonalBitmapFunction, BitmapIntersectFunction { + implements OrthogonalBitmapFunction, BitmapIntersectFunction, NullIgnoringAggregateFunction { static final List FUNCTION_SIGNATURES = SUPPORTED_TYPES.stream() .map(type -> FunctionSignature.ret(BitmapType.INSTANCE).varArgs(BitmapType.INSTANCE, type, type)) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersectCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersectCount.java index 6f7793944b7205..030c7faf20ebab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersectCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapIntersectCount.java @@ -31,7 +31,7 @@ * AggregateFunction 'orthogonal_bitmap_intersect_count'. This class is generated by GenerateFunction. */ public class OrthogonalBitmapIntersectCount extends NotNullableAggregateFunction - implements OrthogonalBitmapFunction, BitmapIntersectFunction { + implements OrthogonalBitmapFunction, BitmapIntersectFunction, NullIgnoringAggregateFunction { /** * constructor with 3 or more arguments. diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapUnionCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapUnionCount.java index 4f6d9f12b7ab6d..f1823c5de3a24e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapUnionCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/OrthogonalBitmapUnionCount.java @@ -35,7 +35,8 @@ * AggregateFunction 'orthogonal_bitmap_union_count'. This class is generated by GenerateFunction. */ public class OrthogonalBitmapUnionCount extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, NotSupportAggState { + implements UnaryExpression, ExplicitlyCastableSignature, NotSupportAggState, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(BitmapType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java index 16a2821a541555..f1b7fc4d93cc92 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Percentile.java @@ -40,7 +40,7 @@ * AggregateFunction 'percentile'. This class is generated by GenerateFunction. */ public class Percentile extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApprox.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApprox.java index 3e0229a1234562..a2234464f11f36 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApprox.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApprox.java @@ -33,7 +33,7 @@ * AggregateFunction 'percentile_approx'. This class is generated by GenerateFunction. */ public class PercentileApprox extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxArray.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxArray.java index 14010a401fe8a9..72ffeb20594317 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxArray.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxArray.java @@ -38,7 +38,7 @@ * AggregateFunction 'percentile_approx_array'. */ public class PercentileApproxArray extends NotNullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxWeighted.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxWeighted.java index 2eae91d865b22b..b0a58e84c962e9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxWeighted.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileApproxWeighted.java @@ -33,7 +33,7 @@ * AggregateFunction 'percentile_approx_weighted'. */ public class PercentileApproxWeighted extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java index 89e8dded9a5728..df892547db0e00 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileArray.java @@ -43,7 +43,7 @@ * AggregateFunction 'percentile_array'. This class is generated by GenerateFunction. */ public class PercentileArray extends NotNullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(ArrayType.of(DoubleType.INSTANCE)) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileReservoir.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileReservoir.java index 5e91e794064220..3e67f57b605617 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileReservoir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/PercentileReservoir.java @@ -35,7 +35,7 @@ * AggregateFunction 'percentile_reservoir' */ public class PercentileReservoir extends NullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/QuantileUnion.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/QuantileUnion.java index 6b433e7895d4ae..b6c533d2559a88 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/QuantileUnion.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/QuantileUnion.java @@ -36,7 +36,7 @@ * AggregateFunction 'quantile_union'. This class is generated by GenerateFunction. */ public class QuantileUnion extends NotNullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(QuantileStateType.INSTANCE).args(QuantileStateType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgx.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgx.java index c1f11c0321d001..724bc60ff4df02 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgx.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgx.java @@ -32,7 +32,8 @@ /** regr_avgx agg function. */ public class RegrAvgx extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgy.java index 1491cf71b811e1..5cdf2178e3681d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgy.java @@ -32,7 +32,8 @@ /** regr_avgy agg function. */ public class RegrAvgy extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrCount.java index fba0645428e238..2c749b52e03645 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrCount.java @@ -33,7 +33,7 @@ /** regr_count agg function. */ public class RegrCount extends NotNullableAggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature { + implements BinaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrIntercept.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrIntercept.java index 81afd0441b0d0d..de508f038dc386 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrIntercept.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrIntercept.java @@ -34,7 +34,8 @@ * AggregateFunction 'regr_intercept'. */ public class RegrIntercept extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrR2.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrR2.java index 2ae74a8628c849..e8d678ad3a6eb7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrR2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrR2.java @@ -32,7 +32,8 @@ /** regr_r2 agg function. */ public class RegrR2 extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSlope.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSlope.java index fc964d317f7255..4420c99bba7ca5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSlope.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSlope.java @@ -34,7 +34,8 @@ * AggregateFunction 'regr_slope'. */ public class RegrSlope extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxx.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxx.java index 28f37781903384..029a7275392558 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxx.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxx.java @@ -32,7 +32,8 @@ /** regr_sxx agg function. */ public class RegrSxx extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxy.java index 39dd7dd2d84755..2e3163af4fb946 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSxy.java @@ -32,7 +32,8 @@ /** regr_sxy agg function. */ public class RegrSxy extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSyy.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSyy.java index f12268182081f5..1ea117a2ad2c75 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSyy.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrSyy.java @@ -32,7 +32,8 @@ /** regr_syy agg function. */ public class RegrSyy extends AggregateFunction - implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Retention.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Retention.java index 87177f34b3856b..ec6888b42fe9a6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Retention.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Retention.java @@ -35,7 +35,7 @@ * AggregateFunction 'retention'. This class is generated by GenerateFunction. */ public class Retention extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { // The BE side stores the retention state in a fixed-size array // (RetentionState::MAX_EVENTS, uint8_t events[32]) and also serializes it into a single diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sem.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sem.java index 7e0dbd537874cc..3f6be349fb16f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sem.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sem.java @@ -34,7 +34,7 @@ */ public class Sem extends NullableAggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature { + implements UnaryExpression, ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceCount.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceCount.java index f0cc6fac537082..813c63a9f340ad 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceCount.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceCount.java @@ -40,7 +40,7 @@ * AggregateFunction 'sequence_count'. This class is generated by GenerateFunction. */ public class SequenceCount extends NotNullableAggregateFunction - implements ExplicitlyCastableSignature, SequenceFunction { + implements ExplicitlyCastableSignature, SequenceFunction, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BigIntType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceMatch.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceMatch.java index 24dc7f8367a4b7..87bd79255067dd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceMatch.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/SequenceMatch.java @@ -38,7 +38,7 @@ * AggregateFunction 'sequence_match'. This class is generated by GenerateFunction. */ public class SequenceMatch extends NullableAggregateFunction - implements ExplicitlyCastableSignature, SequenceFunction { + implements ExplicitlyCastableSignature, SequenceFunction, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(BooleanType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Skew.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Skew.java index aa46bcecc12c3c..bba96f772a4f49 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Skew.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Skew.java @@ -35,7 +35,8 @@ */ public class Skew extends AggregateFunction - implements UnaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + implements UnaryExpression, ExplicitlyCastableSignature, AlwaysNullable, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Stddev.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Stddev.java index 1dd4e46f998222..bfeecf10fa9d43 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Stddev.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Stddev.java @@ -35,7 +35,7 @@ */ public class Stddev extends NullableAggregateFunction implements UnaryExpression, ExplicitlyCastableSignature, - StdDevOrVarianceFunction, DecimalStddevPrecision { + StdDevOrVarianceFunction, DecimalStddevPrecision, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/StddevSamp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/StddevSamp.java index 7eac03ca5c32b0..84e1359421a314 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/StddevSamp.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/StddevSamp.java @@ -35,7 +35,7 @@ */ public class StddevSamp extends NullableAggregateFunction implements UnaryExpression, ExplicitlyCastableSignature, - StdDevOrVarianceFunction, DecimalStddevPrecision { + StdDevOrVarianceFunction, DecimalStddevPrecision, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sum0.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sum0.java index 2bf5f9e2fa3762..5c19b826e3c6f1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sum0.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/Sum0.java @@ -57,7 +57,8 @@ */ public class Sum0 extends NotNullableAggregateFunction implements UnaryExpression, ExplicitlyCastableSignature, ComputePrecisionForSum, - SupportWindowAnalytic, RollUpTrait, SupportMultiDistinct, NeedSessionVarGuard { + SupportWindowAnalytic, RollUpTrait, SupportMultiDistinct, NeedSessionVarGuard, + NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java index f03bbedf343535..15b52e8f340d76 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java @@ -35,7 +35,7 @@ * AggregateFunction 'topn'. This class is generated by GenerateFunction. */ public class TopN extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(VarcharType.SYSTEM_DEFAULT, IntegerType.INSTANCE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java index 840f520b87608d..616c97754120af 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java @@ -37,7 +37,7 @@ * AggregateFunction 'topn_array'. This class is generated by GenerateFunction. */ public class TopNArray extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(ArrayType.of(new FollowToAnyDataType(0))) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java index 1222fcdac37eb3..6bd5497c3e2639 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java @@ -50,7 +50,7 @@ * AggregateFunction 'topn_weighted'. This class is generated by GenerateFunction. */ public class TopNWeighted extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( // three arguments 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 index 756948ea9eb598..f5c49b16ad18a3 100644 --- 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 @@ -35,7 +35,7 @@ */ public class Variance extends NullableAggregateFunction implements UnaryExpression, ExplicitlyCastableSignature, - StdDevOrVarianceFunction, DecimalStddevPrecision { + StdDevOrVarianceFunction, DecimalStddevPrecision, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/VarianceSamp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/VarianceSamp.java index ab3af3e78884a6..5c2a8581867300 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/VarianceSamp.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/VarianceSamp.java @@ -34,7 +34,7 @@ */ public class VarianceSamp extends NullableAggregateFunction implements UnaryExpression, ExplicitlyCastableSignature, - StdDevOrVarianceFunction { + StdDevOrVarianceFunction, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnel.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnel.java index 9f152821c2fef0..6a844b22cdd1d4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnel.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnel.java @@ -43,7 +43,7 @@ * AggregateFunction 'window_funnel'. This class is generated by GenerateFunction. */ public class WindowFunnel extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(IntegerType.INSTANCE) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnelV2.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnelV2.java index fabca97f7448ed..c6d6bb02212fa1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnelV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnelV2.java @@ -44,7 +44,7 @@ * as (timestamp, event_index) pairs, dramatically reducing memory usage compared to V1. */ public class WindowFunnelV2 extends NullableAggregateFunction - implements ExplicitlyCastableSignature { + implements ExplicitlyCastableSignature, NullIgnoringAggregateFunction { public static final int MAX_EVENT_CONDITIONS = 127; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferAggNotNullTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferAggNotNullTest.java index 30c17c2dd68b57..f0e709dc1b739d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferAggNotNullTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferAggNotNullTest.java @@ -30,10 +30,18 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction; import org.apache.doris.nereids.trees.expressions.functions.agg.ArrayAgg; import org.apache.doris.nereids.trees.expressions.functions.agg.Avg; +import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapAgg; +import org.apache.doris.nereids.trees.expressions.functions.agg.CollectList; import org.apache.doris.nereids.trees.expressions.functions.agg.Count; +import org.apache.doris.nereids.trees.expressions.functions.agg.CountByEnum; +import org.apache.doris.nereids.trees.expressions.functions.agg.GroupConcat; +import org.apache.doris.nereids.trees.expressions.functions.agg.MapAgg; +import org.apache.doris.nereids.trees.expressions.functions.agg.MapAggV2; 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.NullIgnoringAggregateFunction; import org.apache.doris.nereids.trees.expressions.functions.agg.Sum; +import org.apache.doris.nereids.trees.expressions.functions.agg.Sum0; import org.apache.doris.nereids.trees.plans.RelationId; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; @@ -129,6 +137,32 @@ void testNotInferForNullSensitiveAggregate() { ); } + @Test + void testAuditedNullInputContractMarkers() { + Expression key = scan1.getOutput().get(0); + Expression value = scan1.getOutput().get(1); + + List nullIgnoring = ImmutableList.of( + new Sum(value), + new Sum0(value), + new CollectList(value), + new BitmapAgg(value)); + nullIgnoring.forEach(function -> Assertions.assertTrue( + function instanceof NullIgnoringAggregateFunction, + function.getName() + " must declare the audited null-row contract")); + + // NotNullableAggregateFunction does not imply that NULL argument rows can be removed. + List withoutClassWideProof = ImmutableList.of( + new ArrayAgg(value), + new MapAgg(key, value), + new MapAggV2(key, value), + new CountByEnum(value), + new GroupConcat(value)); + withoutClassWideProof.forEach(function -> Assertions.assertFalse( + function instanceof NullIgnoringAggregateFunction, + function.getName() + " must remain conservative until every mode is proven")); + } + @Test void testNullSensitiveAggregateBlocksCommonInference() { LogicalPlan plan = new LogicalPlanBuilder(scan1) diff --git a/regression-test/data/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.out b/regression-test/data/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.out index 8205077a801fb5..df19fb316886ad 100644 --- a/regression-test/data/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.out +++ b/regression-test/data/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.out @@ -175,6 +175,59 @@ PhysicalResultSink ----PhysicalProject ------PhysicalOlapScan[t4] +-- !array_agg_no_eliminate -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !collect_list_eliminate -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------filter((t4.c4 = 102)) +------------PhysicalOlapScan[t4] + +-- !collect_list_distinct_eliminate -- +PhysicalResultSink +--PhysicalProject +----hashAgg[DISTINCT_GLOBAL] +------hashAgg[DISTINCT_LOCAL] +--------hashAgg[GLOBAL] +----------hashAgg[LOCAL] +------------PhysicalProject +--------------filter((t4.c4 = 102)) +----------------PhysicalOlapScan[t4] + +-- !bool_or_eliminate -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------filter((t4.c4 = 102)) +----------PhysicalOlapScan[t4] + +-- !sum0_eliminate -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------filter((t4.c4 = 102)) +----------PhysicalOlapScan[t4] + +-- !bitmap_agg_eliminate -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------filter((t4.c4 = 102)) +------------PhysicalOlapScan[t4] + -- !basic_1 -- 10 @@ -247,3 +300,24 @@ PhysicalResultSink 102 1 103 1 +-- !array_agg_preserves_null -- +2 + +-- !array_agg_distinct_preserves_null -- +2 + +-- !collect_list_ignores_null -- +1 + +-- !collect_list_distinct_ignores_null -- +1 + +-- !bool_or_ignores_null -- +true + +-- !sum0_ignores_null -- +102 + +-- !bitmap_agg_ignores_null -- +1 + diff --git a/regression-test/data/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.out b/regression-test/data/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.out index c182c0ba43ad90..233b9a1b71bfe6 100644 --- a/regression-test/data/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.out +++ b/regression-test/data/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.out @@ -11,3 +11,12 @@ -- !mixed_count_array_agg -- 1 3 +-- !null_ignoring_aggregate_identities -- +9 9 1 1 + +-- !all_null_equals_empty_input -- +\N \N 0 0 0 0 0 0 + +-- !null_sensitive_aggregates_keep_rows -- +3 3 + diff --git a/regression-test/suites/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.groovy b/regression-test/suites/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.groovy index 8de498cb362d4b..a1b00cdedf622e 100644 --- a/regression-test/suites/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.groovy +++ b/regression-test/suites/nereids_rules_p0/eliminate_aggregate_casewhen/eliminate_aggregate_casewhen.groovy @@ -75,6 +75,34 @@ suite("eliminate_aggregate_casewhen") { qt_basic_4_5 """explain shape plan select count(case when t4.c4 > 100 then 10 end) from t4;""" qt_basic_4_6 """explain shape plan select t4.c4, count(case when t4.c4 > 100 then 10 end) from t4 group by t4.c4;""" + // NULL-preserving aggregates must keep the IF expression and all input rows. + qt_array_agg_no_eliminate """ + explain shape plan + select array_size(array_agg(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + + // Audited NULL-ignoring aggregates remain eligible for the rewrite. + qt_collect_list_eliminate """ + explain shape plan + select array_size(collect_list(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + qt_collect_list_distinct_eliminate """ + explain shape plan + select array_size(collect_list(distinct case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + qt_bool_or_eliminate """ + explain shape plan + select bool_or(case when t4.c4 = 102 then cast(t4.c4 as boolean) end) from t4; + """ + qt_sum0_eliminate """ + explain shape plan + select sum0(case when t4.c4 = 102 then t4.c4 end) from t4; + """ + qt_bitmap_agg_eliminate """ + explain shape plan + select bitmap_count(bitmap_agg(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + /* ******** Output ******** */ /* ******** with one row ******** */ @@ -108,4 +136,26 @@ suite("eliminate_aggregate_casewhen") { order_qt_basic_4_4 """select max(case when t4.c4 > 100 then 10 end) from t4;""" order_qt_basic_4_5 """select count(case when t4.c4 > 100 then 10 end) from t4;""" order_qt_basic_4_6 """select t4.c4, count(case when t4.c4 > 100 then 10 end) from t4 group by t4.c4;""" + + order_qt_array_agg_preserves_null """ + select array_size(array_agg(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + order_qt_array_agg_distinct_preserves_null """ + select array_size(array_agg(distinct case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + order_qt_collect_list_ignores_null """ + select array_size(collect_list(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + order_qt_collect_list_distinct_ignores_null """ + select array_size(collect_list(distinct case when t4.c4 = 102 then t4.c4 end)) from t4; + """ + order_qt_bool_or_ignores_null """ + select bool_or(case when t4.c4 = 102 then cast(t4.c4 as boolean) end) from t4; + """ + order_qt_sum0_ignores_null """ + select sum0(case when t4.c4 = 102 then t4.c4 end) from t4; + """ + order_qt_bitmap_agg_ignores_null """ + select bitmap_count(bitmap_agg(case when t4.c4 = 102 then t4.c4 end)) from t4; + """ } diff --git a/regression-test/suites/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.groovy b/regression-test/suites/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.groovy index 56b9ec535b784c..742e9771fb8d0a 100644 --- a/regression-test/suites/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.groovy +++ b/regression-test/suites/nereids_rules_p0/infer_agg_not_null/infer_agg_not_null.groovy @@ -63,6 +63,31 @@ suite("infer_agg_not_null") { LEFT JOIN infer_agg_not_null_right r ON l.k = r.k """ + order_qt_null_ignoring_aggregate_identities """ + SELECT SUM(r.v), SUM0(r.v), ARRAY_SIZE(COLLECT_LIST(r.v)), + BITMAP_COUNT(BITMAP_AGG(r.v)) + FROM infer_agg_not_null_left l + LEFT JOIN infer_agg_not_null_right r ON l.k = r.k + """ + + order_qt_all_null_equals_empty_input """ + SELECT + (SELECT SUM(v) FROM infer_agg_not_null_right WHERE k = 3), + (SELECT SUM(v) FROM infer_agg_not_null_right WHERE FALSE), + (SELECT SUM0(v) FROM infer_agg_not_null_right WHERE k = 3), + (SELECT SUM0(v) FROM infer_agg_not_null_right WHERE FALSE), + (SELECT ARRAY_SIZE(COLLECT_LIST(v)) FROM infer_agg_not_null_right WHERE k = 3), + (SELECT ARRAY_SIZE(COLLECT_LIST(v)) FROM infer_agg_not_null_right WHERE FALSE), + (SELECT BITMAP_COUNT(BITMAP_AGG(v)) FROM infer_agg_not_null_right WHERE k = 3), + (SELECT BITMAP_COUNT(BITMAP_AGG(v)) FROM infer_agg_not_null_right WHERE FALSE) + """ + + order_qt_null_sensitive_aggregates_keep_rows """ + SELECT ARRAY_SIZE(ARRAY_AGG(r.v)), MAP_SIZE(MAP_AGG(l.k, r.v)) + FROM infer_agg_not_null_left l + LEFT JOIN infer_agg_not_null_right r ON l.k = r.k + """ + explain { sql """ SHAPE PLAN @@ -102,4 +127,26 @@ suite("infer_agg_not_null") { """ contains "LEFT_OUTER_JOIN" } + + explain { + sql """ + SHAPE PLAN + SELECT SUM(r.v), SUM0(r.v), ARRAY_SIZE(COLLECT_LIST(r.v)), + BITMAP_COUNT(BITMAP_AGG(r.v)) + FROM infer_agg_not_null_left l + LEFT JOIN infer_agg_not_null_right r ON l.k = r.k + """ + contains "INNER_JOIN" + notContains "LEFT_OUTER_JOIN" + } + + explain { + sql """ + SHAPE PLAN + SELECT ARRAY_SIZE(ARRAY_AGG(r.v)), MAP_SIZE(MAP_AGG(l.k, r.v)) + FROM infer_agg_not_null_left l + LEFT JOIN infer_agg_not_null_right r ON l.k = r.k + """ + contains "LEFT_OUTER_JOIN" + } }