Skip to content

Commit ce103a3

Browse files
authored
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
1 parent 335048c commit ce103a3

2 files changed

Lines changed: 61 additions & 8 deletions

File tree

iotdb-client/cli/src/main/java/org/apache/iotdb/tool/common/OptionsUtil.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,7 @@ public static Options createTreeImportCommonOptions() {
157157
}
158158

159159
public static Options createTableImportCommonOptions() {
160-
Options options = createImportCommonOptions();
161-
162-
Option opDatabase =
163-
Option.builder(DB_ARGS).longOpt(DB_NAME).argName(DB_ARGS).hasArg().desc(DB_DESC).build();
164-
options.addOption(opDatabase);
165-
166-
return options;
160+
return createImportCommonOptions();
167161
}
168162

169163
public static Options createExportCommonOptions() {
@@ -731,6 +725,16 @@ public static Options createImportTsFileOptions() {
731725
public static Options createTableImportCsvOptions() {
732726
Options options = createTableImportCommonOptions();
733727

728+
Option opDatabase =
729+
Option.builder(DB_ARGS)
730+
.longOpt(DB_NAME)
731+
.argName(DB_ARGS)
732+
.required()
733+
.hasArg()
734+
.desc(DB_DESC)
735+
.build();
736+
options.addOption(opDatabase);
737+
734738
Option opTable =
735739
Option.builder(TABLE_ARGS)
736740
.longOpt(TABLE_ARGS)
@@ -830,6 +834,10 @@ public static Options createTableImportCsvOptions() {
830834
public static Options createTableImportSqlOptions() {
831835
Options options = createTableImportCommonOptions();
832836

837+
Option opDatabase =
838+
Option.builder(DB_ARGS).longOpt(DB_NAME).argName(DB_ARGS).hasArg().desc(DB_DESC).build();
839+
options.addOption(opDatabase);
840+
833841
Option opFile =
834842
Option.builder(FILE_ARGS)
835843
.required()
@@ -889,6 +897,16 @@ public static Options createTableImportSqlOptions() {
889897
public static Options createTableImportTsFileOptions() {
890898
Options options = createTableImportCommonOptions();
891899

900+
Option opDatabase =
901+
Option.builder(DB_ARGS)
902+
.longOpt(DB_NAME)
903+
.argName(DB_ARGS)
904+
.required()
905+
.hasArg()
906+
.desc(DB_DESC)
907+
.build();
908+
options.addOption(opDatabase);
909+
892910
Option opFile =
893911
Option.builder(FILE_ARGS)
894912
.required()

iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ public class ImportDataTable extends AbstractImportData {
6565
private static Map<String, TSDataType> dataTypes = new HashMap<>();
6666
private static Map<String, ColumnCategory> columnCategory = new HashMap<>();
6767

68+
private static final Pattern DB_FROM_SQL_PATTERN;
69+
70+
static {
71+
// group N: 双引号标识符 (""转义)
72+
// group N+1: 反引号标识符 (``转义)
73+
// group N+2: 普通标识符
74+
String id = "(?:\"((?:[^\"]|\"\")*)\"" + "|`((?:[^`]|``)*)`" + "|(\\w+))";
75+
DB_FROM_SQL_PATTERN =
76+
Pattern.compile("into\\s+" + id + "\\s*\\.\\s*" + id, Pattern.CASE_INSENSITIVE);
77+
}
78+
6879
public void init() throws InterruptedException {
6980
TableSessionPoolBuilder tableSessionPoolBuilder =
7081
new TableSessionPoolBuilder()
@@ -160,6 +171,18 @@ protected static void processSuccessFile() {
160171
loadFileSuccessfulNum.increment();
161172
}
162173

174+
private static String extractDbFromSql(String sql) {
175+
176+
Matcher matcher = DB_FROM_SQL_PATTERN.matcher(sql);
177+
if (matcher.find()) {
178+
// db name: group 1 (双引号), group 2 (反引号), group 3 (普通)
179+
if (matcher.group(1) != null) return matcher.group(1).replace("\"\"", "\"");
180+
if (matcher.group(2) != null) return matcher.group(2).replace("``", "`");
181+
return matcher.group(3);
182+
}
183+
return null;
184+
}
185+
163186
@SuppressWarnings("java:S2259")
164187
protected void importFromSqlFile(File file) {
165188
ArrayList<List<Object>> failedRecords = new ArrayList<>();
@@ -173,7 +196,19 @@ protected void importFromSqlFile(File file) {
173196
String sql;
174197
while ((sql = br.readLine()) != null) {
175198
try (ITableSession session = sessionPool.getSession()) {
176-
sql = sql.replace(";", "");
199+
sql = sql.trim();
200+
if (sql.endsWith(";")) {
201+
sql = sql.substring(0, sql.length() - 1);
202+
}
203+
String dbName = extractDbFromSql(sql);
204+
if (database != null && dbName != null && !dbName.equalsIgnoreCase(database)) {
205+
ioTPrinter.println(
206+
String.format(
207+
"The extracted database '%s' in SQL statement does not match the target database '%s'",
208+
dbName, database));
209+
failedRecords.add(Collections.singletonList(sql));
210+
continue;
211+
}
177212
session.executeNonQueryStatement(sql);
178213
} catch (IoTDBConnectionException | StatementExecutionException e) {
179214
ioTPrinter.println(e.getMessage());

0 commit comments

Comments
 (0)