SPR-7476 Improving named parameter parsing skipping escaped colons like '\:' and allowing for delimiting parameter names with curly brackets like :{p1}
This commit is contained in:
parent
4f5248bb5c
commit
933e22320d
|
|
@ -105,6 +105,12 @@ public abstract class NamedParameterUtils {
|
||||||
// :{x} style parameter
|
// :{x} style parameter
|
||||||
while (j < statement.length && !('}' == statement[j])) {
|
while (j < statement.length && !('}' == statement[j])) {
|
||||||
j++;
|
j++;
|
||||||
|
if (':' == statement[j] || '{' == statement[j] || isParameterSeparator(statement[j])) {
|
||||||
|
throw new InvalidDataAccessApiUsageException("Parameter name contains invalid character '" + statement[j] + "' at position " + i + " in statement " + sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j >= statement.length) {
|
||||||
|
throw new InvalidDataAccessApiUsageException("Non-terminated named parameter declaration at position " + i + " in statement " + sql);
|
||||||
}
|
}
|
||||||
if (j - i > 3) {
|
if (j - i > 3) {
|
||||||
parameter = sql.substring(i + 2, j);
|
parameter = sql.substring(i + 2, j);
|
||||||
|
|
|
||||||
|
|
@ -194,6 +194,8 @@ public class NamedParameterUtilsTests {
|
||||||
|
|
||||||
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
|
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
|
||||||
assertEquals(2, parsedSql.getParameterNames().size());
|
assertEquals(2, parsedSql.getParameterNames().size());
|
||||||
|
assertEquals("p1", parsedSql.getParameterNames().get(0));
|
||||||
|
assertEquals("p2", parsedSql.getParameterNames().get(1));
|
||||||
String finalSql = NamedParameterUtils.substituteNamedParameters(parsedSql, null);
|
String finalSql = NamedParameterUtils.substituteNamedParameters(parsedSql, null);
|
||||||
assertEquals(expectedSql, finalSql);
|
assertEquals(expectedSql, finalSql);
|
||||||
}
|
}
|
||||||
|
|
@ -208,6 +210,8 @@ public class NamedParameterUtilsTests {
|
||||||
|
|
||||||
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
|
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
|
||||||
assertEquals(2, parsedSql.getParameterNames().size());
|
assertEquals(2, parsedSql.getParameterNames().size());
|
||||||
|
assertEquals("p1", parsedSql.getParameterNames().get(0));
|
||||||
|
assertEquals("p2", parsedSql.getParameterNames().get(1));
|
||||||
String finalSql = NamedParameterUtils.substituteNamedParameters(parsedSql, null);
|
String finalSql = NamedParameterUtils.substituteNamedParameters(parsedSql, null);
|
||||||
assertEquals(expectedSql, finalSql);
|
assertEquals(expectedSql, finalSql);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue