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());

Reply via email to