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

starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e0639d7a9b9 [feature](nereids) add expression transformation rule 
simplify_conditional_function (#37613)
e0639d7a9b9 is described below

commit e0639d7a9b9bc5de24b2dcd60da889c834faafe6
Author: feiniaofeiafei <53502832+feiniaofeia...@users.noreply.github.com>
AuthorDate: Tue Oct 15 12:26:03 2024 +0800

    [feature](nereids) add expression transformation rule 
simplify_conditional_function (#37613)
    
    ```sql
    coalesce(null,null,expr,...) => coalesce(expr,...)
    coalesce(expr1(not null able ), expr2, ...., expr_n) => expr1
    coalesce(null,null) => null
    coalesce(expr1) => expr1
    nvl(null,R) => R
    nvl(L(not-nullable ),R) => L
    nullif(null, R) => Null
    nullif(L, null) => Null
    ```
---
 .../doris/nereids/jobs/executor/Rewriter.java      |   6 +-
 .../NullableDependentExpressionRewrite.java        |  46 +++++++
 .../rules/SimplifyConditionalFunction.java         | 106 ++++++++++++++++
 .../rules/SimplifyConditionalFunctionTest.java     | 111 +++++++++++++++++
 .../data/nereids_hint_tpcds_p0/shape/query41.out   |   2 +-
 .../simplify_conditional_function.out              | 133 +++++++++++++++++++++
 .../shape/query41.out                              |   2 +-
 .../noStatsRfPrune/query41.out                     |   2 +-
 .../no_stats_shape/query41.out                     |   2 +-
 .../rf_prune/query41.out                           |   2 +-
 .../nereids_tpcds_shape_sf100_p0/shape/query41.out |   2 +-
 .../shape/query41.out                              |   2 +-
 .../tpcds_sf100/noStatsRfPrune/query41.out         |   2 +-
 .../tpcds_sf100/no_stats_shape/query41.out         |   2 +-
 .../new_shapes_p0/tpcds_sf100/rf_prune/query41.out |   2 +-
 .../new_shapes_p0/tpcds_sf100/shape/query41.out    |   2 +-
 .../new_shapes_p0/tpcds_sf1000/shape/query41.out   |   2 +-
 .../simplify_conditional_function.groovy           |  52 ++++++++
 18 files changed, 465 insertions(+), 13 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index 9b33f94c4c2..099765b5160 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -31,6 +31,7 @@ import 
org.apache.doris.nereids.rules.analysis.NormalizeAggregate;
 import org.apache.doris.nereids.rules.expression.CheckLegalityAfterRewrite;
 import 
org.apache.doris.nereids.rules.expression.ExpressionNormalizationAndOptimization;
 import org.apache.doris.nereids.rules.expression.ExpressionRewrite;
+import 
org.apache.doris.nereids.rules.expression.NullableDependentExpressionRewrite;
 import org.apache.doris.nereids.rules.expression.QueryColumnCollector;
 import org.apache.doris.nereids.rules.rewrite.AddDefaultLimit;
 import org.apache.doris.nereids.rules.rewrite.AddProjectForJoin;
@@ -579,7 +580,10 @@ public class Rewriter extends AbstractBatchJobExecutor {
                         ),
                         topic("whole plan check",
                                 custom(RuleType.ADJUST_NULLABLE, 
AdjustNullable::new)
-                        )
+                        ),
+                        // NullableDependentExpressionRewrite need to be done 
after nullable fixed
+                        topic("condition function", bottomUp(ImmutableList.of(
+                                new NullableDependentExpressionRewrite())))
                 ));
                 return rewriteJobs;
             }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/NullableDependentExpressionRewrite.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/NullableDependentExpressionRewrite.java
