This is an automated email from the ASF dual-hosted git repository.
CritasWang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ce103a333d5 Fixed db parameter in data import (#17521)
ce103a333d5 is described below
commit ce103a333d5a38ebbc2b7d5812a69eee009796d3
Author: LimJiaWenBrenda <[email protected]>
AuthorDate: Mon Apr 20 19:08:46 2026 +0800
Fixed db parameter in data import (#17521)
* Changed db to required for tsfile and csv file type + Checked db in param
and sql for sql file type
* Skipped checking if db parameter is not used for sql file type
* Enhanced regex expression to cover more scenario
* Fixed copilot review suggestion
---
.../org/apache/iotdb/tool/common/OptionsUtil.java | 32 +++++++++++++++----
.../apache/iotdb/tool/data/ImportDataTable.java | 37 +++++++++++++++++++++-
2 files changed, 61 insertions(+), 8 deletions(-)
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/common/OptionsUtil.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/common/OptionsUtil.java
index d128a01bcc8..b60809eba63 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/common/OptionsUtil.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/common/OptionsUtil.java
@@ -157,13 +157,7 @@ public class OptionsUtil extends Constants {
}
public static Options createTableImportCommonOptions() {
- Options options = createImportCommonOptions();
-
- Option opDatabase =
-
Option.builder(DB_ARGS).longOpt(DB_NAME).argName(DB_ARGS).hasArg().desc(DB_DESC).build();
- options.addOption(opDatabase);
-
- return options;
+ return createImportCommonOptions();
}
public static Options createExportCommonOptions() {
@@ -731,6 +725,16 @@ public class OptionsUtil extends Constants {
public static Options createTableImportCsvOptions() {
Options options = createTableImportCommonOptions();
+ Option opDatabase =
+ Option.builder(DB_ARGS)
+ .longOpt(DB_NAME)
+ .argName(DB_ARGS)
+ .required()
+ .hasArg()
+ .desc(DB_DESC)
+ .build();
+ options.addOption(opDatabase);
+
Option opTable =
Option.builder(TABLE_ARGS)
.longOpt(TABLE_ARGS)
@@ -830,6 +834,10 @@ public class OptionsUtil extends Constants {
public static Options createTableImportSqlOptions() {
Options options = createTableImportCommonOptions();
+ Option opDatabase =
+
Option.builder(DB_ARGS).longOpt(DB_NAME).argName(DB_ARGS).hasArg().desc(DB_DESC).build();
+ options.addOption(opDatabase);
+
Option opFile =
Option.builder(FILE_ARGS)
.required()
@@ -889,6 +897,16 @@ public class OptionsUtil extends Constants {
public static Options createTableImportTsFileOptions() {
Options options = createTableImportCommonOptions();
+ Option opDatabase =
+ Option.builder(DB_ARGS)
+ .longOpt(DB_NAME)
+ .argName(DB_ARGS)
+ .required()
+ .hasArg()
+ .desc(DB_DESC)
+ .build();
+ options.addOption(opDatabase);
+
Option opFile =
Option.builder(FILE_ARGS)
.required()
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
index f6e84362d90..506da8b8e17 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
@@ -65,6 +65,17 @@ public class ImportDataTable extends AbstractImportData {
private static Map<String, TSDataType> dataTypes = new HashMap<>();
private static Map<String, ColumnCategory> columnCategory = new HashMap<>();
+ private static final Pattern DB_FROM_SQL_PATTERN;
+
+ static {
+ // group N: 双引号标识符 (""转义)
+ // group N+1: 反引号标识符 (``转义)
+ // group N+2: 普通标识符
+ String id = "(?:\"((?:[^\"]|\"\")*)\"" + "|`((?:[^`]|``)*)`" + "|(\\w+))";
+ DB_FROM_SQL_PATTERN =
+ Pattern.compile("into\\s+" + id + "\\s*\\.\\s*" + id,
Pattern.CASE_INSENSITIVE);
+ }
+
public void init() throws InterruptedException {
TableSessionPoolBuilder tableSessionPoolBuilder =
new TableSessionPoolBuilder()
@@ -160,6 +171,18 @@ public class ImportDataTable extends AbstractImportData {
loadFileSuccessfulNum.increment();
}
+ private static String extractDbFromSql(String sql) {
+
+ Matcher matcher = DB_FROM_SQL_PATTERN.matcher(sql);
+ if (matcher.find()) {
+ // db name: group 1 (双引号), group 2 (反引号), group 3 (普通)
+ if (matcher.group(1) != null) return matcher.group(1).replace("\"\"",
"\"");
+ if (matcher.group(2) != null) return matcher.group(2).replace("``", "`");
+ return matcher.group(3);
+ }
+ return null;
+ }
+
@SuppressWarnings("java:S2259")
protected void importFromSqlFile(File file) {
ArrayList<List<Object>> failedRecords = new ArrayList<>();
@@ -173,7 +196,19 @@ public class ImportDataTable extends AbstractImportData {
String sql;
while ((sql = br.readLine()) != null) {
try (ITableSession session = sessionPool.getSession()) {
- sql = sql.replace(";", "");
+ sql = sql.trim();
+ if (sql.endsWith(";")) {
+ sql = sql.substring(0, sql.length() - 1);
+ }
+ String dbName = extractDbFromSql(sql);
+ if (database != null && dbName != null &&
!dbName.equalsIgnoreCase(database)) {
+ ioTPrinter.println(
+ String.format(
+ "The extracted database '%s' in SQL statement does not
match the target database '%s'",
+ dbName, database));
+ failedRecords.add(Collections.singletonList(sql));
+ continue;
+ }
session.executeNonQueryStatement(sql);
} catch (IoTDBConnectionException | StatementExecutionException e) {
ioTPrinter.println(e.getMessage());