From e7d570de3757ef9ea57e4d392a958324666c202b Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 13 Jan 2013 00:13:41 +0800 Subject: [PATCH] improve performance --- .../sql/dialect/mysql/parser/MySqlLexer.java | 33 ++++++++++++++++++- .../com/alibaba/druid/sql/parser/Lexer.java | 6 +++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index 8fce1469e5..a88caebfb4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -26,6 +26,7 @@ import java.util.Map; import com.alibaba.druid.sql.parser.Keywords; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.NotAllowCommentException; +import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLParseException; import com.alibaba.druid.sql.parser.Token; @@ -205,9 +206,38 @@ public class MySqlLexer extends Lexer { } protected final void scanString() { + { + boolean hasSpecial = false; + int startIndex = pos + 1; + int endIndex = indexOf('\'', startIndex); + if (endIndex == -1) { + throw new ParserException("unclosed str"); + } + + String stringVal = subString(startIndex, endIndex - startIndex); + for (int i = 0; i < stringVal.length(); ++i) { + char ch = stringVal.charAt(i); + if (ch == '\\') { + hasSpecial = true; + break; + } + } + + if (!hasSpecial) { + this.stringVal = stringVal; + int pos = endIndex + 1; + char ch = charAt(pos); + if (ch != '\'') { + this.pos = pos; + this.ch = ch; + token = LITERAL_CHARS; + return; + } + } + } + mark = pos; boolean hasSpecial = false; - for (;;) { if (isEOF()) { lexError("unclosed.str.lit"); @@ -286,6 +316,7 @@ public class MySqlLexer extends Lexer { } if (!hasSpecial) { + stringVal = ""; stringVal = subString(mark + 1, bufPos); } else { stringVal = new String(buf, 0, bufPos); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index a4196f2156..f66ed25908 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -41,7 +41,7 @@ import java.util.Arrays; */ public class Lexer { - private final String text; + protected final String text; protected int pos; protected int mark; @@ -78,6 +78,10 @@ public class Lexer { return text.charAt(index); } + + public final int indexOf(char ch, int fromIndex) { + return text.indexOf(ch, fromIndex); + } public String addSymbol() { return subString(mark, bufPos);