diff --git a/CHANGES.md b/CHANGES.md index 6ccbfade93..4e851dcc21 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ This document is intended for Spotless developers. We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `1.27.0`). ## [Unreleased] +### Fixed +* Preserve case of JDBI named bind params that collide with SQL keywords (e.g. `:limit`, `:offset`) in the DBeaver SQL formatter. ## [4.5.0] - 2026-03-18 ### Added diff --git a/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java b/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java index 52665bf716..54586c1d95 100644 --- a/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java +++ b/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java @@ -95,9 +95,13 @@ private List format(final List argList) { } final KeywordCase keywordCase = formatterCfg.getKeywordCase(); - for (FormatterToken anArgList : argList) { - token = anArgList; + for (int index = 0; index < argList.size(); index++) { + token = argList.get(index); if (token.getType() == TokenType.KEYWORD) { + // Do not transform case for JDBI named bind params (e.g. :limit, :offset) + if (index > 0 && isEmbeddedToken(argList.get(index - 1))) { + continue; + } token.setString(keywordCase.transform(token.getString())); } } @@ -323,8 +327,10 @@ private List format(final List argList) { continue; } if (token.getType() == TokenType.SYMBOL && isEmbeddedToken(token) + && (!":".equals(token.getString()) || prev.getType() == TokenType.SYMBOL) || prev.getType() == TokenType.SYMBOL && isEmbeddedToken(prev)) { - // Do not insert spaces around colons + // Do not insert spaces around embedded tokens (colons, dots), + // except before JDBI named bind params (e.g. :limit) preceded by a keyword or name continue; } if (token.getType() == TokenType.SYMBOL && prev.getType() == TokenType.SYMBOL) { diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 69d68eb09f..598651fde6 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -3,6 +3,8 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `3.27.0`). ## [Unreleased] +### Fixed +* Preserve case of JDBI named bind params that collide with SQL keywords (e.g. `:limit`, `:offset`) in the DBeaver SQL formatter. ## [8.4.0] - 2026-03-18 ### Added diff --git a/plugin-maven/CHANGES.md b/plugin-maven/CHANGES.md index f2af1a3388..cb53547f67 100644 --- a/plugin-maven/CHANGES.md +++ b/plugin-maven/CHANGES.md @@ -3,6 +3,8 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `1.27.0`). ## [Unreleased] +### Fixed +* Preserve case of JDBI named bind params that collide with SQL keywords (e.g. `:limit`, `:offset`) in the DBeaver SQL formatter. ## [3.4.0] - 2026-03-18 ### Added diff --git a/testlib/src/main/resources/sql/dbeaver/jdbi-params.clean b/testlib/src/main/resources/sql/dbeaver/jdbi-params.clean index be0934772a..fb00272a51 100644 --- a/testlib/src/main/resources/sql/dbeaver/jdbi-params.clean +++ b/testlib/src/main/resources/sql/dbeaver/jdbi-params.clean @@ -5,3 +5,10 @@ FROM WHERE id IN() AND user_id =:user_id; + +SELECT + * +FROM + TABLE + WHERE + id =:id LIMIT :limit OFFSET :offset; diff --git a/testlib/src/main/resources/sql/dbeaver/jdbi-params.dirty b/testlib/src/main/resources/sql/dbeaver/jdbi-params.dirty index 3193e724a9..b94db0fdb3 100644 --- a/testlib/src/main/resources/sql/dbeaver/jdbi-params.dirty +++ b/testlib/src/main/resources/sql/dbeaver/jdbi-params.dirty @@ -1 +1,2 @@ SELECT * FROM table WHERE id IN () AND user_id = :user_id; +SELECT * FROM table WHERE id = :id LIMIT :limit OFFSET :offset;