From 969c6547fe460e906fe75240bc082799d1979f5a Mon Sep 17 00:00:00 2001 From: toyeshhm Date: Sun, 8 Nov 2026 10:01:36 -0600 Subject: [PATCH] Fix DBeaver IndexOutOfBoundsException when a file starts with SET --- CHANGES.md | 1 + .../sql/dbeaver/SQLTokenizedFormatter.java | 4 ++++ plugin-gradle/CHANGES.md | 1 + plugin-maven/CHANGES.md | 1 + .../main/resources/sql/dbeaver/set-mode.clean | 2 ++ .../main/resources/sql/dbeaver/set-mode.dirty | 1 + .../sql/DBeaverSQLFormatterStepTest.java | 22 ++++++++++++++++++- 7 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 testlib/src/main/resources/sql/dbeaver/set-mode.clean create mode 100644 testlib/src/main/resources/sql/dbeaver/set-mode.dirty diff --git a/CHANGES.md b/CHANGES.md index eb93716703..5a63e97410 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Fixed - GrEclipse no longer leaves a `file%3A...` directory in the working directory. ([#2019](https://github.com/diffplug/spotless/issues/2019)) +- DBeaver SQL formatter no longer prints an `IndexOutOfBoundsException` when a file starts with a keyword like `SET`. ([#1552](https://github.com/diffplug/spotless/issues/1552)) ## [4.11.0] - 2026-11-02 ### 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 bad5d4a64a..af38b1631b 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 @@ -431,6 +431,10 @@ && isCommentLine(SQL_DIALECT, token.getString()) boolean isDelimiter = statementDelimiters.contains(token.getString().toUpperCase(Locale.ENGLISH)); if (!isDelimiter) { + if (argIndex == 0) { + // nothing precedes the first token, so there is no line to break + return 0; + } token = argList.get(argIndex - 1); if (token.getType() == TokenType.SPACE) { token.setString(s.toString()); diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 5aaef36403..f4217fd640 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -5,6 +5,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Fixed - GrEclipse no longer leaves a `file%3A...` directory in the working directory. ([#2019](https://github.com/diffplug/spotless/issues/2019)) +- DBeaver SQL formatter no longer prints an `IndexOutOfBoundsException` when a file starts with a keyword like `SET`. ([#1552](https://github.com/diffplug/spotless/issues/1552)) ## [8.11.0] - 2026-11-02 ### Added diff --git a/plugin-maven/CHANGES.md b/plugin-maven/CHANGES.md index 4081c6671e..0c8019dc49 100644 --- a/plugin-maven/CHANGES.md +++ b/plugin-maven/CHANGES.md @@ -5,6 +5,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Fixed - GrEclipse no longer leaves a `file%3A...` directory in the working directory. ([#2019](https://github.com/diffplug/spotless/issues/2019)) +- DBeaver SQL formatter no longer prints an `IndexOutOfBoundsException` when a file starts with a keyword like `SET`. ([#1552](https://github.com/diffplug/spotless/issues/1552)) ## [3.11.0] - 2026-11-02 ### Added diff --git a/testlib/src/main/resources/sql/dbeaver/set-mode.clean b/testlib/src/main/resources/sql/dbeaver/set-mode.clean new file mode 100644 index 0000000000..30e7fdc679 --- /dev/null +++ b/testlib/src/main/resources/sql/dbeaver/set-mode.clean @@ -0,0 +1,2 @@ +SET +MODE PostgreSQL; diff --git a/testlib/src/main/resources/sql/dbeaver/set-mode.dirty b/testlib/src/main/resources/sql/dbeaver/set-mode.dirty new file mode 100644 index 0000000000..81ae754394 --- /dev/null +++ b/testlib/src/main/resources/sql/dbeaver/set-mode.dirty @@ -0,0 +1 @@ +SET MODE PostgreSQL; diff --git a/testlib/src/test/java/com/diffplug/spotless/sql/DBeaverSQLFormatterStepTest.java b/testlib/src/test/java/com/diffplug/spotless/sql/DBeaverSQLFormatterStepTest.java index 648ddc6669..24c6be0b19 100644 --- a/testlib/src/test/java/com/diffplug/spotless/sql/DBeaverSQLFormatterStepTest.java +++ b/testlib/src/test/java/com/diffplug/spotless/sql/DBeaverSQLFormatterStepTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2024 DiffPlug + * Copyright 2016-2026 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,11 @@ */ package com.diffplug.spotless.sql; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; import java.util.Collections; import java.util.List; @@ -39,6 +43,22 @@ void behavior() { .testResource("sql/dbeaver/jdbi-params.dirty", "sql/dbeaver/jdbi-params.clean"); } + @Test + void keywordAtStartOfFileDoesNotThrow() { + // https://github.com/diffplug/spotless/issues/1552 + PrintStream originalErr = System.err; + ByteArrayOutputStream err = new ByteArrayOutputStream(); + System.setErr(new PrintStream(err, true)); + try { + FormatterStep step = DBeaverSQLFormatterStep.create(Collections.emptySet()); + StepHarness.forStep(step) + .testResource("sql/dbeaver/set-mode.dirty", "sql/dbeaver/set-mode.clean"); + } finally { + System.setErr(originalErr); + } + assertThat(err.toString()).isEmpty(); + } + @Test void behaviorWithConfigFile() { FormatterStep step = DBeaverSQLFormatterStep.create(createTestFiles("sql/dbeaver/sqlConfig.properties"));