This is an automated email from the ASF dual-hosted git repository.
gabriellee 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 feacb15e71 [Improvement](datev2) push down datev2 predicates with date
literal (#17522)
feacb15e71 is described below
commit feacb15e7163c2a7452c5ec0f4ff5ac566b3b8ee
Author: Gabriel <[email protected]>
AuthorDate: Wed Mar 8 16:54:54 2023 +0800
[Improvement](datev2) push down datev2 predicates with date literal (#17522)
---
.../main/java/org/apache/doris/catalog/Type.java | 4 ++
.../java/org/apache/doris/analysis/Analyzer.java | 2 +
.../org/apache/doris/analysis/BinaryPredicate.java | 20 +++++++
.../org/apache/doris/analysis/DateLiteral.java | 12 ++++
.../doris/rewrite/EraseRedundantCastExpr.java | 70 ++++++++++++++++++++++
5 files changed, 108 insertions(+)
diff --git a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
index 810cbf835e..bc696c4753 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/catalog/Type.java
@@ -508,6 +508,10 @@ public abstract class Type {
return isScalarType(PrimitiveType.DATEV2);
}
+ public boolean isDateV2OrDateTimeV2() {
+ return isScalarType(PrimitiveType.DATEV2) ||
isScalarType(PrimitiveType.DATETIMEV2);
+ }
+
public boolean hasTemplateType() {
return false;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index dc85d48f57..cae02941b9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -47,6 +47,7 @@ import org.apache.doris.planner.RuntimeFilter;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.rewrite.BetweenToCompoundRule;
import org.apache.doris.rewrite.CompoundPredicateWriteRule;
+import org.apache.doris.rewrite.EraseRedundantCastExpr;
import org.apache.doris.rewrite.ExprRewriteRule;
import org.apache.doris.rewrite.ExprRewriter;
import org.apache.doris.rewrite.ExtractCommonFactorsRule;
@@ -415,6 +416,7 @@ public class Analyzer {
rules.add(RewriteImplicitCastRule.INSTANCE);
rules.add(RoundLiteralInBinaryPredicatesRule.INSTANCE);
rules.add(FoldConstantsRule.INSTANCE);
+ rules.add(EraseRedundantCastExpr.INSTANCE);
rules.add(RewriteFromUnixTimeRule.INSTANCE);
rules.add(CompoundPredicateWriteRule.INSTANCE);
rules.add(RewriteDateLiteralRule.INSTANCE);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index ad0f9e6a23..c0bff0c759 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -364,6 +364,26 @@ public class BinaryPredicate extends Predicate implements
Writable {
} else if (getChild(1).getType().isDateV2()
&& (getChild(0).getType().isDate() ||
getChild(0).getType().isDateV2())) {
return getChild(1).getType();
+ } else if (getChild(0).getType().isDateV2()
+ && (getChild(1).getType().isStringType() && getChild(1)
instanceof StringLiteral)) {
+ if (((StringLiteral)
getChild(1)).canConvertToDateV2(Type.DATEV2)) {
+ return Type.DATEV2;
+ } else {
+ return Type.DATETIMEV2;
+ }
+ } else if (getChild(1).getType().isDateV2()
+ && (getChild(0).getType().isStringType() && getChild(0)
instanceof StringLiteral)) {
+ if (((StringLiteral)
getChild(0)).canConvertToDateV2(Type.DATEV2)) {
+ return Type.DATEV2;
+ } else {
+ return Type.DATETIMEV2;
+ }
+ } else if (getChild(0).getType().isDatetimeV2()
+ && (getChild(1).getType().isStringType() && getChild(1)
instanceof StringLiteral)) {
+ return getChild(0).getType();
+ } else if (getChild(1).getType().isDatetimeV2()
+ && (getChild(0).getType().isStringType() && getChild(0)
instanceof StringLiteral)) {
+ return getChild(1).getType();
} else {
return Type.DATETIME;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index d1f9e8a270..969ae83877 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -677,6 +677,18 @@ public class DateLiteral extends LiteralExpr {
second = 0;
}
+ public boolean hasTimePart() {
+ if (this.type.isDateV2() || this.type.isDate()) {
+ return false;
+ } else {
+ if (hour != 0 || minute != 0 || second != 0) {
+ return true;
+ } else {
+ return !this.type.isDatetime() && microsecond != 0;
+ }
+ }
+ }
+
private long makePackedDatetime() {
long ymd = ((year * 13 + month) << 5) | day;
long hms = (hour << 12) | (minute << 6) | second;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/EraseRedundantCastExpr.java
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/EraseRedundantCastExpr.java
new file mode 100644
index 0000000000..829562f783
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/EraseRedundantCastExpr.java
@@ -0,0 +1,70 @@
+// 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.
+// This file is copied from
+//
https://github.com/apache/impala/blob/branch-2.9.0/fe/src/main/java/org/apache/impala/FoldConstantsRule.java
+// and modified by Doris
+
+package org.apache.doris.rewrite;
+
+
+import org.apache.doris.analysis.Analyzer;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.CastExpr;
+import org.apache.doris.analysis.DateLiteral;
+import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.SlotRef;
+import org.apache.doris.common.AnalysisException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * This rule erase redundant cast between datev2/datetimev2 and date literal.
+ *
+ * for expression with pattern:
+ * BinaryPredicate
+ * CAST (SlotRef(TYPE = DATEV2/DATETIMEV2), TYPE = DATETIME)
+ * DATELITERAL(TYPE = DATETIME)
+ *
+ * this rule will be applied.
+ */
+public class EraseRedundantCastExpr implements ExprRewriteRule {
+ private static final Logger LOG =
LogManager.getLogger(EraseRedundantCastExpr.class);
+
+ public static EraseRedundantCastExpr INSTANCE = new
EraseRedundantCastExpr();
+
+ @Override
+ public Expr apply(Expr expr, Analyzer analyzer, ExprRewriter.ClauseType
clauseType) throws AnalysisException {
+ // BinaryPredicate
+ // CAST (SlotRef(TYPE = DATEV2/DATETIMEV2), TYPE = DATETIME)
+ // DATELITERAL(TYPE = DATETIME)
+ if (!(expr instanceof BinaryPredicate) || !(expr.getChild(0)
instanceof CastExpr)
+ || !expr.getChild(0).getType().isDatetime() ||
!(expr.getChild(1)).getType().isDatetime()
+ ||
!expr.getChild(0).getChild(0).getType().isDateV2OrDateTimeV2()
+ || !(expr.getChild(0).getChild(0) instanceof SlotRef)
+ || !(expr.getChild(1) instanceof DateLiteral)) {
+ return expr;
+ }
+
+ if (!((DateLiteral) expr.getChild(1)).hasTimePart()
+ || !(expr.getChild(1).getType().isDatetime() &&
expr.getChild(0).getChild(0).getType().isDateV2())) {
+ expr.getChild(1).setType(expr.getChild(0).getChild(0).getType());
+ expr.setChild(0, expr.getChild(0).getChild(0));
+ }
+ return expr;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]