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