From f8a9c1b872f5ef78536e720034bbeeb319811dc1 Mon Sep 17 00:00:00 2001 From: magicdoom Date: Mon, 1 Jun 2015 17:26:11 +0800 Subject: [PATCH 1/3] fix parse mysql load data infile's bug --- .../mysql/parser/MySqlStatementParser.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 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 6a1d0e77ad..e0f5b7e0db 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 @@ -1760,6 +1760,7 @@ public class MySqlStatementParser extends SQLStatementParser { } protected MySqlLoadDataInFileStatement parseLoadDataInFile() { + acceptIdentifier("DATA"); MySqlLoadDataInFileStatement stmt = new MySqlLoadDataInFileStatement(); @@ -1818,7 +1819,8 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals("TERMINATED")) { lexer.nextToken(); accept(Token.BY); - stmt.setColumnsTerminatedBy((SQLLiteralExpr) this.exprParser.expr()); + stmt.setColumnsTerminatedBy(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); } if (identifierEquals("OPTIONALLY")) { @@ -1829,13 +1831,15 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals("ENCLOSED")) { lexer.nextToken(); accept(Token.BY); - stmt.setColumnsEnclosedBy((SQLLiteralExpr) this.exprParser.expr()); + stmt.setColumnsEnclosedBy(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); } if (identifierEquals("ESCAPED")) { lexer.nextToken(); accept(Token.BY); - stmt.setColumnsEscaped((SQLLiteralExpr) this.exprParser.expr()); + stmt.setColumnsEscaped(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); } } @@ -1844,13 +1848,15 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals("STARTING")) { lexer.nextToken(); accept(Token.BY); - stmt.setLinesStartingBy((SQLLiteralExpr) this.exprParser.expr()); + stmt.setLinesStartingBy(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); } if (identifierEquals("TERMINATED")) { lexer.nextToken(); accept(Token.BY); - stmt.setLinesTerminatedBy((SQLLiteralExpr) this.exprParser.expr()); + stmt.setLinesTerminatedBy(new SQLCharExpr(lexer.stringVal())); + lexer.nextToken(); } } @@ -1872,6 +1878,8 @@ public class MySqlStatementParser extends SQLStatementParser { } return stmt; + + } public MySqlPrepareStatement parsePrepare() { From eda244fe02cb223832da39f11251255a504ae406 Mon Sep 17 00:00:00 2001 From: magicdoom Date: Mon, 1 Jun 2015 17:27:57 +0800 Subject: [PATCH 2/3] fix parse mysql load data infile's bug --- .../druid/sql/dialect/mysql/parser/MySqlStatementParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e0f5b7e0db..d964b3ce37 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 @@ -1862,7 +1862,7 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals(IGNORE)) { lexer.nextToken(); - stmt.setIgnoreLinesNumber((SQLLiteralExpr) this.exprParser.expr()); + stmt.setIgnoreLinesNumber( this.exprParser.expr()); acceptIdentifier("LINES"); } From 75f1ac90e60f55d7e0c2971cb4cf3d4c34a434d2 Mon Sep 17 00:00:00 2001 From: magicdoom Date: Fri, 5 Jun 2015 19:56:39 +0800 Subject: [PATCH 3/3] add testcase for parse mysql load data infile --- .../sql/parser/LoadDataSQLParserTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/sql/parser/LoadDataSQLParserTest.java diff --git a/src/test/java/com/alibaba/druid/sql/parser/LoadDataSQLParserTest.java b/src/test/java/com/alibaba/druid/sql/parser/LoadDataSQLParserTest.java new file mode 100644 index 0000000000..d3b8c9764b --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/parser/LoadDataSQLParserTest.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.sql.parser; + +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import junit.framework.TestCase; +import org.junit.Assert; + + +/** + * Created by magicdoom on 2015/6/5. + */ +public class LoadDataSQLParserTest extends TestCase +{ + public void test_load_data() throws Exception { + String sql = "load DATA local INFILE '/opt/test.txt' IGNORE INTO TABLE test CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\r\n' (id,sid,asf) "; + SQLStatementParser parser = new MySqlStatementParser(sql); + MySqlLoadDataInFileStatement stmt = (MySqlLoadDataInFileStatement) parser.parseStatement(); // + Assert.assertEquals("utf8",stmt.getCharset()) ; + Assert.assertEquals(",",((SQLCharExpr)stmt.getColumnsTerminatedBy()).getText()) ; + Assert.assertEquals("\"",((SQLCharExpr)stmt.getColumnsEnclosedBy()).getText()) ; + Assert.assertEquals("\r\n",((SQLCharExpr)stmt.getLinesTerminatedBy()).getText()) ; + Assert.assertEquals("\\",((SQLCharExpr)stmt.getColumnsEscaped()).getText()) ; + + } +}