Skip to content

Commit 64b22e4

Browse files
committed
fixes #126 - allows brackets around select
1 parent ac785a4 commit 64b22e4

File tree

6 files changed

+45
-11
lines changed

6 files changed

+45
-11
lines changed

src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ public class PlainSelect implements SelectBody {
5252
private boolean oracleSiblings = false;
5353
private boolean forUpdate = false;
5454
private Table forUpdateTable = null;
55+
private boolean useBrackets = false;
56+
57+
public boolean isUseBrackets() {
58+
return useBrackets;
59+
}
60+
61+
public void setUseBrackets(boolean useBrackets) {
62+
this.useBrackets = useBrackets;
63+
}
5564

5665
/**
5766
* The {@link FromItem} in this query
@@ -232,7 +241,11 @@ public void setForUpdateTable(Table forUpdateTable) {
232241

233242
@Override
234243
public String toString() {
235-
StringBuilder sql = new StringBuilder("SELECT ");
244+
StringBuilder sql = new StringBuilder();
245+
if (useBrackets) {
246+
sql.append("(");
247+
}
248+
sql.append("SELECT ");
236249
if (distinct != null) {
237250
sql.append(distinct).append(" ");
238251
}
@@ -293,6 +306,9 @@ public String toString() {
293306
}
294307
}
295308
}
309+
if (useBrackets) {
310+
sql.append(")");
311+
}
296312
return sql.toString();
297313
}
298314

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public SelectDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer)
5252

5353
@Override
5454
public void visit(PlainSelect plainSelect) {
55+
if (plainSelect.isUseBrackets()) {
56+
buffer.append("(");
57+
}
5558
buffer.append("SELECT ");
5659
if (plainSelect.getDistinct() != null) {
5760
buffer.append("DISTINCT ");
@@ -146,7 +149,9 @@ public void visit(PlainSelect plainSelect) {
146149
buffer.append(" OF ").append(plainSelect.getForUpdateTable());
147150
}
148151
}
149-
152+
if (plainSelect.isUseBrackets()) {
153+
buffer.append(")");
154+
}
150155
}
151156

152157
@Override

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -466,12 +466,15 @@ Insert Insert():
466466

467467
|
468468

469-
[LOOKAHEAD(2) "(" { useSelectBrackets = true; }]
470469
(
471-
{ insert.setUseValues(false); }
472-
select = Select()
473-
)
474-
[ ")" ]
470+
LOOKAHEAD(2) "(" { useSelectBrackets = true; }
471+
{ insert.setUseValues(false); }
472+
select = Select()
473+
")"
474+
|
475+
{ insert.setUseValues(false); }
476+
select = Select()
477+
)
475478
)
476479

477480
[ <K_RETURNING> (
@@ -591,9 +594,9 @@ Select Select():
591594
List<WithItem> with = null;
592595
}
593596
{
594-
[ with=WithList() { select.setWithItemsList(with); } ]
595-
selectBody = SelectBody()
597+
[ with=WithList() { } ] selectBody = SelectBody()
596598
{
599+
select.setWithItemsList(with);
597600
select.setSelectBody(selectBody);
598601
return select;
599602
}
@@ -607,6 +610,8 @@ SelectBody SelectBody():
607610
selectBody = SetOperationList()
608611
|
609612
selectBody = PlainSelect()
613+
|
614+
( "(" selectBody = PlainSelect() { ((PlainSelect)selectBody).setUseBrackets(true); } ")" )
610615
)
611616
{ return selectBody; }
612617
}

src/test/java/net/sf/jsqlparser/test/create/CreateViewTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void testCreateViewWithColumnNames1() throws JSQLParserException {
5151

5252
public void testCreateView5() throws JSQLParserException {
5353
String statement = "CREATE VIEW myview AS (SELECT * FROM mytab)";
54-
String statement2 = "CREATE VIEW myview AS SELECT * FROM mytab";
54+
String statement2 = "CREATE VIEW myview AS (SELECT * FROM mytab)";
5555
CreateView createView = (CreateView) parserManager.parse(new StringReader(statement));
5656
assertFalse(createView.isOrReplace());
5757
assertEquals("myview", createView.getView().getName());

src/test/java/net/sf/jsqlparser/test/select/SelectTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,4 +1712,12 @@ public void testSelectBrackets4() throws JSQLParserException {
17121712
public void testSelectForUpdateOfTable() throws JSQLParserException {
17131713
assertSqlCanBeParsedAndDeparsed("SELECT foo.*, bar.* FROM foo, bar WHERE foo.id = bar.foo_id FOR UPDATE OF foo");
17141714
}
1715+
1716+
public void testSelectWithBrackets() throws JSQLParserException {
1717+
assertSqlCanBeParsedAndDeparsed("(SELECT 1 FROM mytable)");
1718+
}
1719+
1720+
public void testSelectWithBrackets2() throws JSQLParserException {
1721+
assertSqlCanBeParsedAndDeparsed("(SELECT 1)");
1722+
}
17151723
}

src/test/java/net/sf/jsqlparser/test/select/SpecialOracleTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void testAllSqlsParseDeparse() throws IOException {
6868
}
6969

7070
LOG.log(Level.INFO, "tested {0} files. got {1} correct parse results", new Object[]{count, success});
71-
assertTrue(success>=121);
71+
assertTrue(success>=122);
7272
}
7373

7474
@Test

0 commit comments

Comments
 (0)