This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 584a25a6e4 [Improve][Connector-V2] Validate ClickHouse source host as
nonblank (#12574)
584a25a6e4 is described below
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());