This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 0d66f7b58fb Revert "branch-3.1: [opt](coercion) change the coercion 
behavior (#57961)" (#59351)
0d66f7b58fb is described below

commit 0d66f7b58fb3c9fae12b176b52cc1f5ca1ce27dc
Author: morrySnow <[email protected]>
AuthorDate: Thu Dec 25 15:40:16 2025 +0800

    Revert "branch-3.1: [opt](coercion) change the coercion behavior (#57961)" 
(#59351)
    
    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]

Reply via email to