From a005d448e530e568fe808b0ceb32a78cb417ec16 Mon Sep 17 00:00:00 2001 From: Yako Date: Wed, 22 Jul 2015 17:32:24 +0800 Subject: [PATCH] bugfix for \n --- .../com/alibaba/druid/sql/parser/Lexer.java | 14 ++++--- .../alibaba/druid/bvt/bug/Bug_for_qianbi.java | 39 +++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java 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 0e88f25bbc..488742fec5 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -674,17 +674,21 @@ public class Lexer { ch = charAt(++pos); - if(ch == '\\') { - hasSpecial = true; - continue; - } - if (ch == '\"' && charAt(pos - 1) != '\\') { scanChar(); token = LITERAL_ALIAS; break; } + if(ch == '\\') { + scanChar(); + if (ch == '"') { + hasSpecial = true; + } else { + unscan(); + } + } + if (bufPos == buf.length) { putChar(ch); } else { diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java new file mode 100644 index 0000000000..5113ca4615 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.bvt.bug; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsOutputVisitor; + +public class Bug_for_qianbi extends TestCase { + + public void test_for_issue() throws Exception { + String sql = "insert into table lol select detail(sellerid,id) as count1,sum(sellerid) as sum1 from ctu_trade_paid_done.time('natural','1d','1h') " + + "where match(auctionTitle,\"男鞋\\n中石化&加油卡\\n中石化&充值卡\\n中石化&冲值卡\\n中石化&代冲\\n中石化&代充\\n中国石化&加油卡\\n中国石化&充值卡\\n中国石化&冲值卡\\n中国石化&代冲\\n中国石化&代充\",\"\\n\")"; + + String expected = "INSERT INTO TABLE lol" + + "\nSELECT detail(sellerid, id) AS count1, " + + "\n\tSUM(sellerid) AS sum1" + + "\nFROM ctu_trade_paid_done:time('natural', '1d', '1h')" + + "\nWHERE match(auctionTitle, '男鞋\\n中石化&加油卡\\n中石化&充值卡\\n中石化&冲值卡\\n中石化&代冲\\n中石化&代充\\n中国石化&加油卡\\n中国石化&充值卡\\n中国石化&冲值卡\\n中国石化&代冲\\n中国石化&代充', '\\n');\n"; + + StringBuilder out = new StringBuilder(); + OdpsOutputVisitor visitor = new OdpsOutputVisitor(out); + OdpsStatementParser parser = new OdpsStatementParser(sql); + List statementList = parser.parseStatementList(); + for (SQLStatement statement : statementList) { + statement.accept(visitor); + visitor.print(";"); + visitor.println(); + } + + // System.out.println(out.toString()); + + Assert.assertEquals(expected, out.toString()); + } +}