This is an automated email from the ASF dual-hosted git repository. yumwang pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new ba42126 [SPARK-30904][SQL] Thrift RowBasedSet serialization throws NullPointerException on NULL BigDecimal ba42126 is described below commit ba4212660305c6555ae16b10c6bbaf6114c4d830 Author: Christian Stuart <christian.stu...@databricks.com> AuthorDate: Fri Feb 21 21:39:35 2020 -0700 [SPARK-30904][SQL] Thrift RowBasedSet serialization throws NullPointerException on NULL BigDecimal ### What changes were proposed in this pull request? This PR fixes SPARK-30904 by adding a null check. ### Why are the changes needed? For HIVE_CLI_SERVICE_PROTOCOL_V5 and below, serialization fails on NULL-containing decimal columns, caused by a call to `value.toPlainString()`, where `value` might be null. This null check fixes it. ### Does this PR introduce any user-facing change? No ### How was this patch tested? A test was added for serialization of NULL decimals for all HIVE_CLI_SERVICE_PROTOCOL versions. Closes #27654 from CJStuart/SPARK-30904. Authored-by: Christian Stuart <christian.stu...@databricks.com> Signed-off-by: Yuming Wang <wgy...@gmail.com> (cherry picked from commit bcce1b10408b5c516c936e8770a598ef415d71c3) Signed-off-by: Yuming Wang <wgy...@gmail.com> --- .../hive/thriftserver/SparkThriftServerProtocolVersionsSuite.scala | 5 +++++ .../v1.2/src/main/java/org/apache/hive/service/cli/ColumnValue.java | 3 ++- .../v2.3/src/main/java/org/apache/hive/service/cli/ColumnValue.java | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/SparkThriftServerProtocolVersionsSuite.scala b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/SparkThriftServerProtocolVersionsSuite.scala index a63b5da..fd45e7a 100644 --- a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/SparkThriftServerProtocolVersionsSuite.scala +++ b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/SparkThriftServerProtocolVersionsSuite.scala @@ -192,6 +192,11 @@ class SparkThriftServerProtocolVersionsSuite extends HiveThriftJdbcTest { assert(rs.next()) assert(rs.getBigDecimal(1) === new java.math.BigDecimal("1.00")) } + testExecuteStatementWithProtocolVersion(version, + "SELECT cast(null as decimal) ") { rs => + assert(rs.next()) + assert(rs.getBigDecimal(1) === null) + } } test(s"$version get string type") { diff --git a/sql/hive-thriftserver/v1.2/src/main/java/org/apache/hive/service/cli/ColumnValue.java b/sql/hive-thriftserver/v1.2/src/main/java/org/apache/hive/service/cli/ColumnValue.java index 547c605..a770bea 100644 --- a/sql/hive-thriftserver/v1.2/src/main/java/org/apache/hive/service/cli/ColumnValue.java +++ b/sql/hive-thriftserver/v1.2/src/main/java/org/apache/hive/service/cli/ColumnValue.java @@ -186,7 +186,8 @@ public class ColumnValue { case INTERVAL_DAY_TIME_TYPE: return stringValue((HiveIntervalDayTime) value); case DECIMAL_TYPE: - return stringValue(((BigDecimal)value).toPlainString()); + String plainStr = value == null ? null : ((BigDecimal)value).toPlainString(); + return stringValue(plainStr); case BINARY_TYPE: String strVal = value == null ? null : UTF8String.fromBytes((byte[])value).toString(); return stringValue(strVal); diff --git a/sql/hive-thriftserver/v2.3/src/main/java/org/apache/hive/service/cli/ColumnValue.java b/sql/hive-thriftserver/v2.3/src/main/java/org/apache/hive/service/cli/ColumnValue.java index f881ab1..53f0465 100644 --- a/sql/hive-thriftserver/v2.3/src/main/java/org/apache/hive/service/cli/ColumnValue.java +++ b/sql/hive-thriftserver/v2.3/src/main/java/org/apache/hive/service/cli/ColumnValue.java @@ -189,7 +189,8 @@ public class ColumnValue { case INTERVAL_DAY_TIME_TYPE: return stringValue((HiveIntervalDayTime) value); case DECIMAL_TYPE: - return stringValue(((BigDecimal)value).toPlainString()); + String plainStr = value == null ? null : ((BigDecimal)value).toPlainString(); + return stringValue(plainStr); case BINARY_TYPE: String strVal = value == null ? null : UTF8String.fromBytes((byte[])value).toString(); return stringValue(strVal); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org