diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java b/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java index f6b11a70a..a16320822 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/ExceptOp.java @@ -13,7 +13,47 @@ public class ExceptOp extends SetOperation { + private boolean distinct; + private boolean all; + public ExceptOp() { super(SetOperationType.EXCEPT); } + + public boolean isAll() { + return all; + } + + public void setAll(boolean all) { + this.all = all; + } + + public boolean isDistinct() { + return distinct; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + @Override + public String toString() { + String allDistinct = ""; + if (isAll()) { + allDistinct = " ALL"; + } else if (isDistinct()) { + allDistinct = " DISTINCT"; + } + return super.toString() + allDistinct; + } + + public ExceptOp withDistinct(boolean distinct) { + this.setDistinct(distinct); + return this; + } + + public ExceptOp withAll(boolean all) { + this.setAll(all); + return this; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java b/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java index f2248ca1b..02233a694 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/IntersectOp.java @@ -13,7 +13,46 @@ public class IntersectOp extends SetOperation { + private boolean distinct; + private boolean all; + public IntersectOp() { super(SetOperationType.INTERSECT); } + public boolean isAll() { + return all; + } + + public void setAll(boolean all) { + this.all = all; + } + + public boolean isDistinct() { + return distinct; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + @Override + public String toString() { + String allDistinct = ""; + if (isAll()) { + allDistinct = " ALL"; + } else if (isDistinct()) { + allDistinct = " DISTINCT"; + } + return super.toString() + allDistinct; + } + + public IntersectOp withDistinct(boolean distinct) { + this.setDistinct(distinct); + return this; + } + + public IntersectOp withAll(boolean all) { + this.setAll(all); + return this; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java b/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java index ab779978a..e33ce1387 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/MinusOp.java @@ -12,8 +12,46 @@ import net.sf.jsqlparser.statement.select.SetOperationList.SetOperationType; public class MinusOp extends SetOperation { - + private boolean distinct; + private boolean all; + public MinusOp() { super(SetOperationType.MINUS); } + public boolean isAll() { + return all; + } + + public void setAll(boolean all) { + this.all = all; + } + + public boolean isDistinct() { + return distinct; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + @Override + public String toString() { + String allDistinct = ""; + if (isAll()) { + allDistinct = " ALL"; + } else if (isDistinct()) { + allDistinct = " DISTINCT"; + } + return super.toString() + allDistinct; + } + + public MinusOp withDistinct(boolean distinct) { + this.setDistinct(distinct); + return this; + } + + public MinusOp withAll(boolean all) { + this.setAll(all); + return this; + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 61b4fc125..f8af4a406 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -2612,11 +2612,21 @@ Select SetOperationList(Select select) #SetOperationList: { [ { union.setAll(true); } | { union.setDistinct(true); } ] ) | - { operations.add(new IntersectOp()); } + ( + { IntersectOp intersect = new IntersectOp(); linkAST(intersect,jjtThis); operations.add(intersect); } + [ { intersect.setAll(true); } | { intersect.setDistinct(true); } ] + ) | - { operations.add(new MinusOp()); } + ( + { MinusOp minus = new MinusOp(); linkAST(minus,jjtThis); operations.add(minus); } + [ { minus.setAll(true); } | { minus.setDistinct(true); } ] + ) | - { operations.add(new ExceptOp()); } + ( + { ExceptOp except = new ExceptOp(); linkAST(except,jjtThis); operations.add(except); } + [ { except.setAll(true); } | { except.setDistinct(true); } ] + ) + ) (