diff --git a/README.md b/README.md index ddb724a51..a8b25c847 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,12 @@ Also I would like to know about needed examples or documentation stuff. ## Extensions in the latest SNAPSHOT version 0.9.2 +* first support for *FOR UPDATE* + +```sql +SELECT * FROM user_table FOR UPDATE +``` + ```sql UPDATE mytable SET (col) = (SELECT a FROM mytable2) ``` diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java index a21500420..ade631fba 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java @@ -50,6 +50,7 @@ public class PlainSelect implements SelectBody { private Top top; private OracleHierarchicalExpression oracleHierarchical = null; private boolean oracleSiblings = false; + private boolean forUpdate = false; /** * The {@link FromItem} in this query @@ -205,6 +206,14 @@ public void setOracleSiblings(boolean oracleSiblings) { this.oracleSiblings = oracleSiblings; } + public boolean isForUpdate() { + return forUpdate; + } + + public void setForUpdate(boolean forUpdate) { + this.forUpdate = forUpdate; + } + @Override public String toString() { StringBuilder sql = new StringBuilder("SELECT "); @@ -260,6 +269,9 @@ public String toString() { if (fetch != null) { sql.append(fetch); } + if (isForUpdate()) { + sql.append(" FOR UPDATE"); + } } return sql.toString(); } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java index d13a9a921..357ce70cc 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -140,6 +140,9 @@ public void visit(PlainSelect plainSelect) { if (plainSelect.getFetch() != null) { deparseFetch(plainSelect.getFetch()); } + if (plainSelect.isForUpdate()) { + buffer.append(" FOR UPDATE"); + } } diff --git a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj index b5d7b0eec..116d85b71 100644 --- a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj +++ b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj @@ -624,6 +624,8 @@ PlainSelect PlainSelect(): [LOOKAHEAD() offset = Offset() { plainSelect.setOffset(offset); } ] [LOOKAHEAD() fetch = Fetch() { plainSelect.setFetch(fetch); } ] + [ { plainSelect.setForUpdate(true); } ] + { plainSelect.setSelectItems(selectItems); plainSelect.setFromItem(fromItem); diff --git a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java index df19fa80f..2f1313031 100644 --- a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java @@ -1616,4 +1616,9 @@ public void testJsonExpression() throws JSQLParserException { public void testSelectInto1() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * INTO user_copy FROM user"); } + + public void testSelectForUpdate() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("SELECT * FROM user_table FOR UPDATE"); + } + }