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
@@ -47,7 +47,7 @@ import com.alibaba.druid.util.StringUtils;
* @author wenshao [szujobs@hotmail.com]
*/
public class Lexer {
protected int features;
protected final String text;
protected int pos;
protected int mark;
@@ -1644,4 +1644,12 @@ public class Lexer {
public int getPosColumn() {
return posColumn;
}
public void config(SQLParserFeature feature, boolean state) {
features = SQLParserFeature.config(features, feature, state);
}
public final boolean isEnabled(SQLParserFeature feature) {
return SQLParserFeature.isEnabled(this.features, feature);
}
}
@@ -21,6 +21,8 @@ public class SQLParser {
protected String dbType;
public SQLParser(String sql, String dbType){
this(new Lexer(sql, null, dbType), dbType);
this.lexer.nextToken();
@@ -316,4 +318,11 @@ public class SQLParser {
}
}
public void config(SQLParserFeature feature, boolean state) {
this.lexer.config(feature, state);
}
public final boolean isEnabled(SQLParserFeature feature) {
return lexer.isEnabled(feature);
}
}
@@ -0,0 +1,56 @@
/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.parser;
public enum SQLParserFeature {
KeepInsertValueClauseOriginalString
;
private SQLParserFeature(){
mask = (1 << ordinal());
}
public final int mask;
public static boolean isEnabled(int features, SQLParserFeature feature) {
return (features & feature.mask) != 0;
}
public static int config(int features, SQLParserFeature feature, boolean state) {
if (state) {
features |= feature.mask;
} else {
features &= ~feature.mask;
}
return features;
}
public static int of(SQLParserFeature[] features) {
if (features == null) {
return 0;
}
int value = 0;
for (SQLParserFeature feature: features) {
value |= feature.mask;
}
return value;
}
}