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 101bc568d7 [fix](Nereids) fix bugs about date function (#16112) 101bc568d7 is described below commit 101bc568d770c5eef427d8012b47bdcb095e3b05 Author: 谢健 <jianx...@gmail.com> AuthorDate: Fri Jan 20 14:11:17 2023 +0800 [fix](Nereids) fix bugs about date function (#16112) 1. when casting constant, check the value is whether in the range of targetType 2. change the scale of dateTimeV2 to 6 --- .../rewrite/rules/FoldConstantRuleOnFE.java | 2 +- .../nereids/trees/expressions/Expression.java | 4 + .../trees/expressions/literal/ArrayLiteral.java | 9 + .../nereids/trees/expressions/literal/Literal.java | 42 ++ .../apache/doris/nereids/types/DateTimeV2Type.java | 8 +- .../apache/doris/nereids/types/LargeIntType.java | 6 + .../datetime_functions/test_date_function.out | 605 ++++++++++++++++++++ .../datetime_functions/test_date_function.groovy | 624 +++++++++++++++++++++ 8 files changed, 1298 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java index afd9a029ba..e36a21bd05 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/rules/FoldConstantRuleOnFE.java @@ -258,7 +258,7 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule { return new NullLiteral(cast.getDataType()); } try { - Expression castResult = child.castTo(cast.getDataType()); + Expression castResult = child.checkedCastTo(cast.getDataType()); if (!Objects.equals(castResult, cast) && !Objects.equals(castResult, child)) { castResult = rewrite(castResult, context); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java index 1bcd9a09bc..a45af25e55 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java @@ -135,6 +135,10 @@ public abstract class Expression extends AbstractTreeNode<Expression> implements return uncheckedCastTo(targetType); } + public Expression checkedCastTo(DataType targetType) throws AnalysisException { + return castTo(targetType); + } + protected Expression uncheckedCastTo(DataType targetType) throws AnalysisException { throw new RuntimeException("Do not implement uncheckedCastTo"); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/ArrayLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/ArrayLiteral.java index 289dcc5b14..9d13bbc3ea 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/ArrayLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/ArrayLiteral.java @@ -68,6 +68,15 @@ public class ArrayLiteral extends Literal { return super.uncheckedCastTo(targetType); } + @Override + public Expression checkedCastTo(DataType targetType) { + if (targetType instanceof ArrayType) { + return new Array( + items.stream().toArray(Expression[]::new)).checkedCastTo(targetType); + } + return super.checkedCastTo(targetType); + } + @Override public String toString() { String items = this.items.stream() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java index 812436218d..3c5793e413 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java @@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.shape.LeafExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.CharType; import org.apache.doris.nereids.types.DataType; +import org.apache.doris.nereids.types.LargeIntType; import org.apache.commons.lang3.StringUtils; @@ -171,6 +172,47 @@ public abstract class Literal extends Expression implements LeafExpression, Comp } } + /** + * literal expr compare. + */ + @Override + public Expression checkedCastTo(DataType targetType) throws AnalysisException { + if (getDataType().isNumericType()) { + String desc = getStringValue(); + BigDecimal val = new BigDecimal(desc); + BigDecimal maxVal = val; + BigDecimal minVal = val; + if (targetType.isTinyIntType()) { + maxVal = new BigDecimal(Byte.MAX_VALUE); + minVal = new BigDecimal(Byte.MIN_VALUE); + } else if (targetType.isSmallIntType()) { + maxVal = new BigDecimal(Short.MAX_VALUE); + minVal = new BigDecimal(Short.MIN_VALUE); + } else if (targetType.isIntegerType()) { + maxVal = new BigDecimal(Integer.MAX_VALUE); + minVal = new BigDecimal(Integer.MIN_VALUE); + } else if (targetType.isBigIntType()) { + maxVal = new BigDecimal(Long.MAX_VALUE); + minVal = new BigDecimal(Long.MIN_VALUE); + } else if (targetType.isLargeIntType()) { + maxVal = new BigDecimal(LargeIntType.MAX_VALUE); + minVal = new BigDecimal(LargeIntType.MIN_VALUE); + } else if (targetType.isFloatType()) { + maxVal = new BigDecimal(Float.MAX_VALUE); + minVal = new BigDecimal(-Float.MAX_VALUE); + } else if (targetType.isDoubleType()) { + maxVal = new BigDecimal(Double.MAX_VALUE); + minVal = new BigDecimal(-Double.MAX_VALUE); + } + + if (val.compareTo(maxVal) > 0 || val.compareTo(minVal) < 0) { + throw new AnalysisException( + String.format("{} can't cast to {}", desc, targetType)); + } + } + return uncheckedCastTo(targetType); + } + @Override protected Expression uncheckedCastTo(DataType targetType) throws AnalysisException { String desc = getStringValue(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java index c2e72e0cda..8f826c50f0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java @@ -20,6 +20,7 @@ package org.apache.doris.nereids.types; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.types.coercion.AbstractDataType; import org.apache.doris.nereids.types.coercion.DateLikeType; import com.google.common.base.Preconditions; @@ -31,7 +32,7 @@ import java.util.Objects; */ public class DateTimeV2Type extends DateLikeType { public static final int MAX_SCALE = 6; - public static final DateTimeV2Type SYSTEM_DEFAULT = new DateTimeV2Type(0); + public static final DateTimeV2Type SYSTEM_DEFAULT = new DateTimeV2Type(MAX_SCALE); private static final int WIDTH = 8; @@ -75,6 +76,11 @@ public class DateTimeV2Type extends DateLikeType { return Objects.equals(scale, that.scale); } + @Override + public boolean acceptsType(AbstractDataType other) { + return other instanceof DateTimeV2Type; + } + @Override public int width() { return WIDTH; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/LargeIntType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/LargeIntType.java index 9c5e1838b8..874fe56460 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/LargeIntType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/LargeIntType.java @@ -21,12 +21,18 @@ import org.apache.doris.catalog.Type; import org.apache.doris.nereids.types.coercion.AbstractDataType; import org.apache.doris.nereids.types.coercion.IntegralType; +import java.math.BigInteger; + /** * LargeInt type in Nereids. */ public class LargeIntType extends IntegralType { public static final LargeIntType INSTANCE = new LargeIntType(); + public static final BigInteger MAX_VALUE = new BigInteger("170141183460469231731687303715884105727"); + + public static final BigInteger MIN_VALUE = new BigInteger("-170141183460469231731687303715884105728"); + private static final int WIDTH = 16; private LargeIntType() { diff --git a/regression-test/data/nereids_p0/datetime_functions/test_date_function.out b/regression-test/data/nereids_p0/datetime_functions/test_date_function.out new file mode 100644 index 0000000000..e48e583e96 --- /dev/null +++ b/regression-test/data/nereids_p0/datetime_functions/test_date_function.out @@ -0,0 +1,605 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +2019-07-31T22:21:03 + +-- !sql -- +2019-07-31T22:21:03 + +-- !sql -- +2019-08-01T06:21:03 + +-- !sql -- +2019-08-01T06:21:03 + +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql1 -- +1 2019-08-01T13:21:03 Asia/Shanghai Asia/Shanghai 2019-08-01T13:21:03 +2 2019-08-01T13:21:03 Asia/Singapore Asia/Shanghai 2019-08-01T13:21:03 +3 2019-08-01T13:21:03 Asia/Taipei Asia/Shanghai 2019-08-01T13:21:03 +4 2019-08-02T13:21:03 Australia/Queensland Asia/Shanghai 2019-08-02T11:21:03 +5 2019-08-02T13:21:03 Australia/Lindeman Asia/Shanghai 2019-08-02T11:21:03 +6 2019-08-03T13:21:03 America/Aruba Asia/Shanghai 2019-08-04T01:21:03 +7 2019-08-03T13:21:03 America/Blanc-Sablon Asia/Shanghai 2019-08-04T01:21:03 +8 2019-08-04T13:21:03 America/Dawson Africa/Lusaka 2019-08-04T22:21:03 +9 2019-08-04T13:21:03 America/Creston Africa/Lusaka 2019-08-04T22:21:03 +10 2019-08-05T13:21:03 Asia/Shanghai Asia/Shanghai 2019-08-05T13:21:03 +11 2019-08-05T13:21:03 Asia/Shanghai Asia/Singapore 2019-08-05T13:21:03 +12 2019-08-05T13:21:03 Asia/Shanghai Asia/Taipei 2019-08-05T13:21:03 +13 2019-08-06T13:21:03 Asia/Shanghai Australia/Queensland 2019-08-06T15:21:03 +14 2019-08-06T13:21:03 Asia/Shanghai Australia/Lindeman 2019-08-06T15:21:03 +15 2019-08-07T13:21:03 Asia/Shanghai America/Aruba 2019-08-07T01:21:03 +16 2019-08-07T13:21:03 Asia/Shanghai America/Blanc-Sablon 2019-08-07T01:21:03 +17 2019-08-08T13:21:03 Africa/Lusaka America/Dawson 2019-08-08T04:21:03 +18 2019-08-08T13:21:03 Africa/Lusaka America/Creston 2019-08-08T04:21:03 + +-- !sql2 -- +2019-08-01T13:21:03 2019-08-01T13:21:03 2019-08-01T13:21:03 + +-- !sql3 -- +2019-08-02T11:21:03 2019-08-02T11:21:03 2019-08-02T11:21:03 + +-- !sql4 -- +2019-08-04T22:21:03 2019-08-04T22:21:03 2019-08-04T22:21:03 + +-- !sql_vec1 -- +1 2019-08-01T13:21:03 Asia/Shanghai Asia/Shanghai 2019-08-01T13:21:03 +2 2019-08-01T13:21:03 Asia/Singapore Asia/Shanghai 2019-08-01T13:21:03 +3 2019-08-01T13:21:03 Asia/Taipei Asia/Shanghai 2019-08-01T13:21:03 +4 2019-08-02T13:21:03 Australia/Queensland Asia/Shanghai 2019-08-02T11:21:03 +5 2019-08-02T13:21:03 Australia/Lindeman Asia/Shanghai 2019-08-02T11:21:03 +6 2019-08-03T13:21:03 America/Aruba Asia/Shanghai 2019-08-04T01:21:03 +7 2019-08-03T13:21:03 America/Blanc-Sablon Asia/Shanghai 2019-08-04T01:21:03 +8 2019-08-04T13:21:03 America/Dawson Africa/Lusaka 2019-08-04T22:21:03 +9 2019-08-04T13:21:03 America/Creston Africa/Lusaka 2019-08-04T22:21:03 +10 2019-08-05T13:21:03 Asia/Shanghai Asia/Shanghai 2019-08-05T13:21:03 +11 2019-08-05T13:21:03 Asia/Shanghai Asia/Singapore 2019-08-05T13:21:03 +12 2019-08-05T13:21:03 Asia/Shanghai Asia/Taipei 2019-08-05T13:21:03 +13 2019-08-06T13:21:03 Asia/Shanghai Australia/Queensland 2019-08-06T15:21:03 +14 2019-08-06T13:21:03 Asia/Shanghai Australia/Lindeman 2019-08-06T15:21:03 +15 2019-08-07T13:21:03 Asia/Shanghai America/Aruba 2019-08-07T01:21:03 +16 2019-08-07T13:21:03 Asia/Shanghai America/Blanc-Sablon 2019-08-07T01:21:03 +17 2019-08-08T13:21:03 Africa/Lusaka America/Dawson 2019-08-08T04:21:03 +18 2019-08-08T13:21:03 Africa/Lusaka America/Creston 2019-08-08T04:21:03 + +-- !sql_vec2 -- +2019-08-01T13:21:03 2019-08-01T13:21:03 2019-08-01T13:21:03 + +-- !sql_vec3 -- +2019-08-02T11:21:03 2019-08-02T11:21:03 2019-08-02T11:21:03 + +-- !sql_vec4 -- +2019-08-04T22:21:03 2019-08-04T22:21:03 2019-08-04T22:21:03 + +-- !sql -- +2012-11-30T23:59:59 + +-- !sql -- +2011-01-30T23:59:59 + +-- !sql -- +2010-12-02T23:59:59 + +-- !sql -- +2010-12-01T01:59:59 + +-- !sql -- +2010-12-01T00:01:59 + +-- !sql -- +2010-12-01T00:00:01 + +-- !sql -- +22:23:00 + +-- !sql -- +4th 00 Thu 04 10 Oct 277 + +-- !sql -- +22 22 10 10:23:00 PM 22:23:00 00 6 + +-- !sql -- +1998 52 + +-- !sql -- +01 + +-- !sql -- +%01 + +-- !sql -- +2009-10-04 + +-- !sql -- +2008-11-30T23:59:59 + +-- !sql -- +2010-09-30T23:59:59 + +-- !sql -- +2010-11-28T23:59:59 + +-- !sql -- +2010-11-30T21:59:59 + +-- !sql -- +2010-11-30T23:57:59 + +-- !sql -- +2010-11-30T23:59:57 + +-- !sql -- +1 + +-- !sql -- +-31 + +-- !sql -- +16 + +-- !sql -- +31 + +-- !sql -- +29 + +-- !sql -- +Saturday + +-- !sql -- +31 + +-- !sql -- +3 + +-- !sql -- +3 + +-- !sql -- +34 + +-- !sql -- +34 + +-- !sql -- +2000-07-03 + +-- !sql -- +0000-01-01 + +-- !sql -- +2007-12-01 00:30:19 + +-- !sql -- +2007-12-01 00:30:19 + +-- !sql -- +2007-12-01 + +-- !sql -- +2007-12-01 00:30:19 + +-- !sql -- +\N + +-- !sql -- +23 + +-- !sql -- +0 + +-- !sql -- +2021-01-01 2021-04-10 2022-02-04 + +-- !sql -- +59 + +-- !sql -- +0 + +-- !sql -- +1 + +-- !sql -- +1 + +-- !sql -- +February + +-- !sql -- +February + +-- !sql -- +59 + +-- !sql -- +0 + +-- !sql -- +2014-12-21T12:34:56 + +-- !sql -- +2014-12-21T12:34:56 + +-- !sql -- +2014-12-21T12:34:56 + +-- !sql -- +2004-10-18 + +-- !sql -- +2020-09-01T00:00 + +-- !sql -- +2020-01-01T00:00 + +-- !sql -- +2020-04-01T00:00 + +-- !sql -- +2020-02-03T00:00 + +-- !sql -- +2020-04-09T00:00 + +-- !sql -- +08:00:00 + +-- !sql -- +00:00:09 + +-- !sql -- +\N + +-- !sql -- +2020-01-02T00:00 + +-- !sql -- +2019-02-02T00:00 + +-- !sql -- +2019-01-09T00:00 + +-- !sql -- +2019-01-03T00:00 + +-- !sql -- +2019-01-02T01:00 + +-- !sql -- +2019-01-02T00:01 + +-- !sql -- +2019-01-02T00:00:01 + +-- !sql -- +3 + +-- !sql -- +-1 + +-- !sql -- +128885 + +-- !sql -- +7689600 + +-- !sql -- +2136 + +-- !sql -- +89 + +-- !sql -- +12 + +-- !sql -- +733321 + +-- !sql -- +749027 + +-- !sql -- +1196389819 + +-- !sql -- +1196389819 + +-- !sql -- +1196389819 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +27 + +-- !sql -- +1 + +-- !sql -- +1 + +-- !sql -- +8 + +-- !sql -- +1987 + +-- !sql -- +2050 + +-- !sql -- +0000-08-01T13:21:03 0 +2019-08-01T13:21:03 2019 +9999-08-01T13:21:03 9999 + +-- !sql -- +202052 + +-- !sql -- +202026 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +198912 + +-- !sql -- +1 2022-08-01 +2 2022-08-01 +4 2022-08-01 + +-- !sql -- + +-- !sql -- +3 2022-07-31 + +-- !sql -- +1 2022-08-01 +2 2022-08-01 +4 2022-08-01 + +-- !sql -- +1 2022-08-01 +2 2022-08-01 +3 2022-07-31 +4 2022-08-01 + +-- !sql -- +1 2022-08-01 +2 2022-08-01 +4 2022-08-01 + +-- !sql -- +2 2022-08-01 00:00:00 + +-- !sql -- +1 2022-08-01 17:00:31 +4 2022-08-01 00:00:01 + +-- !sql -- +3 2022-07-31 23:59:59 + +-- !sql -- +1 2022-08-01 17:00:31 +2 2022-08-01 00:00:00 +4 2022-08-01 00:00:01 + +-- !sql -- +2 2022-08-01 00:00:00 +3 2022-07-31 23:59:59 + +-- !sql -- +2 2022-08-01 00:00:00 + +-- !sql -- +1 2022-08-01 17:00:31 + +-- !sql -- +true + +-- !sql -- +true + +-- !sql -- +2022 31 4 + +-- !sql -- +\N + +-- !sql -- +2022-07-12T20:00:45 + +-- !sql -- +2018-04-02T15:03:28 + +-- !sql -- +19 19 21 22 23 24 25 26 + +-- !sql -- +19 19 21 22 23 24 25 26 + +-- !sql -- +2020-08-01T13:21:03 + +-- !sql -- +2019-09-01T13:21:03 + +-- !sql -- +2019-08-08T13:21:03 + +-- !sql -- +2019-08-02T13:21:03 + +-- !sql -- +2019-08-01T14:21:03 + +-- !sql -- +2019-08-01T13:22:03 + +-- !sql -- +2019-08-01T13:21:04 + +-- !sql -- +2018-08-01T13:21:03 + +-- !sql -- +2019-07-01T13:21:03 + +-- !sql -- +2019-07-25T13:21:03 + +-- !sql -- +2019-07-31T13:21:03 + +-- !sql -- +2019-08-01T12:21:03 + +-- !sql -- +2019-08-01T13:20:03 + +-- !sql -- +2019-08-01T13:21:02 + +-- !sql -- +\N + +-- !sql -- +\N + +-- !sql -- +2020-08-01T13:21:03.111 + +-- !sql -- +2019-09-01T13:21:03.111 + +-- !sql -- +2019-08-08T13:21:03.111 + +-- !sql -- +2019-08-02T13:21:03.111 + +-- !sql -- +2019-08-01T14:21:03.111 + +-- !sql -- +2019-08-01T13:22:03.111 + +-- !sql -- +2019-08-01T13:21:04.111 + +-- !sql -- +2018-08-01T13:21:03.111 + +-- !sql -- +2019-07-01T13:21:03.111 + +-- !sql -- +2019-07-25T13:21:03.111 + +-- !sql -- +2019-07-31T13:21:03.111 + +-- !sql -- +2019-08-01T12:21:03.111 + +-- !sql -- +2019-08-01T13:20:03.111 + +-- !sql -- +2019-08-01T13:21:02.111 + +-- !sql -- +2020-08-01T13:21:03.111111 + +-- !sql -- +2019-09-01T13:21:03.111111 + +-- !sql -- +2019-08-08T13:21:03.111111 + +-- !sql -- +2019-08-02T13:21:03.111111 + +-- !sql -- +2019-08-01T14:21:03.111111 + +-- !sql -- +2019-08-01T13:22:03.111111 + +-- !sql -- +2019-08-01T13:21:04.111111 + +-- !sql -- +2018-08-01T13:21:03.111111 + +-- !sql -- +2019-07-01T13:21:03.111111 + +-- !sql -- +2019-07-25T13:21:03.111111 + +-- !sql -- +2019-07-31T13:21:03.111111 + +-- !sql -- +2019-08-01T12:21:03.111111 + +-- !sql -- +2019-08-01T13:20:03.111111 + +-- !sql -- +2019-08-01T13:21:02.111111 + +-- !sql -- +\N \N \N \N +2000-02-29 2000-02-29 2000-02-29 2000-02-29 +2022-01-31 2022-01-31 2022-01-31 2022-01-31 +2022-02-28 2022-02-28 2022-02-28 \N + +-- !sql -- +\N \N +2000-02-29 2000-02-29 +2022-01-31 2022-01-31 +2022-02-28 2022-02-28 + +-- !sql -- +\N \N \N \N +1970-01-01 1970-01-01 1970-01-01 1970-01-01 +2000-01-31 2000-01-31 2000-01-31 2000-01-31 +2021-12-27 2021-12-27 2021-12-27 2021-12-27 +2022-02-28 2022-02-28 2022-02-28 2022-02-28 + diff --git a/regression-test/suites/nereids_p0/datetime_functions/test_date_function.groovy b/regression-test/suites/nereids_p0/datetime_functions/test_date_function.groovy new file mode 100644 index 0000000000..f973c77916 --- /dev/null +++ b/regression-test/suites/nereids_p0/datetime_functions/test_date_function.groovy @@ -0,0 +1,624 @@ +// 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. + +import java.text.SimpleDateFormat + +suite("test_date_function") { + sql 'set enable_nereids_planner=true' + sql 'set enable_fallback_to_original_planner=false' + + def tableName = "test_date_function" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + test_datetime datetime NULL COMMENT "" + ) ENGINE=OLAP + DUPLICATE KEY(test_datetime) + COMMENT "OLAP" + DISTRIBUTED BY HASH(test_datetime) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + sql """ insert into ${tableName} values ("2019-08-01 13:21:03") """ + // convert_tz + qt_sql """ SELECT convert_tz(test_datetime, 'Asia/Shanghai', 'America/Los_Angeles') result from ${tableName}; """ + qt_sql """ SELECT convert_tz(test_datetime, '+08:00', 'America/Los_Angeles') result from ${tableName}; """ + + qt_sql """ SELECT convert_tz(test_datetime, 'Asia/Shanghai', 'Europe/London') result from ${tableName}; """ + qt_sql """ SELECT convert_tz(test_datetime, '+08:00', 'Europe/London') result from ${tableName}; """ + + qt_sql """ SELECT convert_tz(test_datetime, '+08:00', 'America/London') result from ${tableName}; """ + + // some invalid date + qt_sql """ SELECT convert_tz('2022-2-29 13:21:03', '+08:00', 'America/London') result; """ + qt_sql """ SELECT convert_tz('2022-02-29 13:21:03', '+08:00', 'America/London') result; """ + qt_sql """ SELECT convert_tz('1900-00-00 13:21:03', '+08:00', 'America/London') result; """ + + sql """ truncate table ${tableName} """ + + def timezoneCachedTableName = "test_convert_tz_with_timezone_cache" + sql """ DROP TABLE IF EXISTS ${timezoneCachedTableName} """ + sql """ + CREATE TABLE ${timezoneCachedTableName} ( + id int, + test_datetime datetime NULL COMMENT "", + origin_tz VARCHAR(255), + target_tz VARCHAR(255) + ) ENGINE=OLAP + DUPLICATE KEY(id) + COMMENT "OLAP" + DISTRIBUTED BY HASH(id) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + + sql """ + INSERT INTO ${timezoneCachedTableName} VALUES + (1, "2019-08-01 13:21:03", "Asia/Shanghai", "Asia/Shanghai"), + (2, "2019-08-01 13:21:03", "Asia/Singapore", "Asia/Shanghai"), + (3, "2019-08-01 13:21:03", "Asia/Taipei", "Asia/Shanghai"), + (4, "2019-08-02 13:21:03", "Australia/Queensland", "Asia/Shanghai"), + (5, "2019-08-02 13:21:03", "Australia/Lindeman", "Asia/Shanghai"), + (6, "2019-08-03 13:21:03", "America/Aruba", "Asia/Shanghai"), + (7, "2019-08-03 13:21:03", "America/Blanc-Sablon", "Asia/Shanghai"), + (8, "2019-08-04 13:21:03", "America/Dawson", "Africa/Lusaka"), + (9, "2019-08-04 13:21:03", "America/Creston", "Africa/Lusaka"), + (10, "2019-08-05 13:21:03", "Asia/Shanghai", "Asia/Shanghai"), + (11, "2019-08-05 13:21:03", "Asia/Shanghai", "Asia/Singapore"), + (12, "2019-08-05 13:21:03", "Asia/Shanghai", "Asia/Taipei"), + (13, "2019-08-06 13:21:03", "Asia/Shanghai", "Australia/Queensland"), + (14, "2019-08-06 13:21:03", "Asia/Shanghai", "Australia/Lindeman"), + (15, "2019-08-07 13:21:03", "Asia/Shanghai", "America/Aruba"), + (16, "2019-08-07 13:21:03", "Asia/Shanghai", "America/Blanc-Sablon"), + (17, "2019-08-08 13:21:03", "Africa/Lusaka", "America/Dawson"), + (18, "2019-08-08 13:21:03", "Africa/Lusaka", "America/Creston") + """ + + sql "set parallel_fragment_exec_instance_num = 8" + + qt_sql1 """ + SELECT + `id`, `test_datetime`, `origin_tz`, `target_tz`, convert_tz(`test_datetime`, `origin_tz`, `target_tz`) + FROM + ${timezoneCachedTableName} + ORDER BY `id` + """ + qt_sql2 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "Asia/Singapore", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Asia/Shanghai") + FROM + ${timezoneCachedTableName} + WHERE + id = 2; + """ + qt_sql3 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "Australia/Queensland", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Asia/Shanghai") + FROM + ${timezoneCachedTableName} + WHERE + id = 4; + """ + qt_sql4 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "America/Dawson", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Africa/Lusaka") + FROM + ${timezoneCachedTableName} + WHERE + id = 8; + """ + + qt_sql_vec1 """ + SELECT + `id`, `test_datetime`, `origin_tz`, `target_tz`, convert_tz(`test_datetime`, `origin_tz`, `target_tz`) + FROM + ${timezoneCachedTableName} + ORDER BY `id` + """ + qt_sql_vec2 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "Asia/Singapore", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Asia/Shanghai") + FROM + ${timezoneCachedTableName} + WHERE + id = 2; + """ + qt_sql_vec3 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "Australia/Queensland", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Asia/Shanghai") + FROM + ${timezoneCachedTableName} + WHERE + id = 4; + """ + qt_sql_vec4 """ + SELECT + convert_tz(`test_datetime`, `origin_tz`, `target_tz`), + convert_tz(`test_datetime`, "America/Dawson", `target_tz`), + convert_tz(`test_datetime`, `origin_tz`, "Africa/Lusaka") + FROM + ${timezoneCachedTableName} + WHERE + id = 8; + """ + + // curdate,current_date + String curdate_str = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + def curdate_result = sql """ SELECT CURDATE() """ + def curdate_date_result = sql """ SELECT CURRENT_DATE() """ + assertTrue(curdate_str == curdate_result[0][0].toString()) + assertTrue(curdate_str == curdate_date_result[0][0].toString()) + + // DATETIME CURRENT_TIMESTAMP() + def current_timestamp_result = """ SELECT current_timestamp() """ + assertTrue(current_timestamp_result[0].size() == 1) + + // TIME CURTIME() + def curtime_result = sql """ SELECT CURTIME() """ + assertTrue(curtime_result[0].size() == 1) + + sql """ insert into ${tableName} values ("2010-11-30 23:59:59") """ + // DATE_ADD + qt_sql """ select date_add(test_datetime, INTERVAL 2 YEAR) result from ${tableName}; """ + qt_sql """ select date_add(test_datetime, INTERVAL 2 MONTH) result from ${tableName}; """ + qt_sql """ select date_add(test_datetime, INTERVAL 2 DAY) result from ${tableName}; """ + qt_sql """ select date_add(test_datetime, INTERVAL 2 HOUR) result from ${tableName}; """ + qt_sql """ select date_add(test_datetime, INTERVAL 2 MINUTE) result from ${tableName}; """ + qt_sql """ select date_add(test_datetime, INTERVAL 2 SECOND) result from ${tableName}; """ + + // DATE_FORMAT + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2009-10-04 22:23:00") """ + def resArray = ["Sunday October 2009", "星期日 十月 2009"] + def res = sql """ select date_format(test_datetime, '%W %M %Y') from ${tableName}; """ + assertTrue(resArray.contains(res[0][0])) + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2007-10-04 22:23:00") """ + qt_sql """ select date_format(test_datetime, '%H:%i:%s') from ${tableName};""" + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("1900-10-04 22:23:00") """ + qt_sql """ select date_format(test_datetime, '%D %y %a %d %m %b %j') from ${tableName}; """ + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("1997-10-04 22:23:00") """ + qt_sql """ select date_format(test_datetime, '%H %k %I %r %T %S %w') from ${tableName}; """ + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("1999-01-01 00:00:00") """ + qt_sql """ select date_format(test_datetime, '%X %V') from ${tableName}; """ + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2006-06-01") """ + qt_sql """ select date_format(test_datetime, '%d') from ${tableName}; """ + qt_sql """ select date_format(test_datetime, '%%%d') from ${tableName}; """ + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2009-10-04 22:23:00") """ + qt_sql """ select date_format(test_datetime, 'yyyy-MM-dd') from ${tableName}; """ + sql """ truncate table ${tableName} """ + + sql """ insert into ${tableName} values ("2010-11-30 23:59:59") """ + // DATE_SUB + qt_sql """ select date_sub(test_datetime, INTERVAL 2 YEAR) from ${tableName};""" + qt_sql """ select date_sub(test_datetime, INTERVAL 2 MONTH) from ${tableName};""" + qt_sql """ select date_sub(test_datetime, INTERVAL 2 DAY) from ${tableName};""" + qt_sql """ select date_sub(test_datetime, INTERVAL 2 HOUR) from ${tableName};""" + qt_sql """ select date_sub(test_datetime, INTERVAL 2 MINUTE) from ${tableName};""" + qt_sql """ select date_sub(test_datetime, INTERVAL 2 SECOND) from ${tableName};""" + + + // DATEDIFF + qt_sql """ select datediff(CAST('2007-12-31 23:59:59' AS DATETIME), CAST('2007-12-30' AS DATETIME)) """ + qt_sql """ select datediff(CAST('2010-11-30 23:59:59' AS DATETIME), CAST('2010-12-31' AS DATETIME)) """ + qt_sql """ select datediff('2010-10-31', '2010-10-15') """ + + // DAY + qt_sql """ select day('1987-01-31') """ + qt_sql """ select day('2004-02-29') """ + + // DAYNAME + qt_sql """ select dayname('2007-02-03 00:00:00') """ + + // DAYOFMONTH + qt_sql """ select dayofmonth('1987-01-31') """ + + // DAYOFWEEK + qt_sql """ select dayofweek('2019-06-25') """ + qt_sql """ select dayofweek(cast(20190625 as date)) """ + + // DAYOFYEAR + qt_sql """ select dayofyear('2007-02-03 10:00:00') """ + qt_sql """ select dayofyear('2007-02-03') """ + + // FROM_DAYS + // 通过距离0000-01-01日的天数计算出哪一天 + qt_sql """ select from_days(730669) """ + qt_sql """ select from_days(1) """ + + // FROM_UNIXTIME + qt_sql """ select from_unixtime(1196440219) """ + qt_sql """ select from_unixtime(1196440219, 'yyyy-MM-dd HH:mm:ss') """ + qt_sql """ select from_unixtime(1196440219, '%Y-%m-%d') """ + qt_sql """ select from_unixtime(1196440219, '%Y-%m-%d %H:%i:%s') """ + qt_sql """ select from_unixtime(253402272000, '%Y-%m-%d %H:%i:%s') """ + + // HOUR + qt_sql """ select hour('2018-12-31 23:59:59') """ + qt_sql """ select hour('2018-12-31') """ + + // MAKEDATE + qt_sql """ select makedate(2021,1), makedate(2021,100), makedate(2021,400) """ + + // MINUTE + qt_sql """ select minute('2018-12-31 23:59:59') """ + qt_sql """ select minute('2018-12-31') """ + + // MONTH + qt_sql """ select month('1987-01-01 23:59:59') """ + qt_sql """ select month('1987-01-01') """ + + // MONTHNAME + qt_sql """ select monthname('2008-02-03 00:00:00') """ + qt_sql """ select monthname('2008-02-03') """ + + // NOW + def now_result = sql """ select now() """ + assertTrue(now_result[0].size() == 1) + + // SECOND + qt_sql """ select second('2018-12-31 23:59:59') """ + qt_sql """ select second('2018-12-31 00:00:00') """ + + // STR_TO_DATE + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2014-12-21 12:34:56") """ + qt_sql """ select str_to_date(test_datetime, '%Y-%m-%d %H:%i:%s') from ${tableName}; """ + qt_sql """ select str_to_date("2014-12-21 12:34%3A56", '%Y-%m-%d %H:%i%%3A%s'); """ + qt_sql """ select str_to_date("2014-12-21 12:34:56.789 PM", '%Y-%m-%d %h:%i:%s.%f %p'); """ + qt_sql """ select str_to_date('200442 Monday', '%X%V %W') """ + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2020-09-01") """ + qt_sql """ select str_to_date(test_datetime, "%Y-%m-%d %H:%i:%s") from ${tableName};""" + + // TIME_ROUND + qt_sql """ SELECT YEAR_FLOOR('20200202000000') """ + qt_sql """ SELECT MONTH_CEIL(CAST('2020-02-02 13:09:20' AS DATETIME), 3) """ + qt_sql """ SELECT WEEK_CEIL('2020-02-02 13:09:20', '2020-01-06') """ + qt_sql """ SELECT MONTH_CEIL(CAST('2020-02-02 13:09:20' AS DATETIME), 3, CAST('1970-01-09 00:00:00' AS DATETIME)) """ + + // TIMEDIFF + qt_sql """ SELECT TIMEDIFF(now(),utc_timestamp()) """ + qt_sql """ SELECT TIMEDIFF('2019-07-11 16:59:30','2019-07-11 16:59:21') """ + qt_sql """ SELECT TIMEDIFF('2019-01-01 00:00:00', NULL) """ + + // TIMESTAMPADD + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2019-01-02") ; """ + qt_sql """ SELECT TIMESTAMPADD(YEAR,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(MONTH,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(WEEK,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(DAY,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(HOUR,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(MINUTE,1,test_datetime) from ${tableName}; """ + qt_sql """ SELECT TIMESTAMPADD(SECOND,1,test_datetime) from ${tableName}; """ + + // TIMESTAMPDIFF + qt_sql """ SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01') """ + qt_sql """ SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01') """ + qt_sql """ SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55') """ + qt_sql """ SELECT TIMESTAMPDIFF(SECOND,'2003-02-01','2003-05-01') """ + qt_sql """ SELECT TIMESTAMPDIFF(HOUR,'2003-02-01','2003-05-01') """ + qt_sql """ SELECT TIMESTAMPDIFF(DAY,'2003-02-01','2003-05-01') """ + qt_sql """ SELECT TIMESTAMPDIFF(WEEK,'2003-02-01','2003-05-01') """ + + // TO_DAYS + qt_sql """ select to_days('2007-10-07') """ + qt_sql """ select to_days('2050-10-07') """ + + // UNIX_TIMESTAMP + def unin_timestamp_str = """ select unix_timestamp() """ + assertTrue(unin_timestamp_str[0].size() == 1) + qt_sql """ select unix_timestamp('2007-11-30 10:30:19') """ + qt_sql """ select unix_timestamp('2007-11-30 10:30-19', '%Y-%m-%d %H:%i-%s') """ + qt_sql """ select unix_timestamp('2007-11-30 10:30%3A19', '%Y-%m-%d %H:%i%%3A%s') """ + qt_sql """ select unix_timestamp('1969-01-01 00:00:00') """ + + // UTC_TIMESTAMP + def utc_timestamp_str = sql """ select utc_timestamp(),utc_timestamp() + 1 """ + assertTrue(utc_timestamp_str[0].size() == 2) + // WEEK + qt_sql """ select week('2020-1-1') """ + qt_sql """ select week('2020-7-1',1) """ + + // WEEKDAY + qt_sql """ select weekday('2019-06-25'); """ + qt_sql """ select weekday(cast(20190625 as date)); """ + + // WEEKOFYEAR + qt_sql """ select weekofyear('2008-02-20 00:00:00') """ + + sql """ truncate table ${tableName} """ + sql """ insert into ${tableName} values ("2019-08-01 13:21:03"), ("9999-08-01 13:21:03"),("0-08-01 13:21:03")""" + + // YEAR + qt_sql """ select year('1987-01-01') """ + qt_sql """ select year('2050-01-01') """ + qt_sql """ select test_datetime, year(test_datetime) from ${tableName} order by test_datetime """ + + // YEARWEEK + qt_sql """ select yearweek('2021-1-1') """ + qt_sql """ select yearweek('2020-7-1') """ + qt_sql """ select yearweek('1989-03-21', 0) """ + qt_sql """ select yearweek('1989-03-21', 1) """ + qt_sql """ select yearweek('1989-03-21', 2) """ + qt_sql """ select yearweek('1989-03-21', 3) """ + qt_sql """ select yearweek('1989-03-21', 4) """ + qt_sql """ select yearweek('1989-03-21', 5) """ + qt_sql """ select yearweek('1989-03-21', 6) """ + qt_sql """ select yearweek('1989-03-21', 7) """ + + // qt_sql """ select count(*) from (select * from numbers("number" = "200")) tmp1 WHERE 0 <= UNIX_TIMESTAMP(); """ + + sql """ drop table ${tableName} """ + + tableName = "test_from_unixtime" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `id` INT NOT NULL COMMENT "用户id", + `update_time` INT NOT NULL COMMENT "数据灌入日期时间" + ) ENGINE=OLAP + UNIQUE KEY(`id`) + DISTRIBUTED BY HASH(`id`) + PROPERTIES("replication_num" = "1"); + """ + sql """ insert into ${tableName} values (1, 1659344431) """ + sql """ insert into ${tableName} values (2, 1659283200) """ + sql """ insert into ${tableName} values (3, 1659283199) """ + sql """ insert into ${tableName} values (4, 1659283201) """ + + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") = '2022-08-01' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") > '2022-08-01' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") < '2022-08-01' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") >= '2022-08-01' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") <= '2022-08-01' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") LIKE '2022-08-01' ORDER BY id; """ + + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") = '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") > '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") < '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") >= '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") <= '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") LIKE '2022-08-01 00:00:00' ORDER BY id; """ + qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") = '2022-08-01 17:00:31' ORDER BY id; """ + + qt_sql """SELECT CURDATE() = CURRENT_DATE();""" + qt_sql """SELECT unix_timestamp(CURDATE()) = unix_timestamp(CURRENT_DATE());""" + + sql """ drop table ${tableName} """ + + qt_sql """ select date_format('2022-08-04', '%X %V %w'); """ + qt_sql """ select STR_TO_DATE('Tue Jul 12 20:00:45 CST 2022', '%a %b %e %H:%i:%s %Y'); """ + qt_sql """ select STR_TO_DATE('Tue Jul 12 20:00:45 CST 2022', '%a %b %e %T CST %Y'); """ + qt_sql """ select STR_TO_DATE('2018-4-2 15:3:28','%Y-%m-%d %H:%i:%s'); """ + + qt_sql """ select length(cast(now() as string)), length(cast(now(0) as string)), length(cast(now(1) as string)), + length(cast(now(2) as string)), length(cast(now(3) as string)), length(cast(now(4) as string)), + length(cast(now(5) as string)), length(cast(now(6) as string)); """ + qt_sql """ select length(cast(current_timestamp() as string)), length(cast(current_timestamp(0) as string)), + length(cast(current_timestamp(1) as string)), length(cast(current_timestamp(2) as string)), + length(cast(current_timestamp(3) as string)), length(cast(current_timestamp(4) as string)), + length(cast(current_timestamp(5) as string)), length(cast(current_timestamp(6) as string)); """ + + + tableName = "test_time_add_sub_function" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + test_time datetime NULL COMMENT "", + test_time1 datetimev2(3) NULL COMMENT "", + test_time2 datetimev2(6) NULL COMMENT "" + ) ENGINE=OLAP + DUPLICATE KEY(test_time) + COMMENT "OLAP" + DISTRIBUTED BY HASH(test_time) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + sql """ insert into ${tableName} values ("2019-08-01 13:21:03", "2019-08-01 13:21:03.111", "2019-08-01 13:21:03.111111") """ + //years_add + qt_sql """ select years_add(test_time,1) result from ${tableName}; """ + //months_add + qt_sql """ select months_add(test_time,1) result from ${tableName}; """ + //weeks_add + qt_sql """ select weeks_add(test_time,1) result from ${tableName}; """ + //days_add + qt_sql """ select days_add(test_time,1) result from ${tableName}; """ + //hours_add + qt_sql """ select hours_add(test_time,1) result from ${tableName}; """ + //minutes_add + qt_sql """ select minutes_add(test_time,1) result from ${tableName}; """ + //seconds_add + qt_sql """ select seconds_add(test_time,1) result from ${tableName}; """ + + //years_sub + qt_sql """ select years_sub(test_time,1) result from ${tableName}; """ + //months_sub + qt_sql """ select months_sub(test_time,1) result from ${tableName}; """ + //weeks_sub + qt_sql """ select weeks_sub(test_time,1) result from ${tableName}; """ + //days_sub + qt_sql """ select days_sub(test_time,1) result from ${tableName}; """ + //hours_sub + qt_sql """ select hours_sub(test_time,1) result from ${tableName}; """ + //minutes_sub + qt_sql """ select minutes_sub(test_time,1) result from ${tableName}; """ + //seconds_sub + qt_sql """ select seconds_sub(test_time,1) result from ${tableName}; """ + + qt_sql """ select date_add(NULL, INTERVAL 1 month); """ + qt_sql """ select date_add(NULL, INTERVAL 1 day); """ + + //years_add + qt_sql """ select years_add(test_time1,1) result from ${tableName}; """ + //months_add + qt_sql """ select months_add(test_time1,1) result from ${tableName}; """ + //weeks_add + qt_sql """ select weeks_add(test_time1,1) result from ${tableName}; """ + //days_add + qt_sql """ select days_add(test_time1,1) result from ${tableName}; """ + //hours_add + qt_sql """ select hours_add(test_time1,1) result from ${tableName}; """ + //minutes_add + qt_sql """ select minutes_add(test_time1,1) result from ${tableName}; """ + //seconds_add + qt_sql """ select seconds_add(test_time1,1) result from ${tableName}; """ + + //years_sub + qt_sql """ select years_sub(test_time1,1) result from ${tableName}; """ + //months_sub + qt_sql """ select months_sub(test_time1,1) result from ${tableName}; """ + //weeks_sub + qt_sql """ select weeks_sub(test_time1,1) result from ${tableName}; """ + //days_sub + qt_sql """ select days_sub(test_time1,1) result from ${tableName}; """ + //hours_sub + qt_sql """ select hours_sub(test_time1,1) result from ${tableName}; """ + //minutes_sub + qt_sql """ select minutes_sub(test_time1,1) result from ${tableName}; """ + //seconds_sub + qt_sql """ select seconds_sub(test_time1,1) result from ${tableName}; """ + + //years_add + qt_sql """ select years_add(test_time2,1) result from ${tableName}; """ + //months_add + qt_sql """ select months_add(test_time2,1) result from ${tableName}; """ + //weeks_add + qt_sql """ select weeks_add(test_time2,1) result from ${tableName}; """ + //days_add + qt_sql """ select days_add(test_time2,1) result from ${tableName}; """ + //hours_add + qt_sql """ select hours_add(test_time2,1) result from ${tableName}; """ + //minutes_add + qt_sql """ select minutes_add(test_time2,1) result from ${tableName}; """ + //seconds_add + qt_sql """ select seconds_add(test_time2,1) result from ${tableName}; """ + + //years_sub + qt_sql """ select years_sub(test_time2,1) result from ${tableName}; """ + //months_sub + qt_sql """ select months_sub(test_time2,1) result from ${tableName}; """ + //weeks_sub + qt_sql """ select weeks_sub(test_time2,1) result from ${tableName}; """ + //days_sub + qt_sql """ select days_sub(test_time2,1) result from ${tableName}; """ + //hours_sub + qt_sql """ select hours_sub(test_time2,1) result from ${tableName}; """ + //minutes_sub + qt_sql """ select minutes_sub(test_time2,1) result from ${tableName}; """ + //seconds_sub + qt_sql """ select seconds_sub(test_time2,1) result from ${tableName}; """ + + // test last_day for vec + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + birth date, + birth1 datev2, + birth2 datetime, + birth3 datetimev2) + UNIQUE KEY(birth, birth1, birth2, birth3) + DISTRIBUTED BY HASH (birth) BUCKETS 1 + PROPERTIES( "replication_allocation" = "tag.location.default: 1"); + """ + sql """ + insert into ${tableName} values + ('2022-01-01', '2022-01-01', '2022-01-01 00:00:00', '2022-01-01 00:00:00'), + ('2000-02-01', '2000-02-01', '2000-02-01 00:00:00', '2000-02-01 00:00:00.123'), + ('2022-02-29', '2022-02-29', '2022-02-29 00:00:00', '2022-02-29 00:00:00'), + ('2022-02-28', '2022-02-28', '2022-02-28T23:59:59', '2022-02-28T23:59:59');""" + qt_sql """ + select last_day(birth), last_day(birth1), + last_day(birth2), last_day(birth3) + from ${tableName}; + """ + sql """ DROP TABLE IF EXISTS ${tableName}; """ + + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + birth date, + birth1 datetime) + UNIQUE KEY(birth, birth1) + DISTRIBUTED BY HASH (birth) BUCKETS 1 + PROPERTIES( "replication_allocation" = "tag.location.default: 1"); + """ + sql """ + insert into ${tableName} values + ('2022-01-01', '2022-01-01 00:00:00'), + ('2000-02-01', '2000-02-01 00:00:00'), + ('2022-02-29', '2022-02-29 00:00:00'), + ('2022-02-28', '2022-02-28 23:59:59');""" + qt_sql """ + select last_day(birth), last_day(birth1) from ${tableName}; + """ + sql """ DROP TABLE IF EXISTS ${tableName}; """ + + // test to_monday + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + birth date, + birth1 datev2, + birth2 datetime, + birth3 datetimev2) + UNIQUE KEY(birth, birth1, birth2, birth3) + DISTRIBUTED BY HASH (birth) BUCKETS 1 + PROPERTIES( "replication_allocation" = "tag.location.default: 1"); + """ + sql """ + insert into ${tableName} values + ('2022-01-01', '2022-01-01', '2022-01-01 00:00:00', '2022-01-01 00:00:00'), + ('2000-02-01', '2000-02-01', '2000-02-01 00:00:00', '2000-02-01 00:00:00.123'), + ('2022-02-29', '2022-02-29', '2022-02-29 00:00:00', '2022-02-29 00:00:00'), + ('2022-02-28', '2022-02-28', '2022-02-28 23:59:59', '2022-02-28 23:59:59'), + ('1970-01-02', '1970-01-02', '1970-01-02 01:02:03', '1970-01-02 02:03:04');""" + qt_sql """ + select to_monday(birth), to_monday(birth1), + to_monday(birth2), to_monday(birth3) + from ${tableName}; + """ + sql """ DROP TABLE IF EXISTS ${tableName}; """ +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org