From 6d27ae5a10619ff420ff974790accfda7169edcb Mon Sep 17 00:00:00 2001 From: Zhengguo Yang Date: Sun, 21 Mar 2021 11:22:33 +0800 Subject: [PATCH] [Enhance] Support unescape some invisible char in separator (#5524) --- .../org/apache/doris/analysis/Separator.java | 47 ++++++++++++++++++- .../apache/doris/analysis/SeparatorTest.java | 12 +++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Separator.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Separator.java index efc61d9b1e..11404b524f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Separator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Separator.java @@ -91,10 +91,55 @@ public class Separator implements ParseNode { } return writer.toString(); } else { - return originStr; + return unescape(originStr); } } + // unescape some invisible string literal to char, such as "/t" to char '/t' + private static String unescape(String orig) { + StringBuffer sb = new StringBuffer(); + boolean hadSlash = false; + for (int i = 0; i < orig.length(); i++) { + char ch = orig.charAt(i); + if (hadSlash) { + hadSlash = false; + switch (ch) { + case '\\': + sb.append('\\'); + break; + case '\'': + sb.append('\''); + break; + case '\"': + sb.append('"'); + break; + case 'r': + sb.append('\r'); + break; + case 't': + sb.append('\t'); + break; + case 'n': + sb.append('\n'); + break; + default : + sb.append('\\').append(ch); + break; + } + continue; + } else if (ch == '\\') { + if (i == orig.length() - 1) { + sb.append(ch); + } else { + hadSlash = true; + } + continue; + } + sb.append(ch); + } + return sb.toString(); + } + public String toSql() { StringBuilder sb = new StringBuilder(); sb.append("'").append(oriSeparator).append("'"); diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/SeparatorTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/SeparatorTest.java index e499cc1d78..5fd8e7bc54 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/SeparatorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/SeparatorTest.java @@ -31,6 +31,18 @@ public class SeparatorTest { Assert.assertEquals("'\t'", separator.toSql()); Assert.assertEquals("\t", separator.getSeparator()); + // \\t + separator = new Separator("\\t"); + separator.analyze(); + Assert.assertEquals("'\\t'", separator.toSql()); + Assert.assertEquals("\t", separator.getSeparator()); + + // \\\\t + separator = new Separator("\\\\t"); + separator.analyze(); + Assert.assertEquals("'\\\\t'", separator.toSql()); + Assert.assertEquals("\\t", separator.getSeparator()); + // \x01 separator = new Separator("\\x01"); separator.analyze();