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

nzw921rx 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 6b047a364e [Improve][Connector-V2] Validate IoTDB source SQL is not 
blank (#12603)
6b047a364e is described below

commit 6b047a364e20b5a1317f0ca59afebcbdd427fd33
Author: Nikhil kumar <[email protected]>
AuthorDate: Mon Oct 12 17:09:27 2026 +0530

    [Improve][Connector-V2] Validate IoTDB source SQL is not blank (#12603)
---
 docs/en/connectors/source/IoTDB.md                 |  2 +-
 docs/zh/connectors/source/IoTDB.md                 |  2 +-
 .../seatunnel/iotdb/source/IoTDBSourceFactory.java |  1 +
 .../seatunnel/iotdb/IoTDBFactoryTest.java          | 48 ++++++++++++++++++++++
 4 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/docs/en/connectors/source/IoTDB.md 
b/docs/en/connectors/source/IoTDB.md
index 4a43b2c9b6..aa26207c45 100644
--- a/docs/en/connectors/source/IoTDB.md
+++ b/docs/en/connectors/source/IoTDB.md
@@ -61,7 +61,7 @@ Use either a root-level `sql` and `schema` for one table, or 
`tables_configs` fo
 | node_urls                  | string  | yes      | -             | IoTDB 
cluster address, the format is `"host1:port"` or `"host1:port,host2:port"`      
                            |
 | username                   | string  | yes      | -             | IoTDB user 
username                                                                        
                       |
 | password                   | string  | yes      | -             | IoTDB user 
password                                                                        
                       |
-| sql                        | string  | conditional | -          | SQL query. 
Required with `schema` when `tables_configs` is not configured.                 
                         |
+| sql                        | string  | conditional | -          | SQL query. 
Required with `schema` when `tables_configs` is not configured. A supplied 
root-level value must not be blank. |
 | tables_configs             | array   | no       | -             | Non-empty 
list of table configurations, each containing `sql` and `schema` with a unique, 
non-blank `schema.table`. |
 | schema                     | config  | conditional | -          | Required 
with root-level `sql`; configure inside each entry when using `tables_configs`. 
See [Schema Feature](../../introduction/concepts/schema-feature.md). |
 | fetch_size                 | int     | no       | -             | Number of 
rows fetched from IoTDB in one request.                                         
                        |
diff --git a/docs/zh/connectors/source/IoTDB.md 
b/docs/zh/connectors/source/IoTDB.md
index 4ed9a8ec8d..94056365a6 100644
--- a/docs/zh/connectors/source/IoTDB.md
+++ b/docs/zh/connectors/source/IoTDB.md
@@ -61,7 +61,7 @@ import ChangeLog from '../changelog/connector-iotdb.md';
 | node_urls                  | string  | 是    | -   | IoTDB 集群地址,格式为 
`"host1:port"` 或 `"host1:port,host2:port"`                        |
 | username                   | string  | 是    | -   | IoTDB 用户名                
                                                        |
 | password                   | string  | 是    | -   | IoTDB 用户密码               
                                                        |
-| sql                        | string  | 条件必填 | - | 未配置 `tables_configs` 时,必须与 
`schema` 一起配置。 |
+| sql                        | string  | 条件必填 | - | 未配置 `tables_configs` 时,必须与 
`schema` 一起配置;根级别的 `sql` 不能为纯空白内容。 |
 | tables_configs             | array   | 否    | -   | 非空表配置列表。每项包含 `sql` 和 
`schema`,且 `schema.table` 必须非空、唯一。 |
 | schema                     | config  | 条件必填 | - | 根级别 `sql` 配置需要此项;使用 
`tables_configs` 时放在每项内。参考 [Schema 
特性](../../introduction/concepts/schema-feature.md)。 |
 | fetch_size                 | int     | 否    | -   | 单次获取数据量:查询时每次从 IoTDB 
获取的数据量                                                      |
diff --git 
a/seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceFactory.java
 
b/seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceFactory.java
index e0d6aa95db..1508043d37 100644
--- 
a/seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceFactory.java
+++ 
b/seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceFactory.java
@@ -62,6 +62,7 @@ public class IoTDBSourceFactory implements TableSourceFactory 
{
                 .exclusive(IoTDBSourceOptions.SQL, 
ConnectorCommonOptions.TABLE_CONFIGS)
                 .optional(
                         IoTDBSourceOptions.SQL,
+                        Conditions.notBlank(IoTDBSourceOptions.SQL),
                         Conditions.extension(IoTDBSourceOptions.SQL, new 
SingleTableValidator()))
                 .optional(
                         ConnectorCommonOptions.TABLE_CONFIGS,
diff --git 
a/seatunnel-connectors-v2/connector-iotdb/src/test/java/org/apache/seatunnel/connectors/seatunnel/iotdb/IoTDBFactoryTest.java
 
b/seatunnel-connectors-v2/connector-iotdb/src/test/java/org/apache/seatunnel/connectors/seatunnel/iotdb/IoTDBFactoryTest.java
index a536d3f2ec..b26d3b9571 100644
--- 
a/seatunnel-connectors-v2/connector-iotdb/src/test/java/org/apache/seatunnel/connectors/seatunnel/iotdb/IoTDBFactoryTest.java
+++ 
b/seatunnel-connectors-v2/connector-iotdb/src/test/java/org/apache/seatunnel/connectors/seatunnel/iotdb/IoTDBFactoryTest.java
@@ -23,6 +23,7 @@ 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.api.table.factory.TableSourceFactoryContext;
+import 
org.apache.seatunnel.connectors.seatunnel.iotdb.config.IoTDBSourceOptions;
 import org.apache.seatunnel.connectors.seatunnel.iotdb.sink.IoTDBSinkFactory;
 import org.apache.seatunnel.connectors.seatunnel.iotdb.source.IoTDBSource;
 import 
org.apache.seatunnel.connectors.seatunnel.iotdb.source.IoTDBSourceFactory;
@@ -34,6 +35,53 @@ import org.junit.jupiter.params.provider.ValueSource;
 
 class IoTDBFactoryTest {
 
+    @ParameterizedTest
+    @ValueSource(strings = {"", " ", "\\t"})
+    void rejectsBlankRootSql(String sql) {
+        ReadonlyConfig config =
+                ReadonlyConfig.fromConfig(
+                        ConfigFactory.parseString(
+                                "node_urls = \"localhost:6667\"\nusername = 
root\npassword = root\n"
+                                        + "sql = \""
+                                        + sql
+                                        + "\"\nschema {fields {ts = 
bigint}}"));
+
+        OptionValidationException exception =
+                Assertions.assertThrows(
+                        OptionValidationException.class,
+                        () ->
+                                ConfigValidator.of(config)
+                                        .validate(new 
IoTDBSourceFactory().optionRule()));
+        Assertions.assertTrue(exception.getMessage().contains("sql"));
+    }
+
+    @Test
+    void acceptsPaddedRootSqlWithoutChangingIt() {
+        String sql = "  select value from root.test  ";
+        ReadonlyConfig config =
+                ReadonlyConfig.fromConfig(
+                        ConfigFactory.parseString(
+                                "node_urls = \"localhost:6667\"\nusername = 
root\npassword = root\n"
+                                        + "sql = \""
+                                        + sql
+                                        + "\"\nschema {fields {ts = 
bigint}}"));
+
+        ConfigValidator.of(config).validate(new 
IoTDBSourceFactory().optionRule());
+        Assertions.assertEquals(sql, config.get(IoTDBSourceOptions.SQL));
+    }
+
+    @Test
+    void acceptsTablesConfigsWithoutRootSql() {
+        ReadonlyConfig config =
+                ReadonlyConfig.fromConfig(
+                        ConfigFactory.parseString(
+                                "node_urls = \"localhost:6667\"\nusername = 
root\npassword = root\n"
+                                        + "tables_configs = [{sql = x, schema 
{table = a, fields {ts = bigint}}}]"));
+
+        ConfigValidator.of(config).validate(new 
IoTDBSourceFactory().optionRule());
+        
Assertions.assertFalse(config.getOptional(IoTDBSourceOptions.SQL).isPresent());
+    }
+
     @ParameterizedTest
     @ValueSource(
             strings = {

Reply via email to