mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved parser performance.
This commit is contained in:
@@ -39,6 +39,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
import com.alibaba.druid.util.StringUtils;
|
||||
|
||||
@@ -89,6 +90,8 @@ public class Lexer {
|
||||
|
||||
protected String dbType;
|
||||
|
||||
protected boolean hasSpecial = false;
|
||||
|
||||
private int startPos;
|
||||
private int posLine;
|
||||
private int posColumn;
|
||||
@@ -144,6 +147,12 @@ public class Lexer {
|
||||
return text.substring(offset, offset + count);
|
||||
}
|
||||
|
||||
public final char[] sub_chars(int offset, int count) {
|
||||
char[] chars = new char[count];
|
||||
text.getChars(offset, offset + count, chars, 0);
|
||||
return chars;
|
||||
}
|
||||
|
||||
protected void initBuff(int size) {
|
||||
if (buf == null) {
|
||||
if (size < 32) {
|
||||
@@ -1522,11 +1531,36 @@ public class Lexer {
|
||||
}
|
||||
|
||||
public BigDecimal decimalValue() {
|
||||
String value = subString(mark, bufPos);
|
||||
char[] value = sub_chars(mark, bufPos);
|
||||
if (!StringUtils.isNumber(value)){
|
||||
throw new ParserException(value+" is not a number! " + info());
|
||||
}
|
||||
return new BigDecimal(value.toCharArray());
|
||||
return new BigDecimal(value);
|
||||
}
|
||||
|
||||
public SQLNumberExpr numberExpr() {
|
||||
char[] value = sub_chars(mark, bufPos);
|
||||
if (!StringUtils.isNumber(value)){
|
||||
throw new ParserException(value+" is not a number! " + info());
|
||||
}
|
||||
|
||||
return new SQLNumberExpr(value);
|
||||
}
|
||||
|
||||
public SQLNumberExpr numberExpr(boolean negate) {
|
||||
char[] value = sub_chars(mark, bufPos);
|
||||
if (!StringUtils.isNumber(value)){
|
||||
throw new ParserException(value+" is not a number! " + info());
|
||||
}
|
||||
|
||||
if (negate) {
|
||||
char[] chars = new char[value.length + 1];
|
||||
chars[0] = '-';
|
||||
System.arraycopy(value, 0, chars, 1, value.length);
|
||||
return new SQLNumberExpr(chars);
|
||||
} else {
|
||||
return new SQLNumberExpr(value);
|
||||
}
|
||||
}
|
||||
|
||||
public static interface CommentHandler {
|
||||
|
||||
@@ -297,7 +297,7 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
sqlExpr = new SQLNumberExpr(lexer.decimalValue());
|
||||
sqlExpr = lexer.numberExpr();
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case LITERAL_CHARS:
|
||||
@@ -521,7 +521,7 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
sqlExpr = new SQLNumberExpr(lexer.decimalValue().negate());
|
||||
sqlExpr = lexer.numberExpr(true);
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case IDENTIFIER: // 当负号后面为字段的情况
|
||||
@@ -559,7 +559,7 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case LITERAL_FLOAT:
|
||||
sqlExpr = new SQLNumberExpr(lexer.decimalValue());
|
||||
sqlExpr = lexer.numberExpr();
|
||||
lexer.nextToken();
|
||||
break;
|
||||
case IDENTIFIER: // 当+号后面为字段的情况
|
||||
|
||||
Reference in New Issue
Block a user