mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor sql parser group by
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user