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..3ca0b61d0 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,10 @@ 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..4b71a4830 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); + } }