new file mode 100644
index 00000000000..558e3884739
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/NullableDependentExpressionRewrite.java
@@ -0,0 +1,46 @@
+// 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.rules.expression;
+
+import org.apache.doris.nereids.annotation.DependsRules;
+import 
org.apache.doris.nereids.rules.analysis.AdjustAggregateNullableForEmptySet;
+import 
org.apache.doris.nereids.rules.expression.rules.SimplifyConditionalFunction;
+import org.apache.doris.nereids.rules.rewrite.AdjustNullable;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**NullableDependentExpressionRewrite*/
+@DependsRules({
+        AdjustNullable.class,
+        AdjustAggregateNullableForEmptySet.class
+})
+public class NullableDependentExpressionRewrite extends ExpressionRewrite {
+    public static final List<ExpressionRewriteRule> OPTIMIZE_REWRITE_RULES = 
ImmutableList.of(
+            bottomUp(
+                SimplifyConditionalFunction.INSTANCE
+            )
+    );
+
+    private static final ExpressionRuleExecutor EXECUTOR = new 
ExpressionRuleExecutor(OPTIMIZE_REWRITE_RULES);
+
+    public NullableDependentExpressionRewrite() {
+        super(EXECUTOR);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
new file mode 100644
index 00000000000..359cb887fe5
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunction.java
@@ -0,0 +1,106 @@
+// 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.rules.expression.rules;
+
+import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
+import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.Nvl;
+import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**SimplifyConditionalFunction*/
+public class SimplifyConditionalFunction implements 
ExpressionPatternRuleFactory {
+    public static SimplifyConditionalFunction INSTANCE = new 
SimplifyConditionalFunction();
+
+    @Override
+    public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
+        return ImmutableList.of(
+                
matchesType(Coalesce.class).then(SimplifyConditionalFunction::rewriteCoalesce),
+                
matchesType(Nvl.class).then(SimplifyConditionalFunction::rewriteNvl),
+                
matchesType(NullIf.class).then(SimplifyConditionalFunction::rewriteNullIf)
+        );
+    }
+
+    /*
+     * coalesce(null,null,expr,...) => coalesce(expr,...)
+     * coalesce(expr1(not null able ), expr2, ...., expr_n) => expr1
+     * coalesce(null,null) => null
+     * coalesce(expr1) => expr1
+     * */
+    private static Expression rewriteCoalesce(Coalesce expression) {
+        if (1 == expression.arity()) {
+            return expression.child(0);
+        }
+        if (!(expression.child(0) instanceof NullLiteral) && 
expression.child(0).nullable()) {
+            return expression;
+        }
+        ImmutableList.Builder<Expression> childBuilder = 
ImmutableList.builder();
+        for (int i = 0; i < expression.arity(); i++) {
+            Expression child = expression.children().get(i);
+            if (child instanceof NullLiteral) {
+                continue;
+            }
+            if (!child.nullable()) {
+                return child;
+            } else {
+                for (int j = i; j < expression.arity(); j++) {
+                    childBuilder.add(expression.children().get(j));
+                }
+                break;
+            }
+        }
+        List<Expression> newChildren = childBuilder.build();
+        if (newChildren.isEmpty()) {
+            return new NullLiteral(expression.getDataType());
+        } else {
+            return expression.withChildren(newChildren);
+        }
+    }
+
+    /*
+    * nvl(null,R) => R
+    * nvl(L(not-nullable ),R) => L
+    * */
+    private static Expression rewriteNvl(Nvl nvl) {
+        if (nvl.child(0) instanceof NullLiteral) {
+            return nvl.child(1);
+        }
+        if (!nvl.child(0).nullable()) {
+            return nvl.child(0);
+        }
+        return nvl;
+    }
+
+    /*
+    * nullif(null, R) => Null
+    * nullif(L, null) => Null
+     */
+    private static Expression rewriteNullIf(NullIf nullIf) {
+        if (nullIf.child(0) instanceof NullLiteral || nullIf.child(1) 
instanceof NullLiteral) {
+            return nullIf.child(0);
+        } else {
+            return nullIf;
+        }
+    }
+}
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
new file mode 100644
index 00000000000..33c62f142c2
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/SimplifyConditionalFunctionTest.java
@@ -0,0 +1,111 @@
+// 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.rules.expression.rules;
+
+import org.apache.doris.nereids.rules.expression.ExpressionRewriteTestHelper;
+import org.apache.doris.nereids.rules.expression.ExpressionRuleExecutor;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.Coalesce;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.NullIf;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.Nvl;
+import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
+import org.apache.doris.nereids.types.BooleanType;
+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;
+
+public class SimplifyConditionalFunctionTest extends 
ExpressionRewriteTestHelper {
+    @Test
+    public void testCoalesce() {
+        executor = new 
ExpressionRuleExecutor(ImmutableList.of(bottomUp((SimplifyConditionalFunction.INSTANCE))));
+        SlotReference slot = new SlotReference("a", StringType.INSTANCE, true);
+        SlotReference nonNullableSlot = new SlotReference("b", 
StringType.INSTANCE, false);
+
+        // coalesce(null, null, nullable_slot) -> nullable_slot
+        assertRewrite(new Coalesce(NullLiteral.INSTANCE, NullLiteral.INSTANCE, 
slot), slot);
+
+        // coalesce(null, null, nullable_slot, slot) -> 
coalesce(nullable_slot, slot)
+        assertRewrite(new Coalesce(NullLiteral.INSTANCE, NullLiteral.INSTANCE, 
slot, slot),
+                new Coalesce(slot, slot));
+
+        // coalesce(null, null, non-nullable_slot, slot) -> non-nullable_slot
+        assertRewrite(new Coalesce(NullLiteral.INSTANCE, NullLiteral.INSTANCE, 
nonNullableSlot, slot),
+                nonNullableSlot);
+
+        // coalesce(non-nullable_slot, ...) -> non-nullable_slot
+        assertRewrite(new Coalesce(nonNullableSlot, NullLiteral.INSTANCE, 
nonNullableSlot, slot),
+                nonNullableSlot);
+
+        // coalesce(nullable_slot, slot) -> coalesce(nullable_slot, slot)
+        assertRewrite(new Coalesce(slot, nonNullableSlot), new Coalesce(slot, 
nonNullableSlot));
+
+        // coalesce(null, null) -> null
+        assertRewrite(new Coalesce(NullLiteral.INSTANCE, 
NullLiteral.INSTANCE), new NullLiteral(BooleanType.INSTANCE));
+
+        // coalesce(null) -> null
+        assertRewrite(new Coalesce(NullLiteral.INSTANCE), new 
NullLiteral(BooleanType.INSTANCE));
+
+        // coalesce(non-nullable_slot) -> non-nullable_slot
+        assertRewrite(new Coalesce(nonNullableSlot), nonNullableSlot);
+
+        // coalesce(non-nullable_slot) -> non-nullable_slot
+        assertRewrite(new Coalesce(slot), slot);
+
+        // coalesce(null, nullable_slot, literal) -> coalesce(nullable_slot, 
slot, literal)
+        assertRewrite(new Coalesce(slot, nonNullableSlot), new Coalesce(slot, 
nonNullableSlot));
+    }
+
+    @Test
+    public void testNvl() {
+        executor = new 
ExpressionRuleExecutor(ImmutableList.of(bottomUp((SimplifyConditionalFunction.INSTANCE))));
+        SlotReference slot = new SlotReference("a", StringType.INSTANCE, true);
+        SlotReference nonNullableSlot = new SlotReference("b", 
StringType.INSTANCE, false);
+        // nvl(null, nullable_slot) -> nullable_slot
+        assertRewrite(new Nvl(NullLiteral.INSTANCE, slot), slot);
+
+        // nvl(null, non-nullable_slot) -> non-nullable_slot
+        assertRewrite(new Nvl(NullLiteral.INSTANCE, nonNullableSlot), 
nonNullableSlot);
+
+        // nvl(nullable_slot, nullable_slot) -> nvl(nullable_slot, 
nullable_slot)
+        assertRewrite(new Nvl(slot, nonNullableSlot), new Nvl(slot, 
nonNullableSlot));
+
+        // nvl(non-nullable_slot, null) -> non-nullable_slot
+        assertRewrite(new Nvl(nonNullableSlot, NullLiteral.INSTANCE), 
nonNullableSlot);
+
+        // nvl(null, null) -> null
+        assertRewrite(new Nvl(NullLiteral.INSTANCE, NullLiteral.INSTANCE), new 
NullLiteral(BooleanType.INSTANCE));
+    }
+
+    @Test
+    public void testNullIf() {
+        executor = new 
ExpressionRuleExecutor(ImmutableList.of(bottomUp((SimplifyConditionalFunction.INSTANCE))));
+        SlotReference slot = new SlotReference("a", StringType.INSTANCE, true);
+        SlotReference nonNullableSlot = new SlotReference("b", 
StringType.INSTANCE, false);
+        // nullif(null, slot) -> null
+        assertRewrite(new NullIf(NullLiteral.INSTANCE, slot), new 
NullLiteral(VarcharType.SYSTEM_DEFAULT));
+
+        // nullif(nullable_slot, null) -> slot
+        assertRewrite(new NullIf(slot, NullLiteral.INSTANCE), slot);
+
+        // nullif(non-nullable_slot, null) -> non-nullable_slot
+        assertRewrite(new NullIf(nonNullableSlot, NullLiteral.INSTANCE), 
nonNullableSlot);
+    }
+
+}
diff --git a/regression-test/data/nereids_hint_tpcds_p0/shape/query41.out 
b/regression-test/data/nereids_hint_tpcds_p0/shape/query41.out
index a1be484e284..c870e728a39 100644
--- a/regression-test/data/nereids_hint_tpcds_p0/shape/query41.out
+++ b/regression-test/data/nereids_hint_tpcds_p0/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 744) and (i1.i_manufact_id >= 
704))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out
 
