From 8c8033d7057d65a2f64b775d2f253b954e826631 Mon Sep 17 00:00:00 2001 From: mjh Date: Thu, 1 Feb 2024 14:40:15 +0800 Subject: [PATCH] feat: support keyword "only" for postgresql --- .../statement/select/PlainSelect.java | 21 ++++++++++++++++++- .../util/deparser/SelectDeParser.java | 3 +++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 4 ++++ .../statement/select/SelectTest.java | 7 +++++++ 4 files changed, 34 insertions(+), 1 deletion(-) 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 72a4e530c..560622c67 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java @@ -65,6 +65,8 @@ public class PlainSelect extends Select { */ private boolean isUsingFinal = false; + private boolean isUsingOnly = false; + @Deprecated public boolean isUseBrackets() { return false; @@ -213,6 +215,19 @@ public PlainSelect withUsingFinal(boolean usingFinal) { return this; } + public boolean isUsingOnly() { + return isUsingOnly; + } + + public void setUsingOnly(boolean usingOnly) { + isUsingOnly = usingOnly; + } + + public PlainSelect withUsingOnly(boolean usingOnly) { + this.setUsingOnly(usingOnly); + return this; + } + @Override public void accept(SelectVisitor selectVisitor) { selectVisitor.visit(this); @@ -439,7 +454,11 @@ public StringBuilder appendSelectBodyTo(StringBuilder builder) { } if (fromItem != null) { - builder.append(" FROM ").append(fromItem); + builder.append(" FROM "); + if (isUsingOnly) { + builder.append("ONLY "); + } + builder.append(fromItem); if (lateralViews != null) { for (LateralView lateralView : lateralViews) { builder.append(" ").append(lateralView); 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 a6b718baf..832989022 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -210,6 +210,9 @@ public void visit(PlainSelect plainSelect) { if (plainSelect.getFromItem() != null) { buffer.append(" FROM "); + if (plainSelect.isUsingOnly()) { + buffer.append("ONLY "); + } plainSelect.getFromItem().accept(this); if (plainSelect.getFromItem() instanceof Table) { diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index f757a02ad..13e5d2dd6 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -2277,6 +2277,10 @@ PlainSelect PlainSelect() #PlainSelect: [ lateralViews=LateralViews() ] [ LOOKAHEAD(2) joins=JoinsList() ] ] + [ LOOKAHEAD(3) { plainSelect.setUsingOnly(true); } fromItem=FromItem() + [ lateralViews=LateralViews() ] + [ LOOKAHEAD(2) joins=JoinsList() ] + ] // Clickhouse FINAL as shown at https://clickhouse.com/docs/en/operations/settings/settings#final [ LOOKAHEAD(2) { plainSelect.setUsingFinal(true); } ] diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index 527313bfe..781b3af59 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -5806,4 +5806,11 @@ public void testIssue1907() throws JSQLParserException { "SELECT * FROM (SELECT year, person, SUM(amount) FROM rentals GROUP BY year, person) t1 ORDER BY year DESC WITH ROLLUP"; assertSqlCanBeParsedAndDeparsed(stmt2); } + + @Test + public void testIssue1908() throws JSQLParserException { + // postgresql14 + String stmt = "SELECT * FROM ONLY sys_business_rule"; + assertSqlCanBeParsedAndDeparsed(stmt); + } }