diff --git a/pom.xml b/pom.xml index f8a5c5f36a..41700002a3 100644 --- a/pom.xml +++ b/pom.xml @@ -439,13 +439,14 @@ provided + junit junit diff --git a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java index 2afd376938..e7bee2b280 100644 --- a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java +++ b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java @@ -27,6 +27,7 @@ import com.alibaba.druid.mock.MockResultSetMetaData; import com.alibaba.druid.mock.MockStatementBase; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; @@ -142,8 +143,8 @@ public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { } else if (expr instanceof SQLNCharExpr) { row[i] = ((SQLNCharExpr) expr).getText(); column.setColumnType(Types.NVARCHAR); - } else if (expr instanceof MySqlBooleanExpr) { - row[i] = ((MySqlBooleanExpr) expr).getValue(); + } else if (expr instanceof SQLBooleanExpr) { + row[i] = ((SQLBooleanExpr) expr).getValue(); column.setColumnType(Types.NVARCHAR); } else if (expr instanceof SQLNullExpr) { row[i] = null; diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 96190fb7a1..3e308a2c14 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1569,7 +1569,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat value.setTestWhileIdle(this.isTestWhileIdle()); value.setDefaultAutoCommit(this.isDefaultAutoCommit()); - value.setDefaultReadOnly(this.getDefaultReadOnly()); + if (defaultReadOnly != null) { + value.setDefaultReadOnly(defaultReadOnly); + } value.setDefaultTransactionIsolation(this.getDefaultTransactionIsolation()); value.setLogicConnectErrorCount(connectErrorCount.getAndSet(0)); diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 227f7aec87..24067727ff 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -38,7 +38,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; @@ -367,13 +366,8 @@ public class PagerUtils { } private static SQLSelectItem createCountItem(String dbType) { - SQLAggregateExpr countExpr; + SQLAggregateExpr countExpr = new SQLAggregateExpr("COUNT"); - if (JdbcConstants.ORACLE.equals(dbType)) { - countExpr = new OracleAggregateExpr("COUNT"); - } else { - countExpr = new SQLAggregateExpr("COUNT"); - } countExpr.getArguments().add(new SQLAllColumnExpr()); SQLSelectItem countItem = new SQLSelectItem(countExpr); 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 bf7fa1e2a7..38fe123edf 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 @@ -33,6 +33,7 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { protected final List arguments = new ArrayList(); protected SQLOver over; protected SQLOrderBy withinGroup; + protected boolean ignoreNulls = false; public SQLAggregateExpr(String methodName){ this.methodName = methodName; @@ -59,7 +60,7 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { if (withinGroup != null) { withinGroup.setParent(this); } - + this.withinGroup = withinGroup; } @@ -82,6 +83,15 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { public void setOver(SQLOver over) { this.over = over; } + + public boolean isIgnoreNulls() { + return this.ignoreNulls; + } + + public void setIgnoreNulls(boolean ignoreNulls) { + this.ignoreNulls = ignoreNulls; + } + @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBooleanExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBooleanExpr.java index ba26add238..af19c47b03 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBooleanExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBooleanExpr.java @@ -15,70 +15,11 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.expr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlBooleanExpr extends MySqlExprImpl implements MySqlExpr, SQLLiteralExpr { +public class MySqlBooleanExpr extends SQLBooleanExpr implements MySqlExpr, SQLLiteralExpr { - private boolean value; - - public MySqlBooleanExpr(){ - - } - - public MySqlBooleanExpr(boolean value){ - this.value = value; - } - - public boolean getValue() { - return value; - } - - public void setValue(boolean value) { - this.value = value; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((MySqlASTVisitor) visitor); - } - - public void accept0(MySqlASTVisitor visitor) { - visitor.visit(this); - - visitor.endVisit(this); - } - - public void output(StringBuffer buf) { - buf.append("x"); - buf.append(value ? "TRUE" : "FALSE"); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (value ? 1231 : 1237); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - MySqlBooleanExpr other = (MySqlBooleanExpr) obj; - if (value != other.value) { - return false; - } - return true; - } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index bd0ddc6434..c3520b18d8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLHexExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -36,7 +37,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -138,12 +138,6 @@ public class MySqlExprParser extends SQLExprParser { } switch (tok) { - case TRUE: - lexer.nextToken(); - return primaryRest(new MySqlBooleanExpr(true)); - case FALSE: - lexer.nextToken(); - return primaryRest(new MySqlBooleanExpr(false)); case LITERAL_ALIAS: String aliasValue = lexer.stringVal(); lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java index 5b33cca785..f020f54a26 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySql2OracleOutputVisitor.java @@ -15,7 +15,6 @@ */ package com.alibaba.druid.sql.dialect.mysql.visitor; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; public class MySql2OracleOutputVisitor extends MySqlOutputVisitor { @@ -23,11 +22,5 @@ public class MySql2OracleOutputVisitor extends MySqlOutputVisitor { super(appender); } - public boolean visit(MySqlBooleanExpr x) { - return true; - } - - public void endVisit(MySqlBooleanExpr x) { - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index f42ae9138d..e9f5e338fe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -123,11 +122,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface MySqlASTVisitor extends SQLASTVisitor { - - boolean visit(MySqlBooleanExpr x); - - void endVisit(MySqlBooleanExpr x); - boolean visit(MySqlSelectQueryBlock.Limit x); void endVisit(MySqlSelectQueryBlock.Limit x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index fa166fbd0f..67da8b1226 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -128,17 +127,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySqlASTVisitor { - - @Override - public boolean visit(MySqlBooleanExpr x) { - return true; - } - - @Override - public void endVisit(MySqlBooleanExpr x) { - - } - @Override public boolean visit(Limit x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java index c70e199db1..3629dbb837 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java @@ -22,6 +22,7 @@ import java.util.Map; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLHexExpr; @@ -35,7 +36,6 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.sql.visitor.functions.Function; @@ -135,12 +135,6 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE return SQLEvalVisitorUtils.visit(this, x); } - @Override - public boolean visit(MySqlBooleanExpr x) { - x.getAttributes().put(EVAL_VALUE, x.getValue()); - return false; - } - public boolean isMarkVariantIndex() { return markVariantIndex; } @@ -167,4 +161,10 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE public void unregisterFunction(String funcName) { functions.remove(funcName); } + + @Override + public boolean visit(SQLBooleanExpr x) { + x.getAttributes().put(EVAL_VALUE, x.getValue()); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index bf7327be01..106cf5c56a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -45,7 +45,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -156,15 +155,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV super(appender); } - public boolean visit(MySqlBooleanExpr x) { - print(x.getValue() ? "true" : "false"); - - return false; - } - - public void endVisit(MySqlBooleanExpr x) { - } - @Override public boolean visit(SQLSelectQueryBlock select) { if (select instanceof MySqlSelectQueryBlock) { @@ -383,11 +373,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getCharSetName() != null) { print(" CHARACTER SET "); print(x.getCharSetName()); - - if (x.getCollate() != null) { - print(" COLLATE "); - print(x.getCollate()); - } } if (x.getCollate() != null) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 68b9d0265a..09e5c0e7cb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -37,7 +37,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -224,17 +223,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS return false; } - @Override - public boolean visit(MySqlBooleanExpr x) { - - return true; - } - - @Override - public void endVisit(MySqlBooleanExpr x) { - - } - @Override public boolean visit(Limit x) { 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 deleted file mode 100644 index 6660323808..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.ast.expr; - -import java.io.Serializable; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class OracleAggregateExpr extends SQLAggregateExpr implements Serializable, OracleExpr { - - private static final long serialVersionUID = 1L; - private boolean ignoreNulls = false; - - public boolean isUnique() { - return Option.UNIQUE.equals(this.getOption()); - } - - public void setUnique(boolean unique) { - this.setOption(Option.UNIQUE); - } - - public boolean isIgnoreNulls() { - return this.ignoreNulls; - } - - public void setIgnoreNulls(boolean ignoreNulls) { - this.ignoreNulls = ignoreNulls; - } - - public OracleAggregateExpr(String methodName){ - super(methodName); - } - - public OracleAggregateExpr(String methodName, Option option){ - super(methodName, option); - } - - public void output(StringBuffer buf) { - buf.append(this.methodName); - buf.append("("); - int i = 0; - for (int size = this.arguments.size(); i < size; ++i) { - ((SQLExpr) this.arguments.get(i)).output(buf); - } - buf.append(")"); - - if (this.over != null) { - buf.append(" "); - this.over.output(buf); - } - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof OracleASTVisitor) { - this.accept0((OracleASTVisitor) visitor); - } else { - if (visitor.visit(this)) { - acceptChild(visitor, this.arguments); - acceptChild(visitor, this.over); - } - visitor.endVisit(this); - } - } - - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.arguments); - acceptChild(visitor, this.over); - } - visitor.endVisit(this); - } -} 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 fb5cc2946d..7089bd4071 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 @@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -47,7 +48,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause.FlashCacheType; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; @@ -106,6 +106,7 @@ public class OracleExprParser extends SQLExprParser { "LAG", // "LAST", // "LAST_VALUE", // + "LISTAGG", "LEAD", // "MAX", // "MIN", // @@ -744,21 +745,21 @@ public class OracleExprParser extends SQLExprParser { return null; } - protected OracleAggregateExpr parseAggregateExpr(String methodName) { + protected SQLAggregateExpr parseAggregateExpr(String methodName) { methodName = methodName.toUpperCase(); - OracleAggregateExpr aggregateExpr; + SQLAggregateExpr aggregateExpr; if (lexer.token() == Token.UNIQUE) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE); + aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE); lexer.nextToken(); } else if (lexer.token() == (Token.ALL)) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); + aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); lexer.nextToken(); } else if (lexer.token() == (Token.DISTINCT)) { - aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT); + aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT); lexer.nextToken(); } else { - aggregateExpr = new OracleAggregateExpr(methodName); + aggregateExpr = new SQLAggregateExpr(methodName); } exprList(aggregateExpr.getArguments(), aggregateExpr); @@ -769,6 +770,15 @@ public class OracleExprParser extends SQLExprParser { } accept(Token.RPAREN); + + if (identifierEquals("WITHIN")) { + lexer.nextToken(); + accept(Token.GROUP); + accept(Token.LPAREN); + SQLOrderBy withinGroup = this.parseOrderBy(); + aggregateExpr.setWithinGroup(withinGroup); + accept(Token.RPAREN); + } if (lexer.token() == Token.OVER) { OracleAnalytic over = new OracleAnalytic(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 95c12850bc..2c52741226 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -19,6 +19,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -52,7 +53,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; @@ -984,7 +984,7 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.LPAREN); while (true) { item = new OracleSelectPivot.Item(); - item.setExpr((OracleAggregateExpr) this.exprParser.expr()); + item.setExpr((SQLAggregateExpr) this.exprParser.expr()); item.setAlias(as()); pivot.getItems().add(item); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index 1c9d44abee..c547e0ddd9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -36,7 +36,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; @@ -123,8 +122,6 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface OracleASTVisitor extends SQLASTVisitor { - void endVisit(OracleAggregateExpr astNode); - void endVisit(OraclePLSQLCommitStatement astNode); void endVisit(OracleAnalytic x); @@ -169,8 +166,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleUpdateStatement x); - boolean visit(OracleAggregateExpr astNode); - boolean visit(OraclePLSQLCommitStatement astNode); boolean visit(OracleAnalytic x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 8c8c3e276e..eae3fdcc9c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -44,7 +44,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; @@ -142,11 +141,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OracleSelect x) { } - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - @Override public void endVisit(OraclePLSQLCommitStatement astNode) { @@ -257,12 +251,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleAggregateExpr astNode) { - - return true; - } - @Override public boolean visit(OraclePLSQLCommitStatement astNode) { 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 1cc7c7c279..83e61ad477 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 @@ -72,7 +72,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; @@ -218,32 +217,14 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } } - public boolean visit(OracleAggregateExpr expr) { - print(expr.getMethodName()); - print("("); - - if (expr.getOption() != null) { - print(expr.getOption().toString()); - print(' '); - } - - printAndAccept(expr.getArguments(), ", "); - print(")"); - - if (expr.getOver() != null) { - print(" OVER ("); - expr.getOver().accept(this); - print(")"); - } - return false; - } - public boolean visit(SQLAllColumnExpr x) { print("*"); return false; } public boolean visit(OracleAnalytic x) { + print("OVER ("); + boolean space = false; if (x.getPartitionBy().size() > 0) { print("PARTITION BY "); @@ -267,6 +248,8 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS x.getWindowing().accept(this); } + print(")"); + return false; } @@ -810,13 +793,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - // /////////////////// - - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - @Override public void endVisit(OraclePLSQLCommitStatement astNode) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index b76d7b9a67..7a6f2049c0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; @@ -68,7 +67,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; @@ -262,17 +260,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle return false; } - public boolean visit(SQLAggregateExpr x) { - accept(x.getArguments()); - return false; - } - - public boolean visit(OracleAggregateExpr x) { - accept(x.getArguments()); - accept(x.getOver()); - return false; - } - public void endVisit(OracleSelect x) { endVisit((SQLSelect) x); } @@ -400,11 +387,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle return super.visit(x); } - @Override - public void endVisit(OracleAggregateExpr astNode) { - - } - @Override public void endVisit(OraclePLSQLCommitStatement astNode) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java index dc8fd11fa6..9939d3e10f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java @@ -58,6 +58,9 @@ public class PGLexer extends Lexer { map.put("USING", Token.USING); map.put("WINDOW", Token.WINDOW); + + map.put("TRUE", Token.TRUE); + map.put("FALSE", Token.FALSE); DEFAULT_PG_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index a77b70be60..994700ce88 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -36,6 +36,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCastExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -554,6 +555,14 @@ public class SQLExprParser extends SQLParser { break; case EOF: throw new EOFParserException(); + case TRUE: + lexer.nextToken(); + sqlExpr = new SQLBooleanExpr(true); + break; + case FALSE: + lexer.nextToken(); + sqlExpr = new SQLBooleanExpr(false); + break; default: throw new ParserException("ERROR. token : " + tok + ", pos : " + lexer.pos()); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java index 0aa97ab7f1..002d186f8f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -20,11 +20,11 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; public class ExportParameterVisitorUtils { @@ -48,8 +48,8 @@ public class ExportParameterVisitorUtils { return new SQLVariantRefExpr("?"); } - if (param instanceof MySqlBooleanExpr) { - Object value = ((MySqlBooleanExpr) param).getValue(); + if (param instanceof SQLBooleanExpr) { + Object value = ((SQLBooleanExpr) param).getValue(); parameters.add(value); return new SQLVariantRefExpr("?"); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index cae14c8ca4..a930e4c6a4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -41,6 +41,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCastExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -536,6 +537,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab visitAggreateRest(x); print(")"); + + if (x.getWithinGroup() != null) { + print(" WITHIN GROUP ("); + x.getWithinGroup().accept(this); + print(")"); + } if (x.getOver() != null) { print(" "); @@ -1935,4 +1942,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab x.getBody().accept(this); return false; } + + public boolean visit(SQLBooleanExpr x) { + print(x.getValue() ? "true" : "false"); + + return false; + } + + public void endVisit(SQLBooleanExpr x) { + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index cccb4aae41..e2b8f59ae8 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCastExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -534,4 +535,9 @@ public interface SQLASTVisitor { void endVisit(SQLDropProcedureStatement x); boolean visit(SQLDropProcedureStatement x); + + void endVisit(SQLBooleanExpr x); + + boolean visit(SQLBooleanExpr x); + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index cd9b2b6ae7..72376edd54 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCastExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -1041,4 +1042,15 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLDropProcedureStatement x) { return true; } + + @Override + public void endVisit(SQLBooleanExpr x) { + + } + + @Override + public boolean visit(SQLBooleanExpr x) { + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java index 6c016e0c01..85cf887c83 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLHexExpr; @@ -143,4 +144,11 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV public void unregisterFunction(String funcName) { functions.remove(funcName); } + + @Override + public boolean visit(SQLBooleanExpr x) { + x.getAttributes().put(EVAL_VALUE, x.getValue()); + return false; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 892a8d800c..cc647e74bf 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1117,11 +1117,15 @@ public class SQLEvalVisitorUtils { if (val == null) { return null; } + + if (val == EVAL_VALUE_NULL) { + return null; + } if (val instanceof Boolean) { return (Boolean) val; } - + if (val instanceof Number) { return ((Number) val).intValue() > 0; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 3fd944310b..e7269db0ab 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -980,6 +980,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLAggregateExpr x) { accept(x.getArguments()); + accept(x.getWithinGroup()); + accept(x.getOver()); return false; } diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 5fd1d05463..942cacc63e 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -40,6 +40,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr.Item; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -91,7 +92,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; @@ -1386,8 +1386,8 @@ public class WallVisitorUtils { return getValue(visitor, (SQLBinaryOpExpr) x); } - if (x instanceof MySqlBooleanExpr) { - return ((MySqlBooleanExpr) x).getValue(); + if (x instanceof SQLBooleanExpr) { + return ((SQLBooleanExpr) x).getValue(); } if (x instanceof SQLNumericLiteralExpr) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java index 9bca1c33bc..ae68890016 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; import org.junit.Assert; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -13,18 +13,18 @@ public class EqualTest_boolean extends TestCase { public void test_exits() throws Exception { String sql = "true"; String sql_c = "false"; - MySqlBooleanExpr exprA, exprB, exprC; + SQLBooleanExpr exprA, exprB, exprC; { SQLExprParser parser = new MySqlExprParser(sql); - exprA = (MySqlBooleanExpr) parser.expr(); + exprA = (SQLBooleanExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql); - exprB = (MySqlBooleanExpr) parser.expr(); + exprB = (SQLBooleanExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql_c); - exprC = (MySqlBooleanExpr) parser.expr(); + exprC = (SQLBooleanExpr) parser.expr(); } Assert.assertEquals(exprA, exprB); Assert.assertNotEquals(exprA, exprC); @@ -32,7 +32,7 @@ public class EqualTest_boolean extends TestCase { Assert.assertFalse(exprA.equals(new Object())); Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); - Assert.assertEquals(new MySqlBooleanExpr(), new MySqlBooleanExpr()); - Assert.assertEquals(new MySqlBooleanExpr().hashCode(), new MySqlBooleanExpr().hashCode()); + Assert.assertEquals(new SQLBooleanExpr(), new SQLBooleanExpr()); + Assert.assertEquals(new SQLBooleanExpr().hashCode(), new SQLBooleanExpr().hashCode()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index 0ecb814c19..0ff4606c99 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -2,6 +2,7 @@ package com.alibaba.druid.bvt.sql.mysql; import junit.framework.TestCase; +import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; @@ -9,7 +10,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -101,7 +101,7 @@ public class MySqlASTVisitorAdapterTest extends TestCase { public void test_adapter() throws Exception { MySqlASTVisitorAdapter adapter = new MySqlASTVisitorAdapter(); - new MySqlBooleanExpr().accept(adapter); + new SQLBooleanExpr().accept(adapter); new Limit().accept(adapter); new MySqlTableIndex().accept(adapter); new MySqlKey().accept(adapter);