mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor sql parser.
This commit is contained in:
@@ -16,8 +16,10 @@
|
||||
package com.alibaba.druid.sql.dialect.mysql.parser;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLListExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.*;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
|
||||
@@ -371,7 +373,20 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
queryBlock.setInto(this.exprParser.name());
|
||||
SQLExpr intoExpr = this.exprParser.name();
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
SQLListExpr list = new SQLListExpr();
|
||||
list.addItem(intoExpr);
|
||||
|
||||
while (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
SQLName name = this.exprParser.name();
|
||||
list.addItem(name);
|
||||
}
|
||||
|
||||
intoExpr = list;
|
||||
}
|
||||
queryBlock.setInto(intoExpr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+39
-14
@@ -553,12 +553,6 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
public boolean parseStatementListDialect(List<SQLStatement> statementList) {
|
||||
if (lexer.token() == Token.KILL) {
|
||||
SQLStatement stmt = parseKill();
|
||||
statementList.add(stmt);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (identifierEquals("PREPARE")) {
|
||||
MySqlPrepareStatement stmt = parsePrepare();
|
||||
statementList.add(stmt);
|
||||
@@ -733,6 +727,33 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String label = lexer.stringVal();
|
||||
char ch = lexer.current();
|
||||
int bp = lexer.bp();
|
||||
lexer.nextToken();
|
||||
if (lexer.token() == Token.VARIANT && lexer.stringVal().equals(":")) {
|
||||
lexer.nextToken();
|
||||
if (lexer.token() == Token.LOOP) {
|
||||
// parse loop statement
|
||||
statementList.add(this.parseLoop(label));
|
||||
} else if (lexer.token() == Token.WHILE) {
|
||||
// parse while statement with label
|
||||
statementList.add(this.parseWhile(label));
|
||||
} else if (lexer.token() == Token.BEGIN) {
|
||||
// parse begin-end statement with label
|
||||
statementList.add(this.parseBlock(label));
|
||||
} else if (lexer.token() == Token.REPEAT) {
|
||||
// parse repeat statement with label
|
||||
statementList.add(this.parseRepeat(label));
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
lexer.reset(bp, ch, Token.IDENTIFIER);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -740,7 +761,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
SQLBlockStatement block = new SQLBlockStatement();
|
||||
|
||||
accept(Token.BEGIN);
|
||||
parseProcedureStatementList(block.getStatementList());
|
||||
this.parseStatementList(block.getStatementList(), -1, block);
|
||||
accept(Token.END);
|
||||
|
||||
return block;
|
||||
@@ -3369,7 +3390,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
// insert
|
||||
if (lexer.token() == Token.INSERT) {
|
||||
statementList.add(parseInsert());
|
||||
SQLStatement stmt = parseInsert();
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -3432,7 +3454,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
// while statement
|
||||
if (lexer.token() == Token.WHILE) {
|
||||
statementList.add(this.parseWhile());
|
||||
SQLStatement stmt = this.parseWhile();
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -3731,7 +3754,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
|
||||
stmt.addVar(item);
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
accept(Token.COMMA);
|
||||
lexer.nextToken();
|
||||
stmt.setAfterSemi(true);
|
||||
continue;
|
||||
} else if (lexer.token() != Token.EOF) {
|
||||
// var type
|
||||
@@ -3842,15 +3866,16 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
* @return
|
||||
*/
|
||||
public MySqlRepeatStatement parseRepeat() {
|
||||
MySqlRepeatStatement repeatStmt = new MySqlRepeatStatement();
|
||||
MySqlRepeatStatement stmt = new MySqlRepeatStatement();
|
||||
accept(Token.REPEAT);
|
||||
parseProcedureStatementList(repeatStmt.getStatements());
|
||||
parseStatementList(stmt.getStatements(), -1, stmt);
|
||||
accept(Token.UNTIL);
|
||||
repeatStmt.setCondition(exprParser.expr());
|
||||
stmt.setCondition(exprParser.expr());
|
||||
accept(Token.END);
|
||||
accept(Token.REPEAT);
|
||||
accept(Token.SEMI);
|
||||
return repeatStmt;
|
||||
stmt.setAfterSemi(true);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3129,9 +3129,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
println();
|
||||
}
|
||||
SQLStatement stmt = x.getStatementList().get(i);
|
||||
stmt.setParent(x);
|
||||
stmt.accept(this);
|
||||
print(';');
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
@@ -3377,15 +3375,16 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
}
|
||||
|
||||
print0(ucase ? "REPEAT " : "repeat ");
|
||||
incrementIndent();
|
||||
println();
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
SQLStatement item = x.getStatements().get(i);
|
||||
item.setParent(x);
|
||||
item.accept(this);
|
||||
if (i != size - 1) {
|
||||
println();
|
||||
}
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
print0(ucase ? "UNTIL " : "until ");
|
||||
x.getCondition().accept(this);
|
||||
|
||||
@@ -65,8 +65,9 @@ public class OdpsStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
public SQLSelectStatement parseSelect() {
|
||||
OdpsSelectParser selectParser = new OdpsSelectParser(this.exprParser);
|
||||
return new SQLSelectStatement(selectParser.select(), JdbcConstants.ODPS);
|
||||
return new SQLSelectStatement(
|
||||
new OdpsSelectParser(this.exprParser)
|
||||
.select(), JdbcConstants.ODPS);
|
||||
}
|
||||
|
||||
public SQLCreateTableStatement parseCreateTable() {
|
||||
|
||||
Reference in New Issue
Block a user