Skip to content

Commit 51e4fc9

Browse files
committed
Consider sanitised names when copying parameter sources.
Closes #1565
1 parent a3b8cc5 commit 51e4fc9

File tree

4 files changed

+85
-2
lines changed

4 files changed

+85
-2
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void addAll(SqlIdentifierParameterSource others) {
7373

7474
for (SqlIdentifier identifier : others.getIdentifiers()) {
7575

76-
String name = identifier.getReference();
76+
String name = BindParameterNameSanitizer.sanitize( identifier.getReference());
7777
addValue(identifier, others.getValue(name), others.getSqlType(name));
7878
}
7979
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSourceUnitTests.java

+53
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,25 @@ void addSingleValue() {
6161
});
6262
}
6363

64+
@Test // GH-1565
65+
void addSingleUnsanitaryValue() {
66+
67+
SqlIdentifierParameterSource parameters = new SqlIdentifierParameterSource();
68+
69+
parameters.addValue(SqlIdentifier.unquoted("ke.y"), 23);
70+
71+
assertSoftly(softly -> {
72+
73+
softly.assertThat(parameters.getParameterNames()).isEqualTo(new String[] { "key" });
74+
softly.assertThat(parameters.getValue("key")).isEqualTo(23);
75+
softly.assertThat(parameters.hasValue("key")).isTrue();
76+
77+
softly.assertThat(parameters.getValue("ke.y")).isNull();
78+
softly.assertThat(parameters.hasValue("ke.y")).isFalse();
79+
softly.assertThat(parameters.getSqlType("ke.y")).isEqualTo(Integer.MIN_VALUE);
80+
});
81+
}
82+
6483
@Test // DATAJDBC-386
6584
void addSingleValueWithType() {
6685

@@ -114,4 +133,38 @@ void addOtherDatabaseObjectIdentifierParameterSource() {
114133
softly.assertThat(parameters.getSqlType("blah")).isEqualTo(Integer.MIN_VALUE);
115134
});
116135
}
136+
137+
@Test // DATAJDBC-386
138+
void addOtherDatabaseObjectIdentifierParameterSourceWithUnsanitaryValue() {
139+
140+
SqlIdentifierParameterSource parameters = new SqlIdentifierParameterSource();
141+
parameters.addValue(SqlIdentifier.unquoted("key1"), 111, 11);
142+
parameters.addValue(SqlIdentifier.unquoted("key2"), 111);
143+
144+
SqlIdentifierParameterSource parameters2 = new SqlIdentifierParameterSource();
145+
parameters2.addValue(SqlIdentifier.unquoted("key.2"), 222, 22);
146+
parameters2.addValue(SqlIdentifier.unquoted("key.3"), 222);
147+
148+
parameters.addAll(parameters2);
149+
150+
assertSoftly(softly -> {
151+
152+
softly.assertThat(parameters.getParameterNames()).containsExactlyInAnyOrder("key1", "key2", "key3");
153+
softly.assertThat(parameters.getValue("key1")).isEqualTo(111);
154+
softly.assertThat(parameters.hasValue("key1")).isTrue();
155+
softly.assertThat(parameters.getSqlType("key1")).isEqualTo(11);
156+
157+
softly.assertThat(parameters.getValue("key2")).isEqualTo(222);
158+
softly.assertThat(parameters.hasValue("key2")).isTrue();
159+
softly.assertThat(parameters.getSqlType("key2")).isEqualTo(22);
160+
161+
softly.assertThat(parameters.getValue("key3")).isEqualTo(222);
162+
softly.assertThat(parameters.hasValue("key3")).isTrue();
163+
softly.assertThat(parameters.getSqlType("key3")).isEqualTo(Integer.MIN_VALUE);
164+
165+
softly.assertThat(parameters.getValue("blah")).isNull();
166+
softly.assertThat(parameters.hasValue("blah")).isFalse();
167+
softly.assertThat(parameters.getSqlType("blah")).isEqualTo(Integer.MIN_VALUE);
168+
});
169+
}
117170
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryEmbeddedIntegrationTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.data.relational.core.mapping.Embedded.OnEmpty;
3737
import org.springframework.data.relational.core.mapping.Table;
3838
import org.springframework.data.repository.CrudRepository;
39+
import org.springframework.data.repository.ListCrudRepository;
3940
import org.springframework.data.repository.PagingAndSortingRepository;
4041
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
4142
import org.springframework.test.jdbc.JdbcTestUtils;
@@ -46,6 +47,7 @@
4647
* @author Bastian Wilhelm
4748
* @author Christoph Strobl
4849
* @author Mikhail Polivakha
50+
* @author Jens Schauder
4951
*/
5052
@IntegrationTest
5153
public class JdbcRepositoryEmbeddedIntegrationTests {
@@ -69,12 +71,18 @@ WithDotColumnRepo withDotColumnRepo(JdbcRepositoryFactory factory) {
6971
return factory.getRepository(WithDotColumnRepo.class);
7072
}
7173

74+
@Bean
75+
WithDotEmbeddedRepo withDotEmbeddedRepo(JdbcRepositoryFactory factory) {
76+
return factory.getRepository(WithDotEmbeddedRepo.class);
77+
}
78+
7279
}
7380

