From aaa22ad07d112533b35aec82f554a9f52b94dd95 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 19 Oct 2022 18:23:49 +0200 Subject: [PATCH] Remove square brackets with index/key expressions from generated SQL See gh-27925 --- .../jdbc/core/namedparam/NamedParameterUtils.java | 6 ++++-- .../jdbc/core/namedparam/NamedParameterUtilsTests.java | 10 ++++++++-- .../r2dbc/core/NamedParameterUtils.java | 6 ++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java index ee94747669..cf8280ba18 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java @@ -147,8 +147,10 @@ public abstract class NamedParameterUtils { } if (j - i > 1) { parameter = sql.substring(i + 1, j); - if (parameter.contains("[")) { - parameter += "]"; // preserve end bracket for index/key + if (j < statement.length && statement[j] == ']' && parameter.contains("[")) { + // preserve end bracket for index/key + j++; + parameter = sql.substring(i + 1, j); } namedParameterCount = addNewNamedParameter( namedParameters, namedParameterCount, parameter); diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java index 32c5fdac2a..0c10b1c301 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java @@ -325,6 +325,9 @@ public class NamedParameterUtilsTests { ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql); assertThat(psql.getNamedParameterCount()).isEqualTo(1); assertThat(psql.getParameterNames()).containsExactly("ext"); + + String sqlToUse = NamedParameterUtils.substituteNamedParameters(psql, null); + assertThat(sqlToUse).isEqualTo("SELECT ARRAY[?]"); } @Test // gh-27925 @@ -345,11 +348,14 @@ public class NamedParameterUtilsTests { } Foo foo = new Foo(); - Object[] params = NamedParameterUtils.buildValueArray(psql, - new BeanPropertySqlParameterSource(foo), null); + SqlParameterSource paramSource = new BeanPropertySqlParameterSource(foo); + Object[] params = NamedParameterUtils.buildValueArray(psql, paramSource, null); assertThat(params[0]).isInstanceOf(SqlParameterValue.class); assertThat(((SqlParameterValue) params[0]).getValue()).isEqualTo(foo.getHeaders().get("id")); + + String sqlToUse = NamedParameterUtils.substituteNamedParameters(psql, paramSource); + assertThat(sqlToUse).isEqualTo("insert into foos (id) values (?)"); } } diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java index a1b87ffedc..66cf315d43 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java @@ -160,8 +160,10 @@ abstract class NamedParameterUtils { } if (j - i > 1) { parameter = sql.substring(i + 1, j); - if (parameter.contains("[")) { - parameter += "]"; // preserve end bracket for index/key + if (j < statement.length && statement[j] == ']' && parameter.contains("[")) { + // preserve end bracket for index/key + j++; + parameter = sql.substring(i + 1, j); } namedParameterCount = addNewNamedParameter( namedParameters, namedParameterCount, parameter);