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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 32a32808a70 [improvement](nereids) support convert_tz in partition 
prune (#40047) (#40127)
32a32808a70 is described below

commit 32a32808a70738d8d819b6b544e3dd9d80efa74d
Author: feiniaofeiafei <[email protected]>
AuthorDate: Fri Aug 30 13:39:37 2024 +0800

    [improvement](nereids) support convert_tz in partition prune (#40047) 
(#40127)
    
    cherry-pick #40047 to branch-2.1
---
 .../rules/OneRangePartitionEvaluator.java          | 14 +++
 .../expressions/functions/scalar/ConvertTz.java    | 19 ++++-
 .../partition_prune/test_convert_tz.groovy         | 99 ++++++++++++++++++++++
 3 files changed, 131 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
index 9de31fde6d5..c3345c34693 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/OneRangePartitionEvaluator.java
@@ -43,6 +43,7 @@ import 
org.apache.doris.nereids.trees.expressions.NullSafeEqual;
 import org.apache.doris.nereids.trees.expressions.Or;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.functions.Monotonic;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.ConvertTz;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Date;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.DateTrunc;
 import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
@@ -638,6 +639,19 @@ public class OneRangePartitionEvaluator
         return computeMonotonicFunctionRange(result);
     }
 
+    @Override
+    public EvaluateRangeResult visitConvertTz(ConvertTz convertTz, 
EvaluateRangeInput context) {
+        EvaluateRangeResult result = super.visitConvertTz(convertTz, context);
+        if (!(result.result instanceof ConvertTz)) {
+            return result;
+        }
+        Expression converTzChild = convertTz.child(0);
+        if (partitionSlotContainsNull.containsKey(converTzChild)) {
+            partitionSlotContainsNull.put(convertTz, true);
+        }
+        return computeMonotonicFunctionRange(result);
+    }
+
     private boolean isPartitionSlot(Slot slot) {
         return slotToType.containsKey(slot);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConvertTz.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConvertTz.java
index 75270fa022b..11b44d8acee 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConvertTz.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConvertTz.java
@@ -22,6 +22,8 @@ import org.apache.doris.nereids.trees.expressions.Cast;
 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.Monotonic;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
 import org.apache.doris.nereids.trees.expressions.shape.TernaryExpression;
@@ -39,7 +41,7 @@ import java.util.List;
  * ScalarFunction 'convert_tz'. This class is generated by GenerateFunction.
  */
 public class ConvertTz extends ScalarFunction
-        implements TernaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+        implements TernaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable, Monotonic {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -84,4 +86,19 @@ public class ConvertTz extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitConvertTz(this, context);
     }
+
+    @Override
+    public boolean isPositive() {
+        return true;
+    }
+
+    @Override
+    public int getMonotonicFunctionChildIndex() {
+        return 0;
+    }
+
+    @Override
+    public Expression withConstantArgs(Literal literal) {
+        return new ConvertTz(literal, child(1), child(2));
+    }
 }
diff --git 
a/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
new file mode 100644
index 00000000000..c309d10d067
--- /dev/null
+++ 
b/regression-test/suites/nereids_rules_p0/partition_prune/test_convert_tz.groovy
@@ -0,0 +1,99 @@
+// 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_convert_tz") {
+    sql "set enable_fallback_to_original_planner=false"
+    sql "drop table if exists test_convert_tz;"
+    sql """CREATE TABLE test_convert_tz
+    (
+            timestamp DATETIME NOT NULL
+    )
+    ENGINE = olap
+    PARTITION BY range (timestamp)
+    (
+            PARTITION `p1` VALUES LESS THAN ('2021-01-01'),
+    PARTITION `p2` VALUES LESS THAN ('2021-02-01'),
+    PARTITION `p3` VALUES LESS THAN ('2021-03-01')
+    ) DISTRIBUTED BY HASH (timestamp)
+    PROPERTIES(
+            "storage_format" = "DEFAULT",
+            "replication_num" = "1");"""
+    sql """INSERT INTO test_convert_tz (timestamp)
+    VALUES ('2020-12-31'),
+    ('2021-01-05'),
+    ('2021-01-15'),
+    ('2021-02-05'),
+    ('2021-02-15');"""
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') < '2021-01-01';"
+        contains("partitions=2/3 (p1,p2)")
+    }
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') > '2021-01-01';";
+        contains("partitions=2/3 (p2,p3)")
+    }
+
+    explain {
+        sql """SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') < '2021-02-24'
+        and convert_tz(timestamp, 'Asia/Shanghai', 'Europe/Paris') > 
'2021-01-01';"""
+        contains("partitions=2/3 (p2,p3)")
+    }
+
+    explain {
+        sql """SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') < '2021-02-24'
+        or convert_tz(timestamp, 'Asia/Shanghai', 'Europe/Paris') > 
'2021-01-01';"""
+        contains("partitions=3/3 (p1,p2,p3)")
+    }
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Beijing', 'Europe/Paris') is null;";
+        contains("partitions=3/3 (p1,p2,p3)")
+    }
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE convert_tz(timestamp, 
'Asia/Beijing', 'Europe/Paris') is not null;";
+        contains("partitions=3/3 (p1,p2,p3)")
+    }
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE 
date_trunc(convert_tz(timestamp, 'Asia/Beijing', 'Europe/Paris'), 'month') 
<'2021-01-01';";
+        contains("partitions=3/3 (p1,p2,p3)")
+    }
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE 
date_trunc(convert_tz(timestamp, 'Asia/Shanghai', 'Europe/Paris'), 'month') 
<'2021-01-01';";
+        contains("partitions=2/3 (p1,p2)")
+    }
+
+    explain {
+        sql "SELECT * FROM test_convert_tz WHERE 
convert_tz(date_trunc(timestamp, 'month'), 'Asia/Shanghai', 'Europe/Paris') 
<'2021-01-01';";
+        contains("partitions=2/3 (p1,p2)")
+    }
+    for (int i = 0; i < 2; i++) {
+        if (i == 0) {
+            sql "set disable_nereids_rules = 'REWRITE_FILTER_EXPRESSION'"
+        } else {
+            sql "set disable_nereids_rules = ''"
+        }
+        explain {
+            sql "SELECT * FROM test_convert_tz WHERE not convert_tz(timestamp, 
'Asia/Shanghai', 'Europe/Paris') <= '2021-01-01';";
+            contains("partitions=2/3 (p2,p3)")
+        }
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to