mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #838 from magicdoom/master
修复解析mysql的load datainfile语句中包含FIELDS TERMINATED,ENCLOSED等参数时出错的bug
This commit is contained in:
@@ -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,19 +1848,21 @@ 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();
|
||||
}
|
||||
}
|
||||
|
||||
if (identifierEquals(IGNORE)) {
|
||||
lexer.nextToken();
|
||||
stmt.setIgnoreLinesNumber((SQLLiteralExpr) this.exprParser.expr());
|
||||
stmt.setIgnoreLinesNumber( this.exprParser.expr());
|
||||
acceptIdentifier("LINES");
|
||||
}
|
||||
|
||||
@@ -1872,6 +1878,8 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
return stmt;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public MySqlPrepareStatement parsePrepare() {
|
||||
|
||||
@@ -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()) ;
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user