hive-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hashut...@apache.org
Subject [2/2] hive git commit: HIVE-10120 : Disallow create table with dot/colon in column name (Pengcheng Xiong via John Pullokkaran)
Date Thu, 30 Apr 2015 18:24:46 GMT
HIVE-10120 : Disallow create table with dot/colon in column name (Pengcheng Xiong via John
Pullokkaran)

Signed-off-by: Ashutosh Chauhan <hashutosh@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/7cbea47b
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/7cbea47b
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/7cbea47b

Branch: refs/heads/master
Commit: 7cbea47b7ae4c4a56349c2362c25bbe5284e023d
Parents: b097189
Author: Pengcheng Xiong <pxiong@hortonworks.com>
Authored: Tue Apr 7 11:17:00 2015 -0700
Committer: Ashutosh Chauhan <hashutosh@apache.org>
Committed: Thu Apr 30 11:24:31 2015 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hive/ql/parse/HiveParser.g    | 14 ++++
 ...tedCharsInColumnNameCreateTableNegative.java | 87 ++++++++++++++++++++
 2 files changed, 101 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/7cbea47b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index 7258c1b..0dce141 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -364,6 +364,7 @@ TOK_SERVER_TYPE;
 @header {
 package org.apache.hadoop.hive.ql.parse;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import org.apache.hadoop.conf.Configuration;
@@ -630,9 +631,21 @@ import org.apache.hadoop.hive.conf.HiveConf;
   private String generateUnionAlias() {
     return "_u" + (++aliasCounter);
   }
+  private char [] excludedCharForColumnName = {'.', ':'};
+  private boolean containExcludedCharForCreateTableColumnName(String input) {
+    for(char c : excludedCharForColumnName) {
+      if(input.indexOf(c)>-1) {
+        return true;
+      }
+    }
+    return false;
+  }
   private CommonTree throwSetOpException() throws RecognitionException {
     throw new FailedPredicateException(input, "orderByClause clusterByClause distributeByClause
sortByClause limitClause can only be applied to the whole union.", "");
   }
+  private CommonTree throwColumnNameException() throws RecognitionException {
+    throw new FailedPredicateException(input, Arrays.toString(excludedCharForColumnName)
+ " can not be used in column name in create table statement.", "");
+  }
   private Configuration hiveConf;
   public void setHiveConf(Configuration hiveConf) {
     this.hiveConf = hiveConf;
@@ -2016,6 +2029,7 @@ columnNameType
 @init { pushMsg("column specification", state); }
 @after { popMsg(state); }
     : colName=identifier colType (KW_COMMENT comment=StringLiteral)?
+    -> {containExcludedCharForCreateTableColumnName($colName.text)}? {throwColumnNameException()}
     -> {$comment == null}? ^(TOK_TABCOL $colName colType)
     ->                     ^(TOK_TABCOL $colName colType $comment)
     ;

http://git-wip-us.apache.org/repos/asf/hive/blob/7cbea47b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestUnpermittedCharsInColumnNameCreateTableNegative.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestUnpermittedCharsInColumnNameCreateTableNegative.java
b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestUnpermittedCharsInColumnNameCreateTableNegative.java
new file mode 100644
index 0000000..451199b
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestUnpermittedCharsInColumnNameCreateTableNegative.java
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.parse;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.ql.Context;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Parser tests for unpermitted chars in column names. Please find more
+ * information in HIVE-10120
+ */
+public class TestUnpermittedCharsInColumnNameCreateTableNegative {
+  private static HiveConf conf;
+
+  private ParseDriver pd;
+
+  @BeforeClass
+  public static void initialize() {
+    conf = new HiveConf(SemanticAnalyzer.class);
+    SessionState.start(conf);
+  }
+
+  @Before
+  public void setup() throws SemanticException, IOException {
+    pd = new ParseDriver();
+  }
+
+  ASTNode parse(String query) throws ParseException {
+    ASTNode nd = null;
+    try {
+      nd = pd.parse(query, new Context(conf));
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+    return (ASTNode) nd.getChild(0);
+  }
+
+  @Test
+  public void testDotInCreateTable() {
+    try {
+      parse("CREATE TABLE testTable (`emp.no` STRING)");
+      Assert.assertFalse("Expected ParseException", true);
+    } catch (ParseException ex) {
+      Assert
+          .assertEquals(
+              "Failure didn't match.",
+              "line 1:39 Failed to recognize predicate ')'. Failed rule: '[., :] can not
be used in column name in create table statement.' in column specification",
+              ex.getMessage());
+    }
+  }
+
+  @Test
+  public void testColonInCreateTable() {
+    try {
+      parse("CREATE TABLE testTable (`emp:no` STRING)");
+      Assert.assertFalse("Expected ParseException", true);
+    } catch (ParseException ex) {
+      Assert
+          .assertEquals(
+              "Failure didn't match.",
+              "line 1:39 Failed to recognize predicate ')'. Failed rule: '[., :] can not
be used in column name in create table statement.' in column specification",
+              ex.getMessage());
+    }
+  }
+}


Mime
View raw message