You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2016/04/20 00:25:07 UTC
[15/58] [abbrv] hive git commit: HIVE-13434 :
BaseSemanticAnalyzer.unescapeSQLString doesn't unescape \u0000 style
character literals. (Kousuke Saruta via Ashutosh Chauhan)
HIVE-13434 : BaseSemanticAnalyzer.unescapeSQLString doesn't unescape \u0000 style character literals. (Kousuke Saruta via Ashutosh Chauhan)
Signed-off-by: Ashutosh Chauhan <ha...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/0ebd4d17
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/0ebd4d17
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/0ebd4d17
Branch: refs/heads/llap
Commit: 0ebd4d17ba24809707a68098d05c753a569f62d5
Parents: caafd88
Author: Kousuke Saruta <sa...@oss.nttdata.co.jp>
Authored: Wed Apr 6 07:15:00 2016 -0800
Committer: Ashutosh Chauhan <ha...@apache.org>
Committed: Sat Apr 9 17:36:46 2016 -0700
----------------------------------------------------------------------
.../hive/ql/parse/BaseSemanticAnalyzer.java | 4 +--
.../hive/ql/parse/TestSemanticAnalyzer.java | 37 ++++++++++++++++++++
2 files changed, 38 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/0ebd4d17/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index f6ba521..19342a8 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
@@ -438,8 +438,6 @@ public abstract class BaseSemanticAnalyzer {
}
}
- private static final int[] multiplier = new int[] {1000, 100, 10, 1};
-
@SuppressWarnings("nls")
public static String unescapeSQLString(String b) {
Character enclosure = null;
@@ -469,7 +467,7 @@ public abstract class BaseSemanticAnalyzer {
int base = i + 2;
for (int j = 0; j < 4; j++) {
int digit = Character.digit(b.charAt(j + base), 16);
- code += digit * multiplier[j];
+ code = (code << 4) + digit;
}
sb.append((char)code);
i += 5;
http://git-wip-us.apache.org/repos/asf/hive/blob/0ebd4d17/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzer.java b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzer.java
index be1f7ff..d35fa91 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzer.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzer.java
@@ -66,4 +66,41 @@ public class TestSemanticAnalyzer {
assertEquals(result, partSpec.get(colName));
}
}
+
+ @Test
+ public void testUnescapeSQLString() {
+ assertEquals("abcdefg", BaseSemanticAnalyzer.unescapeSQLString("\"abcdefg\""));
+
+ // String enclosed by single quotes.
+ assertEquals("C0FFEE", BaseSemanticAnalyzer.unescapeSQLString("\'C0FFEE\'"));
+
+ // Strings including single escaped characters.
+ assertEquals("\u0000", BaseSemanticAnalyzer.unescapeSQLString("'\\0'"));
+ assertEquals("\'", BaseSemanticAnalyzer.unescapeSQLString("\"\\'\""));
+ assertEquals("\"", BaseSemanticAnalyzer.unescapeSQLString("'\\\"'"));
+ assertEquals("\b", BaseSemanticAnalyzer.unescapeSQLString("\"\\b\""));
+ assertEquals("\n", BaseSemanticAnalyzer.unescapeSQLString("'\\n'"));
+ assertEquals("\r", BaseSemanticAnalyzer.unescapeSQLString("\"\\r\""));
+ assertEquals("\t", BaseSemanticAnalyzer.unescapeSQLString("'\\t'"));
+ assertEquals("\u001A", BaseSemanticAnalyzer.unescapeSQLString("\"\\Z\""));
+ assertEquals("\\", BaseSemanticAnalyzer.unescapeSQLString("'\\\\'"));
+ assertEquals("\\%", BaseSemanticAnalyzer.unescapeSQLString("\"\\%\""));
+ assertEquals("\\_", BaseSemanticAnalyzer.unescapeSQLString("'\\_'"));
+
+ // String including '\000' style literal characters.
+ assertEquals("3 + 5 = \u0038", BaseSemanticAnalyzer.unescapeSQLString("'3 + 5 = \\070'"));
+ assertEquals("\u0000", BaseSemanticAnalyzer.unescapeSQLString("\"\\000\""));
+
+ // String including invalid '\000' style literal characters.
+ assertEquals("256", BaseSemanticAnalyzer.unescapeSQLString("\"\\256\""));
+
+ // String including a '\u0000' style literal characters (\u732B is a cat in Kanji).
+ assertEquals("How cute \u732B are",
+ BaseSemanticAnalyzer.unescapeSQLString("\"How cute \\u732B are\""));
+
+ // String including a surrogate pair character
+ // (\uD867\uDE3D is Okhotsk atka mackerel in Kanji).
+ assertEquals("\uD867\uDE3D is a fish",
+ BaseSemanticAnalyzer.unescapeSQLString("\"\\uD867\uDE3D is a fish\""));
+ }
}