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 3 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;
* *
* @author Roman Chigvintsev * @author Roman Chigvintsev
* @author Mark Paluch * @author Mark Paluch
* @author Alexander Tochin
* @since 2.0 * @since 2.0
*/ */
public class Escaper { public class Escaper {
@ -84,6 +85,7 @@ public class Escaper {
/** /**
* Escapes all special like characters ({@code _}, {@code %}) using the configured escape character. * Escapes all special like characters ({@code _}, {@code %}) using the configured escape character.
* Escape character itself is also escaped.
* *
* @param value value to be escaped * @param value value to be escaped
* @return escaped value * @return escaped value
@ -94,6 +96,11 @@ public class Escaper {
return null; 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;
* *
* @author Roman Chigvintsev * @author Roman Chigvintsev
* @author Mark Paluch * @author Mark Paluch
* @author Alexander Tochin
*/ */
public class EscaperUnitTests { public class EscaperUnitTests {
@ -71,4 +72,16 @@ public class EscaperUnitTests {
public void escapesAdditionalCharacters() { public void escapesAdditionalCharacters() {
assertThat(Escaper.DEFAULT.withRewriteFor("[", "]").escape("Hello Wo[Rr]ld")).isEqualTo("Hello Wo\\[Rr\\]ld"); 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