This is an automated email from the ASF dual-hosted git repository.

davidzollo 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 4a65e98add [Improve][Connector-V2] Validate Databend JDBC URL (#11831)
4a65e98add is described below

commit 4a65e98add57ead347f0bf1289b45f057d73ac18
Author: BobSong <[email protected]>
AuthorDate: Tue Aug 18 11:32:38 2026 +0800

    [Improve][Connector-V2] Validate Databend JDBC URL (#11831)
---
 .../databend/source/DatabendSourceFactory.java     | 10 +++-----
 .../seatunnel/databend/DatabendFactoryTest.java    | 30 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git 
a/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/source/DatabendSourceFactory.java
 
b/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/source/DatabendSourceFactory.java
index 87d2e7273e..b7dd081629 100644
--- 
a/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/source/DatabendSourceFactory.java
+++ 
b/seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/source/DatabendSourceFactory.java
@@ -39,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
 
 import java.util.Collections;
 
+import static 
org.apache.seatunnel.api.configuration.util.Conditions.startsWith;
 import static 
org.apache.seatunnel.connectors.seatunnel.databend.config.DatabendOptions.DATABASE;
 
 /** Databend source factory that creates Databend source connector. */
@@ -53,7 +54,8 @@ public class DatabendSourceFactory implements 
TableSourceFactory {
     @Override
     public OptionRule optionRule() {
         return OptionRule.builder()
-                .required(DatabendOptions.URL, DatabendOptions.USERNAME, 
DatabendOptions.PASSWORD)
+                .required(DatabendOptions.URL, startsWith(DatabendOptions.URL, 
"jdbc:databend://"))
+                .required(DatabendOptions.USERNAME, DatabendOptions.PASSWORD)
                 .optional(
                         DATABASE,
                         DatabendOptions.TABLE,
@@ -75,12 +77,6 @@ public class DatabendSourceFactory implements 
TableSourceFactory {
         return () -> {
             ReadonlyConfig options = context.getOptions();
 
-            if 
(!options.get(DatabendOptions.URL).startsWith("jdbc:databend://")) {
-                throw new DatabendConnectorException(
-                        DatabendConnectorErrorCode.CONNECT_FAILED,
-                        "Databend URL should start with 'jdbc:databend://'");
-            }
-
             String url = options.get(DatabendOptions.URL);
             Boolean ssl = options.get(DatabendOptions.SSL);
             String username = options.get(DatabendOptions.USERNAME);
diff --git 
a/seatunnel-connectors-v2/connector-databend/src/test/java/org/apache/seatunnel/connectors/seatunnel/databend/DatabendFactoryTest.java
 
b/seatunnel-connectors-v2/connector-databend/src/test/java/org/apache/seatunnel/connectors/seatunnel/databend/DatabendFactoryTest.java
index f72a6dcb32..3a1b6992c8 100644
--- 
a/seatunnel-connectors-v2/connector-databend/src/test/java/org/apache/seatunnel/connectors/seatunnel/databend/DatabendFactoryTest.java
+++ 
b/seatunnel-connectors-v2/connector-databend/src/test/java/org/apache/seatunnel/connectors/seatunnel/databend/DatabendFactoryTest.java
@@ -18,7 +18,9 @@
 package org.apache.seatunnel.connectors.seatunnel.databend;
 
 import org.apache.seatunnel.api.configuration.ReadonlyConfig;
+import org.apache.seatunnel.api.configuration.util.ConfigValidator;
 import org.apache.seatunnel.api.configuration.util.OptionRule;
+import org.apache.seatunnel.api.configuration.util.OptionValidationException;
 import org.apache.seatunnel.api.table.catalog.CatalogTable;
 import org.apache.seatunnel.api.table.catalog.Column;
 import org.apache.seatunnel.api.table.catalog.PhysicalColumn;
@@ -28,6 +30,7 @@ import 
org.apache.seatunnel.api.table.factory.TableSinkFactoryContext;
 import org.apache.seatunnel.api.table.factory.TableSourceFactoryContext;
 import org.apache.seatunnel.api.table.type.BasicType;
 import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
+import 
org.apache.seatunnel.connectors.seatunnel.databend.config.DatabendOptions;
 import 
org.apache.seatunnel.connectors.seatunnel.databend.sink.DatabendSinkFactory;
 import 
org.apache.seatunnel.connectors.seatunnel.databend.source.DatabendSourceFactory;
 
@@ -69,6 +72,20 @@ public class DatabendFactoryTest {
         Assertions.assertNotNull(sourceFactory.createSource(context));
     }
 
+    @Test
+    public void testSourceOptionRuleWithValidDatabendUrl() {
+        Assertions.assertDoesNotThrow(() -> 
validateSourceOptionRule(getSourceOptions()));
+    }
+
+    @Test
+    public void testSourceOptionRuleWithInvalidDatabendUrl() {
+        Map<String, Object> options = getSourceOptions();
+        options.put(DatabendOptions.URL.key(), "jdbc:mysql://localhost:3306");
+
+        Assertions.assertThrows(
+                OptionValidationException.class, () -> 
validateSourceOptionRule(options));
+    }
+
     @Test
     public void testCreateSink() {
         DatabendSinkFactory sinkFactory = new DatabendSinkFactory();
@@ -92,6 +109,19 @@ public class DatabendFactoryTest {
                 config, Thread.currentThread().getContextClassLoader());
     }
 
+    private Map<String, Object> getSourceOptions() {
+        Map<String, Object> options = new HashMap<>();
+        options.put(DatabendOptions.URL.key(), 
"jdbc:databend://localhost:8000");
+        options.put(DatabendOptions.USERNAME.key(), "root");
+        options.put(DatabendOptions.PASSWORD.key(), "");
+        return options;
+    }
+
+    private void validateSourceOptionRule(Map<String, Object> options) {
+        ConfigValidator.of(ReadonlyConfig.fromMap(options))
+                .validate(new DatabendSourceFactory().optionRule());
+    }
+
     private TableSinkFactoryContext getTableSinkFactoryContext(Map<String, 
Object> options) {
         ReadonlyConfig config = ReadonlyConfig.fromMap(options);
         return new TableSinkFactoryContext(

Reply via email to