mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve sql parser
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -33,6 +33,7 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable {
|
||||
protected final List<SQLExpr> arguments = new ArrayList<SQLExpr>();
|
||||
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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
-7
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
-12
@@ -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) {
|
||||
|
||||
|
||||
+4
-28
@@ -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) {
|
||||
|
||||
|
||||
-18
@@ -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) {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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("?");
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user