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:
@@ -57,7 +57,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
super(lexer);
|
||||
}
|
||||
|
||||
public MySqlExprParser(String sql) {
|
||||
public MySqlExprParser(String sql){
|
||||
this(new MySqlLexer(sql));
|
||||
this.lexer.nextToken();
|
||||
}
|
||||
@@ -71,7 +71,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return new SQLBinaryOpExpr(expr, SQLBinaryOperator.RegExp, rightExp);
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("RLIKE")) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = equality();
|
||||
@@ -106,7 +106,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotRegExp, rightExp);
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("RLIKE")) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
@@ -121,14 +121,14 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
public SQLExpr primary() {
|
||||
final Token tok = lexer.token();
|
||||
|
||||
|
||||
if (identifierEquals("outfile")) {
|
||||
lexer.nextToken();
|
||||
SQLExpr file = primary();
|
||||
SQLExpr expr = new MySqlOutFileExpr(file);
|
||||
|
||||
|
||||
return primaryRest(expr);
|
||||
|
||||
|
||||
}
|
||||
|
||||
switch (tok) {
|
||||
@@ -155,7 +155,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
} else if (varRefExpr.getName().equals("@@") && lexer.token() == Token.LITERAL_CHARS) {
|
||||
varRefExpr.setName("@@'" + lexer.stringVal() + "'");
|
||||
lexer.nextToken();
|
||||
}
|
||||
}
|
||||
return primaryRest(varRefExpr);
|
||||
case VALUES:
|
||||
lexer.nextToken();
|
||||
@@ -400,6 +400,10 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
} else {
|
||||
matchAgainstExpr.setSearchModifier(SearchModifier.IN_NATURAL_LANGUAGE_MODE);
|
||||
}
|
||||
} else if (identifierEquals("BOOLEAN")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("MODE");
|
||||
matchAgainstExpr.setSearchModifier(SearchModifier.IN_BOOLEAN_MODE);
|
||||
} else {
|
||||
throw new ParserException("TODO");
|
||||
}
|
||||
@@ -437,16 +441,16 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
return primaryRest(expr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.VARIANT && "@".equals(lexer.stringVal())) {
|
||||
lexer.nextToken();
|
||||
MySqlUserName userName = new MySqlUserName();
|
||||
if (expr instanceof SQLCharExpr) {
|
||||
userName.setUserName(((SQLCharExpr)expr).toString());
|
||||
userName.setUserName(((SQLCharExpr) expr).toString());
|
||||
} else {
|
||||
userName.setUserName(((SQLIdentifierExpr)expr).getName());
|
||||
userName.setUserName(((SQLIdentifierExpr) expr).getName());
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.LITERAL_CHARS) {
|
||||
userName.setHost("'" + lexer.stringVal() + "'");
|
||||
} else {
|
||||
@@ -494,7 +498,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
return intervalExpr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public SQLColumnDefinition parseColumn() {
|
||||
MySqlSQLColumnDefinition column = new MySqlSQLColumnDefinition();
|
||||
column.setName(name());
|
||||
@@ -511,7 +515,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
}
|
||||
return parseColumnRest(column);
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("PARTITION")) {
|
||||
throw new ParserException("syntax error " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
@@ -519,7 +523,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return column;
|
||||
}
|
||||
|
||||
|
||||
public SQLExpr orRest(SQLExpr expr) {
|
||||
|
||||
for (;;) {
|
||||
@@ -540,23 +544,23 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return expr;
|
||||
}
|
||||
|
||||
|
||||
public SQLAssignItem parseAssignItem() {
|
||||
SQLAssignItem item = new SQLAssignItem();
|
||||
|
||||
|
||||
SQLExpr var = primary();
|
||||
|
||||
|
||||
if (var instanceof SQLIdentifierExpr) {
|
||||
String ident = ((SQLIdentifierExpr) var).getName();
|
||||
|
||||
|
||||
if ("GLOBAL".equalsIgnoreCase(ident)) {
|
||||
ident = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
var = new SQLVariantRefExpr(ident, true);
|
||||
} else if ("SESSION".equalsIgnoreCase(ident)) {
|
||||
ident = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
var = new SQLVariantRefExpr(ident, false);
|
||||
ident = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
var = new SQLVariantRefExpr(ident, false);
|
||||
} else {
|
||||
var = new SQLVariantRefExpr(ident);
|
||||
}
|
||||
@@ -567,17 +571,21 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
} else {
|
||||
accept(Token.EQ);
|
||||
}
|
||||
item.setValue(expr());
|
||||
|
||||
if (lexer.token() == Token.BINARY) {
|
||||
lexer.nextToken();
|
||||
item.setValue(new SQLIdentifierExpr("BINARY"));
|
||||
} else {
|
||||
item.setValue(expr());
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
public SQLName nameRest(SQLName name) {
|
||||
if (lexer.token() == Token.VARIANT && "@".equals(lexer.stringVal())) {
|
||||
lexer.nextToken();
|
||||
MySqlUserName userName = new MySqlUserName();
|
||||
userName.setUserName(((SQLIdentifierExpr)name).getName());
|
||||
|
||||
userName.setUserName(((SQLIdentifierExpr) name).getName());
|
||||
|
||||
if (lexer.token() == Token.LITERAL_CHARS) {
|
||||
userName.setHost("'" + lexer.stringVal() + "'");
|
||||
} else {
|
||||
@@ -588,7 +596,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
}
|
||||
return super.nameRest(name);
|
||||
}
|
||||
|
||||
|
||||
public Limit parseLimit() {
|
||||
if (lexer.token() == Token.LIMIT) {
|
||||
lexer.nextToken();
|
||||
@@ -639,7 +647,7 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return primaryKey;
|
||||
}
|
||||
|
||||
|
||||
public MySqlUnique parseUnique() {
|
||||
accept(Token.UNIQUE);
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.mysql.parser;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
|
||||
@@ -44,7 +45,7 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
super(exprParser);
|
||||
}
|
||||
|
||||
public MySqlSelectParser(String sql) {
|
||||
public MySqlSelectParser(String sql){
|
||||
this(new MySqlExprParser(sql));
|
||||
}
|
||||
|
||||
@@ -63,7 +64,7 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
|
||||
if (lexer.token() == Token.SELECT) {
|
||||
lexer.nextToken();
|
||||
|
||||
|
||||
if (lexer.token() == Token.HINT) {
|
||||
this.exprParser.parseHints(queryBlock.getHints());
|
||||
}
|
||||
@@ -273,7 +274,7 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
parseIndexHint(hint);
|
||||
tableSource.getHints().add(hint);
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("FORCE")) {
|
||||
lexer.nextToken();
|
||||
MySqlForceIndexHint hint = new MySqlForceIndexHint();
|
||||
@@ -290,10 +291,10 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
} else {
|
||||
accept(Token.KEY);
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.FOR) {
|
||||
lexer.nextToken();
|
||||
|
||||
|
||||
if (lexer.token() == Token.JOIN) {
|
||||
lexer.nextToken();
|
||||
hint.setOption(MySqlIndexHint.Option.JOIN);
|
||||
@@ -307,9 +308,14 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
hint.setOption(MySqlIndexHint.Option.GROUP_BY);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
accept(Token.LPAREN);
|
||||
this.exprParser.names(hint.getIndexList());
|
||||
if (lexer.token() == Token.PRIMARY) {
|
||||
lexer.nextToken();
|
||||
hint.getIndexList().add(new SQLIdentifierExpr("PRIMARY"));
|
||||
} else {
|
||||
this.exprParser.names(hint.getIndexList());
|
||||
}
|
||||
accept(Token.RPAREN);
|
||||
}
|
||||
|
||||
@@ -326,6 +332,6 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
}
|
||||
|
||||
public Limit parseLimit() {
|
||||
return ((MySqlExprParser)this.exprParser) .parseLimit();
|
||||
return ((MySqlExprParser) this.exprParser).parseLimit();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
|
||||
@@ -28,7 +25,6 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final List<SQLExpr> using = new ArrayList<SQLExpr>();
|
||||
protected OracleSelectPivotBase pivot;
|
||||
protected FlashbackQueryClause flashback;
|
||||
|
||||
@@ -73,10 +69,6 @@ public class OracleSelectJoin extends SQLJoinTableSource implements OracleSelect
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public List<SQLExpr> getUsing() {
|
||||
return this.using;
|
||||
}
|
||||
|
||||
public void output(StringBuffer buf) {
|
||||
this.left.output(buf);
|
||||
buf.append(JoinType.toString(this.joinType));
|
||||
|
||||
Reference in New Issue
Block a user