@@ -261,15 +261,21 @@ public static Object convert(Object value, Class<?> type, ClickHouseColumn colum
261261 } else if (type == java .sql .Time .class && value instanceof TemporalAccessor ) {
262262 return java .sql .Time .valueOf (LocalTime .from ((TemporalAccessor ) value ));
263263 } else if (type == java .sql .Array .class && value instanceof BinaryStreamReader .ArrayValue ) {//It's cleaner to use getList but this handles the more generic getObject
264+ BinaryStreamReader .ArrayValue arrayValue = (BinaryStreamReader .ArrayValue ) value ;
264265 if (column != null && column .getArrayBaseColumn () != null ) {
265- return new Array (convertList (((BinaryStreamReader .ArrayValue ) value ).asList (), JdbcUtils .convertToJavaClass (column .getArrayBaseColumn ().getDataType ())), "Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber ());
266+ ClickHouseDataType baseType = column .getArrayBaseColumn ().getDataType ();
267+ Object [] convertedValues = convertArray (arrayValue .getArrayOfObjects (),
268+ JdbcUtils .convertToJavaClass (column .getArrayBaseColumn ().getDataType ()));
269+ return new Array (baseType .getName (), baseType .getVendorTypeNumber (), convertedValues );
266270 }
267- return new Array ((( BinaryStreamReader . ArrayValue ) value ). asList (), "Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber ());
271+ return new Array ("Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber (), arrayValue . getArrayOfObjects ());
268272 } else if (type == java .sql .Array .class && value instanceof List <?>) {
269273 if (column != null && column .getArrayBaseColumn () != null ) {
270- return new Array (convertList (((List ) value ), JdbcUtils .convertToJavaClass (column .getArrayBaseColumn ().getDataType ())), "Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber ());
274+ ClickHouseDataType baseType = column .getArrayBaseColumn ().getDataType ();
275+ return new Array (baseType .getName (), JdbcUtils .CLICKHOUSE_TO_SQL_TYPE_MAP .getOrDefault (baseType , JDBCType .OTHER ).getVendorTypeNumber (), convertList ((List <?>) value , JdbcUtils .convertToJavaClass (column .getArrayBaseColumn ().getDataType ())) );
271276 }
272- return new Array ((List ) value , "Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber ());
277+ // base type is unknown. all objects should be converted
278+ return new Array ("Object" , JDBCType .JAVA_OBJECT .getVendorTypeNumber (), ((List <?>) value ).toArray ());
273279 } else if (type == Inet4Address .class && value instanceof Inet6Address ) {
274280 // Convert Inet6Address to Inet4Address
275281 return Inet4Address .getByName (value .toString ());
@@ -286,14 +292,25 @@ public static Object convert(Object value, Class<?> type, ClickHouseColumn colum
286292 throw new SQLException ("Unsupported conversion from " + value .getClass ().getName () + " to " + type .getName (), ExceptionUtils .SQL_STATE_DATA_EXCEPTION );
287293 }
288294
289- public static List <Object > convertList (List <Object > values , Class <?> type ) throws SQLException {
295+ public static Object [] convertList (List <?> values , Class <?> type ) throws SQLException {
296+ if (values == null ) {
297+ return null ;
298+ }
299+
300+ Object [] convertedValues = new Object [values .size ()];
301+ for (int i = 0 ; i < values .size (); i ++) {
302+ convertedValues [i ] = convert (values .get (i ), type );
303+ }
304+ return convertedValues ;
305+ }
306+
307+ public static Object [] convertArray (Object [] values , Class <?> type ) throws SQLException {
290308 if (values == null || type == null ) {
291309 return values ;
292310 }
293-
294- List <Object > convertedValues = new ArrayList <>(values .size ());
295- for (Object value : values ) {
296- convertedValues .add (convert (value , type ));
311+ Object [] convertedValues = new Object [values .length ];
312+ for (int i = 0 ; i < values .length ; i ++) {
313+ convertedValues [i ] = convert (values [i ], type );
297314 }
298315 return convertedValues ;
299316 }
0 commit comments