This is an automated email from the ASF dual-hosted git repository.

abhishek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 2045a1345c Fix NPE when applying a transform that outputs to __time 
(#12870)
2045a1345c is described below

commit 2045a1345c9c7cde98b4b1454b1f6fd82b71b96a
Author: Jonathan Wei <[email protected]>
AuthorDate: Sun Aug 7 08:51:47 2022 -0500

    Fix NPE when applying a transform that outputs to __time (#12870)
---
 .../druid/segment/transform/Transformer.java       | 14 ++++-
 .../druid/segment/transform/TransformerTest.java   | 64 ++++++++++++++++++++++
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/transform/Transformer.java 
b/processing/src/main/java/org/apache/druid/segment/transform/Transformer.java
index fa13af9b09..78b5e5dbd3 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/transform/Transformer.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/transform/Transformer.java
@@ -24,6 +24,7 @@ import org.apache.druid.data.input.InputRowListPlusRawValues;
 import org.apache.druid.data.input.Row;
 import org.apache.druid.data.input.Rows;
 import org.apache.druid.java.util.common.DateTimes;
+import org.apache.druid.java.util.common.parsers.ParseException;
 import org.apache.druid.query.filter.ValueMatcher;
 import org.apache.druid.segment.RowAdapters;
 import org.apache.druid.segment.RowBasedColumnSelectorFactory;
@@ -114,7 +115,12 @@ public class Transformer
       final List<InputRow> originalRows = row.getInputRows();
       final List<InputRow> transformedRows = new 
ArrayList<>(originalRows.size());
       for (InputRow originalRow : originalRows) {
-        transformedRows.add(new TransformedInputRow(originalRow, transforms));
+        try {
+          transformedRows.add(new TransformedInputRow(originalRow, 
transforms));
+        }
+        catch (ParseException pe) {
+          return InputRowListPlusRawValues.of(row.getRawValues(), pe);
+        }
       }
       inputRowListPlusRawValues = 
InputRowListPlusRawValues.ofList(row.getRawValuesList(), transformedRows);
     }
@@ -170,7 +176,11 @@ public class Transformer
       final long ts;
       if (transform != null) {
         //noinspection ConstantConditions time column is never null
-        ts = Rows.objectToNumber(ColumnHolder.TIME_COLUMN_NAME, 
transform.eval(row), true).longValue();
+        final Number transformedVal = 
Rows.objectToNumber(ColumnHolder.TIME_COLUMN_NAME, transform.eval(row), true);
+        if (transformedVal == null) {
+          throw new ParseException(row.toString(), "Could not transform value 
for __time.");
+        }
+        ts = transformedVal.longValue();
       } else {
         ts = row.getTimestampFromEpoch();
       }
diff --git 
a/processing/src/test/java/org/apache/druid/segment/transform/TransformerTest.java
 
b/processing/src/test/java/org/apache/druid/segment/transform/TransformerTest.java
index eb4d7f4692..4023d97b82 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/transform/TransformerTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/transform/TransformerTest.java
@@ -21,10 +21,12 @@ package org.apache.druid.segment.transform;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.data.input.InputRowListPlusRawValues;
 import org.apache.druid.data.input.MapBasedInputRow;
 import org.apache.druid.java.util.common.DateTimes;
+import org.apache.druid.java.util.common.parsers.ParseException;
 import org.apache.druid.query.expression.TestExprMacroTable;
 import org.apache.druid.query.filter.SelectorDimFilter;
 import org.apache.druid.testing.InitializedNullHandlingTest;
@@ -74,6 +76,68 @@ public class TransformerTest extends 
InitializedNullHandlingTest
     Assert.assertEquals(now.minusDays(2), actual.getTimestamp());
   }
 
+  @Test
+  public void testTransformTimeColumnWithInvalidTimeValue()
+  {
+    final Transformer transformer = new Transformer(
+        new TransformSpec(
+            null,
+            ImmutableList.of(
+                new ExpressionTransform("__time", "timestamp_parse(ts, null, 
'UTC')", TestExprMacroTable.INSTANCE)
+            )
+        )
+    );
+    final DateTime now = DateTimes.nowUtc();
+    final InputRow row = new MapBasedInputRow(
+        now,
+        ImmutableList.of("ts", "dim"),
+        ImmutableMap.of("ts", "not_a_timestamp", "dim", false)
+    );
+    if (NullHandling.replaceWithDefault()) {
+      final InputRow actual = transformer.transform(row);
+      Assert.assertNotNull(actual);
+      Assert.assertEquals(DateTimes.of("1970-01-01T00:00:00.000Z"), 
actual.getTimestamp());
+    } else {
+      expectedException.expectMessage("Could not transform value for __time.");
+      expectedException.expect(ParseException.class);
+      transformer.transform(row);
+    }
+  }
+
+  @Test
+  public void 
testTransformTimeColumnWithInvalidTimeValueInputRowListPlusRawValues()
+  {
+    final Transformer transformer = new Transformer(
+        new TransformSpec(
+            null,
+            ImmutableList.of(
+                new ExpressionTransform("__time", "timestamp_parse(ts, null, 
'UTC')", TestExprMacroTable.INSTANCE)
+            )
+        )
+    );
+    final DateTime now = DateTimes.nowUtc();
+    final InputRow row = new MapBasedInputRow(
+        now,
+        ImmutableList.of("ts", "dim"),
+        ImmutableMap.of("ts", "not_a_timestamp", "dim", false)
+    );
+    final InputRowListPlusRawValues actual = transformer.transform(
+        InputRowListPlusRawValues.of(
+            row,
+            ImmutableMap.of("ts", "not_a_timestamp", "dim", false)
+        )
+    );
+    Assert.assertNotNull(actual);
+    Assert.assertEquals(1, actual.getRawValuesList().size());
+    if (NullHandling.replaceWithDefault()) {
+      Assert.assertEquals(1, actual.getInputRows().size());
+      Assert.assertEquals(DateTimes.of("1970-01-01T00:00:00.000Z"), 
actual.getInputRows().get(0).getTimestamp());
+    } else {
+      Assert.assertNull(actual.getInputRows());
+      Assert.assertEquals("Could not transform value for __time.", 
actual.getParseException().getMessage());
+    }
+  }
+
   @Test
   public void 
testTransformWithStringTransformOnBooleanColumnTransformAfterCasting()
   {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to