You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2025/12/01 07:56:03 UTC

(doris) branch branch-3.1 updated: branch-3.1: [opt](coercion) change the coercion behavior (#57961)

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 755909f0d36 branch-3.1: [opt](coercion) change the coercion behavior (#57961)
755909f0d36 is described below

commit 755909f0d36646d4d0dd595d21b6c0b0c9d161b5
Author: zhangdong <zh...@selectdb.com>
AuthorDate: Mon Dec 1 15:55:55 2025 +0800

    branch-3.1: [opt](coercion) change the coercion behavior (#57961)
    
    picked part of #55672, only pick: If, NullIf, Nvl
---
 .../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, 238 insertions(+), 761 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 655649822c8..bded496e01b 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,101 +20,24 @@ 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.ExplicitlyCastableSignature;
+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.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.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.types.DataType;
 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, 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)
-    );
+        implements TernaryExpression, CustomSignature {
 
     /**
      * constructor with 3 arguments.
@@ -152,13 +75,21 @@ public class If extends ScalarFunction
     }
 
     @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
-    }
-
-    @Override
-    public FunctionSignature searchSignature(List<FunctionSignature> signatures) {
-
-        return ExplicitlyCastableSignature.super.searchSignature(signatures);
+    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;
+        }
     }
 }
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 fe6164dc085..089478b76f8 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,63 +20,23 @@ 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.ExplicitlyCastableSignature;
+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.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
-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 org.apache.doris.nereids.types.DataType;
+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 'nullif'. This class is generated by GenerateFunction.
  */
 public class NullIf extends ScalarFunction
-        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)
-    );
+        implements BinaryExpression, CustomSignature, AlwaysNullable {
 
     /**
      * constructor with 2 arguments.
@@ -95,8 +55,21 @@ public class NullIf extends ScalarFunction
     }
 
     @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
+    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;
+        }
     }
 
     @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 658e05f1148..52fdacb89e9 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,64 +19,23 @@ 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.ExplicitlyCastableSignature;
+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.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
-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 org.apache.doris.nereids.types.DataType;
+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 'nvl'. This class is generated by GenerateFunction.
  */
 public class Nvl extends ScalarFunction
-        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)
-    );
+        implements BinaryExpression, CustomSignature {
 
     /**
      * constructor with 2 arguments.
@@ -103,8 +62,21 @@ public class Nvl extends ScalarFunction
     }
 
     @Override
-    public List<FunctionSignature> getSignatures() {
-        return SIGNATURES;
+    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;
+        }
     }
 
     @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 0efaca36630..26af1aaef17 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
-    private static Optional<DataType> findWiderTypeForTwoForCaseWhen(DataType left, DataType right) {
+    public 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,6 +1677,9 @@ 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 152c0f542e3..cb1e9e44d50 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,7 +29,6 @@ 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;
@@ -105,7 +104,7 @@ public class SimplifyConditionalFunctionTest extends ExpressionRewriteTestHelper
         assertRewrite(new Nvl(nonNullableSlot, NullLiteral.INSTANCE), nonNullableSlot);
 
         // nvl(null, null) -> null
-        assertRewrite(new Nvl(NullLiteral.INSTANCE, NullLiteral.INSTANCE), new NullLiteral(BooleanType.INSTANCE));
+        assertRewrite(new Nvl(NullLiteral.INSTANCE, NullLiteral.INSTANCE), NullLiteral.INSTANCE);
 
         SlotReference datetimeSlot = new SlotReference("dt", DateTimeV2Type.of(0), false);
         // nvl(null_datetime(0), non-nullable_slot_datetime(6))
@@ -127,7 +126,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(VarcharType.SYSTEM_DEFAULT)));
+                new Nullable(new NullLiteral(StringType.INSTANCE)));
 
         // 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
new file mode 100644
index 00000000000..5a833d1283c
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/TypeCoercionMatrixTest.java
@@ -0,0 +1,121 @@
+// 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 9060e8d87df..17468be7b6c 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,12 +36,9 @@ 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;
@@ -50,15 +47,11 @@ 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;
@@ -68,7 +61,6 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.math.BigDecimal;
-import java.util.Optional;
 
 public class TypeCoercionUtilsTest {
     @Test
@@ -141,565 +133,6 @@ 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
new file mode 100644
index 00000000000..1978168745f
--- /dev/null
+++ b/regression-test/data/query_p0/sql_functions/conditional_functions/test_ifnull_array.out
@@ -0,0 +1,4 @@
+-- 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 2880b0634a0..e7f52410785 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=datetimev2(4)")) {
+        if (value.contains("col=null, colUniqueId=null, type=text")) {
             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=datetimev2(5)")) {
+        if (value.contains("col=null, colUniqueId=null, type=text")) {
             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=datetimev2(6)")) {
+        if (value.contains("col=null, colUniqueId=null, type=text")) {
             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
new file mode 100644
index 00000000000..26e0402b6a4
--- /dev/null
+++ b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_ifnull_array.groovy
@@ -0,0 +1,41 @@
+// 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: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org