Skip to content

Commit 67b178b

Browse files
committed
fixed #226
1 parent 04e5c8b commit 67b178b

File tree

5 files changed

+136
-117
lines changed

5 files changed

+136
-117
lines changed

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

Lines changed: 111 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -32,101 +32,115 @@
3232
*/
3333
public class SetOperationList implements SelectBody {
3434

35-
private List<SelectBody> selects;
36-
private List<SetOperation> operations;
37-
private List<OrderByElement> orderByElements;
38-
private Limit limit;
39-
private Offset offset;
40-
private Fetch fetch;
41-
42-
@Override
43-
public void accept(SelectVisitor selectVisitor) {
44-
selectVisitor.visit(this);
45-
}
46-
47-
public List<OrderByElement> getOrderByElements() {
48-
return orderByElements;
49-
}
50-
51-
public List<SelectBody> getSelects() {
52-
return selects;
53-
}
54-
55-
public List<SetOperation> getOperations() {
56-
return operations;
57-
}
58-
59-
public void setOrderByElements(List<OrderByElement> orderByElements) {
60-
this.orderByElements = orderByElements;
61-
}
62-
63-
public void setOpsAndSelects(List<SelectBody> select, List<SetOperation> ops) {
64-
selects = select;
65-
operations = ops;
66-
67-
if (select.size() - 1 != ops.size()) {
68-
throw new IllegalArgumentException("list sizes are not valid");
69-
}
70-
}
71-
72-
public Limit getLimit() {
73-
return limit;
74-
}
75-
76-
public void setLimit(Limit limit) {
77-
this.limit = limit;
78-
}
79-
80-
public Offset getOffset() {
81-
return offset;
82-
}
83-
84-
public void setOffset(Offset offset) {
85-
this.offset = offset;
86-
}
87-
88-
public Fetch getFetch() {
89-
return fetch;
90-
}
91-
92-
public void setFetch(Fetch fetch) {
93-
this.fetch = fetch;
94-
}
95-
96-
@Override
97-
public String toString() {
98-
StringBuilder buffer = new StringBuilder();
99-
100-
for (int i = 0; i < selects.size(); i++) {
101-
if (i != 0) {
102-
buffer.append(" ").append(operations.get(i - 1).toString()).append(" ");
103-
}
104-
buffer.append("(").append(selects.get(i).toString()).append(")");
105-
}
106-
107-
if (orderByElements != null) {
108-
buffer.append(PlainSelect.orderByToString(orderByElements));
109-
}
110-
if (limit != null) {
111-
buffer.append(limit.toString());
112-
}
113-
if (offset != null) {
114-
buffer.append(offset.toString());
115-
}
116-
if (fetch != null) {
117-
buffer.append(fetch.toString());
118-
}
119-
return buffer.toString();
120-
}
121-
122-
/**
123-
* list of set operations.
124-
*/
125-
public enum SetOperationType {
126-
127-
INTERSECT,
128-
EXCEPT,
129-
MINUS,
130-
UNION
131-
}
35+
private List<SelectBody> selects;
36+
private List<Boolean> brackets;
37+
private List<SetOperation> operations;
38+
private List<OrderByElement> orderByElements;
39+
private Limit limit;
40+
private Offset offset;
41+
private Fetch fetch;
42+
43+
@Override
44+
public void accept(SelectVisitor selectVisitor) {
45+
selectVisitor.visit(this);
46+
}
47+
48+
public List<OrderByElement> getOrderByElements() {
49+
return orderByElements;
50+
}
51+
52+
public List<SelectBody> getSelects() {
53+
return selects;
54+
}
55+
56+
public List<SetOperation> getOperations() {
57+
return operations;
58+
}
59+
60+
public List<Boolean> getBrackets() {
61+
return brackets;
62+
}
63+
64+
public void setBrackets(List<Boolean> brackets) {
65+
this.brackets = brackets;
66+
}
67+
68+
public void setOrderByElements(List<OrderByElement> orderByElements) {
69+
this.orderByElements = orderByElements;
70+
}
71+
72+
public void setBracketsOpsAndSelects(List<Boolean> brackets, List<SelectBody> select, List<SetOperation> ops) {
73+
selects = select;
74+
operations = ops;
75+
this.brackets = brackets;
76+
77+
if (select.size() - 1 != ops.size() || select.size() != brackets.size()) {
78+
throw new IllegalArgumentException("list sizes are not valid");
79+
}
80+
}
81+
82+
public Limit getLimit() {
83+
return limit;
84+
}
85+
86+
public void setLimit(Limit limit) {
87+
this.limit = limit;
88+
}
89+
90+
public Offset getOffset() {
91+
return offset;
92+
}
93+
94+
public void setOffset(Offset offset) {
95+
this.offset = offset;
96+
}
97+
98+
public Fetch getFetch() {
99+
return fetch;
100+
}
101+
102+
public void setFetch(Fetch fetch) {
103+
this.fetch = fetch;
104+
}
105+
106+
@Override
107+
public String toString() {
108+
StringBuilder buffer = new StringBuilder();
109+
110+
for (int i = 0; i < selects.size(); i++) {
111+
if (i != 0) {
112+
buffer.append(" ").append(operations.get(i - 1).toString()).append(" ");
113+
}
114+
if (brackets==null || brackets.get(i)) {
115+
buffer.append("(").append(selects.get(i).toString()).append(")");
116+
} else {
117+
buffer.append(selects.get(i).toString());
118+
}
119+
}
120+
121+
if (orderByElements != null) {
122+
buffer.append(PlainSelect.orderByToString(orderByElements));
123+
}
124+
if (limit != null) {
125+
buffer.append(limit.toString());
126+
}
127+
if (offset != null) {
128+
buffer.append(offset.toString());
129+
}
130+
if (fetch != null) {
131+
buffer.append(fetch.toString());
132+
}
133+
return buffer.toString();
134+
}
135+
136+
/**
137+
* list of set operations.
138+
*/
139+
public enum SetOperationType {
140+
141+
INTERSECT,
142+
EXCEPT,
143+
MINUS,
144+
UNION
145+
}
132146
}

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ public void visit(PlainSelect plainSelect) {
5656
buffer.append("(");
5757
}
5858
buffer.append("SELECT ");
59-
59+
6060
OracleHint hint = plainSelect.getOracleHint();
6161
if (hint != null) {
6262
buffer.append(hint).append(" ");
6363
}
64-
64+
6565
Skip skip = plainSelect.getSkip();
6666
if (skip != null) {
6767
buffer.append(skip).append(" ");
@@ -71,7 +71,7 @@ public void visit(PlainSelect plainSelect) {
7171
if (first != null) {
7272
buffer.append(first).append(" ");
7373
}
74-
74+
7575
if (plainSelect.getDistinct() != null) {
7676
buffer.append("DISTINCT ");
7777
if (plainSelect.getDistinct().getOnSelectItems() != null) {
@@ -257,8 +257,6 @@ public void visit(PivotXml pivot) {
257257
buffer.append("))");
258258
}
259259

260-
261-
262260
public void deparseOffset(Offset offset) {
263261
// OFFSET offset
264262
// or OFFSET offset (ROW | ROWS)
@@ -372,13 +370,17 @@ public void visit(SetOperationList list) {
372370
if (i != 0) {
373371
buffer.append(' ').append(list.getOperations().get(i - 1)).append(' ');
374372
}
375-
buffer.append("(");
376-
SelectBody select = list.getSelects().get(i);
377-
select.accept(this);
378-
buffer.append(")");
373+
boolean brackets = list.getBrackets() == null || list.getBrackets().get(i);
374+
if (brackets) {
375+
buffer.append("(");
376+
}
377+
list.getSelects().get(i).accept(this);
378+
if (brackets) {
379+
buffer.append(")");
380+
}
379381
}
380382
if (list.getOrderByElements() != null) {
381-
new OrderByDeParser(expressionVisitor,buffer).deParse(list.getOrderByElements());
383+
new OrderByDeParser(expressionVisitor, buffer).deParse(list.getOrderByElements());
382384
}
383385

384386
if (list.getLimit() != null) {

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -827,20 +827,23 @@ SetOperationList SetOperationList():
827827
SelectBody select = null;
828828
List<SelectBody> selects = new ArrayList<SelectBody>();
829829
List<SetOperation> operations = new ArrayList<SetOperation>();
830+
List<Boolean> brackets = new ArrayList<Boolean>();
831+
boolean bracket;
830832
}
831833
{
832834
(
833835

834836
(
835-
(("(" select=SelectBody() ")") | select=PlainSelect() ) {selects.add(select);}
837+
(("(" select=SelectBody() ")" { bracket=true;} )
838+
| select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket); }
836839
(
837840
((<K_UNION> { UnionOp union = new UnionOp();operations.add(union); } [ <K_ALL> { union.setAll(true); } | <K_DISTINCT> { union.setDistinct(true); } ])
838841
| <K_INTERSECT> { operations.add(new IntersectOp()); }
839842
| <K_MINUS> { operations.add(new MinusOp()); }
840843
| <K_EXCEPT> { operations.add(new ExceptOp()); }
841844
)
842845

843-
(("(" select=SelectBody() ")") | select=PlainSelect() ) {selects.add(select);}
846+
(("(" select=SelectBody() ")" { bracket=true;} ) | select=PlainSelect() { bracket=false;} ) {selects.add(select);brackets.add(bracket);}
844847
)+
845848
)
846849

@@ -851,7 +854,7 @@ SetOperationList SetOperationList():
851854
)
852855

853856
{
854-
list.setOpsAndSelects(selects,operations);
857+
list.setBracketsOpsAndSelects(brackets,selects,operations);
855858
return list;
856859
}
857860
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,9 +591,9 @@ public void testUnion() throws JSQLParserException {
591591

592592
// use brakets for toString
593593
// use standard limit syntax
594-
String statementToString = "(SELECT * FROM mytable WHERE mytable.col = 9) UNION "
595-
+ "(SELECT * FROM mytable3 WHERE mytable3.col = ?) UNION "
596-
+ "(SELECT * FROM mytable2 LIMIT 4 OFFSET 3)";
594+
String statementToString = "SELECT * FROM mytable WHERE mytable.col = 9 UNION "
595+
+ "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION "
596+
+ "SELECT * FROM mytable2 LIMIT 4 OFFSET 3";
597597
assertStatementCanBeDeparsedAs(select, statementToString);
598598
}
599599

@@ -1399,7 +1399,7 @@ public void testProblemSqlIntersect() throws Exception {
13991399

14001400
stmt = "SELECT * FROM a INTERSECT SELECT * FROM b";
14011401
Statement parsed = parserManager.parse(new StringReader(stmt));
1402-
assertStatementCanBeDeparsedAs(parsed, "(SELECT * FROM a) INTERSECT (SELECT * FROM b)");
1402+
assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM a INTERSECT SELECT * FROM b");
14031403
}
14041404

14051405
public void testProblemSqlExcept() throws Exception {
@@ -1408,7 +1408,7 @@ public void testProblemSqlExcept() throws Exception {
14081408

14091409
stmt = "SELECT * FROM a EXCEPT SELECT * FROM b";
14101410
Statement parsed = parserManager.parse(new StringReader(stmt));
1411-
assertStatementCanBeDeparsedAs(parsed, "(SELECT * FROM a) EXCEPT (SELECT * FROM b)");
1411+
assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM a EXCEPT SELECT * FROM b");
14121412
}
14131413

14141414
public void testProblemSqlMinus() throws Exception {
@@ -1417,7 +1417,7 @@ public void testProblemSqlMinus() throws Exception {
14171417

14181418
stmt = "SELECT * FROM a MINUS SELECT * FROM b";
14191419
Statement parsed = parserManager.parse(new StringReader(stmt));
1420-
assertStatementCanBeDeparsedAs(parsed, "(SELECT * FROM a) MINUS (SELECT * FROM b)");
1420+
assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM a MINUS SELECT * FROM b");
14211421
}
14221422

14231423
public void testProblemSqlCombinedSets() throws Exception {

src/test/java/net/sf/jsqlparser/util/AddAliasesVisitorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ public void testVisit_SetOperationList() throws JSQLParserException {
8080
final AddAliasesVisitor instance = new AddAliasesVisitor();
8181
setOpList.getSelectBody().accept(instance);
8282

83-
assertEquals("(SELECT 3 + 4 AS A1 FROM test) UNION (SELECT 7 + 8 AS A1 FROM test2)", setOpList.toString());
83+
assertEquals("SELECT 3 + 4 AS A1 FROM test UNION SELECT 7 + 8 AS A1 FROM test2", setOpList.toString());
8484
}
8585
}

0 commit comments

Comments
 (0)