improve sql parser

This commit is contained in:
wenshao
2014-06-01 19:11:11 +08:00
parent 4df624ae4b
commit 3526ac38b4
32 changed files with 130 additions and 317 deletions
@@ -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;
@@ -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));
@@ -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();
@@ -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);
@@ -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) {
@@ -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) {
@@ -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;
}
@@ -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) {