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;