From 901465d77e9fcaac6bb9b342dc93115ca8a454d6 Mon Sep 17 00:00:00 2001 From: richardmilles Date: Fri, 7 Aug 2026 11:13:26 +0200 Subject: [PATCH] [Fix-18217][DataX] Escape single quotes in custom parameters Prevent shell quote mismatches when DataX -D parameter values contain single quotes. --- .../plugin/task/datax/DataxTask.java | 7 ++++++- .../plugin/task/datax/DataxTaskTest.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/main/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTask.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/main/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTask.java index e82666d53006..14386e474ee0 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/main/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTask.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/main/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTask.java @@ -377,7 +377,12 @@ private StringBuilder addCustomParameters(Map paramsMap) { } StringBuilder customParameters = new StringBuilder("-p \""); for (Map.Entry entry : paramsMap.entrySet()) { - customParameters.append(String.format(CUSTOM_PARAM, entry.getKey(), entry.getValue().getValue())); + String value = entry.getValue().getValue(); + // Escape single quotes for shell safety: ' -> '\'' (bash standard escape) + // Prevents shell quoting conflicts when value contains single quotes, e.g. + // AND create_data > '2026-05-06 10:59:09' -> AND create_data > '\''2026-05-06 10:59:09'\'' + String escapedValue = value == null ? "" : value.replace("'", "'\\''"); + customParameters.append(String.format(CUSTOM_PARAM, entry.getKey(), escapedValue)); } customParameters.replace(4, 5, ""); customParameters.append("\""); diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/test/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/test/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTaskTest.java index 17687e15c117..d10702423869 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/test/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTaskTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-datax/src/test/java/org/apache/dolphinscheduler/plugin/task/datax/DataxTaskTest.java @@ -165,6 +165,24 @@ public void testHandleParamsMap() throws Exception { "${PYTHON_LAUNCHER} ${DATAX_LAUNCHER} --jvm=\"-Xms1G -Xmx1G\" -p \"-DDT='DT' -DDS='DS'\" /tmp/execution/app-id_job.json"); } + @Test + public void testBuildCommandEscapesSingleQuotesInCustomParameters() { + Map paramsMap = new HashMap<>(); + Property conditionProperty = new Property(); + conditionProperty.setProp("ds_incr_condition"); + conditionProperty.setDirect(Direct.IN); + conditionProperty.setType(DataType.VARCHAR); + conditionProperty.setValue("AND create_data > '2026-05-06 10:59:09'"); + paramsMap.put("ds_incr_condition", conditionProperty); + + String command = dataxTask.buildCommand("/tmp/execution/app-id_job.json", paramsMap); + Assertions.assertEquals( + "${PYTHON_LAUNCHER} ${DATAX_LAUNCHER} --jvm=\"-Xms1G -Xmx1G\" " + + "-p \"-Dds_incr_condition='AND create_data > '\\''2026-05-06 10:59:09'\\'''\" " + + "/tmp/execution/app-id_job.json", + command); + } + @Test public void testHandleInterruptedException() throws Exception { String parameters = JSONUtils.toJsonString(createDataxParameters());