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 = {