From a4de0e67f6fb90e2fb86253e89896a6df6831d56 Mon Sep 17 00:00:00 2001 From: Fu Chen Date: Wed, 19 Jan 2022 16:50:41 +0800 Subject: [PATCH] [KYUUBI #1784][FOLLOWUP][TRINO] Fix float types lose precision ### _Why are the changes needed?_ The end-to-end test case should be added after the Trino engine test framework has been refined. ### _How was this patch tested?_ - [ ] Add some test cases that check the changes thoroughly including negative and positive cases if possible - [ ] Add screenshots for manual tests if appropriate - [x] [Run test](https://kyuubi.readthedocs.io/en/latest/develop_tools/testing.html#running-tests) locally before make a pull request Closes #1802 from cfmcgrady/kyuubi-1784-trino. Closes #1784 8b19aafb [Fu Chen] fix Authored-by: Fu Chen Signed-off-by: Cheng Pan --- .../org/apache/kyuubi/engine/trino/schema/RowSet.scala | 7 +++++-- .../apache/kyuubi/engine/trino/schema/RowSetSuite.scala | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/schema/RowSet.scala b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/schema/RowSet.scala index 5fe4cd43a..7ae080c0b 100644 --- a/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/schema/RowSet.scala +++ b/externals/kyuubi-trino-engine/src/main/scala/org/apache/kyuubi/engine/trino/schema/RowSet.scala @@ -114,7 +114,7 @@ object RowSet { case REAL => 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 DOUBLE => @@ -200,7 +200,10 @@ object RowSet { case REAL => val tDoubleValue = new TDoubleValue - if (row(ordinal) != null) tDoubleValue.setValue(row(ordinal).asInstanceOf[Float]) + if (row(ordinal) != null) { + val doubleValue = java.lang.Double.valueOf(row(ordinal).asInstanceOf[Float].toString) + tDoubleValue.setValue(doubleValue) + } TColumnValue.doubleVal(tDoubleValue) case DOUBLE => diff --git a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/schema/RowSetSuite.scala b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/schema/RowSetSuite.scala index 99b1f0ca3..d6187bbf8 100644 --- a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/schema/RowSetSuite.scala +++ b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/schema/RowSetSuite.scala @@ -182,7 +182,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