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);