Skip to content

Commit 673eb25

Browse files
committed
set operation handling done
1 parent e980bf3 commit 673eb25

File tree

5 files changed

+65
-42
lines changed

5 files changed

+65
-42
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ public interface SelectVisitor {
2626
public void visit(PlainSelect plainSelect);
2727

2828
public void visit(Union union);
29+
30+
public void visit(SetOperationList setOpList);
2931
}

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public List getOrderByElements() {
5555
public List getPlainSelects() {
5656
return plainSelects;
5757
}
58-
58+
5959
public List getOperations() {
6060
return operations;
6161
}
@@ -64,12 +64,13 @@ public void setOrderByElements(List orderByElements) {
6464
this.orderByElements = orderByElements;
6565
}
6666

67-
public void setOpsAndSelects(List select,List ops) {
67+
public void setOpsAndSelects(List select, List ops) {
6868
plainSelects = select;
69-
operations=ops;
70-
71-
if (select.size()-1!=ops.size())
69+
operations = ops;
70+
71+
if (select.size() - 1 != ops.size()) {
7272
throw new IllegalArgumentException("list sizes are not valid");
73+
}
7374
}
7475

7576
public Limit getLimit() {
@@ -83,17 +84,20 @@ public void setLimit(Limit limit) {
8384
@Override
8485
public String toString() {
8586
StringBuilder buffer = new StringBuilder();
86-
87+
8788
for (int i = 0; i < plainSelects.size(); i++) {
88-
if (i!=0)
89-
buffer.append(" ").append(operations.get(i-1).toString()).append(" ");
89+
if (i != 0) {
90+
buffer.append(" ").append(operations.get(i - 1).toString()).append(" ");
91+
}
9092
buffer.append("(").append(plainSelects.get(i).toString()).append(")");
9193
}
9294

93-
if (orderByElements!=null)
95+
if (orderByElements != null) {
9496
buffer.append(PlainSelect.orderByToString(orderByElements));
95-
if (limit!=null)
97+
}
98+
if (limit != null) {
9699
buffer.append(limit.toString());
100+
}
97101
return buffer.toString();
98102
}
99103

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.sf.jsqlparser.statement.select.SelectItem;
2121
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
2222
import net.sf.jsqlparser.statement.select.SelectVisitor;
23+
import net.sf.jsqlparser.statement.select.SetOperationList;
2324
import net.sf.jsqlparser.statement.select.SubJoin;
2425
import net.sf.jsqlparser.statement.select.SubSelect;
2526
import net.sf.jsqlparser.statement.select.Top;
@@ -284,4 +285,22 @@ else if (join.isInner())
284285

285286
}
286287

288+
@Override
289+
public void visit(SetOperationList list) {
290+
for (int i=0;i<list.getPlainSelects().size();i++) {
291+
if (i!=0)
292+
buffer.append(' ').append(list.getOperations().get(i-1)).append(' ');
293+
buffer.append("(");
294+
PlainSelect plainSelect = (PlainSelect) list.getPlainSelects().get(i);
295+
plainSelect.accept(this);
296+
buffer.append(")");
297+
}
298+
if (list.getOrderByElements() != null) {
299+
deparseOrderBy(list.getOrderByElements());
300+
}
301+
302+
if (list.getLimit() != null) {
303+
deparseLimit(list.getLimit());
304+
}
305+
}
287306
}

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

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import net.sf.jsqlparser.statement.select.PlainSelect;
2828
import net.sf.jsqlparser.statement.select.Select;
2929
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
30+
import net.sf.jsqlparser.statement.select.SetOperationList;
3031
import net.sf.jsqlparser.statement.select.Union;
3132
import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
3233
import net.sf.jsqlparser.util.deparser.SelectDeParser;
@@ -64,9 +65,9 @@ public void testLimit() throws JSQLParserException {
6465
statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
6566
+ "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) LIMIT 3, 4";
6667
select = (Select) parserManager.parse(new StringReader(statement));
67-
Union union = (Union) select.getSelectBody();
68-
assertEquals(3, union.getLimit().getOffset());
69-
assertEquals(4, union.getLimit().getRowCount());
68+
SetOperationList setList = (SetOperationList) select.getSelectBody();
69+
assertEquals(3, setList.getLimit().getOffset());
70+
assertEquals(4, setList.getLimit().getRowCount());
7071

7172
// toString uses standard syntax
7273
statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
@@ -134,12 +135,12 @@ public void testUnion() throws JSQLParserException {
134135
+ "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 LIMIT 3,4";
135136

136137
Select select = (Select) parserManager.parse(new StringReader(statement));
137-
Union union = (Union) select.getSelectBody();
138-
assertEquals(3, union.getPlainSelects().size());
139-
assertEquals("mytable", ((Table) ((PlainSelect) union.getPlainSelects().get(0)).getFromItem()).getName());
140-
assertEquals("mytable3", ((Table) ((PlainSelect) union.getPlainSelects().get(1)).getFromItem()).getName());
141-
assertEquals("mytable2", ((Table) ((PlainSelect) union.getPlainSelects().get(2)).getFromItem()).getName());
142-
assertEquals(3, ((PlainSelect) union.getPlainSelects().get(2)).getLimit().getOffset());
138+
SetOperationList setList = (SetOperationList) select.getSelectBody();
139+
assertEquals(3, setList.getPlainSelects().size());
140+
assertEquals("mytable", ((Table) ((PlainSelect) setList.getPlainSelects().get(0)).getFromItem()).getName());
141+
assertEquals("mytable3", ((Table) ((PlainSelect) setList.getPlainSelects().get(1)).getFromItem()).getName());
142+
assertEquals("mytable2", ((Table) ((PlainSelect) setList.getPlainSelects().get(2)).getFromItem()).getName());
143+
assertEquals(3, ((PlainSelect) setList.getPlainSelects().get(2)).getLimit().getOffset());
143144

144145
// use brakets for toString
145146
// use standard limit syntax
@@ -660,38 +661,27 @@ public void testProblemSqlIntersect() throws Exception {
660661
assertStatementCanBeDeparsedAs(parsed,"(SELECT * FROM a) INTERSECT (SELECT * FROM b)");
661662
}
662663

663-
@Test
664664
public void testProblemSqlExcept() throws Exception {
665665
String stmt = "(SELECT * FROM a) EXCEPT (SELECT * FROM b)";
666-
Statement parsed = parserManager.parse(new StringReader(stmt));
667-
assertStatementCanBeDeparsedAs(parsed,"(SELECT * FROM a) INTERSECT (SELECT * FROM b)");
666+
assertSqlCanBeParsedAndDeparsed(stmt);
668667

669-
stmt = "SELECT * FROM a INTERSECT SELECT * FROM b";
670-
parsed = parserManager.parse(new StringReader(stmt));
671-
assertStatementCanBeDeparsedAs(parsed,"(SELECT * FROM a) INTERSECT (SELECT * FROM b)");
672-
//Left ist ein Schlüsselwort und darf so nicht verwendet werden.
673-
//Fehler SQLServer, OK Oracle, OK Postgresql
674-
Statement stmt = JSqlParserUtils.parseSqlStatement("select * from a except select * from b");
675-
System.out.println(stmt.toString());
676-
assertEquals("(SELECT * FROM a) EXCEPT (SELECT * FROM b)", stmt.toString());
668+
stmt = "SELECT * FROM a EXCEPT SELECT * FROM b";
669+
Statement parsed = parserManager.parse(new StringReader(stmt));
670+
assertStatementCanBeDeparsedAs(parsed,"(SELECT * FROM a) EXCEPT (SELECT * FROM b)");
677671
}
678672

679-
@Test
680673
public void testProblemSqlMinus() throws Exception {
681-
//Left ist ein Schlüsselwort und darf so nicht verwendet werden.
682-
//Fehler SQLServer, OK Oracle, OK Postgresql
683-
Statement stmt = JSqlParserUtils.parseSqlStatement("select * from a minus select * from b");
684-
System.out.println(stmt.toString());
685-
assertEquals("(SELECT * FROM a) MINUS (SELECT * FROM b)", stmt.toString());
674+
String stmt = "(SELECT * FROM a) MINUS (SELECT * FROM b)";
675+
assertSqlCanBeParsedAndDeparsed(stmt);
676+
677+
stmt = "SELECT * FROM a MINUS SELECT * FROM b";
678+
Statement parsed = parserManager.parse(new StringReader(stmt));
679+
assertStatementCanBeDeparsedAs(parsed,"(SELECT * FROM a) MINUS (SELECT * FROM b)");
686680
}
687681

688-
@Test
689682
public void testProblemSqlCombinedSets() throws Exception {
690-
//Left ist ein Schlüsselwort und darf so nicht verwendet werden.
691-
//Fehler SQLServer, OK Oracle, OK Postgresql
692-
Statement stmt = JSqlParserUtils.parseSqlStatement("select * from a intersect select * from b union select * from c");
693-
System.out.println(stmt.toString());
694-
assertEquals("(SELECT * FROM a) INTERSECT (SELECT * FROM b) UNION (SELECT * FROM c)", stmt.toString());
683+
String stmt = "(SELECT * FROM a) INTERSECT (SELECT * FROM b) UNION (SELECT * FROM c)";
684+
assertSqlCanBeParsedAndDeparsed(stmt);
695685
}
696686

697687
private void assertSqlCanBeParsedAndDeparsed(String statement) throws JSQLParserException {

src/test/java/net/sf/jsqlparser/test/tablesfinder/TablesNamesFinder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import net.sf.jsqlparser.statement.select.PlainSelect;
5757
import net.sf.jsqlparser.statement.select.Select;
5858
import net.sf.jsqlparser.statement.select.SelectVisitor;
59+
import net.sf.jsqlparser.statement.select.SetOperationList;
5960
import net.sf.jsqlparser.statement.select.SubJoin;
6061
import net.sf.jsqlparser.statement.select.SubSelect;
6162
import net.sf.jsqlparser.statement.select.Union;
@@ -285,4 +286,11 @@ public void visit(Modulo modulo) {
285286
public void visit(AnalyticExpression analytic) {
286287

287288
}
289+
290+
public void visit(SetOperationList list) {
291+
for (Iterator iter = list.getPlainSelects().iterator(); iter.hasNext();) {
292+
PlainSelect plainSelect = (PlainSelect) iter.next();
293+
visit(plainSelect);
294+
}
295+
}
288296
}

0 commit comments

Comments
 (0)