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