Skip to content

Commit e78db38

Browse files
committed
fixed converter for dynamic types and make tool to enquote lists
1 parent 0b5dddb commit e78db38

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

client-v2/src/main/java/com/clickhouse/client/api/internal/DataTypeConverter.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.clickhouse.data.ClickHouseColumn;
77
import com.clickhouse.data.ClickHouseDataType;
88

9+
import java.io.IOException;
910
import java.net.InetAddress;
1011
import java.time.Instant;
1112
import java.time.LocalDate;
@@ -202,6 +203,11 @@ public String arrayToString(Object value, ClickHouseColumn column) {
202203
return value.toString();
203204
}
204205

206+
public String arrayToString(Object value, String columnDef) {
207+
ClickHouseColumn column = ClickHouseColumn.of("v", columnDef);
208+
return arrayToString(value, column);
209+
}
210+
205211
/**
206212
*
207213
* @param value not null object value to convert
@@ -215,6 +221,18 @@ public String variantOrDynamicToString(Object value, ClickHouseColumn column) {
215221
return value.toString();
216222
}
217223

224+
private static void appendEnquotedArrayElement(String value, ClickHouseColumn elementColumn, Appendable appendable) {
225+
try {
226+
if (elementColumn != null && elementColumn.getDataType() == ClickHouseDataType.String) {
227+
appendable.append(QUOTE).append(value).append(QUOTE);
228+
} else {
229+
appendable.append(value);
230+
}
231+
} catch (IOException e) {
232+
throw new ClickHouseException(e.getMessage(), e);
233+
}
234+
}
235+
218236
private final class ArrayAsStringWriter extends BaseCollectionConverter.BaseArrayWriter {
219237
private ClickHouseColumn column;
220238

@@ -233,16 +251,9 @@ protected void onItem(Object item, ListConversionState<Object> state) {
233251
append(NULL);
234252
return;
235253
}
236-
String str = DataTypeConverter.this.convertToString(item, column.getArrayBaseColumn() == null ? column : column.getArrayBaseColumn());
237-
try {
238-
if (column.getArrayBaseColumn().getDataType() == ClickHouseDataType.String) {
239-
appendable.append(QUOTE).append(str).append(QUOTE);
240-
} else {
241-
appendable.append(str);
242-
}
243-
} catch (Exception ex) {
244-
throw new ClickHouseException(ex.getMessage(), ex);
245-
}
254+
ClickHouseColumn elementColumn = column.getArrayBaseColumn() == null ? column : column.getArrayBaseColumn();
255+
String str = DataTypeConverter.this.convertToString(item, elementColumn);
256+
appendEnquotedArrayElement(str, elementColumn, appendable);
246257
}
247258

248259
public String convertAndReset(Object list, Appendable acc, ClickHouseColumn column) {
@@ -270,7 +281,10 @@ protected void onItem(Object item, ListConversionState<List<?>> state) {
270281
append(NULL);
271282
return;
272283
}
273-
append(DataTypeConverter.this.convertToString(item, column.getArrayBaseColumn() == null ? column : column.getArrayBaseColumn()));
284+
ClickHouseColumn elementColumn = column.getArrayBaseColumn() == null ? column : column.getArrayBaseColumn();
285+
String str = DataTypeConverter.this.convertToString(item, elementColumn);
286+
appendEnquotedArrayElement(str, elementColumn, appendable);
287+
274288
}
275289

276290
public String convertAndReset(List<?> list, Appendable acc, ClickHouseColumn column) {

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.clickhouse.client.api.enums.Protocol;
1717
import com.clickhouse.client.api.insert.InsertResponse;
1818
import com.clickhouse.client.api.insert.InsertSettings;
19+
import com.clickhouse.client.api.internal.DataTypeConverter;
1920
import com.clickhouse.client.api.internal.ServerSettings;
2021
import com.clickhouse.client.api.internal.StopWatch;
2122
import com.clickhouse.client.api.metadata.TableSchema;
@@ -1634,6 +1635,20 @@ public void testQueryParams() throws Exception {
16341635
Assert.assertEquals(allRecords.size(), 2);
16351636
}
16361637

1638+
@Test(groups = {"integration"})
1639+
public void testQueryParamsWithArrays() {
1640+
final Map<String, Object> params = new HashMap<>();
1641+
params.put("database_name", "system");
1642+
params.put("table_names",
1643+
DataTypeConverter.INSTANCE.arrayToString(Arrays.asList("COLLATIONS", "ENGINES"), "Array(String)"));
1644+
// This query should not throw an exception
1645+
List<GenericRecord> records = client.queryAll("SELECT database, name FROM system.tables WHERE name IN {table_names:Array(String)}",
1646+
params);
1647+
1648+
Assert.assertEquals(records.get(0).getString("name"), "COLLATIONS");
1649+
Assert.assertEquals(records.get(1).getString("name"), "ENGINES");
1650+
}
1651+
16371652
@Test(groups = {"integration"})
16381653
public void testExecuteQueryParam() throws ExecutionException, InterruptedException, TimeoutException {
16391654

0 commit comments

Comments
 (0)