7481
@Autowired NamedParameterJdbcTemplate template;
7582
@Autowired DummyEntityRepository repository;
7683
@Autowired PersonRepository personRepository;
7784
@Autowired WithDotColumnRepo withDotColumnRepo;
85+
@Autowired WithDotEmbeddedRepo withDotEmbeddedRepo;
7886

7987
@Test // DATAJDBC-111
8088
void savesAnEntity() {
@@ -270,6 +278,16 @@ void sortingWorksCorrectlyIfColumnHasDotInItsName() {
270278
Assertions.assertThat(fetchedPersons).containsExactly(saved.get(1), saved.get(0), saved.get(2));
271279
}
272280

281+
@Test // GH-1565
282+
void saveAndLoadEmbeddedWithDottedPrefix() {
283+
WithDotEmbedded entity = withDotEmbeddedRepo.save(
284+
new WithDotEmbedded(null, new PersonContacts("[email protected]", "123456789")));
285+
286+
WithDotEmbedded reloaded = withDotEmbeddedRepo.findById(entity.id).orElseThrow();
287+
288+
assertThat(reloaded).isEqualTo(entity);
289+
}
290+
273291
private static DummyEntity createDummyEntity() {
274292
DummyEntity entity = new DummyEntity();
275293

@@ -304,6 +322,11 @@ interface WithDotColumnRepo
304322
record WithDotColumn(@Id Integer id, @Column("address.city") String address) {
305323
}
306324

325+
record WithDotEmbedded(@Id Integer id, @Embedded.Nullable(prefix = "prefix.") PersonContacts contact) {
326+
}
327+
328+
interface WithDotEmbeddedRepo extends ListCrudRepository<WithDotEmbedded, Integer> {}
329+
307330
@Table("SORT_EMBEDDED_ENTITY")
308331
record Person(@Id Long id, String firstName, String address, @Embedded.Nullable PersonContacts personContacts) {
309332
}

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryEmbeddedIntegrationTests-hsql.sql

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,11 @@ CREATE TABLE WITH_DOT_COLUMN
2020
(
2121
id BIGINT GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ) PRIMARY KEY,
2222
"address.city" VARCHAR(255)
23-
);
23+
);
24+
25+
CREATE TABLE WITH_DOT_EMBEDDED
26+
(
27+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 ) PRIMARY KEY,
28+
"PREFIX.EMAIL" VARCHAR(255),
29+
"PREFIX.PHONE_NUMBER" VARCHAR(255)
30+
)

0 commit comments

Comments
 (0)