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\""));
+  }
 }