This is an automated email from the ASF dual-hosted git repository.
Jackie-Jiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new eba4f6971bf Fix dateTimeConvert regression parsing
decimal/scientific-notation epoch strings (#18940)
eba4f6971bf is described below
commit eba4f6971bf11a738a375e87aa7556281f62c558
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Wed Jul 8 15:29:53 2026 -0700
Fix dateTimeConvert regression parsing decimal/scientific-notation epoch
strings (#18940)
---
.../pinot/common/function/scalar/DateTimeConvert.java | 9 ++++++---
.../pinot/core/data/function/DateTimeFunctionsTest.java | 13 +++++++++++++
.../org/apache/pinot/spi/data/DateTimeFormatSpecTest.java | 5 +++++
3 files changed, 24 insertions(+), 3 deletions(-)
diff --git
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeConvert.java
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeConvert.java
index 11192bb95ee..20820b289ac 100644
---
a/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeConvert.java
+++
b/pinot-common/src/main/java/org/apache/pinot/common/function/scalar/DateTimeConvert.java
@@ -86,11 +86,14 @@ public class DateTimeConvert {
}
/// Converts the input time value to millis since epoch:
- /// - `EPOCH` / `TIMESTAMP` input is treated as a `LONG`.
- /// - `SIMPLE_DATE_FORMAT` input is treated as a `STRING`.
+ /// - `SIMPLE_DATE_FORMAT` input, and any value that arrives as a `String`,
are parsed via
+ /// [DateTimeFormatSpec#fromFormatToMillis(String)], which tolerates
decimal and scientific-notation numeric
+ /// epoch strings (e.g. `"1.4988924E12"`) rather than requiring a strict
integer literal.
+ /// - Other `EPOCH` / `TIMESTAMP` input types (numeric and date/time logical
types) are read as a `LONG`.
private long fromInputFormatToMillis(Object timeValue) {
PinotDataType argumentType = FunctionUtils.getArgumentType(timeValue);
- if (_inputFormatSpec.getTimeFormat() ==
DateTimeFieldSpec.TimeFormat.SIMPLE_DATE_FORMAT) {
+ if (argumentType == PinotDataType.STRING
+ || _inputFormatSpec.getTimeFormat() ==
DateTimeFieldSpec.TimeFormat.SIMPLE_DATE_FORMAT) {
return _inputFormatSpec.fromFormatToMillis((String)
PinotDataType.STRING.convert(timeValue, argumentType));
}
return _inputFormatSpec.fromFormatToMillis((Long)
PinotDataType.LONG.convert(timeValue, argumentType));
diff --git
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
index c185d99baf7..876a01d9806 100644
---
a/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
+++
b/pinot-core/src/test/java/org/apache/pinot/core/data/function/DateTimeFunctionsTest.java
@@ -775,6 +775,19 @@ public class DateTimeFunctionsTest {
8160000L);
}
+ @Test
+ public void testDateTimeConvertNumericStringEpoch() {
+ // EPOCH input arriving as a numeric string is read as LONG via
PinotDataType. Decimal and scientific-notation
+ // forms (e.g. a numeric column stringified upstream) must parse rather
than throw; the fractional part is
+ // truncated toward zero.
+ testDateTimeConvert("1505898960000", "1:MILLISECONDS:EPOCH",
"1:MILLISECONDS:EPOCH", "1:MILLISECONDS",
+ 1505898960000L);
+ testDateTimeConvert("1505898960000.0", "1:MILLISECONDS:EPOCH",
"1:MILLISECONDS:EPOCH", "1:MILLISECONDS",
+ 1505898960000L);
+ testDateTimeConvert("1.50589896E12", "1:MILLISECONDS:EPOCH",
"1:MILLISECONDS:EPOCH", "1:MILLISECONDS",
+ 1505898960000L);
+ }
+
@Test
private void testTimestampAdd() {
long currentTimestamp = System.currentTimeMillis();
diff --git
a/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeFormatSpecTest.java
b/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeFormatSpecTest.java
index 898e182fb3c..153f8d2fd35 100644
---
a/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeFormatSpecTest.java
+++
b/pinot-spi/src/test/java/org/apache/pinot/spi/data/DateTimeFormatSpecTest.java
@@ -51,6 +51,11 @@ public class DateTimeFormatSpecTest {
entries.add(new Object[]{"1:MILLISECONDS:EPOCH", "1498892400000",
1498892400000L});
entries.add(new Object[]{"1:HOURS:EPOCH", "0", 0L});
entries.add(new Object[]{"5:MINUTES:EPOCH", "4996308", 1498892400000L});
+ // Numeric EPOCH values may arrive as decimal or scientific-notation
strings (e.g. from a numeric column
+ // stringified upstream); the fractional part is truncated toward zero.
+ entries.add(new Object[]{"1:HOURS:EPOCH", "416359.0", 1498892400000L});
+ entries.add(new Object[]{"1:MILLISECONDS:EPOCH", "1.4988924E12",
1498892400000L});
+ entries.add(new Object[]{"5:MINUTES:EPOCH", "4996308.9", 1498892400000L});
entries.add(new Object[]{
"1:MILLISECONDS:TIMESTAMP", "2017-07-01 00:00:00",
Timestamp.valueOf("2017-07-01 00:00:00").getTime()
});
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]