This is an automated email from the ASF dual-hosted git repository.

zihaoxiang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 38d599c745 [Fix-15828] fix expandListParameter (#15878)
38d599c745 is described below

commit 38d599c745dab32cf33d73d99ae9dce5c8f4b46e
Author: zuo <[email protected]>
AuthorDate: Sat Jul 20 16:48:43 2024 +0800

    [Fix-15828] fix expandListParameter (#15878)
    
    * [Fix-15828] Replace the original question mark before regex replacement
---
 .../plugin/task/api/AbstractTask.java              | 15 ++----
 .../plugin/task/api/TaskConstants.java             | 10 ++++
 .../plugin/task/api/utils/ParameterUtils.java      | 33 ++++++------
 .../plugin/task/api/utils/ParameterUtilsTest.java  | 20 +++++---
 .../plugin/task/procedure/ProcedureTask.java       |  5 +-
 .../dolphinscheduler/plugin/task/sql/SqlTask.java  |  7 ++-
 .../plugin/task/sql/SqlTaskTest.java               | 59 +++++++++++++++++-----
 7 files changed, 95 insertions(+), 54 deletions(-)

diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractTask.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractTask.java
index 4437df763b..f9f7dc21c3 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractTask.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/AbstractTask.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import java.util.StringJoiner;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -35,10 +34,6 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public abstract class AbstractTask {
 
-    private static String groupName1 = "paramName1";
-    private static String groupName2 = "paramName2";
-    public String rgex = 
String.format("['\"]\\$\\{(?<%s>.*?)}['\"]|\\$\\{(?<%s>.*?)}", groupName1, 
groupName2);
-
     @Getter
     @Setter
     protected Map<String, String> taskOutputParams;
@@ -173,24 +168,22 @@ public abstract class AbstractTask {
      * regular expressions match the contents between two specified strings
      *
      * @param content content
-     * @param rgex rgex
      * @param sqlParamsMap sql params map
      * @param paramsPropsMap params props map
      */
-    public void setSqlParamsMap(String content, String rgex, Map<Integer, 
Property> sqlParamsMap,
+    public void setSqlParamsMap(String content, Map<Integer, Property> 
sqlParamsMap,
                                 Map<String, Property> paramsPropsMap, int 
taskInstanceId) {
         if (paramsPropsMap == null) {
             return;
         }
 
-        Pattern pattern = Pattern.compile(rgex);
-        Matcher m = pattern.matcher(content);
+        Matcher m = TaskConstants.SQL_PARAMS_PATTERN.matcher(content);
         int index = 1;
         while (m.find()) {
 
-            String paramName = m.group(groupName1);
+            String paramName = m.group(TaskConstants.GROUP_NAME1);
             if (paramName == null) {
-                paramName = m.group(groupName2);
+                paramName = m.group(TaskConstants.GROUP_NAME2);
             }
 
             Property prop = paramsPropsMap.get(paramName);
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/TaskConstants.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/TaskConstants.java
index 98780a2236..77fd8db7fa 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/TaskConstants.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/TaskConstants.java
@@ -21,6 +21,7 @@ import 
org.apache.dolphinscheduler.common.constants.DateConstants;
 
 import java.time.Duration;
 import java.util.Set;
+import java.util.regex.Pattern;
 
 import com.google.common.collect.Sets;
 
@@ -418,4 +419,13 @@ public class TaskConstants {
     // Loop task constants
     public static final Duration DEFAULT_LOOP_STATUS_INTERVAL = 
Duration.ofSeconds(5L);
 
+    /**
+     * sql params regex
+     */
+    public static final String GROUP_NAME1 = "paramName1";
+    public static final String GROUP_NAME2 = "paramName2";
+    public static final String SQL_PARAMS_REGEX =
+            String.format("['\"]\\$\\{(?<%s>.*?)}['\"]|\\$\\{(?<%s>.*?)}", 
GROUP_NAME1, GROUP_NAME2);
+    public static final Pattern SQL_PARAMS_PATTERN = 
Pattern.compile(SQL_PARAMS_REGEX);
+
 }
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtils.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtils.java
index 3347297a46..9733453b2d 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtils.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtils.java
@@ -23,6 +23,7 @@ import static 
org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETE
 
 import org.apache.dolphinscheduler.common.utils.DateUtils;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.plugin.task.api.TaskConstants;
 import org.apache.dolphinscheduler.plugin.task.api.enums.DataType;
 import org.apache.dolphinscheduler.plugin.task.api.enums.Direct;
 import org.apache.dolphinscheduler.plugin.task.api.model.Property;
@@ -192,24 +193,27 @@ public class ParameterUtils {
         if (params == null || params.isEmpty()) {
             return sql;
         }
-        String[] split = sql.split("\\?");
-        if (split.length == 0) {
-            return sql;
-        }
-        StringBuilder ret = new StringBuilder(split[0]);
+        StringBuilder ret = new StringBuilder(sql);
+        Matcher m = TaskConstants.SQL_PARAMS_PATTERN.matcher(sql);
         int index = 1;
-        for (int i = 1; i < split.length; i++) {
-            Property property = params.get(i);
+        int paramsIndex = 1;
+        // When matching with a regex, determine whether the corresponding 
property is a list.
+        while (m.find()) {
+            Property property = params.get(paramsIndex++);
+            if (property == null) {
+                continue;
+            }
             String value = property.getValue();
+            StringBuilder tempReplace = new StringBuilder();
             if (DataType.LIST.equals(property.getType())) {
                 List<Object> valueList = JSONUtils.toList(value, Object.class);
                 if (valueList.isEmpty() && StringUtils.isNotBlank(value)) {
                     valueList.add(value);
                 }
                 for (int j = 0; j < valueList.size(); j++) {
-                    ret.append(PARAM_REPLACE_CHAR);
+                    tempReplace.append(PARAM_REPLACE_CHAR);
                     if (j != valueList.size() - 1) {
-                        ret.append(",");
+                        tempReplace.append(",");
                     }
                 }
                 for (Object v : valueList) {
@@ -231,14 +235,12 @@ public class ParameterUtils {
                     expandMap.put(index++, newProperty);
                 }
             } else {
-                ret.append(PARAM_REPLACE_CHAR);
+                tempReplace.append(PARAM_REPLACE_CHAR);
                 expandMap.put(index++, property);
             }
-            ret.append(split[i]);
-        }
-        if (PARAM_REPLACE_CHAR == sql.charAt(sql.length() - 1)) {
-            ret.append(PARAM_REPLACE_CHAR);
-            expandMap.put(index, params.get(split.length));
+            ret.replace(m.start(), m.end(), tempReplace.toString());
+            // After replacement, the string length will change, so a reset is 
required
+            m.reset(ret.toString());
         }
         params.clear();
         params.putAll(expandMap);
@@ -341,5 +343,4 @@ public class ParameterUtils {
         }
         return userDefParamsMaps;
     }
-
 }
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtilsTest.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtilsTest.java
index 4297e36fcc..1c0dbc7c06 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtilsTest.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/utils/ParameterUtilsTest.java
@@ -23,6 +23,7 @@ import 
org.apache.dolphinscheduler.common.constants.DateConstants;
 import org.apache.dolphinscheduler.common.utils.DateUtils;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.plugin.task.api.enums.DataType;
+import org.apache.dolphinscheduler.plugin.task.api.enums.Direct;
 import org.apache.dolphinscheduler.plugin.task.api.model.Property;
 import org.apache.dolphinscheduler.plugin.task.api.parser.PlaceholderUtils;
 
@@ -40,21 +41,25 @@ public class ParameterUtilsTest {
 
     @Test
     public void expandListParameter() {
+
         Map<Integer, Property> params = new HashMap<>();
         params.put(1,
-                new Property(null, null, DataType.LIST, 
JSONUtils.toJsonString(Lists.newArrayList("c1", "c2", "c3"))));
-        params.put(2, new Property(null, null, DataType.DATE, "2020-06-30"));
-        params.put(3, new Property(null, null, DataType.LIST,
+                new Property("col1", Direct.IN, DataType.LIST,
+                        JSONUtils.toJsonString(Lists.newArrayList("c1", "c2", 
"c3"))));
+        params.put(2, new Property("date", Direct.IN, DataType.DATE, 
"2020-06-30"));
+        params.put(3, new Property("col2", Direct.IN, DataType.LIST,
                 JSONUtils.toJsonString(Lists.newArrayList(3.1415, 2.44, 
3.44))));
         String sql = ParameterUtils.expandListParameter(params,
-                "select * from test where col1 in (?) and date=? and col2 in 
(?)");
+                "select * from test where col1 in ('${col1}') and 
date='${date}' and col2 in ('${col2}')");
         Assertions.assertEquals("select * from test where col1 in (?,?,?) and 
date=? and col2 in (?,?,?)", sql);
         Assertions.assertEquals(7, params.size());
 
         Map<Integer, Property> params2 = new HashMap<>();
-        params2.put(1, new Property(null, null, DataType.LIST, 
JSONUtils.toJsonString(Lists.newArrayList("c1"))));
-        params2.put(2, new Property(null, null, DataType.DATE, "2020-06-30"));
-        String sql2 = ParameterUtils.expandListParameter(params2, "select * 
from test where col1 in (?) and date=?");
+        params2.put(1,
+                new Property("col1", Direct.IN, DataType.LIST, 
JSONUtils.toJsonString(Lists.newArrayList("c1"))));
+        params2.put(2, new Property("date", Direct.IN, DataType.DATE, 
"2020-06-30"));
+        String sql2 = ParameterUtils.expandListParameter(params2,
+                "select * from test where col1 in ('${col}') and 
date='${date}'");
         Assertions.assertEquals("select * from test where col1 in (?) and 
date=?", sql2);
         Assertions.assertEquals(2, params2.size());
 
@@ -113,4 +118,5 @@ public class ParameterUtilsTest {
         Assertions.assertEquals("test Parameter", 
ParameterUtils.handleEscapes("test Parameter"));
         Assertions.assertEquals("////%test////%Parameter", 
ParameterUtils.handleEscapes("%test%Parameter"));
     }
+
 }
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-procedure/src/main/java/org/apache/dolphinscheduler/plugin/task/procedure/ProcedureTask.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-procedure/src/main/java/org/apache/dolphinscheduler/plugin/task/procedure/ProcedureTask.java
index 6a66ba1965..90b41ee9c2 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-procedure/src/main/java/org/apache/dolphinscheduler/plugin/task/procedure/ProcedureTask.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-procedure/src/main/java/org/apache/dolphinscheduler/plugin/task/procedure/ProcedureTask.java
@@ -26,6 +26,7 @@ import 
org.apache.dolphinscheduler.plugin.datasource.api.plugin.DataSourceClient
 import 
org.apache.dolphinscheduler.plugin.datasource.api.plugin.DataSourceProcessorProvider;
 import org.apache.dolphinscheduler.plugin.task.api.AbstractTask;
 import org.apache.dolphinscheduler.plugin.task.api.TaskCallBack;
+import org.apache.dolphinscheduler.plugin.task.api.TaskConstants;
 import org.apache.dolphinscheduler.plugin.task.api.TaskException;
 import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
 import org.apache.dolphinscheduler.plugin.task.api.enums.DataType;
@@ -131,9 +132,9 @@ public class ProcedureTask extends AbstractTask {
     }
 
     private String formatSql(Map<Integer, Property> sqlParamsMap, Map<String, 
Property> paramsMap) {
-        setSqlParamsMap(procedureParameters.getMethod(), rgex, sqlParamsMap, 
paramsMap,
+        setSqlParamsMap(procedureParameters.getMethod(), sqlParamsMap, 
paramsMap,
                 taskExecutionContext.getTaskInstanceId());
-        return procedureParameters.getMethod().replaceAll(rgex, "?");
+        return 
procedureParameters.getMethod().replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?");
     }
 
     /**
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/main/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTask.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/main/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTask.java
index 586cee1c01..d4462ce2cf 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/main/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTask.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/main/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTask.java
@@ -418,17 +418,16 @@ public class SqlTask extends AbstractTask {
         }
 
         // special characters need to be escaped, ${} needs to be escaped
-        setSqlParamsMap(sql, rgex, sqlParamsMap, paramsMap, 
taskExecutionContext.getTaskInstanceId());
+        setSqlParamsMap(sql, sqlParamsMap, paramsMap, 
taskExecutionContext.getTaskInstanceId());
         // Replace the original value in sql !{...} ,Does not participate in 
precompilation
         String rgexo = "['\"]*\\!\\{(.*?)\\}['\"]*";
         sql = replaceOriginalValue(sql, rgexo, paramsMap);
         // replace the ${} of the SQL statement with the Placeholder
-        String formatSql = sql.replaceAll(rgex, "?");
         // Convert the list parameter
-        formatSql = ParameterUtils.expandListParameter(sqlParamsMap, 
formatSql);
+        String formatSql = ParameterUtils.expandListParameter(sqlParamsMap, 
sql);
         sqlBuilder.append(formatSql);
         // print replace sql
-        printReplacedSql(sql, formatSql, rgex, sqlParamsMap);
+        printReplacedSql(sql, formatSql, TaskConstants.SQL_PARAMS_REGEX, 
sqlParamsMap);
         return new SqlBinds(sqlBuilder.toString(), sqlParamsMap);
     }
 
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/test/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTaskTest.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/test/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTaskTest.java
index 268e28db76..3e1b25a4be 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/test/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTaskTest.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-sql/src/test/java/org/apache/dolphinscheduler/plugin/task/sql/SqlTaskTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.dolphinscheduler.plugin.task.sql;
 
+import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.plugin.task.api.TaskConstants;
 import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext;
 import org.apache.dolphinscheduler.plugin.task.api.enums.DataType;
 import org.apache.dolphinscheduler.plugin.task.api.enums.Direct;
@@ -24,6 +26,7 @@ import 
org.apache.dolphinscheduler.plugin.task.api.enums.ResourceType;
 import org.apache.dolphinscheduler.plugin.task.api.model.Property;
 import 
org.apache.dolphinscheduler.plugin.task.api.parameters.resource.DataSourceParameters;
 import 
org.apache.dolphinscheduler.plugin.task.api.parameters.resource.ResourceParametersHelper;
+import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
 import org.apache.dolphinscheduler.spi.enums.DbType;
 
 import java.util.HashMap;
@@ -33,6 +36,8 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import com.google.common.collect.Lists;
+
 class SqlTaskTest {
 
     private SqlTask sqlTask;
@@ -57,21 +62,21 @@ class SqlTaskTest {
     void testReplacingSqlWithoutParams() {
         String querySql = "select 1";
         String expected = "select 1";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
     }
 
     @Test
     void testReplacingSqlWithDollarSymbol() {
         String querySql = "select concat(amount, '$') as price from product";
         String expected = "select concat(amount, '$') as price from product";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
     }
 
     @Test
     void testReplacingHiveLoadSql() {
         String hiveLoadSql = "load inpath '/tmp/test_table/dt=${dt}' into 
table test_table partition(dt=${dt})";
         String expected = "load inpath '/tmp/test_table/dt=?' into table 
test_table partition(dt=?)";
-        Assertions.assertEquals(expected, hiveLoadSql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
hiveLoadSql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         Map<Integer, Property> sqlParamsMap = new HashMap<>();
         Map<Integer, Property> expectedSQLParamsMap = new HashMap<>();
@@ -79,7 +84,7 @@ class SqlTaskTest {
         expectedSQLParamsMap.put(2, new Property("dt", Direct.IN, 
DataType.VARCHAR, "1970"));
         Map<String, Property> paramsMap = new HashMap<>();
         paramsMap.put("dt", new Property("dt", Direct.IN, DataType.VARCHAR, 
"1970"));
-        sqlTask.setSqlParamsMap(hiveLoadSql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(hiveLoadSql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
     }
 
@@ -87,38 +92,38 @@ class SqlTaskTest {
     void testReplacingSelectSql() {
         String querySql = "select id from student where dt='${dt}'";
         String expected = "select id from student where dt=?";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         Map<Integer, Property> sqlParamsMap = new HashMap<>();
         Map<Integer, Property> expectedSQLParamsMap = new HashMap<>();
         expectedSQLParamsMap.put(1, new Property("dt", Direct.IN, 
DataType.VARCHAR, "1970"));
         Map<String, Property> paramsMap = new HashMap<>();
         paramsMap.put("dt", new Property("dt", Direct.IN, DataType.VARCHAR, 
"1970"));
-        sqlTask.setSqlParamsMap(querySql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
 
         querySql = "select id from student where dt=\"${dt}\"";
         expected = "select id from student where dt=?";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         sqlParamsMap.clear();
-        sqlTask.setSqlParamsMap(querySql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
 
         querySql = "select id from student where dt=${dt}";
         expected = "select id from student where dt=?";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         sqlParamsMap.clear();
-        sqlTask.setSqlParamsMap(querySql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
 
         querySql = "select id from student where dt=${dt} and gender=1";
         expected = "select id from student where dt=? and gender=1";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         sqlParamsMap.clear();
-        sqlTask.setSqlParamsMap(querySql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
     }
 
@@ -126,7 +131,7 @@ class SqlTaskTest {
     void testReplacingSqlNonGreedy() {
         String querySql = "select id from student where year=${year} and 
month=${month} and gender=1";
         String expected = "select id from student where year=? and month=? and 
gender=1";
-        Assertions.assertEquals(expected, querySql.replaceAll(sqlTask.rgex, 
"?"));
+        Assertions.assertEquals(expected, 
querySql.replaceAll(TaskConstants.SQL_PARAMS_REGEX, "?"));
 
         Map<Integer, Property> sqlParamsMap = new HashMap<>();
         Map<Integer, Property> expectedSQLParamsMap = new HashMap<>();
@@ -135,11 +140,37 @@ class SqlTaskTest {
         Map<String, Property> paramsMap = new HashMap<>();
         paramsMap.put("year", new Property("year", Direct.IN, 
DataType.VARCHAR, "1970"));
         paramsMap.put("month", new Property("month", Direct.IN, 
DataType.VARCHAR, "12"));
-        sqlTask.setSqlParamsMap(querySql, sqlTask.rgex, sqlParamsMap, 
paramsMap, 1);
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
         Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
     }
 
     @Test
     void splitSql() {
     }
+
+    @Test
+    void testReplacingSqlHasQuestionMarkAndParams() {
+        String querySql =
+                "select id, concat('?', year) from student where year=${year} 
and month=${month} and gender in ('${gender}')";
+        String expected =
+                "select id, concat('?', year) from student where year=? and 
month=? and gender in (?,?)";
+
+        Map<Integer, Property> sqlParamsMap = new HashMap<>();
+        Map<Integer, Property> expectedSQLParamsMap = new HashMap<>();
+        expectedSQLParamsMap.put(1, new Property("year", Direct.IN, 
DataType.VARCHAR, "1970"));
+        expectedSQLParamsMap.put(2, new Property("month", Direct.IN, 
DataType.VARCHAR, "12"));
+        expectedSQLParamsMap.put(3,
+                new Property("gender", Direct.IN, DataType.LIST, 
JSONUtils.toJsonString(Lists.newArrayList(1, 2))));
+        Map<String, Property> paramsMap = new HashMap<>();
+        paramsMap.put("year", new Property("year", Direct.IN, 
DataType.VARCHAR, "1970"));
+        paramsMap.put("month", new Property("month", Direct.IN, 
DataType.VARCHAR, "12"));
+        paramsMap.put("gender",
+                new Property("gender", Direct.IN, DataType.LIST, 
JSONUtils.toJsonString(Lists.newArrayList(1, 2))));
+        sqlTask.setSqlParamsMap(querySql, sqlParamsMap, paramsMap, 1);
+        Assertions.assertEquals(sqlParamsMap, expectedSQLParamsMap);
+
+        String formatSql = ParameterUtils.expandListParameter(sqlParamsMap, 
querySql);
+        Assertions.assertEquals(4, sqlParamsMap.size());
+        Assertions.assertEquals(expected, formatSql);
+    }
 }

Reply via email to