Remove square brackets with index/key expressions from generated SQL

See gh-27925
This commit is contained in:
Juergen Hoeller 2022-10-19 18:23:49 +02:00
parent affccba8f1
commit aaa22ad07d
3 changed files with 16 additions and 6 deletions

View File

@ -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);

View File

@ -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 (?)");
}
}

View File

@ -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);