improved sql parser.

This commit is contained in:
wenshao
2017-09-28 09:39:01 +08:00
parent aa957fab13
commit 6277b490bd
166 changed files with 2030 additions and 446 deletions
@@ -21,6 +21,7 @@ import static com.alibaba.druid.sql.parser.CharTypes.isWhitespace;
import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI;
import static com.alibaba.druid.sql.parser.SQLParserFeature.KeepComments;
import static com.alibaba.druid.sql.parser.SQLParserFeature.OptimizedForParameterized;
import static com.alibaba.druid.sql.parser.SQLParserFeature.SkipComments;
import static com.alibaba.druid.sql.parser.Token.*;
import java.math.BigDecimal;
@@ -1924,6 +1925,8 @@ public class Lexer {
optimizedForParameterized = state;
} else if (feature == KeepComments) {
this.keepComments = state;
} else if (feature == SkipComments) {
this.skipComment = state;
}
}
@@ -2034,13 +2034,21 @@ public class SQLExprParser extends SQLParser {
}
} else if (lexer.token == Token.IN) {
lexer.nextToken();
accept(Token.LPAREN);
SQLInListExpr inListExpr = new SQLInListExpr(expr, true);
exprList(inListExpr.getTargetList(), inListExpr);
expr = inListExpr;
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
accept(Token.RPAREN);
exprList(inListExpr.getTargetList(), inListExpr);
expr = inListExpr;
accept(Token.RPAREN);
} else {
SQLExpr valueExpr = this.primary();
valueExpr.setParent(inListExpr);
inListExpr.getTargetList().add(valueExpr);
expr = inListExpr;
}
if (inListExpr.getTargetList().size() == 1) {
SQLExpr targetExpr = inListExpr.getTargetList().get(0);
@@ -2670,14 +2678,17 @@ public class SQLExprParser extends SQLParser {
if (token == Token.AS) {
lexer.nextToken();
String as = lexer.stringVal();
String as = null;
if (lexer.token != Token.COMMA && lexer.token != Token.FROM) {
as = lexer.stringVal();
lexer.nextTokenComma();
lexer.nextTokenComma();
if (lexer.token == Token.DOT) {
lexer.nextToken();
as += '.' + lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.DOT) {
lexer.nextToken();
as += '.' + lexer.stringVal();
lexer.nextToken();
}
}
return new SQLSelectItem(expr, as, connectByRoot);
@@ -2689,7 +2700,8 @@ public class SQLExprParser extends SQLParser {
return new SQLSelectItem(expr, as, connectByRoot);
}
if (token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT) {
if ((token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT)
|| token == Token.MODEL) {
String as = lexer.stringVal();
lexer.nextTokenComma();
return new SQLSelectItem(expr, as, connectByRoot);
@@ -2716,6 +2728,7 @@ public class SQLExprParser extends SQLParser {
final String alias;
switch (lexer.token) {
case FULL:
case MODEL:
alias = lexer.stringVal();
lexer.nextToken();
break;
@@ -19,7 +19,8 @@ public enum SQLParserFeature {
KeepInsertValueClauseOriginalString,
EnableSQLBinaryOpExprGroup,
OptimizedForParameterized,
KeepComments
KeepComments,
SkipComments
;
private SQLParserFeature(){
@@ -21,11 +21,12 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
public class SQLSelectListCache {
private final String dbType;
private List<String> sqlCache = new ArrayList<String>();
private List<SQLSelectQueryBlock> queryBlockCache = new ArrayList<SQLSelectQueryBlock>();
private List<String> sqlCache = new CopyOnWriteArrayList<String>();
private List<SQLSelectQueryBlock> queryBlockCache = new CopyOnWriteArrayList<SQLSelectQueryBlock>();
private List<String> printSqlList = new ArrayList<String>();
public SQLSelectListCache(String dbType) {
@@ -2621,7 +2621,7 @@ public class SQLStatementParser extends SQLParser {
public SQLOpenStatement parseOpen() {
SQLOpenStatement stmt = new SQLOpenStatement();
accept(Token.OPEN);
stmt.setCursorName(exprParser.name().getSimpleName());
stmt.setCursorName(exprParser.name());
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
@@ -2674,7 +2674,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseClose() {
SQLCloseStatement stmt = new SQLCloseStatement();
accept(Token.CLOSE);
stmt.setCursorName(exprParser.name().getSimpleName());
stmt.setCursorName(exprParser.name());
accept(Token.SEMI);
stmt.setAfterSemi(true);
return stmt;