diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index f928dde609..d608cdb019 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -122,6 +122,6 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { } public static enum Option { - DISTINCT, ALL + DISTINCT, ALL, UNIQUE } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java index c87bc58921..ec22e01cda 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java @@ -24,17 +24,16 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class OracleAggregateExpr extends SQLAggregateExpr implements Serializable, OracleExpr { - private boolean unique = false; private static final long serialVersionUID = 1L; private OracleAnalytic over; private boolean ignoreNulls = false; public boolean isUnique() { - return unique; + return Option.UNIQUE.equals(this.getOption()); } public void setUnique(boolean unique) { - this.unique = unique; + this.setOption(Option.UNIQUE); } public boolean isIgnoreNulls() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index a71bab7efe..fc6d3e9d76 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -526,17 +526,13 @@ public class OracleExprParser extends SQLExprParser { } protected OracleAggregateExpr parseAggregateExpr(String methodName) { - boolean unique = false; - methodName = methodName.toUpperCase(); - if (lexer.token() == Token.UNIQUE) { - lexer.nextToken(); - unique = true; - } - OracleAggregateExpr aggregateExpr; - if (lexer.token() == (Token.ALL)) { + if (lexer.token() == Token.UNIQUE) { + aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE); + lexer.nextToken(); + } else if (lexer.token() == (Token.ALL)) { aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); lexer.nextToken(); } else if (lexer.token() == (Token.DISTINCT)) { @@ -545,7 +541,6 @@ public class OracleExprParser extends SQLExprParser { } else { aggregateExpr = new OracleAggregateExpr(methodName); } - aggregateExpr.setUnique(unique); exprList(aggregateExpr.getArguments()); if (lexer.stringVal().equalsIgnoreCase("IGNORE")) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 6c2c2c47cb..fe2c6bbafd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -217,9 +217,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(' '); } - if (expr.isUnique()) { - print("UNIQUE "); - } printAndAccept(expr.getArguments(), ", "); print(")"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java index 1eb807dd2e..8b6299dfd4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java @@ -18,6 +18,10 @@ public class DistinctTest extends TestCase { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.ORACLE)); } + public void test_oracle_unique() throws Exception { + Assert.assertEquals("SELECT COUNT(UNIQUE *)\nFROM t", SQLUtils.format("select count(unique *) from t", JdbcUtils.ORACLE)); + } + public void test_postgres() throws Exception { Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.POSTGRESQL)); }