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