clickhouse-java
clickhouse-java copied to clipboard
Converting [com.clickhouse.jdbc.ClickHouseArray] to [float[]] is not supported
Describe the bug
Trying to insert a float array to a nested structure.
NOTE: Works with driver 'com.github.housepower:clickhouse-native-jdbc:2.6.5' Doesn't work with 'com.clickhouse:clickhouse-jdbc:0.4.6'
Code example
job Nested(
task LowCardinality(String),
factor Array(LowCardinality(String)),
workload Array(Float32), <-- fails to insert here
num Array(UInt16)
)
Insert query example:
INSERT INTO complexity_nested (job.task,job.factor,job.workload,job.num) VALUES (?,?,?,?);
A structure to insert
data class TaskFactor(
val task: String,
val factor: String,
val complexity: BigDecimal,
val num: Int = 0
)
Batch code (example):
conn.prepareStatement(INSERT_WORKLOAD).use { stmt ->
// ... forEach {
val byTask = load.flatMap { it.load }.groupByTo(sortedMapOf()) { it.task }
stmt.setArray(1, conn.createArrayOf("String", byTask.keys.toTypedArray()))
val factors = byTask.values.map { taskFactors ->
conn.createArrayOf("String", taskFactors.map { it.factor }.toTypedArray())
}
stmt.setArray(2, conn.createArrayOf("Array(String)", factors.toTypedArray()))
val complexity = byTask.values.map { taskFactors ->
conn.createArrayOf("Float32", taskFactors.map { it.complexity }.toTypedArray())
}
stmt.setArray(3, conn.createArrayOf("Array(Float32)", complexity.toTypedArray()))
val num = byTask.values.map { taskFactors ->
conn.createArrayOf("UInt16", taskFactors.map { it.num }.toTypedArray())
}
stmt.setArray(4, conn.createArrayOf("Array(UInt16)", num.toTypedArray()))
stmt.addBatch()
}
Error log
java.lang.UnsupportedOperationException: Converting [com.clickhouse.jdbc.ClickHouseArray] to [float[]] is not supported
at com.clickhouse.data.ClickHouseValue.newUnsupportedException(ClickHouseValue.java:50)
at com.clickhouse.data.value.array.ClickHouseFloatArrayValue.updateUnknown(ClickHouseFloatArrayValue.java:466)
at com.clickhouse.data.ClickHouseValue.update(ClickHouseValue.java:1244)
at com.clickhouse.data.value.ClickHouseObjectValue.update(ClickHouseObjectValue.java:135)
at com.clickhouse.data.value.array.ClickHouseFloatArrayValue.update(ClickHouseFloatArrayValue.java:475)
at com.clickhouse.data.value.array.ClickHouseFloatArrayValue.update(ClickHouseFloatArrayValue.java:30)
at com.clickhouse.data.value.ClickHouseArrayValue.getValue(ClickHouseArrayValue.java:591)
at com.clickhouse.data.format.BinaryDataProcessor$ArraySerializer.serialize(BinaryDataProcessor.java:106)
at com.clickhouse.data.ClickHouseDataProcessor.write(ClickHouseDataProcessor.java:593)
Environment
- Client version: 0.4.6
- ClickHouse Server version: 23.3.8.21
@xRomZak, it's slow to use Connection.createArrayOf() and it seems it's still buggy. Could you set float[] using PreparedStatement.setObject() instead?
Fixed in the latest version of driver.
Please use Connection.createArrayOf() and java.sql.Connection#createStruct