Skip to content

Commit aaa22ad

Browse files
committed
Remove square brackets with index/key expressions from generated SQL
See gh-27925
1 parent affccba commit aaa22ad

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,10 @@ public static ParsedSql parseSqlStatement(String sql) {
147147
}
148148
if (j - i > 1) {
149149
parameter = sql.substring(i + 1, j);
150-
if (parameter.contains("[")) {
151-
parameter += "]"; // preserve end bracket for index/key
150+
if (j < statement.length && statement[j] == ']' && parameter.contains("[")) {
151+
// preserve end bracket for index/key
152+
j++;
153+
parameter = sql.substring(i + 1, j);
152154
}
153155
namedParameterCount = addNewNamedParameter(
154156
namedParameters, namedParameterCount, parameter);

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,9 @@ public void parseSqlStatementWithSquareBracket() {
325325
ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql);
326326
assertThat(psql.getNamedParameterCount()).isEqualTo(1);
327327
assertThat(psql.getParameterNames()).containsExactly("ext");
328+
329+
String sqlToUse = NamedParameterUtils.substituteNamedParameters(psql, null);
330+
assertThat(sqlToUse).isEqualTo("SELECT ARRAY[?]");
328331
}
329332

330333
@Test // gh-27925
@@ -345,11 +348,14 @@ public Map<String, Object> getHeaders() {
345348
}
346349

347350
Foo foo = new Foo();
348-
Object[] params = NamedParameterUtils.buildValueArray(psql,
349-
new BeanPropertySqlParameterSource(foo), null);
351+
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(foo);
352+
Object[] params = NamedParameterUtils.buildValueArray(psql, paramSource, null);
350353

351354
assertThat(params[0]).isInstanceOf(SqlParameterValue.class);
352355
assertThat(((SqlParameterValue) params[0]).getValue()).isEqualTo(foo.getHeaders().get("id"));
356+
357+
String sqlToUse = NamedParameterUtils.substituteNamedParameters(psql, paramSource);
358+
assertThat(sqlToUse).isEqualTo("insert into foos (id) values (?)");
353359
}
354360

355361
}

spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,10 @@ public static ParsedSql parseSqlStatement(String sql) {
160160
}
161161
if (j - i > 1) {
162162
parameter = sql.substring(i + 1, j);
163-
if (parameter.contains("[")) {
164-
parameter += "]"; // preserve end bracket for index/key
163+
if (j < statement.length && statement[j] == ']' && parameter.contains("[")) {
164+
// preserve end bracket for index/key
165+
j++;
166+
parameter = sql.substring(i + 1, j);
165167
}
166168
namedParameterCount = addNewNamedParameter(
167169
namedParameters, namedParameterCount, parameter);

0 commit comments

Comments
 (0)