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 2e583da..ef6170c 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 @@ -362,6 +362,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; @@ -628,9 +629,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)>0) { + 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; @@ -2000,6 +2013,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) ; 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..9bce303 --- /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- + */ +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()); + } + } +}