diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/schema/RowSet.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/schema/RowSet.scala index ba6d9c9f4..47407d48e 100644 --- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/schema/RowSet.scala +++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/schema/RowSet.scala @@ -90,7 +90,7 @@ object RowSet { case FloatType => val values = getOrSetAsNull[java.lang.Float](rows, ordinal, nulls, 0.toFloat) - .asScala.map(n => java.lang.Double.valueOf(n.toDouble)).asJava + .asScala.map(n => java.lang.Double.valueOf(n.toString)).asJava TColumn.doubleVal(new TDoubleColumn(values, nulls)) case DoubleType => @@ -176,7 +176,10 @@ object RowSet { case FloatType => val tDoubleValue = new TDoubleValue - if (!row.isNullAt(ordinal)) tDoubleValue.setValue(row.getFloat(ordinal)) + if (!row.isNullAt(ordinal)) { + val doubleValue = java.lang.Double.valueOf(row.getFloat(ordinal).toString) + tDoubleValue.setValue(doubleValue) + } TColumnValue.doubleVal(tDoubleValue) case DoubleType => diff --git a/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/schema/RowSetSuite.scala b/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/schema/RowSetSuite.scala index 96d544bf5..803eea3e6 100644 --- a/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/schema/RowSetSuite.scala +++ b/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/schema/RowSetSuite.scala @@ -142,7 +142,7 @@ class RowSetSuite extends KyuubiFunSuite { val floatCol = cols.next().getDoubleVal floatCol.getValues.asScala.zipWithIndex.foreach { case (b, 11) => assert(b === 0) - case (b, i) => assert(b === java.lang.Float.valueOf(s"$i.$i")) + case (b, i) => assert(b.toFloat === java.lang.Float.valueOf(s"$i.$i")) } val doubleCol = cols.next().getDoubleVal @@ -226,7 +226,7 @@ class RowSetSuite extends KyuubiFunSuite { val r4 = iter.next().getColVals assert(r4.get(4).getI64Val.getValue === 3) - assert(r4.get(5).getDoubleVal.getValue === 3.3f) + assert(r4.get(5).getDoubleVal.getValue.toFloat === 3.3f) val r5 = iter.next().getColVals assert(r5.get(6).getDoubleVal.getValue === 4.4d) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkSqlEngineSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkSqlEngineSuite.scala index de74c8478..461a82870 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkSqlEngineSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkSqlEngineSuite.scala @@ -124,5 +124,13 @@ class SparkSqlEngineSuite extends WithKyuubiServer with HiveJDBCTestHelper { } } + test("KYUUBI-1784: float types should not lose precision") { + withJdbcStatement() { statement => + val resultSet = statement.executeQuery("SELECT cast(0.1 as float) AS col") + assert(resultSet.next()) + assert(resultSet.getString("col") == "0.1") + } + } + override protected def jdbcUrl: String = getJdbcUrl }