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

jackie 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 8a86c7b1f2 Fix a NullPointerException bug in 
ScalarTransformFunctionWrapper. (#11309)
8a86c7b1f2 is described below

commit 8a86c7b1f29b19102ee6198732ca02fcb80ea14f
Author: Shen Yu <s...@startree.ai>
AuthorDate: Fri Aug 11 16:55:41 2023 -0700

    Fix a NullPointerException bug in ScalarTransformFunctionWrapper. (#11309)
---
 .../function/ScalarTransformFunctionWrapper.java   | 20 ++++++++---
 .../queries/NullHandlingEnabledQueriesTest.java    | 39 ++++++++++++++++++++++
 2 files changed, 54 insertions(+), 5 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapper.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapper.java
index 410e979132..3a2c35b90a 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapper.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/ScalarTransformFunctionWrapper.java
@@ -27,6 +27,7 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.pinot.common.function.FunctionInfo;
 import org.apache.pinot.common.function.FunctionInvoker;
 import org.apache.pinot.common.function.FunctionUtils;
+import org.apache.pinot.common.utils.DataSchema;
 import org.apache.pinot.common.utils.PinotDataType;
 import org.apache.pinot.core.operator.ColumnContext;
 import org.apache.pinot.core.operator.blocks.ValueBlock;
@@ -159,7 +160,9 @@ public class ScalarTransformFunctionWrapper extends 
BaseTransformFunction {
       for (int j = 0; j < _numNonLiteralArguments; j++) {
         _scalarArguments[_nonLiteralIndices[j]] = _nonLiteralValues[j][i];
       }
-      _intValuesSV[i] = (int) 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      Object value = _functionInvoker.invoke(_scalarArguments);
+      _intValuesSV[i] = value == null ? (int) 
DataSchema.ColumnDataType.INT.getNullPlaceholder()
+          : (int) _resultType.toInternal(value);
     }
     return _intValuesSV;
   }
@@ -176,7 +179,9 @@ public class ScalarTransformFunctionWrapper extends 
BaseTransformFunction {
       for (int j = 0; j < _numNonLiteralArguments; j++) {
         _scalarArguments[_nonLiteralIndices[j]] = _nonLiteralValues[j][i];
       }
-      _longValuesSV[i] = (long) 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      Object value = _functionInvoker.invoke(_scalarArguments);
+      _longValuesSV[i] = value == null ? (long) 
DataSchema.ColumnDataType.LONG.getNullPlaceholder()
+          : (long) _resultType.toInternal(value);
     }
     return _longValuesSV;
   }
@@ -193,7 +198,9 @@ public class ScalarTransformFunctionWrapper extends 
BaseTransformFunction {
       for (int j = 0; j < _numNonLiteralArguments; j++) {
         _scalarArguments[_nonLiteralIndices[j]] = _nonLiteralValues[j][i];
       }
-      _floatValuesSV[i] = (float) 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      Object value = _functionInvoker.invoke(_scalarArguments);
+      _floatValuesSV[i] = value == null ? (float) 
DataSchema.ColumnDataType.FLOAT.getNullPlaceholder()
+          : (float) _resultType.toInternal(value);
     }
     return _floatValuesSV;
   }
@@ -210,7 +217,9 @@ public class ScalarTransformFunctionWrapper extends 
BaseTransformFunction {
       for (int j = 0; j < _numNonLiteralArguments; j++) {
         _scalarArguments[_nonLiteralIndices[j]] = _nonLiteralValues[j][i];
       }
-      _doubleValuesSV[i] = (double) 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      Object value = 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      _doubleValuesSV[i] = value == null ? (double) 
DataSchema.ColumnDataType.DOUBLE.getNullPlaceholder()
+          : (double) _resultType.toInternal(value);
     }
     return _doubleValuesSV;
   }
@@ -227,7 +236,8 @@ public class ScalarTransformFunctionWrapper extends 
BaseTransformFunction {
       for (int j = 0; j < _numNonLiteralArguments; j++) {
         _scalarArguments[_nonLiteralIndices[j]] = _nonLiteralValues[j][i];
       }
-      _bigDecimalValuesSV[i] = (BigDecimal) 
_resultType.toInternal(_functionInvoker.invoke(_scalarArguments));
+      Object value = _functionInvoker.invoke(_scalarArguments);
+      _bigDecimalValuesSV[i] = value == null ? null : (BigDecimal) 
_resultType.toInternal(value);
     }
     return _bigDecimalValuesSV;
   }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
index fadda4faae..33eb0b0069 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
@@ -1154,4 +1154,43 @@ public class NullHandlingEnabledQueriesTest extends 
BaseQueriesTest {
     assertEquals(rows.size(), NUM_OF_SEGMENT_COPIES);
     assertArrayEquals(rows.get(0), new Object[]{new Integer[]{1, 2, 3}});
   }
+
+  @Test
+  public void testScalarFunctionStringNullLiteral()
+      throws Exception {
+    initializeRows();
+    insertRow("abc");
+    insertRow(null);
+    TableConfig tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).build();
+    Schema schema = new 
Schema.SchemaBuilder().addSingleValueDimension(COLUMN1, 
FieldSpec.DataType.STRING).build();
+    setUpSegments(tableConfig, schema);
+    String query = String.format("SELECT STARTSWITH(%s, NULL) FROM testTable", 
COLUMN1);
+
+    BrokerResponseNative brokerResponse = getBrokerResponse(query, 
QUERY_OPTIONS);
+
+    ResultTable resultTable = brokerResponse.getResultTable();
+    List<Object[]> rows = resultTable.getRows();
+    assertEquals(rows.size(), 2 * NUM_OF_SEGMENT_COPIES);
+    for (int i = 0; i < 2 * NUM_OF_SEGMENT_COPIES; i++) {
+      assertArrayEquals(rows.get(i), new Object[]{null});
+    }
+  }
+
+  @Test
+  public void testScalarFunctionIntNullLiteral()
+      throws Exception {
+    initializeRows();
+    insertRow(1);
+    TableConfig tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).build();
+    Schema schema = new 
Schema.SchemaBuilder().addSingleValueDimension(COLUMN1, 
FieldSpec.DataType.INT).build();
+    setUpSegments(tableConfig, schema);
+    String query = String.format("SELECT between(%s, NULL, 2) FROM testTable", 
COLUMN1);
+
+    BrokerResponseNative brokerResponse = getBrokerResponse(query, 
QUERY_OPTIONS);
+
+    ResultTable resultTable = brokerResponse.getResultTable();
+    List<Object[]> rows = resultTable.getRows();
+    assertEquals(rows.size(), NUM_OF_SEGMENT_COPIES);
+    assertArrayEquals(rows.get(0), new Object[]{null});
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to