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 e33e42f3cc8c..604c21f82c19 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 @@ -26,6 +26,9 @@ import org.apache.hive.service.cli.GetInfoType import org.apache.thrift.protocol.TBinaryProtocol import org.apache.thrift.transport.TSocket +import org.apache.spark.sql.catalyst.util.NumberConverter +import org.apache.spark.unsafe.types.UTF8String + class SparkThriftServerProtocolVersionsSuite extends HiveThriftJdbcTest { override def mode: ServerMode.Value = ServerMode.binary @@ -215,12 +218,19 @@ class SparkThriftServerProtocolVersionsSuite extends HiveThriftJdbcTest { } } - // TODO: enable this test case after SPARK-28474 - ignore(s"$version get binary type") { + test(s"$version get binary type") { testExecuteStatementWithProtocolVersion(version, "SELECT cast('ABC' as binary)") { rs => assert(rs.next()) assert(rs.getString(1) === "ABC") } + testExecuteStatementWithProtocolVersion(version, "SELECT cast(49960 as binary)") { rs => + assert(rs.next()) + assert(rs.getString(1) === UTF8String.fromBytes(NumberConverter.toBinary(49960)).toString) + } + testExecuteStatementWithProtocolVersion(version, "SELECT cast(null as binary)") { rs => + assert(rs.next()) + assert(rs.getString(1) === null) + } } test(s"$version get boolean type") { diff --git a/sql/hive-thriftserver/v1.2.1/src/main/java/org/apache/hive/service/cli/ColumnValue.java b/sql/hive-thriftserver/v1.2.1/src/main/java/org/apache/hive/service/cli/ColumnValue.java index 40144cfe33fa..9e9d6ccc2116 100644 --- a/sql/hive-thriftserver/v1.2.1/src/main/java/org/apache/hive/service/cli/ColumnValue.java +++ b/sql/hive-thriftserver/v1.2.1/src/main/java/org/apache/hive/service/cli/ColumnValue.java @@ -36,6 +36,8 @@ import org.apache.hive.service.cli.thrift.TI64Value; import org.apache.hive.service.cli.thrift.TStringValue; +import org.apache.spark.unsafe.types.UTF8String; + /** * Protocols before HIVE_CLI_SERVICE_PROTOCOL_V6 (used by RowBasedSet) * @@ -195,7 +197,8 @@ public static TColumnValue toTColumnValue(Type type, Object value) { case DECIMAL_TYPE: return stringValue(((HiveDecimal)value)); case BINARY_TYPE: - return stringValue((String)value); + String strVal = value == null ? null : UTF8String.fromBytes((byte[])value).toString(); + return stringValue(strVal); case ARRAY_TYPE: case MAP_TYPE: case STRUCT_TYPE: diff --git a/sql/hive-thriftserver/v2.3.5/src/main/java/org/apache/hive/service/cli/ColumnValue.java b/sql/hive-thriftserver/v2.3.5/src/main/java/org/apache/hive/service/cli/ColumnValue.java index 28149e1e5edb..12d49b25142a 100644 --- a/sql/hive-thriftserver/v2.3.5/src/main/java/org/apache/hive/service/cli/ColumnValue.java +++ b/sql/hive-thriftserver/v2.3.5/src/main/java/org/apache/hive/service/cli/ColumnValue.java @@ -37,6 +37,8 @@ import org.apache.hive.service.rpc.thrift.TI64Value; import org.apache.hive.service.rpc.thrift.TStringValue; +import org.apache.spark.unsafe.types.UTF8String; + /** * Protocols before HIVE_CLI_SERVICE_PROTOCOL_V6 (used by RowBasedSet) * @@ -199,7 +201,8 @@ public static TColumnValue toTColumnValue(TypeDescriptor typeDescriptor, Object case DECIMAL_TYPE: return stringValue((HiveDecimal)value, typeDescriptor); case BINARY_TYPE: - return stringValue((String)value); + String strVal = value == null ? null : UTF8String.fromBytes((byte[])value).toString(); + return stringValue(strVal); case ARRAY_TYPE: case MAP_TYPE: case STRUCT_TYPE: