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());

Reply via email to