From 4cf31e306bfce82f247c7015d6ab59ce08d57f1f Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Fri, 10 Oct 2025 12:21:12 +0200 Subject: [PATCH 1/2] [feat] Support for FOR READ ONLY/FOR FETCH ONLY --- .../sf/jsqlparser/statement/select/ForMode.java | 6 +++++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 ++ .../sf/jsqlparser/statement/select/DB2Test.java | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java index 846faf9ed..a651cf9e8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java @@ -20,7 +20,11 @@ public enum ForMode { NO_KEY_UPDATE("NO KEY UPDATE"), - KEY_SHARE("KEY SHARE"); + KEY_SHARE("KEY SHARE"), + + // https://www.ibm.com/docs/en/db2-for-zos/13.0.0?topic=statement-read-only-clause + READ_ONLY("READ ONLY"), + FETCH_ONLY("FETCH ONLY"); private final String value; diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 83bcacaa8..d27b640ca 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4247,6 +4247,8 @@ PlainSelect PlainSelect() #PlainSelect: | { plainSelect.setForMode(ForMode.SHARE); } | ( { plainSelect.setForMode(ForMode.NO_KEY_UPDATE); }) | ( { plainSelect.setForMode(ForMode.KEY_SHARE); }) + | ( { plainSelect.setForMode(ForMode.READ_ONLY); }) + | ( { plainSelect.setForMode(ForMode.FETCH_ONLY); }) ) [ LOOKAHEAD(2) updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ] [ LOOKAHEAD() wait = Wait() { plainSelect.setWait(wait); } ] diff --git a/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java b/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java index 296aab55d..b18e3571a 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java @@ -12,6 +12,8 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class DB2Test { @Test @@ -20,4 +22,16 @@ void testDB2SpecialRegister() throws JSQLParserException { "SELECT * FROM TABLE1 where COL_WITH_TIMESTAMP <= CURRENT TIMESTAMP - CURRENT TIMEZONE"; TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + + @ParameterizedTest + @ValueSource( strings = { + "SELECT * FROM table WITH UR", + "SELECT * FROM table WITH UR FOR READ ONLY", + "SELECT * FROM table FOR READ ONLY", + "SELECT * FROM table FOR FETCH ONLY", + "SELECT * FROM table FETCH FIRST 100 ROWS ONLY FOR READ ONLY" + }) + void testWithIsolationLevelAndReadOnlyModes(String sqlStr) throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } } From 80772d3c7c506934bd127484815282a3ccfa0bc5 Mon Sep 17 00:00:00 2001 From: Andreas Neumann Date: Fri, 10 Oct 2025 12:28:44 +0200 Subject: [PATCH 2/2] [chore] Spotless --- src/main/java/net/sf/jsqlparser/statement/select/ForMode.java | 3 +-- src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java index a651cf9e8..3ca0b61d0 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/ForMode.java @@ -23,8 +23,7 @@ public enum ForMode { KEY_SHARE("KEY SHARE"), // https://www.ibm.com/docs/en/db2-for-zos/13.0.0?topic=statement-read-only-clause - READ_ONLY("READ ONLY"), - FETCH_ONLY("FETCH ONLY"); + READ_ONLY("READ ONLY"), FETCH_ONLY("FETCH ONLY"); private final String value; diff --git a/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java b/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java index b18e3571a..4b71a4830 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/DB2Test.java @@ -24,7 +24,7 @@ void testDB2SpecialRegister() throws JSQLParserException { } @ParameterizedTest - @ValueSource( strings = { + @ValueSource(strings = { "SELECT * FROM table WITH UR", "SELECT * FROM table WITH UR FOR READ ONLY", "SELECT * FROM table FOR READ ONLY",