This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 9bbf67975f9 [enhance](nerieds) month, day, hour, minute, second,
day_of_year, day_of_month, week_of_year implement monotonic (#45928)
9bbf67975f9 is described below
commit 9bbf67975f935b3d4cbe8d5236d4b6d0d6200f77
Author: feiniaofeiafei <[email protected]>
AuthorDate: Fri Jan 3 14:15:04 2025 +0800
[enhance](nerieds) month, day, hour, minute, second, day_of_year,
day_of_month, week_of_year implement monotonic (#45928)
---
.../rules/OneRangePartitionEvaluator.java | 8 +-
.../doris/nereids/trees/expressions/Cast.java | 29 ++-
.../expressions/functions/FromSecondMonotonic.java | 42 ++++
.../expressions/functions/scalar/DateFormat.java | 15 +-
.../expressions/functions/scalar/DayOfMonth.java | 29 ++-
.../expressions/functions/scalar/DayOfYear.java | 28 ++-
.../functions/scalar/FromMicrosecond.java | 9 +-
.../functions/scalar/FromMillisecond.java | 9 +-
.../expressions/functions/scalar/FromSecond.java | 9 +-
.../expressions/functions/scalar/FromUnixtime.java | 38 +++-
.../trees/expressions/functions/scalar/Hour.java | 30 ++-
.../expressions/functions/scalar/MakeDate.java | 18 +-
.../expressions/functions/scalar/Microsecond.java | 37 +++-
.../trees/expressions/functions/scalar/Minute.java | 35 +++-
.../trees/expressions/functions/scalar/Month.java | 28 ++-
.../expressions/functions/scalar/Quarter.java | 28 ++-
.../trees/expressions/functions/scalar/Second.java | 36 +++-
.../expressions/functions/scalar/WeeksAdd.java | 8 +-
.../expressions/functions/scalar/WeeksDiff.java | 13 +-
.../expressions/functions/scalar/WeeksSub.java | 8 +-
.../expressions/functions/scalar/YearWeek.java | 30 ++-
.../org/apache/doris/nereids/util/DateUtils.java | 6 +
.../int_as_date_partition_col.groovy | 6 -
.../month_quarter_cast_in_prune.groovy | 226 +++++++++++++++++++++
.../test_add_sub_diff_ceil_floor.groovy | 51 +++++
25 files changed, 736 insertions(+), 40 deletions(-)
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 90b5af14931..03eba5a2f99 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
@@ -832,6 +832,7 @@ public class OneRangePartitionEvaluator<K>
if (!checkFoldConstantValueIsValid(lowerValue, upperValue)) {
return result;
}
+
if (!func.isPositive()) {
Expression temp = lowerValue;
lowerValue = upperValue;
@@ -865,10 +866,7 @@ public class OneRangePartitionEvaluator<K>
if (lowerValue instanceof NullLiteral || upperValue instanceof
NullLiteral) {
return false;
}
- if (lowerValue != null && !(lowerValue instanceof Literal)
- || upperValue != null && !(upperValue instanceof Literal)) {
- return false;
- }
- return true;
+ return (lowerValue == null || lowerValue instanceof Literal)
+ && (upperValue == null || upperValue instanceof Literal);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Cast.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Cast.java
index 20f8079bd9f..0b280af2363 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Cast.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Cast.java
@@ -18,9 +18,12 @@
package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
+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.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.coercion.DateLikeType;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -31,7 +34,7 @@ import java.util.Objects;
/**
* cast function.
*/
-public class Cast extends Expression implements UnaryExpression {
+public class Cast extends Expression implements UnaryExpression, Monotonic {
// CAST can be from SQL Query or Type Coercion.
private final boolean isExplicitType;
@@ -117,4 +120,28 @@ public class Cast extends Expression implements
UnaryExpression {
public int hashCode() {
return Objects.hash(super.hashCode(), targetType);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Cast(literal, targetType, isExplicitType);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ // Both upward and downward casting of date types satisfy monotonicity.
+ if (child().getDataType() instanceof DateLikeType && targetType
instanceof DateLikeType) {
+ return true;
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FromSecondMonotonic.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FromSecondMonotonic.java
new file mode 100644
index 00000000000..96dfa7ac650
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FromSecondMonotonic.java
@@ -0,0 +1,42 @@
+// 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.trees.expressions.functions;
+
+import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
+
+/** monotonicity for from_{xx}second */
+public interface FromSecondMonotonic extends Monotonic {
+ @Override
+ default boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof BigIntLiteral) {
+ return ((BigIntLiteral) lower).getValue() >= 0;
+ }
+ return false;
+ }
+
+ @Override
+ default boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ default int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DateFormat.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DateFormat.java
index 997464cf81a..98a9f3e3b19 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DateFormat.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DateFormat.java
@@ -24,7 +24,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSi
import org.apache.doris.nereids.trees.expressions.functions.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
-import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -32,13 +32,12 @@ 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.VarcharType;
+import org.apache.doris.nereids.util.DateUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
import java.util.List;
-import java.util.Set;
/**
* ScalarFunction 'date_format'. This class is generated by GenerateFunction.
@@ -54,10 +53,6 @@ public class DateFormat extends ScalarFunction
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(DateType.INSTANCE,
VarcharType.SYSTEM_DEFAULT)
);
- private static final Set<String> monoFormat = ImmutableSet.of("yyyyMMdd",
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss",
- "%Y", "%Y-%m", "%Y-%m-%d", "%Y-%m-%d %H", "%Y-%m-%d %H:%i",
"%Y-%m-%d %H:%i:%s", "%Y-%m-%d %H:%i:%S",
- "%Y-%m-%d %T", "%Y%m%d", "%Y%m");
-
/**
* constructor with 2 arguments.
*/
@@ -87,11 +82,11 @@ public class DateFormat extends ScalarFunction
@Override
public boolean isMonotonic(Literal lower, Literal upper) {
Expression format = child(1);
- if (!(format instanceof VarcharLiteral)) {
+ if (!(format instanceof StringLikeLiteral)) {
return false;
}
- String str = ((VarcharLiteral) format).getValue();
- return monoFormat.contains(str);
+ String str = ((StringLikeLiteral) format).getValue();
+ return DateUtils.monoFormat.contains(str);
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfMonth.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfMonth.java
index a64bff850b7..16ef08a00f0 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfMonth.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfMonth.java
@@ -20,7 +20,10 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -37,7 +40,7 @@ import java.util.List;
* ScalarFunction 'dayofmonth'. This class is generated by GenerateFunction.
*/
public class DayOfMonth extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateV2Type.INSTANCE),
@@ -70,4 +73,28 @@ public class DayOfMonth extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitDayOfMonth(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new DayOfMonth(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateLiteral && upper instanceof DateLiteral) {
+ return ((DateLiteral) lower).getYear() == ((DateLiteral)
upper).getYear()
+ && ((DateLiteral) lower).getMonth() == ((DateLiteral)
upper).getMonth();
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfYear.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfYear.java
index a32f64325e1..b76ebc77763 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfYear.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/DayOfYear.java
@@ -20,7 +20,10 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -37,7 +40,7 @@ import java.util.List;
* ScalarFunction 'dayofyear'. This class is generated by GenerateFunction.
*/
public class DayOfYear extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(SmallIntType.INSTANCE).args(DateV2Type.INSTANCE),
@@ -70,4 +73,27 @@ public class DayOfYear extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitDayOfYear(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new DayOfYear(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateLiteral && upper instanceof DateLiteral) {
+ return ((DateLiteral) lower).getYear() == ((DateLiteral)
upper).getYear();
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java
index 32e38858da4..f99f7ca9dbc 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMicrosecond.java
@@ -20,6 +20,7 @@ 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.FromSecondMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -35,7 +36,8 @@ import java.util.List;
* ScalarFunction 'from_microsecond'.
*/
public class FromMicrosecond extends ScalarFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args,
+ FromSecondMonotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(DateTimeV2Type.MAX).args(BigIntType.INSTANCE));
@@ -59,4 +61,9 @@ public class FromMicrosecond extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitScalarFunction(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new FromMicrosecond(literal);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java
index 658f7444d81..ad0c385bf36 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromMillisecond.java
@@ -20,6 +20,7 @@ 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.FromSecondMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -35,7 +36,8 @@ import java.util.List;
* ScalarFunction 'from_millisecond'.
*/
public class FromMillisecond extends ScalarFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args,
+ FromSecondMonotonic {
public static final DateTimeV2Type MillisecondDateTimeV2 =
DateTimeV2Type.of(3);
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(MillisecondDateTimeV2).args(BigIntType.INSTANCE));
@@ -59,4 +61,9 @@ public class FromMillisecond extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitScalarFunction(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new FromMillisecond(literal);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java
index 46c550fe78c..fdbbbebf870 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromSecond.java
@@ -20,6 +20,7 @@ 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.FromSecondMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -35,7 +36,8 @@ import java.util.List;
* ScalarFunction 'from_second'.
*/
public class FromSecond extends ScalarFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args,
+ FromSecondMonotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(DateTimeV2Type.SYSTEM_DEFAULT).args(BigIntType.INSTANCE));
@@ -59,4 +61,9 @@ public class FromSecond extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitScalarFunction(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new FromSecond(literal);
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromUnixtime.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromUnixtime.java
index 05d5d73e0de..675feb0f355 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromUnixtime.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/FromUnixtime.java
@@ -21,11 +21,15 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
+import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BigIntType;
import org.apache.doris.nereids.types.StringType;
import org.apache.doris.nereids.types.VarcharType;
+import org.apache.doris.nereids.util.DateUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -36,8 +40,7 @@ import java.util.List;
* ScalarFunction 'from_unixtime'. This class is generated by GenerateFunction.
*/
public class FromUnixtime extends ScalarFunction
- implements ExplicitlyCastableSignature, AlwaysNullable,
PropagateNullLiteral {
-
+ implements ExplicitlyCastableSignature, AlwaysNullable,
PropagateNullLiteral, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(BigIntType.INSTANCE),
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args(BigIntType.INSTANCE,
VarcharType.SYSTEM_DEFAULT),
@@ -81,4 +84,35 @@ public class FromUnixtime extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitFromUnixtime(this, context);
}
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (1 == arity()) {
+ return true;
+ }
+ Expression format = child(1);
+ if (!(format instanceof StringLikeLiteral)) {
+ return false;
+ }
+ String str = ((StringLikeLiteral) format).getValue();
+ return DateUtils.monoFormat.contains(str);
+ }
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ if (1 == arity()) {
+ return new FromUnixtime(literal);
+ }
+ return new FromUnixtime(literal, child(1));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Hour.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Hour.java
index 60a57ff96be..768ddbbd686 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Hour.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Hour.java
@@ -20,7 +20,10 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -39,7 +42,7 @@ import java.util.List;
* ScalarFunction 'hour'. This class is generated by GenerateFunction.
*/
public class Hour extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -72,4 +75,29 @@ public class Hour extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitHour(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Hour(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateLiteral && upper instanceof DateLiteral) {
+ return ((DateLiteral) lower).getYear() == ((DateLiteral)
upper).getYear()
+ && ((DateLiteral) lower).getMonth() == ((DateLiteral)
upper).getMonth()
+ && ((DateLiteral) lower).getDay() == ((DateLiteral)
upper).getDay();
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MakeDate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MakeDate.java
index 8b5215251dd..6c217b92f81 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MakeDate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MakeDate.java
@@ -20,7 +20,9 @@ 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.DateDiffMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateType;
@@ -35,7 +37,7 @@ import java.util.List;
* ScalarFunction 'makedate'. This class is generated by GenerateFunction.
*/
public class MakeDate extends ScalarFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNullable {
+ implements BinaryExpression, ExplicitlyCastableSignature,
AlwaysNullable, DateDiffMonotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(DateType.INSTANCE).args(IntegerType.INSTANCE,
IntegerType.INSTANCE)
@@ -66,4 +68,18 @@ public class MakeDate extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitMakeDate(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ if (child(1) instanceof Literal) {
+ return new MakeDate(literal, child(1));
+ } else {
+ return new MakeDate(child(0), literal);
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Microsecond.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Microsecond.java
index 4e610e21bed..5f5fe3e4fd1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Microsecond.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Microsecond.java
@@ -20,7 +20,11 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeV2Type;
@@ -35,7 +39,7 @@ import java.util.List;
* ScalarFunction 'microsecond'. This class is generated by GenerateFunction.
*/
public class Microsecond extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(IntegerType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT)
@@ -66,4 +70,35 @@ public class Microsecond extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitMicrosecond(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Microsecond(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateTimeLiteral && upper instanceof
DateTimeLiteral) {
+ DateTimeLiteral lowerDateTime = (DateTimeLiteral) lower;
+ DateTimeLiteral upperDateTime = (DateTimeLiteral) upper;
+ return lowerDateTime.getYear() == upperDateTime.getYear()
+ && lowerDateTime.getMonth() == upperDateTime.getMonth()
+ && lowerDateTime.getDay() == upperDateTime.getDay()
+ && lowerDateTime.getHour() == upperDateTime.getHour()
+ && lowerDateTime.getMinute() == upperDateTime.getMinute()
+ && lowerDateTime.getSecond() == upperDateTime.getSecond();
+ } else {
+ return lower instanceof DateLiteral && upper instanceof
DateLiteral;
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Minute.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Minute.java
index 790b0378235..9959fafbaad 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Minute.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Minute.java
@@ -20,7 +20,11 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -38,7 +42,7 @@ import java.util.List;
* ScalarFunction 'minute'. This class is generated by GenerateFunction.
*/
public class Minute extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -71,4 +75,33 @@ public class Minute extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitMinute(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Minute(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateTimeLiteral && upper instanceof
DateTimeLiteral) {
+ DateTimeLiteral lowerDateTime = (DateTimeLiteral) lower;
+ DateTimeLiteral upperDateTime = (DateTimeLiteral) upper;
+ return lowerDateTime.getYear() == upperDateTime.getYear()
+ && lowerDateTime.getMonth() == upperDateTime.getMonth()
+ && lowerDateTime.getDay() == upperDateTime.getDay()
+ && lowerDateTime.getHour() == upperDateTime.getHour();
+ } else {
+ return lower instanceof DateLiteral && upper instanceof
DateLiteral;
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Month.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Month.java
index 9f8d38dc759..bff6cc30a3f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Month.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Month.java
@@ -20,7 +20,10 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -37,7 +40,7 @@ import java.util.List;
* ScalarFunction 'month'. This class is generated by GenerateFunction.
*/
public class Month extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateV2Type.INSTANCE),
@@ -70,4 +73,27 @@ public class Month extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitMonth(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Month(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateLiteral && upper instanceof DateLiteral) {
+ return ((DateLiteral) lower).getYear() == ((DateLiteral)
upper).getYear();
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Quarter.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Quarter.java
index 3a88b2dbe8f..70135b938ae 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Quarter.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Quarter.java
@@ -20,7 +20,10 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -37,7 +40,7 @@ import java.util.List;
* ScalarFunction 'quarter'. This class is generated by GenerateFunction.
*/
public class Quarter extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateTimeType.INSTANCE),
@@ -70,4 +73,27 @@ public class Quarter extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitQuarter(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Quarter(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateLiteral && upper instanceof DateLiteral) {
+ return ((DateLiteral) lower).getYear() == ((DateLiteral)
upper).getYear();
+ }
+ return false;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Second.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Second.java
index 8f36817b4d0..a7dc75be1e9 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Second.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Second.java
@@ -20,7 +20,11 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
@@ -38,7 +42,7 @@ import java.util.List;
* ScalarFunction 'second'. This class is generated by GenerateFunction.
*/
public class Second extends ScalarFunction
- implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements UnaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(TinyIntType.INSTANCE).args(DateTimeV2Type.SYSTEM_DEFAULT),
@@ -71,4 +75,34 @@ public class Second extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitSecond(this, context);
}
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new Second(literal);
+ }
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (lower instanceof DateTimeLiteral && upper instanceof
DateTimeLiteral) {
+ DateTimeLiteral lowerDateTime = (DateTimeLiteral) lower;
+ DateTimeLiteral upperDateTime = (DateTimeLiteral) upper;
+ return lowerDateTime.getYear() == upperDateTime.getYear()
+ && lowerDateTime.getMonth() == upperDateTime.getMonth()
+ && lowerDateTime.getDay() == upperDateTime.getDay()
+ && lowerDateTime.getHour() == upperDateTime.getHour()
+ && lowerDateTime.getMinute() == upperDateTime.getMinute();
+ } else {
+ return lower instanceof DateLiteral && upper instanceof
DateLiteral;
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksAdd.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksAdd.java
index 938822c1d21..607096f8322 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksAdd.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksAdd.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
import org.apache.doris.common.Config;
import org.apache.doris.nereids.trees.expressions.Expression;
import
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
*/
public class WeeksAdd extends ScalarFunction
implements BinaryExpression, ExplicitlyCastableSignature,
- ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+ ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args,
DateAddSubMonotonic {
// When enable_date_conversion is true, we prefer to V2 signature.
// This preference follows original planner. refer to
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class WeeksAdd extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitWeeksAdd(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new WeeksAdd(literal, child(1));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksDiff.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksDiff.java
index dfacc8137be..3a31e1f56d0 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksDiff.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksDiff.java
@@ -19,8 +19,10 @@ 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.DateDiffMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
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;
@@ -37,7 +39,7 @@ import java.util.List;
* ScalarFunction 'weeks_diff'. This class is generated by GenerateFunction.
*/
public class WeeksDiff extends ScalarFunction
- implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements BinaryExpression, ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, DateDiffMonotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(BigIntType.INSTANCE).args(DateV2Type.INSTANCE,
DateV2Type.INSTANCE),
@@ -73,4 +75,13 @@ public class WeeksDiff extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitWeeksDiff(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ if (child(1) instanceof Literal) {
+ return new WeeksDiff(literal, child(1));
+ } else {
+ return new WeeksDiff(child(0), literal);
+ }
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksSub.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksSub.java
index 0be7a20d4c6..d088fb4de1c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksSub.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/WeeksSub.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.FunctionSignature;
import org.apache.doris.common.Config;
import org.apache.doris.nereids.trees.expressions.Expression;
import
org.apache.doris.nereids.trees.expressions.functions.ComputeSignatureForDateArithmetic;
+import
org.apache.doris.nereids.trees.expressions.functions.DateAddSubMonotonic;
import
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
@@ -41,7 +42,7 @@ import java.util.List;
*/
public class WeeksSub extends ScalarFunction
implements BinaryExpression, ExplicitlyCastableSignature,
- ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args {
+ ComputeSignatureForDateArithmetic, PropagateNullableOnDateLikeV2Args,
DateAddSubMonotonic {
// When enable_date_conversion is true, we prefer to V2 signature.
// This preference follows original planner. refer to
ScalarType.getDefaultDateType()
@@ -78,4 +79,9 @@ public class WeeksSub extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitWeeksSub(this, context);
}
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ return new WeeksSub(literal, child(1));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearWeek.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearWeek.java
index 5afc52b2f66..2dba1d9cd31 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearWeek.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/YearWeek.java
@@ -20,7 +20,9 @@ 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.Monotonic;
import
org.apache.doris.nereids.trees.expressions.functions.PropagateNullableOnDateLikeV2Args;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DateTimeType;
import org.apache.doris.nereids.types.DateTimeV2Type;
@@ -36,7 +38,7 @@ import java.util.List;
* ScalarFunction 'yearweek'. This class is generated by GenerateFunction.
*/
public class YearWeek extends ScalarFunction
- implements ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args {
+ implements ExplicitlyCastableSignature,
PropagateNullableOnDateLikeV2Args, Monotonic {
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(IntegerType.INSTANCE).args(DateV2Type.INSTANCE),
@@ -84,4 +86,30 @@ public class YearWeek extends ScalarFunction
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitYearWeek(this, context);
}
+
+ @Override
+ public boolean isMonotonic(Literal lower, Literal upper) {
+ if (arity() == 1) {
+ return true;
+ }
+ return child(1) instanceof Literal;
+ }
+
+ @Override
+ public boolean isPositive() {
+ return true;
+ }
+
+ @Override
+ public int getMonotonicFunctionChildIndex() {
+ return 0;
+ }
+
+ @Override
+ public Expression withConstantArgs(Expression literal) {
+ if (arity() == 1) {
+ return new YearWeek(literal);
+ }
+ return new YearWeek(literal, child(1));
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java
index 354d78d0271..fdd2fe3a22b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateUtils.java
@@ -20,6 +20,8 @@ package org.apache.doris.nereids.util;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.qe.ConnectContext;
+import com.google.common.collect.ImmutableSet;
+
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
@@ -31,11 +33,15 @@ import java.time.temporal.ChronoField;
import java.time.temporal.IsoFields;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.WeekFields;
+import java.util.Set;
/**
* date util tools.
*/
public class DateUtils {
+ public static final Set<String> monoFormat = ImmutableSet.of("yyyyMMdd",
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss",
+ "%Y", "%Y-%m", "%Y-%m-%d", "%Y-%m-%d %H", "%Y-%m-%d %H:%i",
"%Y-%m-%d %H:%i:%s", "%Y-%m-%d %H:%i:%S",
+ "%Y-%m-%d %T", "%Y%m%d", "%Y%m");
private static final WeekFields weekFields =
WeekFields.of(DayOfWeek.SUNDAY, 7);
/**
diff --git
a/regression-test/suites/nereids_rules_p0/partition_prune/int_as_date_partition_col.groovy
b/regression-test/suites/nereids_rules_p0/partition_prune/int_as_date_partition_col.groovy
index 9d4e2a16490..59467e48306 100644
---
a/regression-test/suites/nereids_rules_p0/partition_prune/int_as_date_partition_col.groovy
+++
b/regression-test/suites/nereids_rules_p0/partition_prune/int_as_date_partition_col.groovy
@@ -80,12 +80,6 @@ suite("int_as_date_partition_col") {
contains("partitions=5/6
(p20240101,p20240201,p20240301,p20240401,p20240501)")
}
- explain {
- sql """SELECT count(*) FROM partition_int WHERE
- !(date_trunc(dt,'month')<'2024-8-01' and
date_trunc(dt,'month')>'2024-6-01' );"""
- contains("partitions=5/6
(p20240101,p20240201,p20240301,p20240401,p20240501)")
- }
-
explain {
sql """
SELECT count(*) FROM partition_int WHERE
diff --git
a/regression-test/suites/nereids_rules_p0/partition_prune/month_quarter_cast_in_prune.groovy
b/regression-test/suites/nereids_rules_p0/partition_prune/month_quarter_cast_in_prune.groovy
new file mode 100644
index 00000000000..f2ac6c85d54
--- /dev/null
+++
b/regression-test/suites/nereids_rules_p0/partition_prune/month_quarter_cast_in_prune.groovy
@@ -0,0 +1,226 @@
+// 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("month_quarter_cast_in_prune") {
+ sql "drop table if exists test_month;"
+ sql """create table test_month(a int,dt datetime(3))
+ partition by range(dt) (
+ partition p1 values less than ('2021-01-01'),
+ partition p2 values less than ('2021-02-01'),
+ partition p3 values less than ('2021-03-01'),
+ partition p4 values less than ('2021-07-01'),
+ partition p5 values less than ('2022-02-01'),
+ partition p6 values less than ('2022-02-25'),
+ partition p7 values less than ('2022-02-26 12:00:00'),
+ partition p8 values less than ('2022-02-26 12:10:30'),
+ partition p9 values less than ('2022-02-26 12:10:59'),
+ partition p10 values less than ('2022-02-26 12:10:59.342'),
+ partition p11 values less than (MAXVALUE)
+ )
+ distributed by hash(a)
+ properties("replication_num"="1");"""
+
+ sql """insert into test_month
values(1,'2020-01-01'),(1,'2021-01-31'),(1,'2021-02-11'),(1,'2021-03-31'),(1,'2021-07-10'),(1,'2022-02-10'),(1,'2022-02-26'),
+ (1,'2022-02-26 12:09:00'),(1,'2022-02-26
12:10:01'),(1,'2022-03-03'),(1,'2022-02-26 12:10:41'),(1,'2022-02-26
12:10:59.123');"""
+
+ explain {
+ sql "select * from test_month where month(dt)<3"
+ contains("partitions=10/11 (p1,p2,p3,p5,p6,p7,p8,p9,p10,p11)")
+ };
+ explain {
+ sql "select * from test_month where month(dt)>3"
+ contains("partitions=4/11 (p1,p4,p5,p11)")
+ };
+ explain {
+ sql "select * from test_month where quarter(dt)>1"
+ contains("partitions=4/11 (p1,p4,p5,p11)")
+ };
+ explain {
+ sql "select * from test_month where day(dt)>27"
+ contains("partitions=6/11 (p1,p2,p3,p4,p5,p11)")
+ };
+ explain {
+ sql "select * from test_month where hour(dt)<10"
+ contains("partitions=8/11 (p1,p2,p3,p4,p5,p6,p7,p11)")
+ };
+ explain {
+ sql "select * from test_month where second(dt)<20"
+ contains("partitions=9/11 (p1,p2,p3,p4,p5,p6,p7,p8,p11)")
+ };
+ explain {
+ sql "select * from test_month where microsecond(dt)>500000"
+ contains("partitions=10/11 (p1,p2,p3,p4,p5,p6,p7,p8,p9,p11)")
+ }
+ explain {
+ sql "select * from test_month where dayofyear(dt)>150"
+ contains("partitions=4/11 (p1,p4,p5,p11)")
+ };
+ explain {
+ sql "select * from test_month where dayofmonth(dt)<25"
+ contains("partitions=7/11 (p1,p2,p3,p4,p5,p6,p11)")
+ };
+ explain {
+ sql "select * from test_month where weekofyear(dt)>40"
+ contains("partitions=11/11 (p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)")
+ };
+ explain {
+ sql "select * from test_month where cast(dt as date) > '2022-02-26'"
+ contains("partitions=5/11 (p7,p8,p9,p10,p11)")
+ }
+
+ explain {
+ sql "select * from test_month where month(dt)>3 and dt>'2021-01-02'"
+ contains("partitions=3/11 (p4,p5,p11)")
+ }
+ explain {
+ sql "select * from test_month where quarter(dt)>1 or cast(dt as date)
> '2022-02-26'"
+ contains("partitions=8/11 (p1,p4,p5,p7,p8,p9,p10,p11)")
+ }
+ explain {
+ sql "select * from test_month where day(dt)>80"
+ contains("partitions=6/11 (p1,p2,p3,p4,p5,p11)")
+ }
+ explain {
+ sql "select * from test_month where hour(dt)<=100;"
+ contains("partitions=11/11 (p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)")
+ }
+ explain {
+ sql "select * from test_month where dayofyear(dt)>150 or
dt='2021-02-01'"
+ contains("partitions=5/11 (p1,p3,p4,p5,p11)")
+ }
+ explain {
+ sql "select * from test_month where dayofyear(dt)>150 or
dt!='2021-02-01'"
+ contains("partitions=11/11 (p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)")
+ }
+ explain {
+ sql "select * from test_month where dayofmonth(dt)<25 and
dt>='2021-07-01'"
+ contains("partitions=3/11 (p5,p6,p11)")
+ }
+ explain {
+ sql "select * from test_month where dayofmonth(dt)=24"
+ contains("partitions=7/11 (p1,p2,p3,p4,p5,p6,p11)")
+ }
+
+ sql "drop table if exists monotonic_function_t"
+ sql """create table monotonic_function_t (a bigint, dt datetime, d date, c
varchar(100)) duplicate key(a)
+ partition by range(a) (
+ partition p1 values less than ("100000"),
+ partition p2 values less than ("1000000009999"),
+ partition p3 values less than ("1000000009999999"),
+ partition p4 values less than MAXVALUE
+ ) distributed by hash(a) properties("replication_num"="1");"""
+ sql """INSERT INTO monotonic_function_t
values(10000,'1979-01-01','1979-01-01','abc'),(100000009999,'2012-01-01','2012-01-01','abc'),(100000009999999,'2020-01-01','2020-01-01','abc'),(10000000099999999,'2045-01-01','2045-01-01','abc')"""
+
+ explain {
+ sql """select * from monotonic_function_t where from_second(a) <
'2001-09-09 12:33:19' """
+ contains("partitions=4/4 (p1,p2,p3,p4)")
+ }
+ explain {
+ sql """select * from monotonic_function_t where from_second(a) >
'2001-09-09 12:33:19' """
+ contains("partitions=4/4 (p1,p2,p3,p4)")
+ }
+ explain {
+ sql """select * from monotonic_function_t where from_millisecond(a) <
'2001-09-09 12:33:19' """
+ contains("partitions=4/4 (p1,p2,p3,p4)")
+ }
+ explain {
+ sql """select * from monotonic_function_t where from_millisecond(a) >
'2001-09-09 12:33:19' """
+ contains("partitions=3/4 (p1,p3,p4)")
+ }
+ explain {
+ sql """select * from monotonic_function_t where from_microsecond(a) <
'2000-09-09 12:33:19' """
+ contains("partitions=3/4 (p1,p2,p3)")
+ }
+ explain {
+ sql """select * from monotonic_function_t where from_microsecond(a) >
'2002-09-09 12:33:19' """
+ contains("partitions=2/4 (p1,p4)")
+ }
+
+ // test makedate
+ sql "drop table if exists makedate_t"
+ sql """create table makedate_t(a int, b int) partition by range(a)(
+ partition p1 values less than ("2"),
+ partition p2 values less than ("200"),
+ partition p3 values less than("1000"),
+ partition p4 values less than ("2100"),
+ partition p5 values less than ("3500"),
+ partition p6 values less than("5003"),
+ partition p7 values less than(MAXVALUE)
+ )
+ distributed by hash(a) properties("replication_num"="1");"""
+
+ sql "insert into makedate_t values(1,2),(100,
9),(500,10),(2000,101),(3000,103),(5000,101),(6000,1)"
+
+ explain {
+ sql "select * from makedate_t where makedate(a,10)<'2024-01-01'"
+ contains("partitions=4/7 (p1,p2,p3,p4)")
+ };
+ explain {
+ sql "select * from makedate_t where makedate(2000,a)>'2024-01-01'"
+ contains("partitions=2/7 (p1,p7)")
+ };
+ explain {
+ sql "select * from makedate_t where makedate(2023,a)>'2024-01-01'"
+ contains("partitions=6/7 (p1,p3,p4,p5,p6,p7)")
+ };
+ explain {
+ sql "select * from makedate_t where makedate(2023,b)>'2024-01-01'"
+ contains("partitions=7/7 (p1,p2,p3,p4,p5,p6,p7)")
+ };
+ explain {
+ sql "select * from makedate_t where makedate(a,b)>'2024-01-01'"
+ contains("partitions=7/7 (p1,p2,p3,p4,p5,p6,p7)")
+ };
+
+ sql "drop table if exists from_unixtime_t;"
+ sql """create table from_unixtime_t(a bigint, b int) partition by range(a)(
+ partition p1 values less than ("50000000"),
+ partition p2 values less than ("990000000"),
+ partition p3 values less than("2000000000"),
+ partition p4 values less than ("2500000000"),
+ partition p5 values less than(MAXVALUE)
+ )
+ distributed by hash(a) properties("replication_num"="1");"""
+ sql "insert into from_unixtime_t
values(1000,10),(50000001,11),(990000001,12),(2000000002,13),(2500000003,14);"
+
+ explain {
+ sql """select * from from_unixtime_t where from_unixtime(a,"%Y-%m-%d
%T") <'2001-05-16 16:00:00'"""
+ contains("partitions=2/5 (p1,p2)")
+ }
+ explain {
+ sql """select * from from_unixtime_t where from_unixtime(a,"%Y-%m-%d
%T") <='2001-05-16 16:00:00'"""
+ contains("partitions=3/5 (p1,p2,p3)")
+ }
+
+ explain {
+ sql """select * from from_unixtime_t where from_unixtime(a,"yyyyMMdd")
< '20330518'"""
+ contains("partitions=3/5 (p1,p2,p3)")
+ }
+ explain {
+ sql """select * from from_unixtime_t where from_unixtime(a,"yyyyMMdd")
> '20330518'"""
+ contains("partitions=3/5 (p1,p4,p5)")
+
+ }
+ explain {
+ sql """select * from from_unixtime_t where
from_unixtime(a,"%yyyyMMdd") > '20330518'"""
+ contains("partitions=5/5 (p1,p2,p3,p4,p5)")
+ }
+ explain {
+ sql """select * from from_unixtime_t where from_unixtime(a,"yyyyMMdd
%T") <='2001-05-16 16:00:00'"""
+ contains("partitions=5/5 (p1,p2,p3,p4,p5)")
+ }
+}
\ No newline at end of file
diff --git
a/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
b/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
index bda9dc81af7..eb0be34704f 100644
---
a/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
+++
b/regression-test/suites/nereids_rules_p0/partition_prune/test_add_sub_diff_ceil_floor.groovy
@@ -342,6 +342,41 @@ suite("test_add_sub_diff_ceil_floor") {
contains("partitions=1/6 (p6)")
}
+ explain {
+ sql """select * from max_t where weeks_add(dt, 1) >'2018-01-01' """
+ contains("partitions=5/6 (p2,p3,p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where weeks_sub(dt, 10) >'2018-01-01' """
+ contains("partitions=5/6 (p1,p3,p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where weeks_diff(dt, '2018-01-01') >=10"""
+ contains("partitions=4/6 (p3,p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where weeks_diff('2018-01-01', dt) <=10"""
+ contains("partitions=5/6 (p2,p3,p4,p5,p6)")
+ }
+ // yearweek
+ explain {
+ sql """select * from max_t where yearweek(dt) <201902"""
+ contains("partitions=4/6 (p1,p2,p3,p4)")
+ }
+ explain {
+ sql """select * from max_t where yearweek(dt,1) <201902"""
+ contains("partitions=4/6 (p1,p2,p3,p4)")
+ }
+ explain {
+ sql """select * from max_t where yearweek(dt,c) <20190206"""
+ contains("partitions=6/6 (p1,p2,p3,p4,p5,p6)")
+ }
+
+ // yearweek
+ explain {
+ sql """select * from max_t where yearweek(dt) <20190206"""
+ contains("partitions=6/6 (p1,p2,p3,p4,p5,p6)")
+ }
// from_days and unix_timestamp
explain {
sql """select * from max_t where unix_timestamp(dt) > 1547838847 """
@@ -404,4 +439,20 @@ suite("test_add_sub_diff_ceil_floor") {
contains("partitions=3/4 (p1,p3,p4)")
}
+ explain {
+ sql """select * from max_t where year(weeks_add(dt, 1)) >2019"""
+ contains("partitions=3/6 (p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where month(weeks_add(dt, 1)) >6"""
+ contains("partitions=6/6 (p1,p2,p3,p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where quarter(weeks_sub(dt, 1)) >3"""
+ contains("partitions=6/6 (p1,p2,p3,p4,p5,p6)")
+ }
+ explain {
+ sql """select * from max_t where weeks_diff(dt, quarter(weeks_sub(dt,
1))) >'2020-01-01'"""
+ contains("partitions=6/6 (p1,p2,p3,p4,p5,p6)")
+ }
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]