This is an automated email from the ASF dual-hosted git repository.
chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git
The following commit(s) were added to refs/heads/master by this push:
new 10e3dec47 [KYUUBI #5374][FOLLOWUP] Fix JDBC ClickHouse TRowSet
Generator
10e3dec47 is described below
commit 10e3dec478eba0c790afa8a9a223c67941adf2dc
Author: senmiaoliu <[email protected]>
AuthorDate: Sun Apr 7 21:05:35 2024 +0800
[KYUUBI #5374][FOLLOWUP] Fix JDBC ClickHouse TRowSet Generator
# :mag: Description
## Issue References ๐
## Describe Your Solution ๐ง
Some data type like `UInt8` in ck can not cast to `short`, we should fix it
## Types of changes :bookmark:
- [x] Bugfix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
## Test Plan ๐งช
#### Behavior Without This Pull Request :coffin:
#### Behavior With This Pull Request :tada:
#### Related Unit Tests
---
# Checklist ๐
- [ ] This patch was not authored or co-authored using [Generative
Tooling](https://www.apache.org/legal/generative-tooling.html)
**Be nice. Be informative.**
Closes #6270 from lsm1/branch-fix-jdbc-ck-short.
Closes #5374
b5dac0f59 [senmiaoliu] ck fix RowSetGenerator
Authored-by: senmiaoliu <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
---
.../clickhouse/ClickHouseTRowSetGenerator.scala | 45 ++++++++++++++++++++++
.../jdbc/clickhouse/ClickHouseStatementSuite.scala | 22 +++++++++--
.../kyuubi/engine/result/TColumnGenerator.scala | 21 +++++++---
.../engine/result/TColumnValueGenerator.scala | 33 +++++++++++++---
4 files changed, 106 insertions(+), 15 deletions(-)
diff --git
a/externals/kyuubi-jdbc-engine/src/main/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseTRowSetGenerator.scala
b/externals/kyuubi-jdbc-engine/src/main/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseTRowSetGenerator.scala
index fd0e24e8f..ce1761fe9 100644
---
a/externals/kyuubi-jdbc-engine/src/main/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseTRowSetGenerator.scala
+++
b/externals/kyuubi-jdbc-engine/src/main/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseTRowSetGenerator.scala
@@ -16,6 +16,7 @@
*/
package org.apache.kyuubi.engine.jdbc.clickhouse
+import java.lang.{Long => JLong, Short => JShort}
import java.sql.Types.{ARRAY, OTHER}
import org.apache.kyuubi.engine.jdbc.schema.DefaultJdbcTRowSetGenerator
@@ -26,6 +27,39 @@ class ClickHouseTRowSetGenerator extends
DefaultJdbcTRowSetGenerator {
super.asByteTColumn(rows, ordinal)
}
+ override def toSmallIntTColumn(rows: Seq[Seq[_]], ordinal: Int): TColumn = {
+ val colHead = if (rows.isEmpty) None else rows.head(ordinal)
+ colHead match {
+ case _: JShort => super.toSmallIntTColumn(rows, ordinal)
+ case _ => super.asShortTColumn(
+ rows,
+ ordinal,
+ convertFunc = (row, ordinal) =>
JShort.valueOf(row(ordinal).toString))
+ }
+ }
+
+ override def toIntegerTColumn(rows: Seq[Seq[_]], ordinal: Int): TColumn = {
+ val colHead = if (rows.isEmpty) None else rows.head(ordinal)
+ colHead match {
+ case _: Integer => super.toIntegerTColumn(rows, ordinal)
+ case _ => super.asIntegerTColumn(
+ rows,
+ ordinal,
+ convertFunc = (row, ordinal) =>
Integer.valueOf(row(ordinal).toString))
+ }
+ }
+
+ override def toBigIntTColumn(rows: Seq[Seq[_]], ordinal: Int): TColumn = {
+ val colHead = if (rows.isEmpty) None else rows.head(ordinal)
+ colHead match {
+ case _: JLong => super.toBigIntTColumn(rows, ordinal)
+ case _ => super.asLongTColumn(
+ rows,
+ ordinal,
+ convertFunc = (row, ordinal) => JLong.valueOf(row(ordinal).toString))
+ }
+ }
+
override def toVarcharTColumn(rows: Seq[Seq[_]], ordinal: Int): TColumn = {
val colHead = if (rows.isEmpty) None else rows.head(ordinal)
colHead match {
@@ -39,6 +73,17 @@ class ClickHouseTRowSetGenerator extends
DefaultJdbcTRowSetGenerator {
super.asByteTColumnValue(row, ordinal)
}
+ override def toSmallIntTColumnValue(row: Seq[_], ordinal: Int): TColumnValue
= {
+ asShortTColumnValue(row, ordinal, rawValue =>
JShort.valueOf(rawValue.toString))
+ }
+
+ override def toIntegerTColumnValue(row: Seq[_], ordinal: Int): TColumnValue =
+ asIntegerTColumnValue(row, ordinal, rawValue =>
Integer.valueOf(rawValue.toString))
+
+ override def toBigIntTColumnValue(row: Seq[_], ordinal: Int): TColumnValue =
{
+ asLongTColumnValue(row, ordinal, rawValue =>
JLong.valueOf(rawValue.toString))
+ }
+
override def toHiveString(data: Any, sqlType: Int): String =
(data, sqlType) match {
case (array: Array[_], ARRAY) => arrayToString(array)
diff --git
a/externals/kyuubi-jdbc-engine/src/test/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseStatementSuite.scala
b/externals/kyuubi-jdbc-engine/src/test/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseStatementSuite.scala
index 303614910..6051893e5 100644
---
a/externals/kyuubi-jdbc-engine/src/test/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseStatementSuite.scala
+++
b/externals/kyuubi-jdbc-engine/src/test/scala/org/apache/kyuubi/engine/jdbc/clickhouse/ClickHouseStatementSuite.scala
@@ -64,17 +64,25 @@ class ClickHouseStatementSuite extends WithClickHouseEngine
with HiveJDBCTestHel
| boolean_col boolean,
| double_col double,
| float_col float,
- | x UUID)
+ | x UUID,
+ | ui8 UInt8,
+ | ui16 UInt16,
+ | ui32 UInt32,
+ | ui64 UInt64,
+ | ui128 UInt128,
+ | ui256 UInt256,
+ | i128 Int128,
+ | i256 Int256)
| ENGINE=File(TabSeparated)
|""".stripMargin)
statement.execute(
""" insert into db1.type_test
| (id, tiny_col, smallint_col, int_col, bigint_col, largeint_col,
decimal_col,
| date_col, datetime_col, char_col, varchar_col, string_col,
boolean_col,
- | double_col, float_col, x)
+ | double_col, float_col, x, ui8, ui16, ui32, ui64, ui128, ui256,
i128, i256)
| VALUES (1, 2, 3, 4, 5, 6, 7.7,
| '2022-05-08', '2022-05-08 17:47:45', 'a', 'Hello', 'Hello,
Kyuubi', true,
- | 8.8, 9.9, generateUUIDv4())
+ | 8.8, 9.9, generateUUIDv4(), 8, 16, 32, 64, 128, 256, -128, -256)
|""".stripMargin)
val resultSet1 = statement.executeQuery("select * from db1.type_test")
while (resultSet1.next()) {
@@ -94,6 +102,14 @@ class ClickHouseStatementSuite extends WithClickHouseEngine
with HiveJDBCTestHel
assert(resultSet1.getObject(14) == 8.8)
assert(resultSet1.getObject(15) == 9.9)
assert(resultSet1.getString(16).length == 36)
+ assert(resultSet1.getObject(17) == 8)
+ assert(resultSet1.getObject(18) == 16)
+ assert(resultSet1.getObject(19) == 32)
+ assert(resultSet1.getObject(20) == "64")
+ assert(resultSet1.getObject(21) == "128")
+ assert(resultSet1.getObject(22) == "256")
+ assert(resultSet1.getObject(23) == "-128")
+ assert(resultSet1.getObject(24) == "-256")
}
}
}
diff --git
a/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnGenerator.scala
b/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnGenerator.scala
index e2c8f1ea6..7d437fc61 100644
---
a/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnGenerator.scala
+++
b/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnGenerator.scala
@@ -62,18 +62,27 @@ trait TColumnGenerator[RowT] extends
TRowSetColumnGetter[RowT] {
TColumn.byteVal(new TByteColumn(values, nulls))
}
- def asShortTColumn(rows: Seq[RowT], ordinal: Int): TColumn = {
- val (values, nulls) = getColumnToList[JShort](rows, ordinal, 0.toShort)
+ def asShortTColumn(
+ rows: Seq[RowT],
+ ordinal: Int,
+ convertFunc: (RowT, Int) => JShort = null): TColumn = {
+ val (values, nulls) = getColumnToList[JShort](rows, ordinal, 0.toShort,
convertFunc)
TColumn.i16Val(new TI16Column(values, nulls))
}
- def asIntegerTColumn(rows: Seq[RowT], ordinal: Int): TColumn = {
- val (values, nulls) = getColumnToList[Integer](rows, ordinal, 0)
+ def asIntegerTColumn(
+ rows: Seq[RowT],
+ ordinal: Int,
+ convertFunc: (RowT, Int) => Integer = null): TColumn = {
+ val (values, nulls) = getColumnToList[Integer](rows, ordinal, 0,
convertFunc)
TColumn.i32Val(new TI32Column(values, nulls))
}
- def asLongTColumn(rows: Seq[RowT], ordinal: Int): TColumn = {
- val (values, nulls) = getColumnToList[JLong](rows, ordinal, 0.toLong)
+ def asLongTColumn(
+ rows: Seq[RowT],
+ ordinal: Int,
+ convertFunc: (RowT, Int) => JLong = null): TColumn = {
+ val (values, nulls) = getColumnToList[JLong](rows, ordinal, 0.toLong,
convertFunc)
TColumn.i64Val(new TI64Column(values, nulls))
}
diff --git
a/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnValueGenerator.scala
b/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnValueGenerator.scala
index 0ff3a250d..032a28a18 100644
---
a/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnValueGenerator.scala
+++
b/kyuubi-common/src/main/scala/org/apache/kyuubi/engine/result/TColumnValueGenerator.scala
@@ -39,26 +39,47 @@ trait TColumnValueGenerator[RowT] extends
TRowSetColumnGetter[RowT] {
TColumnValue.byteVal(tValue)
}
- def asShortTColumnValue(row: RowT, ordinal: Int): TColumnValue = {
+ def asShortTColumnValue(
+ row: RowT,
+ ordinal: Int,
+ convertFunc: Any => JShort = null): TColumnValue = {
val tValue = new TI16Value
if (!isColumnNullAt(row, ordinal)) {
- tValue.setValue(getColumnAs[JShort](row, ordinal))
+ val short = getColumnAs[JShort](row, ordinal) match {
+ case sObj: JShort => sObj
+ case obj if convertFunc != null => convertFunc(obj)
+ }
+ tValue.setValue(short)
}
TColumnValue.i16Val(tValue)
}
- def asIntegerTColumnValue(row: RowT, ordinal: Int): TColumnValue = {
+ def asIntegerTColumnValue(
+ row: RowT,
+ ordinal: Int,
+ convertFunc: Any => Integer = null): TColumnValue = {
val tValue = new TI32Value
if (!isColumnNullAt(row, ordinal)) {
- tValue.setValue(getColumnAs[Integer](row, ordinal))
+ val integer = getColumnAs[Integer](row, ordinal) match {
+ case iObj: Integer => iObj
+ case obj if convertFunc != null => convertFunc(obj)
+ }
+ tValue.setValue(integer)
}
TColumnValue.i32Val(tValue)
}
- def asLongTColumnValue(row: RowT, ordinal: Int): TColumnValue = {
+ def asLongTColumnValue(
+ row: RowT,
+ ordinal: Int,
+ convertFunc: Any => JLong = null): TColumnValue = {
val tValue = new TI64Value
if (!isColumnNullAt(row, ordinal)) {
- tValue.setValue(getColumnAs[JLong](row, ordinal))
+ val long = getColumnAs[JLong](row, ordinal) match {
+ case lObj: JLong => lObj
+ case obj if convertFunc != null => convertFunc(obj)
+ }
+ tValue.setValue(long)
}
TColumnValue.i64Val(tValue)
}