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]

Reply via email to