Browse Source

Escaper escapes the escape character itself.

Closes #2182
Original pull request #2189

Signed-off-by: Alexander Tochin <alterant@gmail.com>
pull/2200/merge
Alexander Tochin 2 weeks ago committed by Jens Schauder
parent
commit
0a221af152
No known key found for this signature in database
GPG Key ID: 2BE5D185CD2A1CE6
  1. 9
      spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java
  2. 13
      spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java

9
spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java

@ -27,6 +27,7 @@ import org.jspecify.annotations.Nullable; @@ -27,6 +27,7 @@ import org.jspecify.annotations.Nullable;
*
* @author Roman Chigvintsev
* @author Mark Paluch
* @author Alexander Tochin
* @since 2.0
*/
public class Escaper {
@ -84,6 +85,7 @@ public class Escaper { @@ -84,6 +85,7 @@ public class Escaper {
/**
* Escapes all special like characters ({@code _}, {@code %}) using the configured escape character.
* Escape character itself is also escaped.
*
* @param value value to be escaped
* @return escaped value
@ -94,6 +96,11 @@ public class Escaper { @@ -94,6 +96,11 @@ public class Escaper {
return null;
}
return toReplace.stream().reduce(value, (it, character) -> it.replace(character, escapeCharacter + character));
String escapeCharString = String.valueOf(escapeCharacter);
String escapedValue = value.replace(escapeCharString, escapeCharString.repeat(2));
for (String character : toReplace) {
escapedValue = escapedValue.replace(character, escapeCharacter + character);
}
return escapedValue;
}
}

13
spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java

@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test;
*
* @author Roman Chigvintsev
* @author Mark Paluch
* @author Alexander Tochin
*/
public class EscaperUnitTests {
@ -71,4 +72,16 @@ public class EscaperUnitTests { @@ -71,4 +72,16 @@ public class EscaperUnitTests {
public void escapesAdditionalCharacters() {
assertThat(Escaper.DEFAULT.withRewriteFor("[", "]").escape("Hello Wo[Rr]ld")).isEqualTo("Hello Wo\\[Rr\\]ld");
}
@Test // GH-2182
public void escapesCharactersUsingDefaultEscapeCharacter() {
assertThat(Escaper.DEFAULT.escape("%te\\st_")).isEqualTo("\\%te\\\\st\\_");
//assertThat(Escaper.of('$').escape("_%")).isEqualTo("$_$%");
}
@Test // GH-2182
public void escapesCharactersUsingCustomEscapeCharacter() {
assertThat(Escaper.DEFAULT.escape("%te\\st_")).isEqualTo("\\%te\\\\st\\_");
assertThat(Escaper.of('$').escape("%te$st_")).isEqualTo("$%te$$st$_");
}
}

Loading…
Cancel
Save