Skip to content

Commit df5c4ae

Browse files
authored
Merge pull request #2028 from ClickHouse/add-enum-string-v2
Enum Code + Test
2 parents 1186ae3 + d0587b4 commit df5c4ae

File tree

4 files changed

+47
-14
lines changed

4 files changed

+47
-14
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.clickhouse.client.api.query.POJOSetter;
1111
import com.clickhouse.client.api.query.QuerySettings;
1212
import com.clickhouse.data.ClickHouseColumn;
13+
import com.clickhouse.data.ClickHouseDataType;
14+
import com.clickhouse.data.ClickHouseEnum;
1315
import com.clickhouse.data.value.ClickHouseBitmap;
1416
import com.clickhouse.data.value.ClickHouseGeoMultiPolygonValue;
1517
import com.clickhouse.data.value.ClickHouseGeoPointValue;
@@ -251,6 +253,8 @@ protected void setSchema(TableSchema schema) {
251253
case Decimal256:
252254
case Bool:
253255
case String:
256+
case Enum8:
257+
case Enum16:
254258
this.convertions[i] = NumberConverter.NUMBER_CONVERTERS;
255259
break;
256260
default:
@@ -275,20 +279,19 @@ public String getString(String colName) {
275279
return null;
276280
} else if (value instanceof String) {
277281
return (String) value;
282+
} else {
283+
ClickHouseDataType dataType = schema.getColumnByName(colName).getDataType();
284+
if (dataType == ClickHouseDataType.Enum8 || dataType == ClickHouseDataType.Enum16) {
285+
ClickHouseEnum clickHouseEnum = schema.getColumnByName(colName).getEnumConstants();
286+
return clickHouseEnum.name(Integer.parseInt(value.toString()));
287+
}
278288
}
279289
return value.toString();
280290
}
281291

282292
@Override
283293
public String getString(int index) {
284-
// TODO: it may be incorrect to call .toString() on some objects
285-
Object value = readValue(index);
286-
if (value == null) {
287-
return null;
288-
} else if (value instanceof String) {
289-
return (String) value;
290-
}
291-
return value.toString();
294+
return getString(schema.columnIndexToName(index));
292295
}
293296

294297
private <T> T readNumberValue(String colName, NumberConverter.NumberType targetType) {

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,6 +1958,31 @@ public void testReadingSimpleAggregateFunction() throws Exception {
19581958
}
19591959
}
19601960

1961+
@Test(groups = {"integration"})
1962+
public void testReadingEnumsAsStrings() throws Exception {
1963+
final String tableName = "enums_as_strings_test_table";
1964+
client.execute("DROP TABLE IF EXISTS " + tableName).get();
1965+
client.execute("CREATE TABLE `" + tableName + "` " +
1966+
"(idx UInt8, enum1 Enum8('a' = 1, 'b' = 2, 'c' = 3), enum2 Enum16('atch' = 1, 'batch' = 2, 'catch' = 3)) " +
1967+
"ENGINE Memory").get();
1968+
1969+
try (InsertResponse response = client.insert(tableName, new ByteArrayInputStream("1\ta\t2".getBytes(StandardCharsets.UTF_8)), ClickHouseFormat.TSV).get(30, TimeUnit.SECONDS)) {
1970+
Assert.assertEquals(response.getWrittenRows(), 1);
1971+
}
1972+
1973+
try (QueryResponse queryResponse = client.query("SELECT * FROM " + tableName + " LIMIT 1").get(30, TimeUnit.SECONDS)) {
1974+
ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(queryResponse);
1975+
Assert.assertNotNull(reader.next());
1976+
Assert.assertEquals(reader.getByte("idx"), Byte.valueOf("1"));
1977+
Assert.assertEquals(reader.getString("enum1"), "a");
1978+
Assert.assertEquals(reader.getShort("enum1"), 1);
1979+
Assert.assertEquals(reader.getInteger("enum1"), 1);
1980+
Assert.assertEquals(reader.getString("enum2"), "batch");
1981+
Assert.assertEquals(reader.getShort("enum2"), 2);
1982+
Assert.assertEquals(reader.getInteger("enum2"), 2);
1983+
Assert.assertFalse(reader.hasNext());
1984+
}
1985+
}
19611986

19621987
@Test(groups = {"integration"})
19631988
public void testServerTimezone() throws Exception {

jdbc-v2/src/main/java/com/clickhouse/jdbc/PreparedStatementImpl.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,8 @@ public long executeLargeUpdate() throws SQLException {
457457
}
458458

459459
private static String encodeObject(Object x) throws SQLException {
460+
LOG.trace("Encoding object: {}", x);
461+
460462
try {
461463
if (x == null) {
462464
return "NULL";
@@ -500,14 +502,14 @@ private static String encodeObject(Object x) throws SQLException {
500502
listString.append("]");
501503

502504
return listString.toString();
503-
} else if (x instanceof Map) {
504-
Map<?, ?> tmpMap = (Map<?, ?>) x;
505+
} else if (x instanceof Map<?, ?> tmpMap) {
505506
StringBuilder mapString = new StringBuilder();
506507
mapString.append("{");
507508
for (Object key : tmpMap.keySet()) {
508509
mapString.append(encodeObject(key)).append(": ").append(encodeObject(tmpMap.get(key))).append(", ");
509510
}
510-
mapString.delete(mapString.length() - 2, mapString.length());
511+
if (!tmpMap.isEmpty())
512+
mapString.delete(mapString.length() - 2, mapString.length());
511513
mapString.append("}");
512514

513515
return mapString.toString();

jdbc-v2/src/test/java/com/clickhouse/jdbc/DataTypeTests.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,12 @@ public void testStringTypes() throws SQLException {
354354
assertTrue(rs.next());
355355
assertEquals(rs.getString("str"), str);
356356
assertEquals(rs.getString("fixed"), fixed);
357-
assertEquals(rs.getString("enum"), "6");
358-
assertEquals(rs.getString("enum8"), "1");
359-
assertEquals(rs.getString("enum16"), "2");
357+
assertEquals(rs.getString("enum"), "a");
358+
assertEquals(rs.getInt("enum"), 6);
359+
assertEquals(rs.getString("enum8"), "a");
360+
assertEquals(rs.getInt("enum8"), 1);
361+
assertEquals(rs.getString("enum16"), "b");
362+
assertEquals(rs.getInt("enum16"), 2);
360363
assertEquals(rs.getString("uuid"), uuid);
361364
assertEquals(rs.getString("ipv4"), "/" + ipv4);
362365
assertEquals(rs.getString("ipv6"), "/" + ipv6);

0 commit comments

Comments
 (0)