From bc2895a30bb37b339c3630d296119eb1ae09dec5 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:05:40 +0100 Subject: [PATCH] Support backticks for quoted identifiers in spring-r2dbc NamedParameterUtils in spring-r2dbc now supports MySQL-style backticks for quoted identifiers for consistency with spring-jdbc. See gh-31944 Closes gh-32285 --- .../springframework/r2dbc/core/NamedParameterUtils.java | 4 ++-- .../r2dbc/core/NamedParameterUtilsTests.java | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 dc6717f591d..c915d081be5 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 e0c224292a9..6d23d481037 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";