diff --git a/docs/src/main/sphinx/connector/clickhouse.rst b/docs/src/main/sphinx/connector/clickhouse.rst index 8fd9e1dbc6fe..75a56de728a3 100644 --- a/docs/src/main/sphinx/connector/clickhouse.rst +++ b/docs/src/main/sphinx/connector/clickhouse.rst @@ -12,7 +12,7 @@ Requirements To connect to a ClickHouse server, you need: -* ClickHouse (version 20.8 or higher) or Altinity (version 20.3 or higher). +* ClickHouse (version 21.3 or higher) or Altinity (version 20.3 or higher). * Network access from the Trino coordinator and workers to the ClickHouse server. Port 8123 is the default port. diff --git a/plugin/trino-clickhouse/pom.xml b/plugin/trino-clickhouse/pom.xml index d29125cb94a8..d24f8a46fa32 100644 --- a/plugin/trino-clickhouse/pom.xml +++ b/plugin/trino-clickhouse/pom.xml @@ -23,11 +23,6 @@ trino-base-jdbc - - io.trino - trino-matching - - io.trino trino-plugin-toolkit 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 ccee07d51af4..7ab40471d762 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 @@ -162,7 +162,6 @@ public ClickHouseClient( .add(new ImplementMinMax(false)) // TODO: Revisit once https://github.com/trinodb/trino/issues/7100 is resolved .add(new ImplementSum(ClickHouseClient::toTypeHandle)) .add(new ImplementAvgFloatingPoint()) - .add(new ImplementAvgDecimal()) .add(new ImplementAvgBigint()) .build()); } diff --git a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ImplementAvgDecimal.java b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ImplementAvgDecimal.java deleted file mode 100644 index 4f16368a47da..000000000000 --- a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ImplementAvgDecimal.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.trino.plugin.clickhouse; - -import io.trino.matching.Capture; -import io.trino.matching.Captures; -import io.trino.matching.Pattern; -import io.trino.plugin.base.expression.AggregateFunctionRule; -import io.trino.plugin.jdbc.JdbcColumnHandle; -import io.trino.plugin.jdbc.JdbcExpression; -import io.trino.spi.connector.AggregateFunction; -import io.trino.spi.expression.Variable; -import io.trino.spi.type.DecimalType; - -import java.util.Optional; - -import static com.google.common.base.Verify.verify; -import static io.trino.matching.Capture.newCapture; -import static io.trino.plugin.base.expression.AggregateFunctionPatterns.basicAggregation; -import static io.trino.plugin.base.expression.AggregateFunctionPatterns.expressionType; -import static io.trino.plugin.base.expression.AggregateFunctionPatterns.functionName; -import static io.trino.plugin.base.expression.AggregateFunctionPatterns.singleInput; -import static io.trino.plugin.base.expression.AggregateFunctionPatterns.variable; -import static io.trino.plugin.clickhouse.ClickHouseClient.CLICKHOUSE_MAX_DECIMAL_PRECISION; -import static java.lang.String.format; - -/** - * Implements {@code avg(decimal(p, s)} - */ -public class ImplementAvgDecimal - implements AggregateFunctionRule -{ - private static final Capture INPUT = newCapture(); - - @Override - public Pattern getPattern() - { - return basicAggregation() - .with(functionName().equalTo("avg")) - .with(singleInput().matching( - variable() - .with(expressionType().matching(DecimalType.class::isInstance)) - .capturedAs(INPUT))); - } - - @Override - public Optional rewrite(AggregateFunction aggregateFunction, Captures captures, RewriteContext context) - { - Variable input = captures.get(INPUT); - JdbcColumnHandle columnHandle = (JdbcColumnHandle) context.getAssignment(input.getName()); - DecimalType type = (DecimalType) columnHandle.getColumnType(); - verify(aggregateFunction.getOutputType().equals(type)); - - // When decimal type has maximum precision we can get result that does not match Trino avg semantics. - if (type.getPrecision() == CLICKHOUSE_MAX_DECIMAL_PRECISION) { - return Optional.of(new JdbcExpression( - format("avg(CAST(%s AS decimal(%s, %s)))", context.getIdentifierQuote().apply(columnHandle.getColumnName()), type.getPrecision(), type.getScale()), - columnHandle.getJdbcTypeHandle())); - } - - // ClickHouse avg function rounds down resulting decimal. - // To match Trino avg semantics, we extend scale by 1 and round result to target scale. - return Optional.of(new JdbcExpression( - format("round(avg(CAST(%s AS decimal(%s, %s))), %s)", context.getIdentifierQuote().apply(columnHandle.getColumnName()), type.getPrecision() + 1, type.getScale() + 1, type.getScale()), - columnHandle.getJdbcTypeHandle())); - } -} diff --git a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorSmokeTest.java b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorSmokeTest.java index c9dd65178074..a7a53239ca35 100644 --- a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorSmokeTest.java +++ b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestClickHouseConnectorSmokeTest.java @@ -17,8 +17,6 @@ import io.trino.testing.QueryRunner; import static io.trino.plugin.clickhouse.ClickHouseQueryRunner.createClickHouseQueryRunner; -import static io.trino.testing.sql.TestTable.randomTableSuffix; -import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestClickHouseConnectorSmokeTest extends BaseClickHouseConnectorSmokeTest @@ -38,22 +36,4 @@ protected QueryRunner createQueryRunner() .buildOrThrow(), REQUIRED_TPCH_TABLES); } - - @Override - public void testRenameSchema() - { - // Override because the default database engine in version < v20.10.2.20-stable doesn't allow renaming schemas - assertThatThrownBy(super::testRenameSchema) - .hasMessageMatching("ClickHouse exception, code: 48,.* Ordinary: RENAME DATABASE is not supported .*\\n"); - - String schemaName = "test_rename_schema_" + randomTableSuffix(); - try { - clickHouseServer.execute("CREATE DATABASE " + schemaName + " ENGINE = Atomic"); - assertUpdate("ALTER SCHEMA " + schemaName + " RENAME TO " + schemaName + "_renamed"); - } - finally { - assertUpdate("DROP SCHEMA IF EXISTS " + schemaName); - assertUpdate("DROP SCHEMA IF EXISTS " + schemaName + "_renamed"); - } - } } 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 51a28ebd1f32..db5fc48fd677 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 @@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.plugin.jdbc.BaseJdbcConnectorTest; +import io.trino.sql.planner.plan.AggregationNode; import io.trino.testing.MaterializedResult; import io.trino.testing.QueryRunner; import io.trino.testing.TestingConnectorBehavior; @@ -98,25 +99,6 @@ public void testColumnName(String columnName) throw new SkipException("TODO: test not implemented yet"); } - @Test - @Override - public void testRenameSchema() - { - // Override because the default database engine in version < v20.10.2.20-stable doesn't allow renaming schemas - assertThatThrownBy(super::testRenameSchema) - .hasMessageMatching("ClickHouse exception, code: 48,.* Ordinary: RENAME DATABASE is not supported .*\\n"); - - String schemaName = "test_rename_schema_" + randomTableSuffix(); - try { - onRemoteDatabase().execute("CREATE DATABASE " + schemaName + " ENGINE = Atomic"); - assertUpdate("ALTER SCHEMA " + schemaName + " RENAME TO " + schemaName + "_renamed"); - } - finally { - assertUpdate("DROP SCHEMA IF EXISTS " + schemaName); - assertUpdate("DROP SCHEMA IF EXISTS " + schemaName + "_renamed"); - } - } - @Override public void testRenameColumn() { @@ -432,7 +414,8 @@ public void testNumericAggregationPushdown() assertThat(query("SELECT min(short_decimal), min(long_decimal), min(a_bigint), min(t_double) FROM " + testTable.getName())).isFullyPushedDown(); assertThat(query("SELECT max(short_decimal), max(long_decimal), max(a_bigint), max(t_double) FROM " + testTable.getName())).isFullyPushedDown(); assertThat(query("SELECT sum(short_decimal), sum(long_decimal), sum(a_bigint), sum(t_double) FROM " + testTable.getName())).isFullyPushedDown(); - assertThat(query("SELECT avg(short_decimal), avg(long_decimal), avg(a_bigint), avg(t_double) FROM " + testTable.getName())).isFullyPushedDown(); + assertThat(query("SELECT avg(a_bigint), avg(t_double) FROM " + testTable.getName())).isFullyPushedDown(); + assertThat(query("SELECT avg(short_decimal), avg(long_decimal) FROM " + testTable.getName())).isNotFullyPushedDown(AggregationNode.class); } } diff --git a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestingClickHouseServer.java b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestingClickHouseServer.java index 9e99edeb3234..b4b053ae8c7d 100644 --- a/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestingClickHouseServer.java +++ b/plugin/trino-clickhouse/src/test/java/io/trino/plugin/clickhouse/TestingClickHouseServer.java @@ -30,7 +30,7 @@ public class TestingClickHouseServer { private static final DockerImageName CLICKHOUSE_IMAGE = DockerImageName.parse("yandex/clickhouse-server"); public static final DockerImageName CLICKHOUSE_LATEST_IMAGE = CLICKHOUSE_IMAGE.withTag("21.11.10.1"); - public static final DockerImageName CLICKHOUSE_DEFAULT_IMAGE = CLICKHOUSE_IMAGE.withTag("20.8"); + public static final DockerImageName CLICKHOUSE_DEFAULT_IMAGE = CLICKHOUSE_IMAGE.withTag("21.3.2.5"); // EOL is 30 Mar 2022 // Altinity Stable Builds Life-Cycle Table https://docs.altinity.com/altinitystablebuilds/#altinity-stable-builds-life-cycle-table private static final DockerImageName ALTINITY_IMAGE = DockerImageName.parse("altinity/clickhouse-server").asCompatibleSubstituteFor("yandex/clickhouse-server");