Skip to content

Commit 073da59

Browse files
committed
add fe ut
1 parent fec459d commit 073da59

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -576,41 +576,23 @@ public static Expression fromUnixTime(BigIntLiteral second, StringLikeLiteral fo
576576
*/
577577
@ExecFunction(name = "from_unixtime")
578578
public static Expression fromUnixTime(DecimalLiteral second, StringLikeLiteral format) {
579-
format = (StringLikeLiteral) SupportJavaDateFormatter.translateJavaFormatter(format);
580-
581-
if (second.getValue().signum() < 0) {
582-
throw new AnalysisException("Operation from_unixtime of " + second.getValue() + " out of range");
583-
}
584-
585-
BigDecimal decimalVal = second.getValue();
586-
BigDecimal microSeconds = decimalVal.movePointRight(decimalVal.scale()).setScale(0, RoundingMode.DOWN);
587-
ZonedDateTime dateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0)
588-
.plus(microSeconds.longValue(), ChronoUnit.MICROS)
589-
.atZone(ZoneId.of("UTC+0"))
590-
.toOffsetDateTime()
591-
.atZoneSameInstant(DateUtils.getTimeZone());
592-
DateTimeV2Literal datetime = new DateTimeV2Literal(DateTimeV2Type.of(6), dateTime.getYear(),
593-
dateTime.getMonthValue(),
594-
dateTime.getDayOfMonth(), dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(),
595-
dateTime.getNano() / 1000);
596-
if (datetime.checkRange()) {
597-
throw new AnalysisException("Operation from_unixtime of " + second.getValue() + " out of range");
598-
}
599-
return dateFormat(datetime, format);
579+
return fromUnixTime(second.getValue(), format);
600580
}
601581

602582
/**
603583
* date transformation function: from_unixtime
604584
*/
605585
@ExecFunction(name = "from_unixtime")
606586
public static Expression fromUnixTime(DecimalV3Literal second, StringLikeLiteral format) {
607-
format = (StringLikeLiteral) SupportJavaDateFormatter.translateJavaFormatter(format);
587+
return fromUnixTime(second.getValue(), format);
588+
}
608589

609-
if (second.getValue().signum() < 0) {
610-
throw new AnalysisException("Operation from_unixtime of " + second.getValue() + " out of range");
590+
private static Expression fromUnixTime(BigDecimal second, StringLikeLiteral format) {
591+
if (second.signum() < 0) {
592+
throw new AnalysisException("Operation from_unixtime of " + second + " out of range");
611593
}
612-
BigDecimal decimalVal = second.getValue();
613-
BigDecimal microSeconds = decimalVal.movePointRight(decimalVal.scale()).setScale(0, RoundingMode.DOWN);
594+
format = (StringLikeLiteral) SupportJavaDateFormatter.translateJavaFormatter(format);
595+
BigDecimal microSeconds = second.movePointRight(second.scale()).setScale(0, RoundingMode.DOWN);
614596
ZonedDateTime dateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0)
615597
.plus(microSeconds.longValue(), ChronoUnit.MICROS)
616598
.atZone(ZoneId.of("UTC+0"))
@@ -621,7 +603,7 @@ public static Expression fromUnixTime(DecimalV3Literal second, StringLikeLiteral
621603
dateTime.getDayOfMonth(), dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond(),
622604
dateTime.getNano() / 1000);
623605
if (datetime.checkRange()) {
624-
throw new AnalysisException("Operation from_unixtime of " + second.getValue() + " out of range");
606+
throw new AnalysisException("Operation from_unixtime of " + second + " out of range");
625607
}
626608
return dateFormat(datetime, format);
627609
}

fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransformTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
package org.apache.doris.nereids.trees.expressions.functions.executable;
1919

20+
import org.apache.doris.nereids.exceptions.AnalysisException;
2021
import org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
2122
import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
23+
import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
2224
import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral;
2325
import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
2426
import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral;
@@ -27,6 +29,7 @@
2729
import org.junit.jupiter.api.Assertions;
2830
import org.junit.jupiter.api.Test;
2931

32+
import java.math.BigDecimal;
3033
import java.time.LocalDateTime;
3134

3235
class DateTimeExtractAndTransformTest {
@@ -148,4 +151,19 @@ void testFromSecondSacle() {
148151
result = (DateTimeV2Literal) DateTimeExtractAndTransform.fromMicroSecond(second);
149152
Assertions.assertEquals(6, result.getScale());
150153
}
154+
155+
@Test
156+
public void testFromUnixTimeNegativeThrows() {
157+
BigIntLiteral negative = new BigIntLiteral(-1L);
158+
Assertions.assertThrows(AnalysisException.class,
159+
() -> DateTimeExtractAndTransform.fromUnixTime(negative));
160+
}
161+
162+
@Test
163+
public void testFromUnixTimeOutOfRangeThrows() {
164+
BigDecimal big = new BigDecimal("253402272000000000");
165+
DecimalV3Literal dec = new DecimalV3Literal(big);
166+
Assertions.assertThrows(AnalysisException.class,
167+
() -> DateTimeExtractAndTransform.fromUnixTime(dec));
168+
}
151169
}

0 commit comments

Comments
 (0)