clickhouse-java icon indicating copy to clipboard operation
clickhouse-java copied to clipboard

Converting [com.clickhouse.jdbc.ClickHouseArray] to [float[]] is not supported

Open xRomZak opened this issue 2 years ago • 1 comments

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 avatar Jul 26 '23 12:07 xRomZak

@xRomZak, it's slow to use Connection.createArrayOf() and it seems it's still buggy. Could you set float[] using PreparedStatement.setObject() instead?

zhicwu avatar Aug 15 '23 01:08 zhicwu

Fixed in the latest version of driver. Please use Connection.createArrayOf() and java.sql.Connection#createStruct

chernser avatar Nov 14 '25 22:11 chernser