refactor sql parser.

This commit is contained in:
wenshao
2017-06-10 07:40:05 +08:00
parent 7c4a43d2c5
commit 5434b65260
310 changed files with 1067 additions and 1091 deletions
@@ -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);
}
}
}
@@ -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() {