From 2c25af9bc130baae3cf3cfdc0d6c643509cd3b33 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 12 Jan 2013 23:31:04 +0800 Subject: [PATCH] improve sql parser performance --- .../mysql/parser/MySqlStatementParser.java | 7 +++-- .../com/alibaba/druid/sql/parser/Lexer.java | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 93f1bd798f..dfa164d9a6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -1783,7 +1783,10 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextTokenLParen(); for (;;) { - accept(Token.LPAREN); + if (lexer.token() != Token.LPAREN) { + throw new SQLParseException("syntax error, expect ')'"); + } + lexer.nextTokenValue(); if (lexer.token() != Token.RPAREN) { List valueExprList; @@ -1810,7 +1813,7 @@ public class MySqlStatementParser extends SQLStatementParser { if (lexer.token() == Token.COMMA) { valueExprList.add(expr); - lexer.nextToken(); + lexer.nextTokenValue(); continue; } else if (lexer.token() == Token.RPAREN) { valueExprList.add(expr); 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 6f38d4efbb..a4196f2156 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -221,6 +221,32 @@ public class Lexer { nextToken(); } + public final void nextTokenValue() { + if (ch == ' ') { + scanChar(); + } + + if (ch == '\'') { + bufPos = 0; + scanString(); + return; + } + + if (ch >= '0' && ch <= '9') { + bufPos = 0; + scanNumber(); + return; + } + + if (ch == '?') { + scanChar(); + token = Token.QUES; + return; + } + + nextToken(); + } + public final void nextToken() { bufPos = 0;