b/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out
new file mode 100644
index 00000000000..91f9110804b
--- /dev/null
+++ 
b/regression-test/data/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.out
@@ -0,0 +1,133 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !test_coalesce_null_begin1 --
+ab     ab      \N
+abc    abc     2.7
+ccd    ccd     7.8
+qwe    qwe     8.0
+
+-- !test_coalesce_null_begin2 --
+ab
+abc
+ccd
+qwe
+
+-- !test_coalesce_null_begin3 --
+1
+2
+9
+qwe
+
+-- !test_coalesce_nonnull_begin --
+1
+2
+9
+qwe
+
+-- !test_coalesce_nullalbe_begin --
+2.7
+7.8
+8
+ab
+
+-- !test_coalesce_null_null --
+\N
+\N
+\N
+\N
+
+-- !test_coalesce_null --
+\N
+\N
+\N
+\N
+
+-- !test_coalesce_nonnull --
+\N     qwe     8.0
+1      abc     2.7
+2      ccd     7.8
+9      ab      \N
+
+-- !test_coalesce_nullable --
+\N
+2.7
+7.8
+8.0
+
+-- !test_nvl_null_nullable --
+ab
+abc
+ccd
+qwe
+
+-- !test_nvl_null_nonnullable --
+\N
+1
+2
+9
+
+-- !test_nvl_nullable_nullable --
+ab
+abc
+ccd
+qwe
+
+-- !test_nvl_nonnullable_null --
+\N
+1
+2
+9
+
+-- !test_nvl_null_null --
+\N
+\N
+\N
+\N
+
+-- !test_nullif_null_nullable --
+\N     \N
+\N     1
+\N     2
+\N     9
+
+-- !test_nullif_null_nonnullable --
+\N
+\N
+\N
+\N
+
+-- !test_nullif_nonnullable_null --
+\N
+1
+2
+9
+
+-- !test_nullif_nullable_null --
+ab     9
+abc    1
+ccd    2
+qwe    \N
+
+-- !test_nullif_nullable_nonnullable --
+ab
+abc
+ccd
+qwe
+
+-- !test_nullif_null_null --
+\N
+\N
+\N
+\N
+
+-- !test_outer_ref_coalesce --
+ab
+abc
+
+-- !test_outer_ref_nvl --
+\N
+1
+
+-- !test_outer_ref_nullif --
+ab
+abc
+
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query41.out
index a1be484e284..c870e728a39 100644
--- a/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query41.out
+++ b/regression-test/data/nereids_tpcds_shape_sf1000_p0/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 744) and (i1.i_manufact_id >= 
704))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query41.out
index 4cac3a912db..ff811ef082c 100644
--- 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query41.out
+++ 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/noStatsRfPrune/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query41.out
index 4cac3a912db..ff811ef082c 100644
--- 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query41.out
+++ 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/no_stats_shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query41.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/rf_prune/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query41.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query41.out 
b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query41.out
index 11bcf3db2e7..a470709da68 100644
--- a/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query41.out
+++ b/regression-test/data/nereids_tpcds_shape_sf10t_orc/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 1010) and (i1.i_manufact_id >= 
970))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query41.out 
b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query41.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/noStatsRfPrune/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query41.out 
b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query41.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/no_stats_shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query41.out 
b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query41.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/rf_prune/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query41.out 
b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query41.out
index 4cac3a912db..ff811ef082c 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query41.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf100/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 788) and (i1.i_manufact_id >= 
748))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query41.out 
b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query41.out
index a1be484e284..c870e728a39 100644
--- a/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query41.out
+++ b/regression-test/data/new_shapes_p0/tpcds_sf1000/shape/query41.out
@@ -13,7 +13,7 @@ PhysicalResultSink
 --------------------filter((i1.i_manufact_id <= 744) and (i1.i_manufact_id >= 
704))
 ----------------------PhysicalOlapScan[item] apply RFs: RF0
 ------------------PhysicalProject
