Skip to content

Commit 82cb5db

Browse files
nkjackzhangjhoeller
authored andcommitted
NamedParameterUtils.parseSqlStatement should parse :{x} style parameter correctly
In my opinion, we should parse ":{x}" style parameter as "x" is parameter using "NamedParameterUtils.parseSqlStatement", so the condition "j - i > 2" is the correct condition, not "j - i > 3", because if "i" is the index of ":" in ":{x}", and "j" is the index of "}" in ":{x}", "j - i == 3" is true. Also add a test case for SPR-16663.
1 parent f4813f5 commit 82cb5db

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public static ParsedSql parseSqlStatement(final String sql) {
130130
throw new InvalidDataAccessApiUsageException(
131131
"Non-terminated named parameter declaration at position " + i + " in statement: " + sql);
132132
}
133-
if (j - i > 3) {
133+
if (j - i > 2) {
134134
parameter = sql.substring(i + 2, j);
135135
namedParameterCount = addNewNamedParameter(namedParameters, namedParameterCount, parameter);
136136
totalParameterCount = addNamedParameter(parameterList, totalParameterCount, escapes, i, j + 1, parameter);

spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,18 @@ public void parseSqlStatementWithEmptyBracketsOrBracketsInQuotes() throws Except
253253
assertEquals(expectedSql2, finalSql2);
254254
}
255255

256+
@Test
257+
public void parseSqlStatementWithSingleLetterInBrackets() {
258+
String expectedSql = "select foo from bar where baz = b?z";
259+
String sql = "select foo from bar where baz = b:{p}z";
260+
261+
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
262+
assertEquals(1, parsedSql.getParameterNames().size());
263+
assertEquals("p", parsedSql.getParameterNames().get(0));
264+
String finalSql = NamedParameterUtils.substituteNamedParameters(parsedSql, null);
265+
assertEquals(expectedSql, finalSql);
266+
}
267+
256268
@Test // SPR-2544
257269
public void parseSqlStatementWithLogicalAnd() {
258270
String expectedSql = "xxx & yyyy";

0 commit comments

Comments
 (0)