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

Reply via email to