This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 958687f7d4d [fix](Nereids) unix_timestamp compute signature and fold
const is wrong (#35727)
958687f7d4d is described below
commit 958687f7d4d06b4b64791fc94d06b4740656cfc1
Author: morrySnow <[email protected]>
AuthorDate: Mon Jun 3 18:56:11 2024 +0800
[fix](Nereids) unix_timestamp compute signature and fold const is wrong
(#35727)
1. compute signature should call super#computeSignature first
2. fold const return type not changed after signature changed in #26827
we already have p0 for this case, but our regression framework has bug
that it report success when compare decimal type if real result lose
scale
---
.../executable/DateTimeExtractAndTransform.java | 29 ++++++----
.../functions/scalar/UnixTimestamp.java | 5 +-
.../nereids/rules/expression/FoldConstantTest.java | 66 ++++++++++------------
3 files changed, 50 insertions(+), 50 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
index 3cc46ee1114..e7a92354440 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
@@ -493,17 +493,17 @@ public class DateTimeExtractAndTransform {
*/
@ExecFunction(name = "unix_timestamp", argTypes = {"DATE"}, returnType =
"INT")
public static Expression unixTimestamp(DateLiteral date) {
- return new IntegerLiteral(getTimestamp(date.toJavaDateType()));
+ return new
IntegerLiteral(Integer.parseInt(getTimestamp(date.toJavaDateType())));
}
@ExecFunction(name = "unix_timestamp", argTypes = {"DATETIME"}, returnType
= "INT")
public static Expression unixTimestamp(DateTimeLiteral date) {
- return new IntegerLiteral(getTimestamp(date.toJavaDateType()));
+ return new
IntegerLiteral(Integer.parseInt(getTimestamp(date.toJavaDateType())));
}
@ExecFunction(name = "unix_timestamp", argTypes = {"DATEV2"}, returnType =
"INT")
public static Expression unixTimestamp(DateV2Literal date) {
- return new IntegerLiteral(getTimestamp(date.toJavaDateType()));
+ return new
IntegerLiteral(Integer.parseInt(getTimestamp(date.toJavaDateType())));
}
/**
@@ -513,18 +513,17 @@ public class DateTimeExtractAndTransform {
public static Expression unixTimestamp(DateTimeV2Literal date) {
if (date.getMicroSecond() == 0) {
return new
DecimalV3Literal(DecimalV3Type.createDecimalV3TypeLooseCheck(10, 0),
- new
BigDecimal(getTimestamp(date.toJavaDateType()).toString()));
+ new BigDecimal(getTimestamp(date.toJavaDateType())));
}
int scale = date.getDataType().getScale();
- String val = getTimestamp(date.toJavaDateType()).toString() + "." +
date.getMicrosecondString();
return new
DecimalV3Literal(DecimalV3Type.createDecimalV3TypeLooseCheck(10 + scale, scale),
- new BigDecimal(val));
+ new BigDecimal(getTimestamp(date.toJavaDateType())));
}
/**
* date transformation function: unix_timestamp
*/
- @ExecFunction(name = "unix_timestamp", argTypes = {"VARCHAR", "VARCHAR"},
returnType = "INT")
+ @ExecFunction(name = "unix_timestamp", argTypes = {"VARCHAR", "VARCHAR"},
returnType = "DECIMALV3")
public static Expression unixTimestamp(StringLikeLiteral date,
StringLikeLiteral format) {
DateTimeFormatter formatter =
DateUtils.formatBuilder(format.getValue()).toFormatter();
LocalDateTime dateObj;
@@ -534,20 +533,26 @@ public class DateTimeExtractAndTransform {
// means the date string doesn't contain time fields.
dateObj = LocalDate.parse(date.getValue(),
formatter).atStartOfDay();
}
- return new IntegerLiteral(getTimestamp(dateObj));
+ return new
DecimalV3Literal(DecimalV3Type.createDecimalV3TypeLooseCheck(16, 6),
+ new BigDecimal(getTimestamp(dateObj)));
}
- private static Integer getTimestamp(LocalDateTime dateTime) {
+ private static String getTimestamp(LocalDateTime dateTime) {
LocalDateTime specialUpperBound = LocalDateTime.of(2038, 1, 19, 3, 14,
7);
LocalDateTime specialLowerBound = LocalDateTime.of(1970, 1, 1, 0, 0,
0);
if (dateTime.isBefore(specialLowerBound) ||
dateTime.isAfter(specialUpperBound)) {
- return 0;
+ return "0";
}
- return ((int) Duration.between(
+ Duration duration = Duration.between(
specialLowerBound,
dateTime.atZone(DateUtils.getTimeZone())
.toOffsetDateTime().atZoneSameInstant(ZoneId.of("UTC+0"))
- .toLocalDateTime()).getSeconds());
+ .toLocalDateTime());
+ if (duration.getNano() == 0) {
+ return String.valueOf(duration.getSeconds());
+ } else {
+ return duration.getSeconds() + "." + (duration.getNano() / 1000);
+ }
}
/**
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
index 9166dddf033..143bc63aade 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java
@@ -46,7 +46,7 @@ public class UnixTimestamp extends ScalarFunction
// we got changes when computeSignature
private static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
FunctionSignature.ret(IntegerType.INSTANCE).args(),
- FunctionSignature.ret(DecimalV3Type.createDecimalV3Type(16,
6)).args(DateTimeV2Type.SYSTEM_DEFAULT),
+
FunctionSignature.ret(DecimalV3Type.WILDCARD).args(DateTimeV2Type.SYSTEM_DEFAULT),
FunctionSignature.ret(IntegerType.INSTANCE).args(DateV2Type.INSTANCE),
FunctionSignature.ret(IntegerType.INSTANCE).args(DateTimeType.INSTANCE),
FunctionSignature.ret(IntegerType.INSTANCE).args(DateType.INSTANCE),
@@ -102,6 +102,7 @@ public class UnixTimestamp extends ScalarFunction
@Override
public FunctionSignature computeSignature(FunctionSignature signature) {
+ signature = super.computeSignature(signature);
if (arity() != 1) {
return signature;
}
@@ -120,7 +121,7 @@ public class UnixTimestamp extends ScalarFunction
*/
@Override
public UnixTimestamp withChildren(List<Expression> children) {
- Preconditions.checkArgument(children.size() == 0
+ Preconditions.checkArgument(children.isEmpty()
|| children.size() == 1
|| children.size() == 2);
if (children.isEmpty() && arity() == 0) {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
index 7a271314691..6e8d7aea8ed 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
@@ -43,6 +43,7 @@ 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.DateTimeV2Literal;
import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal;
+import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
import org.apache.doris.nereids.trees.expressions.literal.Interval.TimeUnit;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
@@ -60,6 +61,7 @@ import com.google.common.collect.ImmutableList;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Locale;
@@ -183,65 +185,57 @@ class FoldConstantTest extends
ExpressionRewriteTestHelper {
ConvertTz c = new
ConvertTz(DateTimeV2Literal.fromJavaDateType(LocalDateTime.of(1, 1, 1, 1, 1,
1)),
StringLiteral.of("Asia/Shanghai"), StringLiteral.of("GMT"));
Expression rewritten = executor.rewrite(c, context);
- String res = "0000-12-31 16:55:18";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateTimeV2Literal("0000-12-31 16:55:18"),
rewritten);
DateFormat d = new
DateFormat(DateTimeLiteral.fromJavaDateType(LocalDateTime.of(1, 1, 1, 1, 1, 1)),
StringLiteral.of("%y %m %d"));
rewritten = executor.rewrite(d, context);
- res = "'01 01 01'";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new VarcharLiteral("01 01 01"), rewritten);
d = new
DateFormat(DateTimeV2Literal.fromJavaDateType(LocalDateTime.of(1, 1, 1, 1, 1,
1)),
StringLiteral.of("%y %m %d"));
rewritten = executor.rewrite(d, context);
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new VarcharLiteral("01 01 01"), rewritten);
d = new DateFormat(DateLiteral.fromJavaDateType(LocalDateTime.of(1, 1,
1, 1, 1, 1)),
StringLiteral.of("%y %m %d"));
rewritten = executor.rewrite(d, context);
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new VarcharLiteral("01 01 01"), rewritten);
d = new DateFormat(DateV2Literal.fromJavaDateType(LocalDateTime.of(1,
1, 1, 1, 1, 1)),
StringLiteral.of("%y %m %d"));
rewritten = executor.rewrite(d, context);
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new VarcharLiteral("01 01 01"), rewritten);
DateTrunc t = new
DateTrunc(DateTimeLiteral.fromJavaDateType(LocalDateTime.of(1, 1, 1, 1, 1, 1)),
StringLiteral.of("week"));
rewritten = executor.rewrite(t, context);
- res = "0001-01-01 00:00:00";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateTimeLiteral("0001-01-01 00:00:00"),
rewritten);
t = new
DateTrunc(DateTimeV2Literal.fromJavaDateType(LocalDateTime.of(1, 1, 1, 1, 1,
1)),
StringLiteral.of("week"));
rewritten = executor.rewrite(t, context);
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateTimeV2Literal("0001-01-01 00:00:00"),
rewritten);
t = new DateTrunc(DateLiteral.fromJavaDateType(LocalDateTime.of(1, 1,
1, 1, 1, 1)),
StringLiteral.of("week"));
rewritten = executor.rewrite(t, context);
- res = "0001-01-01";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateLiteral("0001-01-01"), rewritten);
t = new DateTrunc(DateV2Literal.fromJavaDateType(LocalDateTime.of(1,
1, 1, 1, 1, 1)),
StringLiteral.of("week"));
rewritten = executor.rewrite(t, context);
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateV2Literal("0001-01-01"), rewritten);
FromUnixtime f = new FromUnixtime(BigIntLiteral.of(123456789L),
StringLiteral.of("%y %m %d"));
rewritten = executor.rewrite(f, context);
- res = "'73 11 30'";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new VarcharLiteral("73 11 30"), rewritten);
UnixTimestamp ut = new UnixTimestamp(StringLiteral.of("2021-11-11"),
StringLiteral.of("%Y-%m-%d"));
rewritten = executor.rewrite(ut, context);
- res = "1636560000";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DecimalV3Literal(new
BigDecimal("1636560000.000000")), rewritten);
StrToDate sd = new StrToDate(StringLiteral.of("2021-11-11"),
StringLiteral.of("%Y-%m-%d"));
rewritten = executor.rewrite(sd, context);
- res = "2021-11-11";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new DateV2Literal("2021-11-11"), rewritten);
AppendTrailingCharIfAbsent a = new
AppendTrailingCharIfAbsent(StringLiteral.of("1"), StringLiteral.of("3"));
rewritten = executor.rewrite(a, context);
- res = "'13'";
- Assertions.assertEquals(rewritten.toString(), res);
+ Assertions.assertEquals(new StringLiteral("13"), rewritten);
}
@Test
@@ -659,34 +653,34 @@ class FoldConstantTest extends
ExpressionRewriteTestHelper {
void testDateConstructFunction() {
String[] answer = {
"'2001-07-19'", "'6411-08-17'", "'0000-01-01'", "'1977-06-03
17:57:24'",
- "'1977-06-03'", "1008909293", "1008864000"
+ "'1977-06-03'", "1008909293", "1008864000.000000"
};
int answerIdx = 0;
- Assertions.assertEquals(DateTimeExtractAndTransform.makeDate(
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.makeDate(
new IntegerLiteral(2001),
new IntegerLiteral(200)
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.fromDays(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.fromDays(
new IntegerLiteral(2341798)
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.fromDays(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.fromDays(
new IntegerLiteral(1)
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.fromUnixTime(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.fromUnixTime(
new BigIntLiteral(234179844)
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.fromUnixTime(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.fromUnixTime(
new BigIntLiteral(234179844),
new VarcharLiteral("%Y-%m-%d")
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.unixTimestamp(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx++],
DateTimeExtractAndTransform.unixTimestamp(
new DateTimeLiteral("2001-12-21 12:34:53")
- ).toSql(), answer[answerIdx++]);
- Assertions.assertEquals(DateTimeExtractAndTransform.unixTimestamp(
+ ).toSql());
+ Assertions.assertEquals(answer[answerIdx],
DateTimeExtractAndTransform.unixTimestamp(
new VarcharLiteral("2001-12-21"),
new VarcharLiteral("%Y-%m-%d")
- ).toSql(), answer[answerIdx]);
+ ).toSql());
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]