This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch revert_null_if in repository https://gitbox.apache.org/repos/asf/doris.git
commit f535eb984f8866806f8799ca889b69d6828fef2c Author: MorrySnow <[email protected]> AuthorDate: Thu Dec 25 12:22:38 2025 +0800 Revert "branch-3.1: [opt](coercion) change the coercion behavior (#57961)" This reverts commit 755909f0d36646d4d0dd595d21b6c0b0c9d161b5. PR #57961 --- .../trees/expressions/functions/scalar/If.java | 111 +++- .../trees/expressions/functions/scalar/NullIf.java | 69 ++- .../trees/expressions/functions/scalar/Nvl.java | 70 ++- .../doris/nereids/util/TypeCoercionUtils.java | 5 +- .../rules/SimplifyConditionalFunctionTest.java | 5 +- .../doris/nereids/util/TypeCoercionMatrixTest.java | 121 ----- .../doris/nereids/util/TypeCoercionUtilsTest.java | 567 +++++++++++++++++++++ .../conditional_functions/test_ifnull_array.out | 4 - .../datatype/test_date_implicit_cast.groovy | 6 +- .../conditional_functions/test_ifnull_array.groovy | 41 -- 10 files changed, 761 insertions(+), 238 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java index bded496e01b..655649822c8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java @@ -20,24 +20,101 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.analyzer.Unbound; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.CustomSignature; -import org.apache.doris.nereids.trees.expressions.functions.SearchSignature; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.shape.TernaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.ArrayType; +import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.BitmapType; import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.DataType; +import org.apache.doris.nereids.types.DateTimeType; +import org.apache.doris.nereids.types.DateTimeV2Type; +import org.apache.doris.nereids.types.DateType; +import org.apache.doris.nereids.types.DateV2Type; +import org.apache.doris.nereids.types.DecimalV2Type; +import org.apache.doris.nereids.types.DecimalV3Type; +import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; +import org.apache.doris.nereids.types.HllType; +import org.apache.doris.nereids.types.IntegerType; +import org.apache.doris.nereids.types.JsonType; +import org.apache.doris.nereids.types.LargeIntType; +import org.apache.doris.nereids.types.MapType; +import org.apache.doris.nereids.types.NullType; +import org.apache.doris.nereids.types.SmallIntType; +import org.apache.doris.nereids.types.StringType; +import org.apache.doris.nereids.types.TimeType; +import org.apache.doris.nereids.types.TimeV2Type; +import org.apache.doris.nereids.types.TinyIntType; +import org.apache.doris.nereids.types.VarcharType; +import org.apache.doris.nereids.types.coercion.AnyDataType; import org.apache.doris.nereids.util.TypeCoercionUtils; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import java.util.List; -import java.util.Optional; /** * ScalarFunction 'if'. This class is generated by GenerateFunction. */ public class If extends ScalarFunction - implements TernaryExpression, CustomSignature { + implements TernaryExpression, ExplicitlyCastableSignature { + + public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( + FunctionSignature.ret(NullType.INSTANCE) + .args(BooleanType.INSTANCE, NullType.INSTANCE, NullType.INSTANCE), + FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT) + .args(BooleanType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT), + FunctionSignature.ret(DateV2Type.INSTANCE) + .args(BooleanType.INSTANCE, DateV2Type.INSTANCE, DateV2Type.INSTANCE), + FunctionSignature.ret(BooleanType.INSTANCE) + .args(BooleanType.INSTANCE, BooleanType.INSTANCE, BooleanType.INSTANCE), + FunctionSignature.ret(TinyIntType.INSTANCE) + .args(BooleanType.INSTANCE, TinyIntType.INSTANCE, TinyIntType.INSTANCE), + FunctionSignature.ret(SmallIntType.INSTANCE) + .args(BooleanType.INSTANCE, SmallIntType.INSTANCE, SmallIntType.INSTANCE), + FunctionSignature.ret(IntegerType.INSTANCE) + .args(BooleanType.INSTANCE, IntegerType.INSTANCE, IntegerType.INSTANCE), + FunctionSignature.ret(BigIntType.INSTANCE) + .args(BooleanType.INSTANCE, BigIntType.INSTANCE, BigIntType.INSTANCE), + FunctionSignature.ret(LargeIntType.INSTANCE) + .args(BooleanType.INSTANCE, LargeIntType.INSTANCE, LargeIntType.INSTANCE), + FunctionSignature.ret(FloatType.INSTANCE) + .args(BooleanType.INSTANCE, FloatType.INSTANCE, FloatType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE) + .args(BooleanType.INSTANCE, DoubleType.INSTANCE, DoubleType.INSTANCE), + FunctionSignature.ret(DateTimeType.INSTANCE) + .args(BooleanType.INSTANCE, DateTimeType.INSTANCE, DateTimeType.INSTANCE), + FunctionSignature.ret(DateType.INSTANCE).args(BooleanType.INSTANCE, DateType.INSTANCE, + DateType.INSTANCE), + FunctionSignature.ret(TimeType.INSTANCE).args(BooleanType.INSTANCE, TimeType.INSTANCE, + TimeType.INSTANCE), + FunctionSignature.ret(TimeV2Type.INSTANCE).args(BooleanType.INSTANCE, TimeV2Type.INSTANCE, + TimeV2Type.INSTANCE), + FunctionSignature.ret(DecimalV3Type.WILDCARD) + .args(BooleanType.INSTANCE, DecimalV3Type.WILDCARD, DecimalV3Type.WILDCARD), + FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT) + .args(BooleanType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT), + FunctionSignature.ret(BitmapType.INSTANCE) + .args(BooleanType.INSTANCE, BitmapType.INSTANCE, BitmapType.INSTANCE), + FunctionSignature.ret(HllType.INSTANCE).args(BooleanType.INSTANCE, HllType.INSTANCE, HllType.INSTANCE), + FunctionSignature.retArgType(1) + .args(BooleanType.INSTANCE, ArrayType.of(new AnyDataType(0)), + ArrayType.of(new AnyDataType(0))), + FunctionSignature.retArgType(1) + .args(BooleanType.INSTANCE, MapType.of(new AnyDataType(0), new AnyDataType(1)), + MapType.of(new AnyDataType(0), new AnyDataType(1))), + FunctionSignature.retArgType(1) + .args(BooleanType.INSTANCE, new AnyDataType(0), new AnyDataType(0)), + // NOTICE string must at least of signature list, because all complex type could implicit cast to string + FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) + .args(BooleanType.INSTANCE, VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT), + FunctionSignature.ret(StringType.INSTANCE) + .args(BooleanType.INSTANCE, StringType.INSTANCE, StringType.INSTANCE), + FunctionSignature.ret(JsonType.INSTANCE) + .args(BooleanType.INSTANCE, JsonType.INSTANCE, JsonType.INSTANCE) + ); /** * constructor with 3 arguments. @@ -75,21 +152,13 @@ public class If extends ScalarFunction } @Override - public FunctionSignature customSignature() { - Optional<DataType> commonType; - try { - commonType = TypeCoercionUtils.findWiderTypeForTwoForCaseWhen( - getArgumentType(1), getArgumentType(2)); - } catch (Exception e) { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } - if (commonType.isPresent()) { - return FunctionSignature.ret(commonType.get()) - .args(BooleanType.INSTANCE, commonType.get(), commonType.get()); - } else { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } + public List<FunctionSignature> getSignatures() { + return SIGNATURES; + } + + @Override + public FunctionSignature searchSignature(List<FunctionSignature> signatures) { + + return ExplicitlyCastableSignature.super.searchSignature(signatures); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NullIf.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NullIf.java index 089478b76f8..fe6164dc085 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NullIf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NullIf.java @@ -20,23 +20,63 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; -import org.apache.doris.nereids.trees.expressions.functions.CustomSignature; -import org.apache.doris.nereids.trees.expressions.functions.SearchSignature; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; -import org.apache.doris.nereids.types.DataType; -import org.apache.doris.nereids.util.TypeCoercionUtils; +import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.BooleanType; +import org.apache.doris.nereids.types.DateTimeType; +import org.apache.doris.nereids.types.DateTimeV2Type; +import org.apache.doris.nereids.types.DateType; +import org.apache.doris.nereids.types.DateV2Type; +import org.apache.doris.nereids.types.DecimalV2Type; +import org.apache.doris.nereids.types.DecimalV3Type; +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.StringType; +import org.apache.doris.nereids.types.TimeType; +import org.apache.doris.nereids.types.TimeV2Type; +import org.apache.doris.nereids.types.TinyIntType; +import org.apache.doris.nereids.types.VarcharType; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import java.util.List; -import java.util.Optional; /** * ScalarFunction 'nullif'. This class is generated by GenerateFunction. */ public class NullIf extends ScalarFunction - implements BinaryExpression, CustomSignature, AlwaysNullable { + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNullable { + + public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( + FunctionSignature.ret(BooleanType.INSTANCE).args(BooleanType.INSTANCE, BooleanType.INSTANCE), + FunctionSignature.ret(TinyIntType.INSTANCE).args(TinyIntType.INSTANCE, TinyIntType.INSTANCE), + FunctionSignature.ret(SmallIntType.INSTANCE).args(SmallIntType.INSTANCE, SmallIntType.INSTANCE), + FunctionSignature.ret(IntegerType.INSTANCE).args(IntegerType.INSTANCE, IntegerType.INSTANCE), + FunctionSignature.ret(BigIntType.INSTANCE).args(BigIntType.INSTANCE, BigIntType.INSTANCE), + FunctionSignature.ret(LargeIntType.INSTANCE).args(LargeIntType.INSTANCE, LargeIntType.INSTANCE), + FunctionSignature.ret(FloatType.INSTANCE).args(FloatType.INSTANCE, FloatType.INSTANCE), + FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE), + FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, DateTimeType.INSTANCE), + FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, DateType.INSTANCE), + FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT) + .args(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT), + FunctionSignature.ret(DateV2Type.INSTANCE).args(DateV2Type.INSTANCE, DateV2Type.INSTANCE), + FunctionSignature.ret(TimeType.INSTANCE).args(TimeType.INSTANCE, TimeType.INSTANCE), + FunctionSignature.ret(TimeV2Type.INSTANCE).args(TimeV2Type.INSTANCE, TimeV2Type.INSTANCE), + FunctionSignature.ret(DecimalV2Type.SYSTEM_DEFAULT) + .args(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT), + FunctionSignature.ret(DecimalV3Type.WILDCARD) + .args(DecimalV3Type.WILDCARD, DecimalV3Type.WILDCARD), + FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) + .args(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT), + FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE, StringType.INSTANCE) + ); /** * constructor with 2 arguments. @@ -55,21 +95,8 @@ public class NullIf extends ScalarFunction } @Override - public FunctionSignature customSignature() { - Optional<DataType> commonType; - try { - commonType = TypeCoercionUtils.findWiderTypeForTwoForCaseWhen( - getArgumentType(0), getArgumentType(1)); - } catch (Exception e) { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } - if (commonType.isPresent()) { - return FunctionSignature.ret(commonType.get()).varArgs(commonType.get()); - } else { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } + public List<FunctionSignature> getSignatures() { + return SIGNATURES; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Nvl.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Nvl.java index 52fdacb89e9..658e05f1148 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Nvl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Nvl.java @@ -19,23 +19,64 @@ package org.apache.doris.nereids.trees.expressions.functions.scalar; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.CustomSignature; -import org.apache.doris.nereids.trees.expressions.functions.SearchSignature; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; -import org.apache.doris.nereids.types.DataType; -import org.apache.doris.nereids.util.TypeCoercionUtils; +import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.BitmapType; +import org.apache.doris.nereids.types.BooleanType; +import org.apache.doris.nereids.types.DateTimeType; +import org.apache.doris.nereids.types.DateTimeV2Type; +import org.apache.doris.nereids.types.DateType; +import org.apache.doris.nereids.types.DateV2Type; +import org.apache.doris.nereids.types.DecimalV3Type; +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.StringType; +import org.apache.doris.nereids.types.TimeType; +import org.apache.doris.nereids.types.TimeV2Type; +import org.apache.doris.nereids.types.TinyIntType; +import org.apache.doris.nereids.types.VarcharType; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import java.util.List; -import java.util.Optional; /** * ScalarFunction 'nvl'. This class is generated by GenerateFunction. */ public class Nvl extends ScalarFunction - implements BinaryExpression, CustomSignature { + implements BinaryExpression, ExplicitlyCastableSignature { + + public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( + FunctionSignature.ret(BooleanType.INSTANCE).args(BooleanType.INSTANCE, BooleanType.INSTANCE), + FunctionSignature.ret(TinyIntType.INSTANCE).args(TinyIntType.INSTANCE, TinyIntType.INSTANCE), + FunctionSignature.ret(SmallIntType.INSTANCE).args(SmallIntType.INSTANCE, SmallIntType.INSTANCE), + FunctionSignature.ret(IntegerType.INSTANCE).args(IntegerType.INSTANCE, IntegerType.INSTANCE), + FunctionSignature.ret(BigIntType.INSTANCE).args(BigIntType.INSTANCE, BigIntType.INSTANCE), + FunctionSignature.ret(LargeIntType.INSTANCE).args(LargeIntType.INSTANCE, LargeIntType.INSTANCE), + FunctionSignature.ret(DecimalV3Type.WILDCARD).args(DecimalV3Type.WILDCARD, DecimalV3Type.WILDCARD), + FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE), + FunctionSignature.ret(FloatType.INSTANCE).args(FloatType.INSTANCE, FloatType.INSTANCE), + FunctionSignature.ret(DateType.INSTANCE).args(DateType.INSTANCE, DateType.INSTANCE), + FunctionSignature.ret(DateTimeType.INSTANCE).args(DateTimeType.INSTANCE, DateTimeType.INSTANCE), + FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT) + .args(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT), + FunctionSignature.ret(DateV2Type.INSTANCE) + .args(DateV2Type.INSTANCE, DateV2Type.INSTANCE), + FunctionSignature.ret(TimeType.INSTANCE) + .args(TimeType.INSTANCE, TimeType.INSTANCE), + FunctionSignature.ret(TimeV2Type.INSTANCE) + .args(TimeV2Type.INSTANCE, TimeV2Type.INSTANCE), + FunctionSignature.ret(BitmapType.INSTANCE).args(BitmapType.INSTANCE, BitmapType.INSTANCE), + FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) + .args(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT), + FunctionSignature.ret(StringType.INSTANCE).args(StringType.INSTANCE, StringType.INSTANCE) + ); /** * constructor with 2 arguments. @@ -62,21 +103,8 @@ public class Nvl extends ScalarFunction } @Override - public FunctionSignature customSignature() { - Optional<DataType> commonType; - try { - commonType = TypeCoercionUtils.findWiderTypeForTwoForCaseWhen( - getArgumentType(0), getArgumentType(1)); - } catch (Exception e) { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } - if (commonType.isPresent()) { - return FunctionSignature.ret(commonType.get()).varArgs(commonType.get()); - } else { - SearchSignature.throwCanNotFoundFunctionException(this.getName(), getArguments()); - return null; - } + public List<FunctionSignature> getSignatures() { + return SIGNATURES; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java index 26af1aaef17..0efaca36630 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java @@ -1511,7 +1511,7 @@ public class TypeCoercionUtils { * find wider common type for two data type. */ @Developing - public static Optional<DataType> findWiderTypeForTwoForCaseWhen(DataType left, DataType right) { + private static Optional<DataType> findWiderTypeForTwoForCaseWhen(DataType left, DataType right) { // TODO: need to rethink how to handle char and varchar to return char or varchar as much as possible. Optional<DataType> commonType = findCommonComplexTypeForCaseWhen(left, right); if (commonType.isPresent()) { @@ -1677,9 +1677,6 @@ public class TypeCoercionUtils { if (otherType.isIntegerType() || otherType.isBigIntType() || otherType.isLargeIntType()) { return Optional.of(otherType); } - if (otherType.isTinyIntType() || otherType.isSmallIntType()) { - return Optional.of(IntegerType.INSTANCE); - } } if (dateType.isDateTimeType() || dateType.isDateTimeV2Type()) { if (otherType.isLargeIntType() || otherType.isDoubleType()) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java index cb1e9e44d50..152c0f542e3 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java @@ -29,6 +29,7 @@ import org.apache.doris.nereids.trees.expressions.literal.NullLiteral; import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.DateTimeV2Type; import org.apache.doris.nereids.types.StringType; +import org.apache.doris.nereids.types.VarcharType; import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Test; @@ -104,7 +105,7 @@ public class SimplifyConditionalFunctionTest extends ExpressionRewriteTestHelper assertRewrite(new Nvl(nonNullableSlot, NullLiteral.INSTANCE), nonNullableSlot); // nvl(null, null) -> null - assertRewrite(new Nvl(NullLiteral.INSTANCE, NullLiteral.INSTANCE), NullLiteral.INSTANCE); + assertRewrite(new Nvl(NullLiteral.INSTANCE, NullLiteral.INSTANCE), new NullLiteral(BooleanType.INSTANCE)); SlotReference datetimeSlot = new SlotReference("dt", DateTimeV2Type.of(0), false); // nvl(null_datetime(0), non-nullable_slot_datetime(6)) @@ -126,7 +127,7 @@ public class SimplifyConditionalFunctionTest extends ExpressionRewriteTestHelper SlotReference nonNullableSlot = new SlotReference("b", StringType.INSTANCE, false); // nullif(null, slot) -> null assertRewrite(new NullIf(NullLiteral.INSTANCE, slot), - new Nullable(new NullLiteral(StringType.INSTANCE))); + new Nullable(new NullLiteral(VarcharType.SYSTEM_DEFAULT))); // nullif(nullable_slot, null) -> slot assertRewrite(new NullIf(slot, NullLiteral.INSTANCE), new Nullable(slot)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionMatrixTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionMatrixTest.java deleted file mode 100644 index 5a833d1283c..00000000000 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionMatrixTest.java +++ /dev/null @@ -1,121 +0,0 @@ -// 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.util; - -import org.apache.doris.nereids.types.AggStateType; -import org.apache.doris.nereids.types.ArrayType; -import org.apache.doris.nereids.types.BigIntType; -import org.apache.doris.nereids.types.BitmapType; -import org.apache.doris.nereids.types.BooleanType; -import org.apache.doris.nereids.types.CharType; -import org.apache.doris.nereids.types.DataType; -import org.apache.doris.nereids.types.DateTimeType; -import org.apache.doris.nereids.types.DateTimeV2Type; -import org.apache.doris.nereids.types.DateType; -import org.apache.doris.nereids.types.DateV2Type; -import org.apache.doris.nereids.types.DecimalV2Type; -import org.apache.doris.nereids.types.DecimalV3Type; -import org.apache.doris.nereids.types.DoubleType; -import org.apache.doris.nereids.types.FloatType; -import org.apache.doris.nereids.types.HllType; -import org.apache.doris.nereids.types.IPv4Type; -import org.apache.doris.nereids.types.IPv6Type; -import org.apache.doris.nereids.types.IntegerType; -import org.apache.doris.nereids.types.JsonType; -import org.apache.doris.nereids.types.LargeIntType; -import org.apache.doris.nereids.types.MapType; -import org.apache.doris.nereids.types.NullType; -import org.apache.doris.nereids.types.QuantileStateType; -import org.apache.doris.nereids.types.SmallIntType; -import org.apache.doris.nereids.types.StringType; -import org.apache.doris.nereids.types.StructField; -import org.apache.doris.nereids.types.StructType; -import org.apache.doris.nereids.types.TimeV2Type; -import org.apache.doris.nereids.types.TinyIntType; -import org.apache.doris.nereids.types.VarcharType; -import org.apache.doris.nereids.types.VariantType; - -import com.google.common.collect.ImmutableList; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Optional; - -public class TypeCoercionMatrixTest { - @Test - public void testProcessComparisonPredicateForNullType() { - testProcessComparisonPredicate(NullType.INSTANCE, NullType.INSTANCE, NullType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, BooleanType.INSTANCE, BooleanType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, TinyIntType.INSTANCE, TinyIntType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, SmallIntType.INSTANCE, SmallIntType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, IntegerType.INSTANCE, IntegerType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, BigIntType.INSTANCE, BigIntType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, LargeIntType.INSTANCE, LargeIntType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT); - testProcessComparisonPredicate(NullType.INSTANCE, DecimalV2Type.CATALOG_DEFAULT, DecimalV2Type.CATALOG_DEFAULT); - testProcessComparisonPredicate(NullType.INSTANCE, DecimalV3Type.createDecimalV3Type(23, 3), - DecimalV3Type.createDecimalV3Type(23, 3)); - testProcessComparisonPredicate(NullType.INSTANCE, DecimalV3Type.createDecimalV3Type(38, 30), - DecimalV3Type.createDecimalV3Type(38, 30)); - testProcessComparisonPredicate(NullType.INSTANCE, FloatType.INSTANCE, FloatType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DoubleType.INSTANCE, DoubleType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DateType.INSTANCE, DateType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DateV2Type.INSTANCE, DateV2Type.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DateTimeType.INSTANCE, DateTimeType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, DateTimeV2Type.of(0), DateTimeV2Type.of(0)); - testProcessComparisonPredicate(NullType.INSTANCE, DateTimeV2Type.of(3), DateTimeV2Type.of(3)); - testProcessComparisonPredicate(NullType.INSTANCE, DateTimeV2Type.of(6), DateTimeV2Type.of(6)); - testProcessComparisonPredicate(NullType.INSTANCE, TimeV2Type.of(0), TimeV2Type.of(0)); - testProcessComparisonPredicate(NullType.INSTANCE, TimeV2Type.of(3), TimeV2Type.of(3)); - testProcessComparisonPredicate(NullType.INSTANCE, TimeV2Type.of(6), TimeV2Type.of(6)); - testProcessComparisonPredicate(NullType.INSTANCE, IPv4Type.INSTANCE, IPv4Type.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, IPv6Type.INSTANCE, IPv6Type.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, JsonType.INSTANCE, JsonType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, CharType.createCharType(5), CharType.createCharType(5)); - testProcessComparisonPredicate(NullType.INSTANCE, VarcharType.createVarcharType(5), - VarcharType.createVarcharType(5)); - testProcessComparisonPredicate(NullType.INSTANCE, StringType.INSTANCE, StringType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, ArrayType.of(StringType.INSTANCE), - ArrayType.of(StringType.INSTANCE)); - testProcessComparisonPredicate(NullType.INSTANCE, ArrayType.of(ArrayType.of(StringType.INSTANCE)), - ArrayType.of(ArrayType.of(StringType.INSTANCE))); - testProcessComparisonPredicate(NullType.INSTANCE, MapType.of(StringType.INSTANCE, StringType.INSTANCE), - MapType.of(StringType.INSTANCE, StringType.INSTANCE)); - testProcessComparisonPredicate(NullType.INSTANCE, - new StructType(ImmutableList.of(new StructField("c1", StringType.INSTANCE, true, ""))), - new StructType(ImmutableList.of(new StructField("c1", StringType.INSTANCE, true, "")))); - testProcessComparisonPredicate(NullType.INSTANCE, VariantType.INSTANCE, VariantType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, HllType.INSTANCE, HllType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, BitmapType.INSTANCE, BitmapType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, QuantileStateType.INSTANCE, QuantileStateType.INSTANCE); - testProcessComparisonPredicate(NullType.INSTANCE, - new AggStateType("sum", ImmutableList.of(IntegerType.INSTANCE), ImmutableList.of(true)), - new AggStateType("sum", ImmutableList.of(IntegerType.INSTANCE), ImmutableList.of(true))); - } - - private void testProcessComparisonPredicate(DataType leftType, DataType rightType, DataType commonType) { - // SlotReference c1 = new SlotReference("c1", leftType); - // SlotReference c2 = new SlotReference("c2", rightType); - // EqualTo equalTo = new EqualTo(c1, c2); - // GreaterThan greaterThan = new GreaterThan(c1, c2); - // equalTo = (EqualTo) TypeCoercionUtils.processComparisonPredicate(equalTo); - // greaterThan = (GreaterThan) TypeCoercionUtils.processComparisonPredicate(greaterThan); - Optional<DataType> result = TypeCoercionUtils.findWiderTypeForTwoForCaseWhen(leftType, rightType); - Assertions.assertEquals(Optional.ofNullable(commonType), result); - } -} diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionUtilsTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionUtilsTest.java index 17468be7b6c..9060e8d87df 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionUtilsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionUtilsTest.java @@ -36,9 +36,12 @@ import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal; import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral; import org.apache.doris.nereids.trees.expressions.literal.StringLiteral; import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral; +import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.BitmapType; import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.CharType; +import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.types.DateTimeType; import org.apache.doris.nereids.types.DateTimeV2Type; import org.apache.doris.nereids.types.DateType; @@ -47,11 +50,15 @@ import org.apache.doris.nereids.types.DecimalV2Type; import org.apache.doris.nereids.types.DecimalV3Type; import org.apache.doris.nereids.types.DoubleType; import org.apache.doris.nereids.types.FloatType; +import org.apache.doris.nereids.types.HllType; import org.apache.doris.nereids.types.IntegerType; import org.apache.doris.nereids.types.LargeIntType; import org.apache.doris.nereids.types.NullType; +import org.apache.doris.nereids.types.QuantileStateType; import org.apache.doris.nereids.types.SmallIntType; import org.apache.doris.nereids.types.StringType; +import org.apache.doris.nereids.types.TimeType; +import org.apache.doris.nereids.types.TimeV2Type; import org.apache.doris.nereids.types.TinyIntType; import org.apache.doris.nereids.types.VarcharType; import org.apache.doris.nereids.types.coercion.IntegralType; @@ -61,6 +68,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.math.BigDecimal; +import java.util.Optional; public class TypeCoercionUtilsTest { @Test @@ -133,6 +141,565 @@ public class TypeCoercionUtilsTest { Assertions.assertFalse(TypeCoercionUtils.hasCharacterType(DateType.INSTANCE)); } + @Test + public void testFindCommonPrimitiveTypeForCaseWhen() { + testFindCommonPrimitiveTypeForCaseWhen(null, ArrayType.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, NullType.INSTANCE, ArrayType.SYSTEM_DEFAULT); + + testFindCommonPrimitiveTypeForCaseWhen(NullType.INSTANCE, NullType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BooleanType.INSTANCE, NullType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TinyIntType.INSTANCE, NullType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, NullType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, NullType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, NullType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, NullType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, NullType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, NullType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, NullType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, NullType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(CharType.SYSTEM_DEFAULT, NullType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.SYSTEM_DEFAULT, NullType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, NullType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateType.INSTANCE, NullType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeType.INSTANCE, NullType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateV2Type.INSTANCE, NullType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, NullType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(TimeType.INSTANCE, NullType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TimeV2Type.INSTANCE, NullType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(HllType.INSTANCE, NullType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BitmapType.INSTANCE, NullType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(QuantileStateType.INSTANCE, NullType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BooleanType.INSTANCE, BooleanType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BooleanType.INSTANCE, BooleanType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TinyIntType.INSTANCE, BooleanType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, BooleanType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, BooleanType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BooleanType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, BooleanType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, BooleanType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, BooleanType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, BooleanType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BooleanType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BooleanType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BooleanType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BooleanType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BooleanType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BooleanType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BooleanType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TinyIntType.INSTANCE, TinyIntType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TinyIntType.INSTANCE, TinyIntType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TinyIntType.INSTANCE, TinyIntType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, TinyIntType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, TinyIntType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, TinyIntType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, TinyIntType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, TinyIntType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, TinyIntType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, TinyIntType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TinyIntType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TinyIntType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TinyIntType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TinyIntType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TinyIntType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TinyIntType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TinyIntType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, SmallIntType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, SmallIntType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, SmallIntType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(SmallIntType.INSTANCE, SmallIntType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, SmallIntType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, SmallIntType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, SmallIntType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, SmallIntType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, SmallIntType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, SmallIntType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, SmallIntType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, SmallIntType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, SmallIntType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, SmallIntType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, SmallIntType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, SmallIntType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, SmallIntType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, IntegerType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, IntegerType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, IntegerType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, IntegerType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, IntegerType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, IntegerType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, IntegerType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, IntegerType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, IntegerType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, IntegerType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, IntegerType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, IntegerType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, IntegerType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, IntegerType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, IntegerType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, IntegerType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, BigIntType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, BigIntType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, BigIntType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, BigIntType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BigIntType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BigIntType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BigIntType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, BigIntType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BigIntType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, BigIntType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BigIntType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BigIntType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, BigIntType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BigIntType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BigIntType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BigIntType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, LargeIntType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.createDecimalV3Type(38), LargeIntType.INSTANCE, DecimalV3Type.createDecimalV3Type(38)); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, LargeIntType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, LargeIntType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, LargeIntType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, LargeIntType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, LargeIntType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, LargeIntType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, LargeIntType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, LargeIntType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, LargeIntType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, LargeIntType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, LargeIntType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, + DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, + DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV2Type.SYSTEM_DEFAULT, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV2Type.SYSTEM_DEFAULT, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, + DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV2Type.SYSTEM_DEFAULT, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV2Type.SYSTEM_DEFAULT, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV2Type.SYSTEM_DEFAULT, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.createDecimalV3Type(38), DecimalV3Type.createDecimalV3Type(38), LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, + DecimalV2Type.createDecimalV2Type(27, 0)); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, + DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, + DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV3Type.SYSTEM_DEFAULT, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV3Type.SYSTEM_DEFAULT, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, + DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV3Type.SYSTEM_DEFAULT, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV3Type.SYSTEM_DEFAULT, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DecimalV3Type.SYSTEM_DEFAULT, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(FloatType.INSTANCE, FloatType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, FloatType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, FloatType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, FloatType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, FloatType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, FloatType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DoubleType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DoubleType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DoubleType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DoubleType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DoubleType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DoubleType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DoubleType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DoubleType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DoubleType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(CharType.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(CharType.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.createVarcharType(10), CharType.createCharType(5), + CharType.createCharType(10)); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, CharType.SYSTEM_DEFAULT, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, CharType.SYSTEM_DEFAULT, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, CharType.SYSTEM_DEFAULT, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, CharType.SYSTEM_DEFAULT, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(VarcharType.createVarcharType(10), VarcharType.createVarcharType(5), + VarcharType.createVarcharType(10)); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, VarcharType.SYSTEM_DEFAULT, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, VarcharType.SYSTEM_DEFAULT, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, VarcharType.SYSTEM_DEFAULT, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, StringType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, StringType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, StringType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, StringType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateType.INSTANCE, DateType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, DateType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, DateType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, DateType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateType.INSTANCE, DateType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeType.INSTANCE, DateType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateV2Type.INSTANCE, DateType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeType.INSTANCE, DateTimeType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, DateTimeType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DateTimeType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeType.INSTANCE, DateTimeType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeType.INSTANCE, DateTimeType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeType.INSTANCE, + DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateV2Type.INSTANCE, DateV2Type.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(IntegerType.INSTANCE, DateV2Type.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BigIntType.INSTANCE, DateV2Type.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, DateV2Type.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateV2Type.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateV2Type.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateV2Type.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateV2Type.INSTANCE, DateV2Type.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateV2Type.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateV2Type.INSTANCE, DateV2Type.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateV2Type.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateV2Type.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(LargeIntType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, + DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, + DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, + DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DateTimeV2Type.SYSTEM_DEFAULT, DateTimeV2Type.SYSTEM_DEFAULT, + DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, DateTimeV2Type.SYSTEM_DEFAULT, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TimeType.INSTANCE, TimeType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, TimeType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, TimeType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(TimeType.INSTANCE, TimeType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TimeV2Type.INSTANCE, TimeType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TimeV2Type.INSTANCE, TimeV2Type.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV2Type.SYSTEM_DEFAULT, TimeV2Type.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DecimalV3Type.SYSTEM_DEFAULT, TimeV2Type.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(DoubleType.INSTANCE, TimeV2Type.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeV2Type.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeV2Type.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(StringType.INSTANCE, TimeV2Type.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(TimeV2Type.INSTANCE, TimeV2Type.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(TimeV2Type.INSTANCE, TimeV2Type.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, TimeV2Type.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(HllType.INSTANCE, HllType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(HllType.INSTANCE, HllType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, HllType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BitmapType.INSTANCE, BitmapType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(BitmapType.INSTANCE, BitmapType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, BitmapType.INSTANCE, QuantileStateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(QuantileStateType.INSTANCE, QuantileStateType.INSTANCE, NullType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, BooleanType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, TinyIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, SmallIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, IntegerType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, BigIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, LargeIntType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DecimalV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DecimalV3Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, FloatType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DoubleType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, CharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, VarcharType.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, StringType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DateType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DateTimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DateV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, DateTimeV2Type.SYSTEM_DEFAULT); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, TimeType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, TimeV2Type.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, HllType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(null, QuantileStateType.INSTANCE, BitmapType.INSTANCE); + testFindCommonPrimitiveTypeForCaseWhen(QuantileStateType.INSTANCE, QuantileStateType.INSTANCE, QuantileStateType.INSTANCE); + } + + private void testFindCommonPrimitiveTypeForCaseWhen(DataType commonType, DataType left, DataType right) { + Assertions.assertEquals(Optional.ofNullable(commonType), + TypeCoercionUtils.findCommonPrimitiveTypeForCaseWhen(left, right), + "left: " + left + ", right: " + right); + } + @Test public void testCastIfNotSameType() { Assertions.assertEquals(new DoubleLiteral(5L), diff --git a/regression-test/data/query_p0/sql_functions/conditional_functions/test_ifnull_array.out b/regression-test/data/query_p0/sql_functions/conditional_functions/test_ifnull_array.out deleted file mode 100644 index 1978168745f..00000000000 --- a/regression-test/data/query_p0/sql_functions/conditional_functions/test_ifnull_array.out +++ /dev/null @@ -1,4 +0,0 @@ --- This file is automatically generated. You should know what you did if you want to edit this --- !select -- -["1"] - diff --git a/regression-test/suites/nereids_p0/datatype/test_date_implicit_cast.groovy b/regression-test/suites/nereids_p0/datatype/test_date_implicit_cast.groovy index e7f52410785..2880b0634a0 100644 --- a/regression-test/suites/nereids_p0/datatype/test_date_implicit_cast.groovy +++ b/regression-test/suites/nereids_p0/datatype/test_date_implicit_cast.groovy @@ -38,7 +38,7 @@ suite("test_date_implicit_cast") { if (value.contains("col=k1, colUniqueId=0, type=datetimev2(4)")) { contain0 = true; } - if (value.contains("col=null, colUniqueId=null, type=text")) { + if (value.contains("col=null, colUniqueId=null, type=datetimev2(4)")) { contain1 = true; } } @@ -61,7 +61,7 @@ suite("test_date_implicit_cast") { if (value.contains("col=k1, colUniqueId=0, type=datetimev2(4)")) { contain0 = true; } - if (value.contains("col=null, colUniqueId=null, type=text")) { + if (value.contains("col=null, colUniqueId=null, type=datetimev2(5)")) { contain1 = true; } } @@ -80,7 +80,7 @@ suite("test_date_implicit_cast") { if (value.contains("col=k1, colUniqueId=0, type=datetimev2(6)")) { contain0 = true; } - if (value.contains("col=null, colUniqueId=null, type=text")) { + if (value.contains("col=null, colUniqueId=null, type=datetimev2(6)")) { contain1 = true; } } diff --git a/regression-test/suites/query_p0/sql_functions/conditional_functions/test_ifnull_array.groovy b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_ifnull_array.groovy deleted file mode 100644 index 26e0402b6a4..00000000000 --- a/regression-test/suites/query_p0/sql_functions/conditional_functions/test_ifnull_array.groovy +++ /dev/null @@ -1,41 +0,0 @@ -// 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_ifnull_array") { - String suiteName = "test_ifnull_array" - String tableName = "${suiteName}_table" - - sql """drop table if exists `${tableName}`""" - - sql """ - CREATE TABLE ${tableName} ( - `class_code` varchar(50) NULL, - `student_code` varchar(50) NULL, - `adviser_code` varchar(50) NULL - ) ENGINE=OLAP - DUPLICATE KEY(`class_code`) - DISTRIBUTED BY HASH(`class_code`) BUCKETS 10 - PROPERTIES ( - 'replication_num' = '1' - ); - """ - sql """ - insert into ${tableName} values ('1','1','1'); - """ - qt_select "select (select array_distinct(array_agg(br.class_code)) from ${tableName} br where br.student_code = brv.student_code) as all_class_codes from ${tableName} brv;" - sql """drop table if exists `${tableName}`""" -} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
