improved sql parser performance.

This commit is contained in:
wenshao
2017-08-21 16:57:58 +08:00
parent 5804eea0c9
commit c370d70188
12 changed files with 300 additions and 72 deletions
@@ -44,11 +44,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement.LockType;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.sql.parser.*;
import com.alibaba.druid.util.JdbcConstants;
import java.util.ArrayList;
@@ -2229,6 +2225,8 @@ public class MySqlStatementParser extends SQLStatementParser {
private void parseValueClause(List<ValuesClause> valueClauseList, int columnSize) {
for (int i = 0; ; ++i) {
int startPos = lexer.pos() - 1;
if (lexer.token() != Token.LPAREN) {
throw new ParserException("syntax error, expect ')', " + lexer.info());
}
@@ -2281,6 +2279,13 @@ public class MySqlStatementParser extends SQLStatementParser {
}
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(valueExprList);
if (lexer.isEnabled(SQLParserFeature.KeepInsertValueClauseOriginalString)) {
int endPos = lexer.pos();
String orginalString = lexer.subString(startPos, endPos - startPos);
values.setOriginalString(orginalString);
}
valueClauseList.add(values);
} else {
SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(new ArrayList<SQLExpr>(0));
@@ -47,10 +47,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.sql.visitor.*;
import com.alibaba.druid.util.JdbcConstants;
import java.io.IOException;
@@ -81,7 +78,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
public void configFromProperty(Properties properties) {
if (parameterized) {
if (isEnabled(VisitorFeature.OutputParameterized)) {
String property = properties.getProperty("druid.parameterized.shardingSupport");
if ("true".equals(property)) {
this.setShardingSupport(true);
@@ -92,7 +89,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
public boolean isShardingSupport() {
return parameterized && shardingSupport;
return isEnabled(VisitorFeature.OutputParameterized)
&& shardingSupport;
}
public void setShardingSupport(boolean shardingSupport) {
@@ -573,7 +571,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
try {
if (this.parameterized
if (this.isEnabled(VisitorFeature.OutputParameterized)
&& ParameterizedOutputVisitorUtils.checkParameterize(x)) {
this.appender.append('?');
incrementReplaceCunt();
@@ -1001,7 +999,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
protected void printValuesList(List<SQLInsertStatement.ValuesClause> valuesList) {
if (parameterized) {
if (isEnabled(VisitorFeature.OutputParameterized)) {
print0(ucase ? "VALUES " : "values ");
incrementIndent();
valuesList.get(0).accept(this);
@@ -2774,7 +2772,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(MySqlCharExpr x) {
if (parameterized && ParameterizedOutputVisitorUtils.checkParameterize(x)) {
if (isEnabled(VisitorFeature.OutputParameterized)
&& ParameterizedOutputVisitorUtils.checkParameterize(x)) {
print('?');
incrementReplaceCunt();
if (this instanceof ExportParameterVisitor || this.parameters != null) {
@@ -22,26 +22,23 @@ import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils;
import com.alibaba.druid.sql.visitor.ParameterizedVisitor;
import com.alibaba.druid.sql.visitor.*;
public class OracleParameterizedOutputVisitor extends OracleOutputVisitor implements ParameterizedVisitor {
public OracleParameterizedOutputVisitor(){
this(new StringBuilder());
this.parameterized = true;
this.config(VisitorFeature.OutputParameterized, true);
}
public OracleParameterizedOutputVisitor(Appendable appender){
super(appender);
this.parameterized = true;
this.config(VisitorFeature.OutputParameterized, true);
}
public OracleParameterizedOutputVisitor(Appendable appender, boolean printPostSemi){
super(appender, printPostSemi);
this.parameterized = true;
this.config(VisitorFeature.OutputParameterized, true);
}
public boolean visit(SQLBinaryOpExpr x) {