---------------------filter((ifnull(item_cnt, 0) > 0))
+--------------------filter((item_cnt > 0))
 ----------------------hashAgg[GLOBAL]
 ------------------------PhysicalDistribute[DistributionSpecHash]
 --------------------------hashAgg[LOCAL]
diff --git 
a/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy
 
b/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy
new file mode 100644
index 00000000000..18443bb152a
--- /dev/null
+++ 
b/regression-test/suites/nereids_rules_p0/simplify_conditional_function/simplify_conditional_function.groovy
@@ -0,0 +1,52 @@
+// 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("simplify_conditional_function") {
+    sql "SET enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+    sql "drop table if exists test_simplify_conditional_function"
+    sql """create table test_simplify_conditional_function(c int null, b 
double null, a varchar(100) not null) distributed by hash(c)
+    properties("replication_num"="1");
+    """
+    sql "insert into test_simplify_conditional_function 
values(1,2.7,'abc'),(2,7.8,'ccd'),(null,8,'qwe'),(9,null,'ab')"
+
+    qt_test_coalesce_null_begin1 "select coalesce(null, null, a, b, c),a,b 
from test_simplify_conditional_function order by 1,2,3"
+    qt_test_coalesce_null_begin2 "select coalesce(null, null, a) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_null_begin3 "select coalesce(null, null, c, a) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_nonnull_begin "select coalesce(c, a) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_nullalbe_begin "select coalesce(b, a, null) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_null_null "select coalesce(null, null) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_null "select coalesce(null) from 
test_simplify_conditional_function order by 1"
+    qt_test_coalesce_nonnull "select coalesce(c),a,b from 
test_simplify_conditional_function order by 1,2,3"
+    qt_test_coalesce_nullable "select coalesce(b) from 
test_simplify_conditional_function order by 1"
+
+    qt_test_nvl_null_nullable "select ifnull(null, a) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nvl_null_nonnullable "select ifnull(null, c) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nvl_nullable_nullable "select ifnull(a, b) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nvl_nonnullable_null "select ifnull(c, null) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nvl_null_null "select ifnull(null, null) from 
test_simplify_conditional_function order by 1 "
+
+    qt_test_nullif_null_nullable "select nullif(null, a),c from 
test_simplify_conditional_function order by 1,2 "
+    qt_test_nullif_null_nonnullable "select nullif(null, c) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nullif_nonnullable_null "select nullif(c, null) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nullif_nullable_null "select nullif(a, null),c from 
test_simplify_conditional_function order by 1,2 "
+    qt_test_nullif_nullable_nonnullable "select nullif(a, c) from 
test_simplify_conditional_function order by 1 "
+    qt_test_nullif_null_null "select nullif(null, null) from 
test_simplify_conditional_function order by 1 "
+
+    qt_test_outer_ref_coalesce "select c1 from (select coalesce(null,a,c) 
c1,a,b from test_simplify_conditional_function order by c1,a,b limit 2) t group 
by c1 order by c1"
+    qt_test_outer_ref_nvl "select c1 from (select ifnull(null, c) c1 from 
test_simplify_conditional_function order by 1 limit 2) t group by c1 order by 
c1"
+    qt_test_outer_ref_nullif "select c1 from (select nullif(a, null) c1,c from 
test_simplify_conditional_function order by c1,c limit 2 ) t group by c1 order 
by c1"
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to