This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/dev/pr-12574-d7e9931bea0976547e9730675e7019bbef88ad83 in repository https://gitbox.apache.org/repos/asf/seatunnel.git
commit 584a25a6e44ea443d8d5e78784dbf75556b2997c Author: Yiğitcan Öztürk <[email protected]> AuthorDate: Thu Oct 1 13:19:24 2026 +0000 [Improve][Connector-V2] Validate ClickHouse source host as nonblank (#12574) --- .../clickhouse/source/ClickhouseSourceFactory.java | 4 +- .../clickhouse/ClickhouseFactoryTest.java | 43 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceFactory.java b/seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceFactory.java index c420f760ec..16a371439b 100644 --- a/seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceFactory.java +++ b/seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceFactory.java @@ -20,6 +20,7 @@ package org.apache.seatunnel.connectors.seatunnel.clickhouse.source; import org.apache.seatunnel.shade.org.apache.commons.lang3.StringUtils; import org.apache.seatunnel.api.common.SeaTunnelAPIErrorCode; +import org.apache.seatunnel.api.configuration.util.Conditions; import org.apache.seatunnel.api.configuration.util.OptionRule; import org.apache.seatunnel.api.source.SeaTunnelSource; import org.apache.seatunnel.api.source.SourceSplit; @@ -239,7 +240,8 @@ public class ClickhouseSourceFactory implements TableSourceFactory { @Override public OptionRule optionRule() { return OptionRule.builder() - .required(HOST, USERNAME, PASSWORD) + .required(USERNAME, PASSWORD) + .required(HOST, Conditions.notBlank(HOST)) .optional( TABLE_PATH, CLICKHOUSE_CONFIG, diff --git a/seatunnel-connectors-v2/connector-clickhouse/src/test/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/ClickhouseFactoryTest.java b/seatunnel-connectors-v2/connector-clickhouse/src/test/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/ClickhouseFactoryTest.java index d193b53ea7..7d68a83add 100644 --- a/seatunnel-connectors-v2/connector-clickhouse/src/test/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/ClickhouseFactoryTest.java +++ b/seatunnel-connectors-v2/connector-clickhouse/src/test/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/ClickhouseFactoryTest.java @@ -17,6 +17,10 @@ package org.apache.seatunnel.connectors.seatunnel.clickhouse; +import org.apache.seatunnel.api.configuration.ReadonlyConfig; +import org.apache.seatunnel.api.configuration.util.ConfigValidator; +import org.apache.seatunnel.api.configuration.util.OptionValidationException; +import org.apache.seatunnel.connectors.seatunnel.clickhouse.config.ClickhouseBaseOptions; import org.apache.seatunnel.connectors.seatunnel.clickhouse.sink.client.ClickhouseSinkFactory; import org.apache.seatunnel.connectors.seatunnel.clickhouse.sink.file.ClickhouseFileSinkFactory; import org.apache.seatunnel.connectors.seatunnel.clickhouse.source.ClickhouseSourceFactory; @@ -24,8 +28,47 @@ import org.apache.seatunnel.connectors.seatunnel.clickhouse.source.ClickhouseSou import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.HashMap; +import java.util.Map; + public class ClickhouseFactoryTest { + private void validateSource(Map<String, Object> configMap) { + ClickhouseSourceFactory factory = new ClickhouseSourceFactory(); + ConfigValidator.of(ReadonlyConfig.fromMap(configMap)).validate(factory.optionRule()); + } + + private Map<String, Object> createValidSourceConfig() { + Map<String, Object> config = new HashMap<>(); + config.put(ClickhouseBaseOptions.HOST.key(), "localhost:8123"); + config.put(ClickhouseBaseOptions.USERNAME.key(), "default"); + config.put(ClickhouseBaseOptions.PASSWORD.key(), "password"); + return config; + } + + @Test + public void testSourceHostValidation() { + Map<String, Object> validConfig = createValidSourceConfig(); + Assertions.assertDoesNotThrow(() -> validateSource(validConfig)); + + Map<String, Object> missingHost = createValidSourceConfig(); + missingHost.remove(ClickhouseBaseOptions.HOST.key()); + Assertions.assertThrows(OptionValidationException.class, () -> validateSource(missingHost)); + + Map<String, Object> emptyHost = createValidSourceConfig(); + emptyHost.put(ClickhouseBaseOptions.HOST.key(), ""); + Assertions.assertThrows(OptionValidationException.class, () -> validateSource(emptyHost)); + + Map<String, Object> whitespaceHost = createValidSourceConfig(); + whitespaceHost.put(ClickhouseBaseOptions.HOST.key(), " "); + Assertions.assertThrows( + OptionValidationException.class, () -> validateSource(whitespaceHost)); + + Map<String, Object> paddedHost = createValidSourceConfig(); + paddedHost.put(ClickhouseBaseOptions.HOST.key(), " localhost:8123 "); + Assertions.assertDoesNotThrow(() -> validateSource(paddedHost)); + } + @Test public void testOptionRule() { Assertions.assertNotNull((new ClickhouseSourceFactory()).optionRule());
