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(