From 3ad6a1d89f1ba1b5b177755694449536b5cabb08 Mon Sep 17 00:00:00 2001 From: codeDing18 Date: Tue, 1 Apr 2025 13:39:59 +0800 Subject: [PATCH] Add support for Bool type for ClickHouse connector --- docs/src/main/sphinx/connector/clickhouse.md | 9 +++++--- .../plugin/clickhouse/ClickHouseClient.java | 6 +++-- .../clickhouse/BaseClickHouseTypeMapping.java | 23 +++++++++++++++++++ .../TestClickHouseConnectorTest.java | 2 +- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/docs/src/main/sphinx/connector/clickhouse.md b/docs/src/main/sphinx/connector/clickhouse.md index 0a24166ca246..cc61de2150b2 100644 --- a/docs/src/main/sphinx/connector/clickhouse.md +++ b/docs/src/main/sphinx/connector/clickhouse.md @@ -183,9 +183,12 @@ to the following table: * - ClickHouse type - Trino type - Notes +* - `Bool` + - `BOOLEAN` + - * - `Int8` - `TINYINT` - - `TINYINT`, `BOOL`, `BOOLEAN`, and `INT1` are aliases of `Int8` + - `TINYINT` and `INT1` are aliases of `Int8` * - `Int16` - `SMALLINT` - `SMALLINT` and `INT2` are aliases of `Int16` @@ -262,11 +265,11 @@ to the following table: - ClickHouse type - Notes * - `BOOLEAN` - - `UInt8` + - `Bool` - * - `TINYINT` - `Int8` - - `TINYINT`, `BOOL`, `BOOLEAN`, and `INT1` are aliases of `Int8` + - `TINYINT` and `INT1` are aliases of `Int8` * - `SMALLINT` - `Int16` - `SMALLINT` and `INT2` are aliases of `Int16` diff --git a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java index e3bf999c3043..c2846855257d 100644 --- a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java +++ b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java @@ -137,6 +137,7 @@ import static io.trino.plugin.jdbc.PredicatePushdownController.FULL_PUSHDOWN; import static io.trino.plugin.jdbc.StandardColumnMappings.bigintColumnMapping; import static io.trino.plugin.jdbc.StandardColumnMappings.bigintWriteFunction; +import static io.trino.plugin.jdbc.StandardColumnMappings.booleanColumnMapping; import static io.trino.plugin.jdbc.StandardColumnMappings.booleanWriteFunction; import static io.trino.plugin.jdbc.StandardColumnMappings.dateReadFunctionUsingLocalDate; import static io.trino.plugin.jdbc.StandardColumnMappings.decimalColumnMapping; @@ -638,6 +639,8 @@ public Optional toColumnMapping(ConnectorSession session, Connect ClickHouseColumn column = ClickHouseColumn.of("", jdbcTypeName); ClickHouseDataType columnDataType = column.getDataType(); switch (columnDataType) { + case Bool: + return Optional.of(booleanColumnMapping()); case UInt8: return Optional.of(ColumnMapping.longMapping(SMALLINT, ResultSet::getShort, uInt8WriteFunction(getClickHouseServerVersion(session)))); case UInt16: @@ -757,8 +760,7 @@ public Optional toColumnMapping(ConnectorSession session, Connect public WriteMapping toWriteMapping(ConnectorSession session, Type type) { if (type == BOOLEAN) { - // ClickHouse is no separate type for boolean values. Use UInt8 type, restricted to the values 0 or 1. - return WriteMapping.booleanMapping("UInt8", booleanWriteFunction()); + return WriteMapping.booleanMapping("Bool", booleanWriteFunction()); } if (type == TINYINT) { return WriteMapping.longMapping("Int8", tinyintWriteFunction()); diff --git a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/BaseClickHouseTypeMapping.java b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/BaseClickHouseTypeMapping.java index 1a7b8eb4089d..a37c61dd7404 100644 --- a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/BaseClickHouseTypeMapping.java +++ b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/BaseClickHouseTypeMapping.java @@ -43,6 +43,7 @@ import static io.trino.plugin.jdbc.TypeHandlingJdbcSessionProperties.UNSUPPORTED_TYPE_HANDLING; import static io.trino.plugin.jdbc.UnsupportedTypeHandling.CONVERT_TO_VARCHAR; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DateType.DATE; import static io.trino.spi.type.DecimalType.createDecimalType; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -106,6 +107,28 @@ private static void checkIsDoubled(ZoneId zone, LocalDateTime dateTime) verify(zone.getRules().getValidOffsets(dateTime).size() == 2, "Expected %s to be doubled in %s", dateTime, zone); } + @Test + public void testTrinoBoolean() + { + SqlDataTypeTest.create() + .addRoundTrip("boolean", "true", BOOLEAN, "true") + .addRoundTrip("boolean", "false", BOOLEAN, "false") + .addRoundTrip("boolean", "NULL", BOOLEAN, "CAST(NULL AS BOOLEAN)") + .execute(getQueryRunner(), trinoCreateAsSelect("test_boolean")) + .execute(getQueryRunner(), trinoCreateAndInsert("test_boolean")); + } + + @Test + public void testBool() + { + SqlDataTypeTest.create() + .addRoundTrip("bool", "true", BOOLEAN, "true") + .addRoundTrip("bool", "false", BOOLEAN, "false") + .addRoundTrip("Nullable(bool)", "NULL", BOOLEAN, "CAST(NULL AS BOOLEAN)") + .execute(getQueryRunner(), clickhouseCreateAndInsert("tpch.test_boolean")) + .execute(getQueryRunner(), clickhouseCreateAndTrinoInsert("tpch.test_boolean")); + } + @Test public void testTinyint() { diff --git a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorTest.java b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorTest.java index 16712d363489..546bbe0a2175 100644 --- a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorTest.java +++ b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorTest.java @@ -486,7 +486,7 @@ public void testTableProperty() .isEqualTo(format("" + "CREATE TABLE clickhouse.tpch.%s (\n" + " id integer NOT NULL,\n" + - " x smallint NOT NULL,\n" + + " x boolean NOT NULL,\n" + " y varchar NOT NULL\n" + ")\n" + "WITH (\n" +