[Enhance] Support unescape some invisible char in separator (#5524)

This commit is contained in:
Zhengguo Yang
2021-03-21 11:22:33 +08:00
committed by GitHub
parent 97134c64e4
commit 6d27ae5a10
2 changed files with 58 additions and 1 deletions

View File

@ -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("'");

View File

@ -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();