Skip to content

Commit d86af57

Browse files
committed
Polishing
1 parent d4cde29 commit d86af57

File tree

4 files changed

+50
-48
lines changed

4 files changed

+50
-48
lines changed

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@
4242
public abstract class NamedParameterUtils {
4343

4444
/**
45-
* Set of characters that qualify as comment or quotes starting characters.
45+
* Set of characters that qualify as comment or quote starting characters.
4646
*/
47-
private static final String[] START_SKIP = new String[] {"'", "\"", "--", "/*", "`"};
47+
private static final String[] START_SKIP = {"'", "\"", "--", "/*", "`"};
4848

4949
/**
50-
* Set of characters that at are the corresponding comment or quotes ending characters.
50+
* Set of characters that are the corresponding comment or quote ending characters.
5151
*/
52-
private static final String[] STOP_SKIP = new String[] {"'", "\"", "\n", "*/", "`"};
52+
private static final String[] STOP_SKIP = {"'", "\"", "\n", "*/", "`"};
5353

5454
/**
5555
* Set of characters that qualify as parameter separators,

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

+13-13
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ void testParseSqlStatementWithStringContainingQuotes() {
153153
}
154154

155155
@Test // SPR-4789
156-
public void parseSqlContainingComments() {
156+
void parseSqlContainingComments() {
157157
String sql1 = "/*+ HINT */ xxx /* comment ? */ :a yyyy :b :c :a zzzzz -- :xx XX\n";
158158
ParsedSql parsedSql1 = NamedParameterUtils.parseSqlStatement(sql1);
159159
assertThat(NamedParameterUtils.substituteNamedParameters(parsedSql1, null)).isEqualTo("/*+ HINT */ xxx /* comment ? */ ? yyyy ? ? ? zzzzz -- :xx XX\n");
@@ -179,15 +179,15 @@ public void parseSqlContainingComments() {
179179
}
180180

181181
@Test // SPR-4612
182-
public void parseSqlStatementWithPostgresCasting() {
182+
void parseSqlStatementWithPostgresCasting() {
183183
String expectedSql = "select 'first name' from artists where id = ? and birth_date=?::timestamp";
184184
String sql = "select 'first name' from artists where id = :id and birth_date=:birthDate::timestamp";
185185
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
186186
assertThat(substituteNamedParameters(parsedSql)).isEqualTo(expectedSql);
187187
}
188188

189189
@Test // SPR-13582
190-
public void parseSqlStatementWithPostgresContainedOperator() {
190+
void parseSqlStatementWithPostgresContainedOperator() {
191191
String expectedSql = "select 'first name' from artists where info->'stat'->'albums' = ?? ? and '[\"1\",\"2\",\"3\"]'::jsonb ?? '4'";
192192
String sql = "select 'first name' from artists where info->'stat'->'albums' = ?? :album and '[\"1\",\"2\",\"3\"]'::jsonb ?? '4'";
193193
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
@@ -196,7 +196,7 @@ public void parseSqlStatementWithPostgresContainedOperator() {
196196
}
197197

198198
@Test // SPR-15382
199-
public void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() {
199+
void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() {
200200
String expectedSql = "select '[\"3\", \"11\"]'::jsonb ?| '{1,3,11,12,17}'::text[]";
201201
String sql = "select '[\"3\", \"11\"]'::jsonb ?| '{1,3,11,12,17}'::text[]";
202202

@@ -206,7 +206,7 @@ public void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() {
206206
}
207207

208208
@Test // SPR-15382
209-
public void parseSqlStatementWithPostgresAllArrayStringsExistsOperator() {
209+
void parseSqlStatementWithPostgresAllArrayStringsExistsOperator() {
210210
String expectedSql = "select '[\"3\", \"11\"]'::jsonb ?& '{1,3,11,12,17}'::text[] AND ? = 'Back in Black'";
211211
String sql = "select '[\"3\", \"11\"]'::jsonb ?& '{1,3,11,12,17}'::text[] AND :album = 'Back in Black'";
212212

@@ -216,7 +216,7 @@ public void parseSqlStatementWithPostgresAllArrayStringsExistsOperator() {
216216
}
217217

218218
@Test // SPR-7476
219-
public void parseSqlStatementWithEscapedColon() {
219+
void parseSqlStatementWithEscapedColon() {
220220
String expectedSql = "select '0\\:0' as a, foo from bar where baz < DATE(? 23:59:59) and baz = ?";
221221
String sql = "select '0\\:0' as a, foo from bar where baz < DATE(:p1 23\\:59\\:59) and baz = :p2";
222222

@@ -227,7 +227,7 @@ public void parseSqlStatementWithEscapedColon() {
227227
}
228228

229229
@Test // SPR-7476
230-
public void parseSqlStatementWithBracketDelimitedParameterNames() {
230+
void parseSqlStatementWithBracketDelimitedParameterNames() {
231231
String expectedSql = "select foo from bar where baz = b??z";
232232
String sql = "select foo from bar where baz = b:{p1}:{p2}z";
233233

@@ -238,7 +238,7 @@ public void parseSqlStatementWithBracketDelimitedParameterNames() {
238238
}
239239

240240
@Test // SPR-7476
241-
public void parseSqlStatementWithEmptyBracketsOrBracketsInQuotes() {
241+
void parseSqlStatementWithEmptyBracketsOrBracketsInQuotes() {
242242
String expectedSql = "select foo from bar where baz = b:{}z";
243243
String sql = "select foo from bar where baz = b:{}z";
244244
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
@@ -267,21 +267,21 @@ void parseSqlStatementWithSingleLetterInBrackets() {
267267
}
268268

269269
@Test // SPR-2544
270-
public void parseSqlStatementWithLogicalAnd() {
270+
void parseSqlStatementWithLogicalAnd() {
271271
String expectedSql = "xxx & yyyy";
272272
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(expectedSql);
273273
assertThat(substituteNamedParameters(parsedSql)).isEqualTo(expectedSql);
274274
}
275275

276276
@Test // SPR-2544
277-
public void substituteNamedParametersWithLogicalAnd() {
277+
void substituteNamedParametersWithLogicalAnd() {
278278
String expectedSql = "xxx & yyyy";
279279
String newSql = NamedParameterUtils.substituteNamedParameters(expectedSql, new MapSqlParameterSource());
280280
assertThat(newSql).isEqualTo(expectedSql);
281281
}
282282

283283
@Test // SPR-3173
284-
public void variableAssignmentOperator() {
284+
void variableAssignmentOperator() {
285285
String expectedSql = "x := 1";
286286
String newSql = NamedParameterUtils.substituteNamedParameters(expectedSql, new MapSqlParameterSource());
287287
assertThat(newSql).isEqualTo(expectedSql);
@@ -295,14 +295,14 @@ public void variableAssignmentOperator() {
295295
"SELECT \":foo\"\":doo\", :xxx FROM DUAL",
296296
"SELECT `:foo``:doo`, :xxx FROM DUAL"
297297
})
298-
void parseSqlStatementWithParametersInsideQuote(String sql) {
298+
void parseSqlStatementWithParametersInsideQuotesAndComments(String sql) {
299299
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
300300
assertThat(parsedSql.getTotalParameterCount()).isEqualTo(1);
301301
assertThat(parsedSql.getParameterNames()).containsExactly("xxx");
302302
}
303303

304304
@Test // gh-27716
305-
public void parseSqlStatementWithSquareBracket() {
305+
void parseSqlStatementWithSquareBracket() {
306306
String sql = "SELECT ARRAY[:ext]";
307307
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
308308
assertThat(parsedSql.getNamedParameterCount()).isEqualTo(1);

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -54,14 +54,14 @@
5454
abstract class NamedParameterUtils {
5555

5656
/**
57-
* Set of characters that qualify as comment or quotes starting characters.
57+
* Set of characters that qualify as comment or quote starting characters.
5858
*/
59-
private static final String[] START_SKIP = new String[] {"'", "\"", "--", "/*"};
59+
private static final String[] START_SKIP = {"'", "\"", "--", "/*"};
6060

6161
/**
62-
* Set of characters that at are the corresponding comment or quotes ending characters.
62+
* Set of characters that are the corresponding comment or quote ending characters.
6363
*/
64-
private static final String[] STOP_SKIP = new String[] {"'", "\"", "\n", "*/"};
64+
private static final String[] STOP_SKIP = {"'", "\"", "\n", "*/"};
6565

6666
/**
6767
* Set of characters that qualify as parameter separators,

Diff for: spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java

+28-26
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import io.r2dbc.spi.Parameters;
2626
import org.junit.jupiter.api.Test;
27+
import org.junit.jupiter.params.ParameterizedTest;
28+
import org.junit.jupiter.params.provider.ValueSource;
2729

2830
import org.springframework.r2dbc.core.binding.BindMarkersFactory;
2931
import org.springframework.r2dbc.core.binding.BindTarget;
@@ -243,40 +245,40 @@ void variableAssignmentOperator() {
243245
assertThat(expand(expectedSql)).isEqualTo(expectedSql);
244246
}
245247

246-
@Test
247-
void parseSqlStatementWithQuotedSingleQuote() {
248-
String sql = "SELECT ':foo'':doo', :xxx FROM DUAL";
249-
250-
ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql);
251-
assertThat(psql.getTotalParameterCount()).isEqualTo(1);
252-
assertThat(psql.getParameterNames()).containsExactly("xxx");
253-
}
254-
255-
@Test
256-
void parseSqlStatementWithQuotesAndCommentBefore() {
257-
String sql = "SELECT /*:doo*/':foo', :xxx FROM DUAL";
258-
259-
ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql);
260-
assertThat(psql.getTotalParameterCount()).isEqualTo(1);
261-
assertThat(psql.getParameterNames()).containsExactly("xxx");
262-
}
263-
264-
@Test
265-
void parseSqlStatementWithQuotesAndCommentAfter() {
266-
String sql2 = "SELECT ':foo'/*:doo*/, :xxx FROM DUAL";
267-
268-
ParsedSql psql2 = NamedParameterUtils.parseSqlStatement(sql2);
269-
assertThat(psql2.getTotalParameterCount()).isEqualTo(1);
270-
assertThat(psql2.getParameterNames()).containsExactly("xxx");
248+
@ParameterizedTest // SPR-8280 and others
249+
@ValueSource(strings = {
250+
"SELECT ':foo'':doo', :xxx FROM DUAL",
251+
"SELECT /*:doo*/':foo', :xxx FROM DUAL",
252+
"SELECT ':foo'/*:doo*/, :xxx FROM DUAL",
253+
"SELECT \":foo\"\":doo\", :xxx FROM DUAL",
254+
})
255+
void parseSqlStatementWithParametersInsideQuotesAndComments(String sql) {
256+
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
257+
assertThat(parsedSql.getTotalParameterCount()).isEqualTo(1);
258+
assertThat(parsedSql.getParameterNames()).containsExactly("xxx");
271259
}
272260

273261
@Test // gh-27716
274-
public void parseSqlStatementWithSquareBracket() {
262+
void parseSqlStatementWithSquareBracket() {
275263
String sql = "SELECT ARRAY[:ext]";
276264

277265
ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql);
278266
assertThat(psql.getNamedParameterCount()).isEqualTo(1);
279267
assertThat(psql.getParameterNames()).containsExactly("ext");
268+
269+
assertThat(expand(psql)).isEqualTo("SELECT ARRAY[$1]");
270+
}
271+
272+
@Test // gh-31596
273+
void paramNameWithNestedSquareBrackets() {
274+
String sql = "insert into GeneratedAlways (id, first_name, last_name) values " +
275+
"(:records[0].id, :records[0].firstName, :records[0].lastName), " +
276+
"(:records[1].id, :records[1].firstName, :records[1].lastName)";
277+
278+
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
279+
assertThat(parsedSql.getParameterNames()).containsOnly(
280+
"records[0].id", "records[0].firstName", "records[0].lastName",
281+
"records[1].id", "records[1].firstName", "records[1].lastName");
280282
}
281283

282284
@Test // gh-27925

0 commit comments

Comments
 (0)