refactor sql parser group by

This commit is contained in:
高铁
2016-01-09 13:56:09 +08:00
parent 739645fbf1
commit b4155d7be2
26 changed files with 220 additions and 329 deletions
@@ -44,6 +44,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr;
import com.alibaba.druid.sql.ast.expr.SQLDefaultExpr;
import com.alibaba.druid.sql.ast.expr.SQLExistsExpr;
import com.alibaba.druid.sql.ast.expr.SQLGroupingSetExpr;
import com.alibaba.druid.sql.ast.expr.SQLHexExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
@@ -90,7 +91,7 @@ public class SQLExprParser extends SQLParser {
public SQLExprParser(String sql){
super(sql);
}
public SQLExprParser(String sql, String dbType){
super(sql, dbType);
}
@@ -98,7 +99,7 @@ public class SQLExprParser extends SQLParser {
public SQLExprParser(Lexer lexer){
super(lexer);
}
public SQLExprParser(Lexer lexer, String dbType){
super(lexer, dbType);
}
@@ -185,10 +186,10 @@ public class SQLExprParser extends SQLParser {
}
public SQLExpr primary() {
List<String> beforeComments = null;
if (lexer.isKeepComments() && lexer.hasComment()) {
beforeComments = lexer.readAndResetComments();
}
List<String> beforeComments = null;
if (lexer.isKeepComments() && lexer.hasComment()) {
beforeComments = lexer.readAndResetComments();
}
SQLExpr sqlExpr = null;
@@ -442,12 +443,12 @@ public class SQLExprParser extends SQLParser {
case IDENTIFIER: // 当负号后面为字段的情况
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
if (lexer.token() == Token.LPAREN || lexer.token() == Token.LBRACKET) {
sqlExpr = primaryRest(sqlExpr);
}
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr);
break;
case QUES:
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, new SQLVariantRefExpr("?"));
@@ -569,11 +570,11 @@ public class SQLExprParser extends SQLParser {
}
SQLExpr expr = primaryRest(sqlExpr);
if (beforeComments != null) {
expr.addBeforeComment(beforeComments);
}
return expr;
}
@@ -614,7 +615,7 @@ public class SQLExprParser extends SQLParser {
lexer.nextToken();
if (lexer.token() == Token.LPAREN) {
accept(Token.LPAREN);
if (lexer.token() == Token.IDENTIFIER) {
SQLExpr expr = this.expr();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr("ANY");
@@ -622,7 +623,7 @@ public class SQLExprParser extends SQLParser {
accept(Token.RPAREN);
return methodInvokeExpr;
}
SQLAnyExpr anyExpr = new SQLAnyExpr();
SQLSelect anySubQuery = createSelectParser().select();
anyExpr.setSubQuery(anySubQuery);
@@ -636,7 +637,7 @@ public class SQLExprParser extends SQLParser {
}
return sqlExpr;
}
protected SQLExpr parseAliasExpr(String alias) {
return new SQLIdentifierExpr('"' + alias + '"');
}
@@ -675,6 +676,19 @@ public class SQLExprParser extends SQLParser {
expr = dotRest(expr);
return primaryRest(expr);
} else if (identifierEquals("SETS") //
&& expr.getClass() == SQLIdentifierExpr.class //
&& "GROUPING".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) {
SQLGroupingSetExpr groupingSets = new SQLGroupingSetExpr();
lexer.nextToken();
accept(Token.LPAREN);
this.exprList(groupingSets.getParameters(), groupingSets);
accept(Token.RPAREN);
return groupingSets;
} else {
if (lexer.token() == Token.LPAREN) {
return methodRest(expr, true);
@@ -713,12 +727,12 @@ public class SQLExprParser extends SQLParser {
}
accept(Token.RPAREN);
if (lexer.token() == Token.OVER) {
SQLAggregateExpr aggregateExpr = new SQLAggregateExpr(methodName);
aggregateExpr.getArguments().addAll(methodInvokeExpr.getParameters());
over(aggregateExpr);
return primaryRest(aggregateExpr);
}
@@ -885,7 +899,7 @@ public class SQLExprParser extends SQLParser {
case OPTIMIZE:
case GRANT:
case REVOKE:
//binary有很多含义,lexer识别了这个token,实际上应该当做普通IDENTIFIER
// binary有很多含义,lexer识别了这个token,实际上应该当做普通IDENTIFIER
case BINARY:
identName = lexer.stringVal();
lexer.nextToken();
@@ -949,7 +963,7 @@ public class SQLExprParser extends SQLParser {
} else if (lexer.token() == Token.DISTINCT) {
aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DISTINCT);
lexer.nextToken();
} else if (identifierEquals("DEDUPLICATION")) { //just for nut
} else if (identifierEquals("DEDUPLICATION")) { // just for nut
aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DEDUPLICATION);
lexer.nextToken();
} else {
@@ -1034,7 +1048,7 @@ public class SQLExprParser extends SQLParser {
return item;
}
public SQLUpdateSetItem parseUpdateSetItem() {
SQLUpdateSetItem item = new SQLUpdateSetItem();
@@ -1052,7 +1066,7 @@ public class SQLExprParser extends SQLParser {
} else {
accept(Token.EQ);
}
item.setValue(this.expr());
return item;
}
@@ -1213,9 +1227,9 @@ public class SQLExprParser extends SQLParser {
if (lexer.isKeepComments() && lexer.hasComment()) {
expr.addAfterComment(lexer.readAndResetComments());
}
lexer.nextToken();
SQLExpr rightExp = relational();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BooleanAnd, rightExp, getDbType());
@@ -1477,15 +1491,12 @@ public class SQLExprParser extends SQLParser {
protected boolean isCharType(String dataTypeName) {
return "char".equalsIgnoreCase(dataTypeName) //
|| "varchar".equalsIgnoreCase(dataTypeName)
|| "nchar".equalsIgnoreCase(dataTypeName)
|| "nvarchar".equalsIgnoreCase(dataTypeName)
|| "tinytext".equalsIgnoreCase(dataTypeName)
|| "text".equalsIgnoreCase(dataTypeName)
|| "mediumtext".equalsIgnoreCase(dataTypeName)
|| "varchar".equalsIgnoreCase(dataTypeName) || "nchar".equalsIgnoreCase(dataTypeName)
|| "nvarchar".equalsIgnoreCase(dataTypeName) || "tinytext".equalsIgnoreCase(dataTypeName)
|| "text".equalsIgnoreCase(dataTypeName) || "mediumtext".equalsIgnoreCase(dataTypeName)
|| "longtext".equalsIgnoreCase(dataTypeName)
//
;
//
;
}
protected SQLDataType parseCharTypeRest(SQLCharacterDataType charType) {
@@ -1493,7 +1504,7 @@ public class SQLExprParser extends SQLParser {
charType.setHasBinary(true);
lexer.nextToken();
}
if (identifierEquals("CHARACTER")) {
lexer.nextToken();
@@ -1505,12 +1516,12 @@ public class SQLExprParser extends SQLParser {
charType.setCharSetName(lexer.stringVal());
lexer.nextToken();
}
if (lexer.token() == Token.BINARY) {
charType.setHasBinary(true);
lexer.nextToken();
}
if (lexer.token() == Token.IDENTIFIER) {
if (lexer.stringVal().equalsIgnoreCase("COLLATE")) {
lexer.nextToken();
@@ -1537,9 +1548,9 @@ public class SQLExprParser extends SQLParser {
public SQLColumnDefinition parseColumn() {
SQLColumnDefinition column = createColumnDefinition();
column.setName(name());
if(lexer.token() != Token.SET //
&& lexer.token() != Token.DROP) {
if (lexer.token() != Token.SET //
&& lexer.token() != Token.DROP) {
column.setDataType(parseDataType());
}
return parseColumnRest(column);
@@ -1556,7 +1567,7 @@ public class SQLExprParser extends SQLParser {
column.setDefaultExpr(bitOr());
return parseColumnRest(column);
}
if (lexer.token() == Token.NOT) {
lexer.nextToken();
accept(Token.NULL);
@@ -1713,8 +1724,8 @@ public class SQLExprParser extends SQLParser {
} else {
accept(Token.EQ);
}
if(lexer.token() == Token.ON) {
if (lexer.token() == Token.ON) {
item.setValue(new SQLIdentifierExpr(lexer.stringVal()));
lexer.nextToken();
} else {
@@ -1725,7 +1736,7 @@ public class SQLExprParser extends SQLParser {
item.setValue(expr());
}
}
return item;
}
@@ -1808,7 +1819,7 @@ public class SQLExprParser extends SQLParser {
protected SQLForeignKeyConstraint createForeignKey() {
return new SQLForeignKeyImpl();
}
public SQLSelectItem parseSelectItem() {
SQLExpr expr;
boolean connectByRoot = false;
@@ -1831,4 +1842,25 @@ public class SQLExprParser extends SQLParser {
return new SQLSelectItem(expr, alias, connectByRoot);
}
public SQLExpr parseGroupingSet() {
String tmp = lexer.stringVal();
acceptIdentifier("GROUPING");
SQLGroupingSetExpr expr = new SQLGroupingSetExpr();
if (identifierEquals("SET")) {
lexer.nextToken();
} else {
return new SQLIdentifierExpr(tmp);
}
accept(Token.LPAREN);
this.exprList(expr.getParameters(), expr);
accept(Token.RPAREN);
return expr;
}
}