Skip to content

Commit

Permalink
[improvement](nereids) support convert_tz in partition prune (#40047)
Browse files Browse the repository at this point in the history
  • Loading branch information
feiniaofeiafei committed Aug 29, 2024
1 parent 841565a commit 9fc658c
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
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;
Expand Down Expand Up @@ -638,6 +639,19 @@ public EvaluateRangeResult visitDate(Date date, EvaluateRangeInput context) {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
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;
Expand All @@ -39,7 +41,7 @@
* 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)
Expand Down Expand Up @@ -84,4 +86,19 @@ public List<FunctionSignature> getSignatures() {
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));
}
}
Original file line number Diff line number Diff line change
@@ -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)")
}
}
}

0 comments on commit 9fc658c

Please sign in to comment.