diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java index dc6717f591..c915d081be 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java @@ -56,12 +56,12 @@ abstract class NamedParameterUtils { /** * Set of characters that qualify as comment or quote starting characters. */ - private static final String[] START_SKIP = {"'", "\"", "--", "/*"}; + private static final String[] START_SKIP = {"'", "\"", "--", "/*", "`"}; /** * Set of characters that are the corresponding comment or quote ending characters. */ - private static final String[] STOP_SKIP = {"'", "\"", "\n", "*/"}; + private static final String[] STOP_SKIP = {"'", "\"", "\n", "*/", "`"}; /** * Set of characters that qualify as parameter separators, diff --git a/spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java b/spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java index e0c224292a..6d23d48103 100644 --- a/spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java +++ b/spring-r2dbc/src/test/java/org/springframework/r2dbc/core/NamedParameterUtilsTests.java @@ -251,6 +251,7 @@ class NamedParameterUtilsTests { "SELECT /*:doo*/':foo', :xxx FROM DUAL", "SELECT ':foo'/*:doo*/, :xxx FROM DUAL", "SELECT \":foo\"\":doo\", :xxx FROM DUAL", + "SELECT `:foo``:doo`, :xxx FROM DUAL" }) void parseSqlStatementWithParametersInsideQuotesAndComments(String sql) { ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); @@ -289,6 +290,14 @@ class NamedParameterUtilsTests { assertThat(psql.getParameterNames()).containsExactly("headers[id]"); } + @Test // gh-31944 / gh-32285 + void parseSqlStatementWithBackticks() { + String sql = "select * from `tb&user` where id = :id"; + ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); + assertThat(parsedSql.getParameterNames()).containsExactly("id"); + assertThat(expand(parsedSql)).isEqualTo("select * from `tb&user` where id = $1"); + } + @Test void shouldAllowParsingMultipleUseOfParameter() { String sql = "SELECT * FROM person where name = :id or lastname = :id";