diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java index bbaf8414f6..81e0aa66ca 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Escaper.java @@ -27,6 +27,7 @@ * * @author Roman Chigvintsev * @author Mark Paluch + * @author Alexander Tochin * @since 2.0 */ public class Escaper { @@ -84,6 +85,7 @@ public char getEscapeCharacter() { /** * 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 char getEscapeCharacter() { 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; } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java index ce51101c30..68195470dd 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/EscaperUnitTests.java @@ -24,6 +24,7 @@ * * @author Roman Chigvintsev * @author Mark Paluch + * @author Alexander Tochin */ public class EscaperUnitTests { @@ -71,4 +72,16 @@ public void escapesSpecialCharactersUsingCustomEscapeCharacter() { 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$_"); + } }