Browse Source

Polishing.

Simplify sanitizer. Add unit test.

See #1405
See #1406
Original pull request #1415
pull/1486/head
Mark Paluch 3 years ago
parent
commit
f3a7586db6
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 9
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BindParameterNameSanitizer.java
  2. 11
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java
  3. 2
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlIdentifierParameterSource.java
  4. 37
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/BindParameterNameSanitizerUnitTests.java

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

@ -22,16 +22,13 @@ import java.util.regex.Pattern; @@ -22,16 +22,13 @@ import java.util.regex.Pattern;
* Sanitizes the name of bind parameters, so they don't contain any illegal characters.
*
* @author Jens Schauder
*
* @since 3.0
* @since 3.0.2
*/
enum BindParameterNameSanitizer {
INSTANCE;
abstract class BindParameterNameSanitizer {
private static final Pattern parameterPattern = Pattern.compile("\\W");
String sanitize(String rawName) {
static String sanitize(String rawName) {
return parameterPattern.matcher(rawName).replaceAll("");
}
}

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

@ -17,7 +17,6 @@ package org.springframework.data.jdbc.core.convert; @@ -17,7 +17,6 @@ package org.springframework.data.jdbc.core.convert;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.springframework.data.domain.Pageable;
@ -157,7 +156,7 @@ class SqlGenerator { @@ -157,7 +156,7 @@ class SqlGenerator {
}
private BindMarker getBindMarker(SqlIdentifier columnName) {
return SQL.bindMarker(":" + BindParameterNameSanitizer.INSTANCE.sanitize(renderReference(columnName)));
return SQL.bindMarker(":" + BindParameterNameSanitizer.sanitize(renderReference(columnName)));
}
/**
@ -651,7 +650,7 @@ class SqlGenerator { @@ -651,7 +650,7 @@ class SqlGenerator {
private String createUpdateWithVersionSql() {
Update update = createBaseUpdate() //
.and(getVersionColumn().isEqualTo(SQL.bindMarker(":" + renderReference(VERSION_SQL_PARAMETER)))) //
.and(getVersionColumn().isEqualTo(getBindMarker(VERSION_SQL_PARAMETER))) //
.build();
return render(update);
@ -685,7 +684,7 @@ class SqlGenerator { @@ -685,7 +684,7 @@ class SqlGenerator {
private String createDeleteByIdAndVersionSql() {
Delete delete = createBaseDeleteById(getTable()) //
.and(getVersionColumn().isEqualTo(SQL.bindMarker(":" + renderReference(VERSION_SQL_PARAMETER)))) //
.and(getVersionColumn().isEqualTo(getBindMarker(VERSION_SQL_PARAMETER))) //
.build();
return render(delete);
@ -694,13 +693,13 @@ class SqlGenerator { @@ -694,13 +693,13 @@ class SqlGenerator {
private DeleteBuilder.DeleteWhereAndOr createBaseDeleteById(Table table) {
return Delete.builder().from(table)
.where(getIdColumn().isEqualTo(SQL.bindMarker(":" + renderReference(ID_SQL_PARAMETER))));
.where(getIdColumn().isEqualTo(getBindMarker(ID_SQL_PARAMETER)));
}
private DeleteBuilder.DeleteWhereAndOr createBaseDeleteByIdIn(Table table) {
return Delete.builder().from(table)
.where(getIdColumn().in(SQL.bindMarker(":" + renderReference(IDS_SQL_PARAMETER))));
.where(getIdColumn().in(getBindMarker(IDS_SQL_PARAMETER)));
}
private String createDeleteByPathAndCriteria(PersistentPropertyPathExtension path,

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

@ -68,7 +68,7 @@ class SqlIdentifierParameterSource extends AbstractSqlParameterSource { @@ -68,7 +68,7 @@ class SqlIdentifierParameterSource extends AbstractSqlParameterSource {
void addValue(SqlIdentifier identifier, Object value, int sqlType) {
identifiers.add(identifier);
String name = BindParameterNameSanitizer.INSTANCE.sanitize(identifier.getReference(identifierProcessing));
String name = BindParameterNameSanitizer.sanitize(identifier.getReference(identifierProcessing));
namesToValues.put(name, value);
registerSqlType(name, sqlType);
}

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

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
/*
* Copyright 2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.jdbc.core.convert;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
/**
* Unit tests for {@link BindParameterNameSanitizer}.
*
* @author Mark Paluch
*/
class BindParameterNameSanitizerUnitTests {
@Test
void shouldSanitizeNames() {
assertThat(BindParameterNameSanitizer.sanitize("___oldOptimisticLockingVersion"))
.isEqualTo("___oldOptimisticLockingVersion");
assertThat(BindParameterNameSanitizer.sanitize("fooBar")).isEqualTo("fooBar");
assertThat(BindParameterNameSanitizer.sanitize("one.two.three")).isEqualTo("onetwothree");
}
}
Loading…
Cancel
Save