diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index 62c803821d..b069dc65e9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -125,63 +125,8 @@ public SQLSelectQuery query() { } parseSelectList(queryBlock); - - if (lexer.token() == (Token.INTO)) { - lexer.nextToken(); - - if (identifierEquals("OUTFILE")) { - lexer.nextToken(); - - MySqlOutFileExpr outFile = new MySqlOutFileExpr(); - outFile.setFile(expr()); - - queryBlock.setInto(outFile); - - if (identifierEquals("FIELDS") || identifierEquals("COLUMNS")) { - lexer.nextToken(); - - if (identifierEquals("TERMINATED")) { - lexer.nextToken(); - accept(Token.BY); - } - outFile.setColumnsTerminatedBy((SQLLiteralExpr) expr()); - - if (identifierEquals("OPTIONALLY")) { - lexer.nextToken(); - outFile.setColumnsEnclosedOptionally(true); - } - - if (identifierEquals("ENCLOSED")) { - lexer.nextToken(); - accept(Token.BY); - outFile.setColumnsEnclosedBy((SQLLiteralExpr) expr()); - } - - if (identifierEquals("ESCAPED")) { - lexer.nextToken(); - accept(Token.BY); - outFile.setColumnsEscaped((SQLLiteralExpr) expr()); - } - } - - if (identifierEquals("LINES")) { - lexer.nextToken(); - - if (identifierEquals("STARTING")) { - lexer.nextToken(); - accept(Token.BY); - outFile.setLinesStartingBy((SQLLiteralExpr) expr()); - } else { - identifierEquals("TERMINATED"); - lexer.nextToken(); - accept(Token.BY); - outFile.setLinesTerminatedBy((SQLLiteralExpr) expr()); - } - } - } else { - queryBlock.setInto(this.exprParser.name()); - } - } + + parseInto(queryBlock); } parseFrom(queryBlock); @@ -201,11 +146,7 @@ public SQLSelectQuery query() { throw new ParserException("TODO"); } - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - SQLExpr expr = this.exprParser.name(); - queryBlock.setInto(expr); - } + parseInto(queryBlock); if (lexer.token() == Token.FOR) { lexer.nextToken(); @@ -224,6 +165,65 @@ public SQLSelectQuery query() { return queryRest(queryBlock); } + + protected void parseInto(SQLSelectQueryBlock queryBlock) { + if (lexer.token() == (Token.INTO)) { + lexer.nextToken(); + + if (identifierEquals("OUTFILE")) { + lexer.nextToken(); + + MySqlOutFileExpr outFile = new MySqlOutFileExpr(); + outFile.setFile(expr()); + + queryBlock.setInto(outFile); + + if (identifierEquals("FIELDS") || identifierEquals("COLUMNS")) { + lexer.nextToken(); + + if (identifierEquals("TERMINATED")) { + lexer.nextToken(); + accept(Token.BY); + } + outFile.setColumnsTerminatedBy((SQLLiteralExpr) expr()); + + if (identifierEquals("OPTIONALLY")) { + lexer.nextToken(); + outFile.setColumnsEnclosedOptionally(true); + } + + if (identifierEquals("ENCLOSED")) { + lexer.nextToken(); + accept(Token.BY); + outFile.setColumnsEnclosedBy((SQLLiteralExpr) expr()); + } + + if (identifierEquals("ESCAPED")) { + lexer.nextToken(); + accept(Token.BY); + outFile.setColumnsEscaped((SQLLiteralExpr) expr()); + } + } + + if (identifierEquals("LINES")) { + lexer.nextToken(); + + if (identifierEquals("STARTING")) { + lexer.nextToken(); + accept(Token.BY); + outFile.setLinesStartingBy((SQLLiteralExpr) expr()); + } else { + identifierEquals("TERMINATED"); + lexer.nextToken(); + accept(Token.BY); + outFile.setLinesTerminatedBy((SQLLiteralExpr) expr()); + } + } + } else { + queryBlock.setInto(this.exprParser.name()); + } + } + } protected void parseGroupBy(SQLSelectQueryBlock queryBlock) { SQLSelectGroupByClause groupBy = null;