You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/09/15 19:23:55 UTC
svn commit: r1523463 [1/5] - in /hive/trunk:
common/src/java/org/apache/hadoop/hive/common/type/
common/src/test/org/apache/hadoop/hive/common/type/ data/files/
ql/src/java/org/apache/hadoop/hive/ql/exec/
ql/src/java/org/apache/hadoop/hive/ql/parse/ ql...
Author: hashutosh
Date: Sun Sep 15 17:23:53 2013
New Revision: 1523463
URL: http://svn.apache.org/r1523463
Log:
HIVE-4844 : Add varchar data type (Jason Dere via Ashutosh Chauhan)
Added:
hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/
hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/TestHiveVarchar.java
hive/trunk/data/files/vc1.txt
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToVarchar.java
hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_1.q
hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_2.q
hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_3.q
hive/trunk/ql/src/test/queries/clientpositive/alter_varchar1.q
hive/trunk/ql/src/test/queries/clientpositive/ctas_varchar.q
hive/trunk/ql/src/test/queries/clientpositive/partition_varchar1.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_1.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_2.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_cast.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_comparison.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_join1.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_nested_types.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_udf1.q
hive/trunk/ql/src/test/queries/clientpositive/varchar_union1.q
hive/trunk/ql/src/test/results/clientnegative/invalid_varchar_length_1.q.out
hive/trunk/ql/src/test/results/clientnegative/invalid_varchar_length_2.q.out
hive/trunk/ql/src/test/results/clientnegative/invalid_varchar_length_3.q.out
hive/trunk/ql/src/test/results/clientpositive/alter_varchar1.q.out
hive/trunk/ql/src/test/results/clientpositive/ctas_varchar.q.out
hive/trunk/ql/src/test/results/clientpositive/partition_varchar1.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_1.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_2.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_cast.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_comparison.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_join1.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_nested_types.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_udf1.q.out
hive/trunk/ql/src/test/results/clientpositive/varchar_union1.q.out
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/io/HiveVarcharWritable.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyHiveVarchar.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/objectinspector/primitive/LazyHiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryHiveVarchar.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/HiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/JavaHiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/SettableHiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantHiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableHiveVarcharObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/VarcharTypeParams.java
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/typeinfo/
hive/trunk/serde/src/test/org/apache/hadoop/hive/serde2/typeinfo/TestTypeInfoUtils.java
Modified:
hive/trunk/data/files/datatypes.txt
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/GenericUDFEncode.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFComputeStats.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcatWS.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStringToMap.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDate.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java
hive/trunk/serde/if/serde.thrift
hive/trunk/serde/src/gen/thrift/gen-cpp/serde_constants.cpp
hive/trunk/serde/src/gen/thrift/gen-cpp/serde_constants.h
hive/trunk/serde/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/serde/serdeConstants.java
hive/trunk/serde/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/serde/test/ThriftTestObj.java
hive/trunk/serde/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/serde2/thrift/test/Complex.java
hive/trunk/serde/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/serde2/thrift/test/MegaStruct.java
hive/trunk/serde/src/gen/thrift/gen-php/org/apache/hadoop/hive/serde/Types.php
hive/trunk/serde/src/gen/thrift/gen-py/org_apache_hadoop_hive_serde/constants.py
hive/trunk/serde/src/gen/thrift/gen-rb/serde_constants.rb
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/SerDeUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/avro/AvroObjectInspectorGenerator.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/binarysortable/BinarySortableSerDe.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/io/DoubleWritable.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazyUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazy/objectinspector/primitive/LazyPrimitiveObjectInspectorFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinarySerDe.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/lazybinary/LazyBinaryUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorConverters.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/PrimitiveObjectInspector.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/ParameterizedPrimitiveTypeUtils.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfo.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoFactory.java
hive/trunk/serde/src/java/org/apache/hadoop/hive/serde2/typeinfo/TypeInfoUtils.java
Added: hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java
URL: http://svn.apache.org/viewvc/hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java?rev=1523463&view=auto
==============================================================================
--- hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java (added)
+++ hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveBaseChar.java Sun Sep 15 17:23:53 2013
@@ -0,0 +1,74 @@
+/**
+ * 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.common.type;
+
+import org.apache.commons.lang.StringUtils;
+
+public abstract class HiveBaseChar {
+ protected String value;
+ protected int characterLength = -1;
+
+ protected HiveBaseChar() {
+ }
+
+ /**
+ * Sets the string value to a new value, obeying the max length defined for this object.
+ * @param val new value
+ */
+ public void setValue(String val, int maxLength) {
+ characterLength = -1;
+ value = HiveBaseChar.enforceMaxLength(val, maxLength);
+ }
+
+ public void setValue(HiveBaseChar val, int maxLength) {
+ if ((maxLength < 0)
+ || (val.characterLength > 0 && val.characterLength <= maxLength)) {
+ // No length enforcement required, or source length is less than max length.
+ // We can copy the source value as-is.
+ value = val.value;
+ this.characterLength = val.characterLength;
+ } else {
+ setValue(val.value, maxLength);
+ }
+ }
+
+ public static String enforceMaxLength(String val, int maxLength) {
+ String value = val;
+
+ if (maxLength > 0) {
+ int valLength = val.codePointCount(0, val.length());
+ if (valLength > maxLength) {
+ // Truncate the excess trailing spaces to fit the character length.
+ // Also make sure we take supplementary chars into account.
+ value = val.substring(0, val.offsetByCodePoints(0, maxLength));
+ }
+ }
+ return value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public int getCharacterLength() {
+ if (characterLength < 0) {
+ characterLength = value.codePointCount(0, value.length());
+ }
+ return characterLength;
+ }
+}
Added: hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java
URL: http://svn.apache.org/viewvc/hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java?rev=1523463&view=auto
==============================================================================
--- hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java (added)
+++ hive/trunk/common/src/java/org/apache/hadoop/hive/common/type/HiveVarchar.java Sun Sep 15 17:23:53 2013
@@ -0,0 +1,77 @@
+/**
+ * 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.common.type;
+
+/**
+ *
+ * HiveVarChar.
+ * String wrapper to support SQL VARCHAR features.
+ * Max string length is enforced.
+ *
+ */
+public class HiveVarchar extends HiveBaseChar
+ implements Comparable<HiveVarchar> {
+
+ public static final int MAX_VARCHAR_LENGTH = 65535;
+
+ public HiveVarchar() {
+ }
+
+ public HiveVarchar(String val, int len) {
+ setValue(val, len);
+ }
+
+ public HiveVarchar(HiveVarchar hc, int len) {
+ setValue(hc, len);
+ }
+
+ /**
+ * Set the new value
+ */
+ public void setValue(String val) {
+ super.setValue(val, -1);
+ }
+
+ public void setValue(HiveVarchar hc) {
+ super.setValue(hc.getValue(), -1);
+ }
+
+ @Override
+ public String toString() {
+ return getValue();
+ }
+
+ public int compareTo(HiveVarchar rhs) {
+ if (rhs == this) {
+ return 0;
+ }
+ return this.getValue().compareTo(rhs.getValue());
+ }
+
+ public boolean equals(HiveVarchar rhs) {
+ if (rhs == this) {
+ return true;
+ }
+ return this.getValue().equals(rhs.getValue());
+ }
+
+ @Override
+ public int hashCode() {
+ return getValue().hashCode();
+ }
+}
Added: hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/TestHiveVarchar.java
URL: http://svn.apache.org/viewvc/hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/TestHiveVarchar.java?rev=1523463&view=auto
==============================================================================
--- hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/TestHiveVarchar.java (added)
+++ hive/trunk/common/src/test/org/apache/hadoop/hive/common/type/TestHiveVarchar.java Sun Sep 15 17:23:53 2013
@@ -0,0 +1,143 @@
+/**
+ * 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.common.type;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hive.common.type.HiveVarchar;
+import org.apache.hadoop.hive.common.LogUtils;
+import org.apache.hadoop.hive.common.LogUtils.LogInitializationException;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Random;
+
+
+public class TestHiveVarchar extends TestCase {
+ public TestHiveVarchar() {
+ super();
+ }
+
+ static Random rnd = new Random();
+
+ public static int getRandomSupplementaryChar() {
+ int lowSurrogate = 0xDC00 + rnd.nextInt(1024);
+ //return 0xD8000000 + lowSurrogate;
+ int highSurrogate = 0xD800;
+ return Character.toCodePoint((char)highSurrogate, (char)lowSurrogate);
+ }
+
+ public static int getRandomCodePoint() {
+ int codePoint;
+ if (rnd.nextDouble() < 0.50) {
+ codePoint = 32 + rnd.nextInt(90);
+ } else {
+ codePoint = getRandomSupplementaryChar();
+ }
+ if (!Character.isValidCodePoint(codePoint)) {
+ System.out.println(Integer.toHexString(codePoint) + " is not a valid code point");
+ }
+ return codePoint;
+ }
+
+ public static int getRandomCodePoint(int excludeChar) {
+ while (true) {
+ int codePoint = getRandomCodePoint();
+ if (codePoint != excludeChar) {
+ return codePoint;
+ }
+ }
+ }
+
+ public void testStringLength() throws Exception {
+ int strLen = 20;
+ int[] lengths = { 15, 20, 25 };
+ // Try with supplementary characters
+ for (int idx1 = 0; idx1 < lengths.length; ++idx1) {
+ // Create random test string
+ StringBuffer sb = new StringBuffer();
+ int curLen = lengths[idx1];
+ for (int idx2 = 0; idx2 < curLen; ++idx2) {
+ sb.appendCodePoint(getRandomCodePoint(' '));
+ }
+ String testString = sb.toString();
+ assertEquals(curLen, testString.codePointCount(0, testString.length()));
+ String enforcedString = HiveBaseChar.enforceMaxLength(testString, strLen);
+ if (curLen <= strLen) {
+ // No truncation needed
+ assertEquals(testString, enforcedString);
+ } else {
+ // String should have been truncated.
+ assertEquals(strLen, enforcedString.codePointCount(0, enforcedString.length()));
+ }
+ }
+
+ // Try with ascii chars
+ String[] testStrings = {
+ "abcdefg",
+ "abcdefghijklmnopqrst",
+ "abcdefghijklmnopqrstuvwxyz"
+ };
+ for (String testString : testStrings) {
+ int curLen = testString.length();
+ assertEquals(curLen, testString.codePointCount(0, testString.length()));
+ String enforcedString = HiveBaseChar.enforceMaxLength(testString, strLen);
+ if (curLen <= strLen) {
+ // No truncation needed
+ assertEquals(testString, enforcedString);
+ } else {
+ // String should have been truncated.
+ assertEquals(strLen, enforcedString.codePointCount(0, enforcedString.length()));
+ }
+ }
+ }
+
+ public void testComparison() throws Exception {
+ HiveVarchar hc1 = new HiveVarchar("abcd", 20);
+ HiveVarchar hc2 = new HiveVarchar("abcd", 20);
+
+ // Identical strings should be equal
+ assertTrue(hc1.equals(hc2));
+ assertTrue(hc2.equals(hc1));
+ assertEquals(0, hc1.compareTo(hc2));
+ assertEquals(0, hc2.compareTo(hc1));
+
+ // Unequal strings
+ hc2 = new HiveVarchar("abcde", 20);
+ assertFalse(hc1.equals(hc2));
+ assertFalse(hc2.equals(hc1));
+ assertFalse(0 == hc1.compareTo(hc2));
+ assertFalse(0 == hc2.compareTo(hc1));
+
+ // Trailing spaces are significant
+ hc2 = new HiveVarchar("abcd ", 30);
+
+ assertFalse(hc1.equals(hc2));
+ assertFalse(hc2.equals(hc1));
+ assertFalse(0 == hc1.compareTo(hc2));
+ assertFalse(0 == hc2.compareTo(hc1));
+
+ // Leading spaces are significant
+ hc2 = new HiveVarchar(" abcd", 20);
+ assertFalse(hc1.equals(hc2));
+ assertFalse(hc2.equals(hc1));
+ assertFalse(0 == hc1.compareTo(hc2));
+ assertFalse(0 == hc2.compareTo(hc1));
+ }
+}
Modified: hive/trunk/data/files/datatypes.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/datatypes.txt?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/data/files/datatypes.txt (original)
+++ hive/trunk/data/files/datatypes.txt Sun Sep 15 17:23:53 2013
@@ -1,3 +1,3 @@
-\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N
--1false-1.1\N\N\N-1-1-1.0-1\N\N\N\N\N\N
-1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.0123456YWJjZA==2013-01-01
+\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N
+-1false-1.1\N\N\N-1-1-1.0-1\N\N\N\N\N\N\N
+1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.0123456YWJjZA==2013-01-01abc123
Added: hive/trunk/data/files/vc1.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/vc1.txt?rev=1523463&view=auto
==============================================================================
--- hive/trunk/data/files/vc1.txt (added)
+++ hive/trunk/data/files/vc1.txt Sun Sep 15 17:23:53 2013
@@ -0,0 +1,3 @@
+1abc
+2abc
+3 abc
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Sun Sep 15 17:23:53 2013
@@ -39,6 +39,7 @@ import javax.xml.parsers.DocumentBuilder
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.common.type.HiveVarchar;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
@@ -159,6 +160,7 @@ import org.apache.hadoop.hive.serde2.typ
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.ReflectionUtils;
import org.w3c.dom.Document;
@@ -361,6 +363,8 @@ public final class FunctionRegistry {
GenericUDFToBinary.class);
registerGenericUDF(serdeConstants.DECIMAL_TYPE_NAME,
GenericUDFToDecimal.class);
+ registerGenericUDF(serdeConstants.VARCHAR_TYPE_NAME,
+ GenericUDFToVarchar.class);
// Aggregate functions
registerGenericUDAF("max", new GenericUDAFMax());
@@ -626,6 +630,17 @@ public final class FunctionRegistry {
registerNumericType(PrimitiveCategory.STRING, 8);
}
+ static int getCommonLength(int aLen, int bLen) {
+ int maxLength;
+ if (aLen < 0 || bLen < 0) {
+ // negative length should take precedence over positive value?
+ maxLength = -1;
+ } else {
+ maxLength = Math.max(aLen, bLen);
+ }
+ return maxLength;
+ }
+
/**
* Given 2 TypeInfo types and the PrimitiveCategory selected as the common class between the two,
* return a TypeInfo corresponding to the common PrimitiveCategory, and with type qualifiers
@@ -643,6 +658,16 @@ public final class FunctionRegistry {
// For types with parameters (like varchar), we need to determine the type parameters
// that should be added to this type, based on the original 2 TypeInfos.
switch (typeCategory) {
+ case VARCHAR:
+ int maxLength = getCommonLength(
+ TypeInfoUtils.getCharacterLengthForType(a),
+ TypeInfoUtils.getCharacterLengthForType(b));
+ VarcharTypeParams varcharParams = new VarcharTypeParams();
+ varcharParams.setLength(maxLength);
+ // Generate type name so that we can retrieve the TypeInfo for that type.
+ String typeName = PrimitiveObjectInspectorUtils
+ .getTypeEntryFromTypeSpecs(typeCategory, varcharParams).toString();
+ return TypeInfoFactory.getPrimitiveTypeInfo(typeName);
default:
// Type doesn't require any qualifiers.
@@ -840,7 +865,6 @@ public final class FunctionRegistry {
return false;
}
-
/**
* Get the GenericUDAF evaluator for the name and argumentClasses.
*
@@ -1019,7 +1043,8 @@ public final class FunctionRegistry {
*/
public static int matchCost(TypeInfo argumentPassed,
TypeInfo argumentAccepted, boolean exact) {
- if (argumentAccepted.equals(argumentPassed)) {
+ if (argumentAccepted.equals(argumentPassed)
+ || TypeInfoUtils.doPrimitiveCategoriesMatch(argumentPassed, argumentAccepted)) {
// matches
return 0;
}
@@ -1468,6 +1493,7 @@ public final class FunctionRegistry {
udfClass == UDFToDouble.class || udfClass == UDFToFloat.class ||
udfClass == UDFToInteger.class || udfClass == UDFToLong.class ||
udfClass == UDFToShort.class || udfClass == UDFToString.class ||
+ udfClass == GenericUDFToVarchar.class ||
udfClass == GenericUDFTimestamp.class || udfClass == GenericUDFToBinary.class ||
udfClass == GenericUDFToDate.class;
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java Sun Sep 15 17:23:53 2013
@@ -628,7 +628,7 @@ public abstract class BaseSemanticAnalyz
case HiveParser.TOK_UNIONTYPE:
return getUnionTypeStringFromAST(typeNode);
default:
- return DDLSemanticAnalyzer.getTypeName(typeNode.getType());
+ return DDLSemanticAnalyzer.getTypeName(typeNode);
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java Sun Sep 15 17:23:53 2013
@@ -38,6 +38,7 @@ import java.util.Set;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.Tree;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.Path;
@@ -127,6 +128,10 @@ import org.apache.hadoop.hive.ql.securit
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
import org.apache.hadoop.mapred.InputFormat;
import org.apache.hadoop.mapred.TextInputFormat;
@@ -148,6 +153,7 @@ public class DDLSemanticAnalyzer extends
TokenToTypeName.put(HiveParser.TOK_FLOAT, serdeConstants.FLOAT_TYPE_NAME);
TokenToTypeName.put(HiveParser.TOK_DOUBLE, serdeConstants.DOUBLE_TYPE_NAME);
TokenToTypeName.put(HiveParser.TOK_STRING, serdeConstants.STRING_TYPE_NAME);
+ TokenToTypeName.put(HiveParser.TOK_VARCHAR, serdeConstants.VARCHAR_TYPE_NAME);
TokenToTypeName.put(HiveParser.TOK_BINARY, serdeConstants.BINARY_TYPE_NAME);
TokenToTypeName.put(HiveParser.TOK_DATE, serdeConstants.DATE_TYPE_NAME);
TokenToTypeName.put(HiveParser.TOK_DATETIME, serdeConstants.DATETIME_TYPE_NAME);
@@ -155,12 +161,27 @@ public class DDLSemanticAnalyzer extends
TokenToTypeName.put(HiveParser.TOK_DECIMAL, serdeConstants.DECIMAL_TYPE_NAME);
}
- public static String getTypeName(int token) throws SemanticException {
+ public static String getTypeName(ASTNode node) throws SemanticException {
+ int token = node.getType();
+ String typeName;
+
// datetime type isn't currently supported
if (token == HiveParser.TOK_DATETIME) {
throw new SemanticException(ErrorMsg.UNSUPPORTED_TYPE.getMsg());
}
- return TokenToTypeName.get(token);
+
+ switch (token) {
+ case HiveParser.TOK_VARCHAR:
+ PrimitiveCategory primitiveCategory = PrimitiveCategory.VARCHAR;
+ typeName = TokenToTypeName.get(token);
+ VarcharTypeParams varcharParams = ParseUtils.getVarcharParams(typeName, node);
+ typeName = PrimitiveObjectInspectorUtils.getTypeEntryFromTypeSpecs(
+ primitiveCategory, varcharParams).toString();
+ break;
+ default:
+ typeName = TokenToTypeName.get(token);
+ }
+ return typeName;
}
static class TablePartition {
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g Sun Sep 15 17:23:53 2013
@@ -105,6 +105,7 @@ KW_DATETIME: 'DATETIME';
KW_TIMESTAMP: 'TIMESTAMP';
KW_DECIMAL: 'DECIMAL';
KW_STRING: 'STRING';
+KW_VARCHAR: 'VARCHAR';
KW_ARRAY: 'ARRAY';
KW_STRUCT: 'STRUCT';
KW_MAP: 'MAP';
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g Sun Sep 15 17:23:53 2013
@@ -110,6 +110,7 @@ TOK_DATELITERAL;
TOK_DATETIME;
TOK_TIMESTAMP;
TOK_STRING;
+TOK_VARCHAR;
TOK_BINARY;
TOK_DECIMAL;
TOK_LIST;
@@ -1771,6 +1772,7 @@ primitiveType
| KW_STRING -> TOK_STRING
| KW_BINARY -> TOK_BINARY
| KW_DECIMAL -> TOK_DECIMAL
+ | KW_VARCHAR LPAREN length=Number RPAREN -> ^(TOK_VARCHAR $length)
;
listType
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseUtils.java Sun Sep 15 17:23:53 2013
@@ -20,14 +20,17 @@ package org.apache.hadoop.hive.ql.parse;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.ql.ErrorMsg;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
+import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.typeinfo.BaseTypeParams;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
/**
@@ -116,7 +119,9 @@ public final class ParseUtils {
typeParams = tableFieldTypeInfo.getTypeParams();
if (typeParams != null) {
switch (tableFieldTypeInfo.getPrimitiveCategory()) {
- // No parameterized types yet
+ case VARCHAR:
+ // Nothing to do here - the parameter will be passed to the UDF factory method below
+ break;
default:
throw new SemanticException("Type cast for " + tableFieldTypeInfo.getPrimitiveCategory() +
" does not take type parameters");
@@ -132,4 +137,22 @@ public final class ParseUtils {
return ret;
}
+
+ public static VarcharTypeParams getVarcharParams(String typeName, ASTNode node)
+ throws SemanticException {
+ if (node.getChildCount() != 1) {
+ throw new SemanticException("Bad params for type " + typeName);
+ }
+
+ try {
+ VarcharTypeParams typeParams = new VarcharTypeParams();
+ String lengthStr = node.getChild(0).getText();
+ Integer length = Integer.valueOf(lengthStr);
+ typeParams.setLength(length.intValue());
+ typeParams.validateParams();
+ return typeParams;
+ } catch (SerDeException err) {
+ throw new SemanticException(err);
+ }
+ }
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java Sun Sep 15 17:23:53 2013
@@ -62,6 +62,7 @@ import org.apache.hadoop.hive.ql.udf.gen
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
@@ -562,6 +563,8 @@ public final class TypeCheckProcFactory
serdeConstants.DOUBLE_TYPE_NAME);
conversionFunctionTextHashMap.put(HiveParser.TOK_STRING,
serdeConstants.STRING_TYPE_NAME);
+ conversionFunctionTextHashMap.put(HiveParser.TOK_VARCHAR,
+ serdeConstants.VARCHAR_TYPE_NAME);
conversionFunctionTextHashMap.put(HiveParser.TOK_BINARY,
serdeConstants.BINARY_TYPE_NAME);
conversionFunctionTextHashMap.put(HiveParser.TOK_DATE,
@@ -783,8 +786,14 @@ public final class TypeCheckProcFactory
if (isFunction) {
ASTNode funcNameNode = (ASTNode)expr.getChild(0);
switch (funcNameNode.getType()) {
- // Get type param from AST and add to cast function.
- // But, no parameterized types to handle at the moment
+ case HiveParser.TOK_VARCHAR:
+ // Add type params
+ VarcharTypeParams varcharTypeParams = new VarcharTypeParams();
+ varcharTypeParams.length = Integer.valueOf((funcNameNode.getChild(0).getText()));
+ if (genericUDF != null) {
+ ((SettableUDF)genericUDF).setParams(varcharTypeParams);
+ }
+ break;
default:
// Do nothing
break;
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/CreateTableDesc.java Sun Sep 15 17:23:53 2013
@@ -25,10 +25,13 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.common.JavaUtils;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.Order;
import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.hive.ql.io.HiveFileFormatUtils;
import org.apache.hadoop.hive.ql.io.HiveOutputFormat;
@@ -36,7 +39,8 @@ import org.apache.hadoop.hive.ql.parse.B
import org.apache.hadoop.hive.ql.parse.ParseUtils;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.serde2.SerDeUtils;
-import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
/**
* CreateTableDesc.
@@ -45,6 +49,7 @@ import org.apache.hadoop.hive.serde2.obj
@Explain(displayName = "Create Table")
public class CreateTableDesc extends DDLDesc implements Serializable {
private static final long serialVersionUID = 1L;
+ private static Log LOG = LogFactory.getLog(CreateTableDesc.class);
String databaseName;
String tableName;
boolean isExternal;
@@ -461,12 +466,15 @@ public class CreateTableDesc extends DDL
while (partColsIter.hasNext()) {
FieldSchema fs = partColsIter.next();
String partCol = fs.getName();
- PrimitiveObjectInspectorUtils.PrimitiveTypeEntry pte = PrimitiveObjectInspectorUtils
- .getTypeEntryFromTypeName(
- fs.getType());
- if(null == pte){
+ TypeInfo pti = null;
+ try {
+ pti = TypeInfoFactory.getPrimitiveTypeInfo(fs.getType());
+ } catch (Exception err) {
+ LOG.error(err);
+ }
+ if(null == pti){
throw new SemanticException(ErrorMsg.PARTITION_COLUMN_NON_PRIMITIVE.getMsg() + " Found "
- + partCol + " of type: " + fs.getType());
+ + partCol + " of type: " + fs.getType());
}
Iterator<String> colNamesIter = colNames.iterator();
while (colNamesIter.hasNext()) {
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeConstantDesc.java Sun Sep 15 17:23:53 2013
@@ -66,7 +66,8 @@ public class ExprNodeConstantDesc extend
.getPrimitiveJavaObjectInspector(pc).getPrimitiveWritableObject(
getValue());
return PrimitiveObjectInspectorFactory
- .getPrimitiveWritableConstantObjectInspector(pc, writableValue);
+ .getPrimitiveWritableConstantObjectInspector(
+ (PrimitiveTypeInfo) getTypeInfo(), writableValue);
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/GenericUDFEncode.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/GenericUDFEncode.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/GenericUDFEncode.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/GenericUDFEncode.java Sun Sep 15 17:23:53 2013
@@ -19,6 +19,8 @@ import org.apache.hadoop.hive.serde2.obj
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
@@ -30,8 +32,8 @@ extended = "Possible options for the cha
"is null, the result will also be null")
public class GenericUDFEncode extends GenericUDF {
private transient CharsetEncoder encoder = null;
- private transient StringObjectInspector stringOI = null;
- private transient StringObjectInspector charsetOI = null;
+ private transient PrimitiveObjectInspector stringOI = null;
+ private transient PrimitiveObjectInspector charsetOI = null;
private transient BytesWritable result = new BytesWritable();
@Override
@@ -41,23 +43,27 @@ public class GenericUDFEncode extends Ge
}
if (arguments[0].getCategory() != Category.PRIMITIVE ||
- ((PrimitiveObjectInspector)arguments[0]).getPrimitiveCategory() != PrimitiveCategory.STRING){
- throw new UDFArgumentTypeException(0, "The first argument to Encode() must be a string");
+ PrimitiveGrouping.STRING_GROUP != PrimitiveObjectInspectorUtils.getPrimitiveGrouping(
+ ((PrimitiveObjectInspector)arguments[0]).getPrimitiveCategory())){
+ throw new UDFArgumentTypeException(
+ 0, "The first argument to Encode() must be a string/varchar");
}
- stringOI = (StringObjectInspector) arguments[0];
+ stringOI = (PrimitiveObjectInspector) arguments[0];
if (arguments[1].getCategory() != Category.PRIMITIVE ||
- ((PrimitiveObjectInspector)arguments[1]).getPrimitiveCategory() != PrimitiveCategory.STRING){
- throw new UDFArgumentTypeException(1, "The second argument to Encode() must be a string");
+ PrimitiveGrouping.STRING_GROUP != PrimitiveObjectInspectorUtils.getPrimitiveGrouping(
+ ((PrimitiveObjectInspector)arguments[1]).getPrimitiveCategory())){
+ throw new UDFArgumentTypeException(
+ 1, "The second argument to Encode() must be a string/varchar");
}
- charsetOI = (StringObjectInspector) arguments[1];
+ charsetOI = (PrimitiveObjectInspector) arguments[1];
// If the character set for encoding is constant, we can optimize that
- StringObjectInspector charSetOI = (StringObjectInspector) arguments[1];
- if (charSetOI instanceof ConstantObjectInspector){
- String charSetName = ((Text) ((ConstantObjectInspector) charSetOI).getWritableConstantValue()).toString();
+ if (charsetOI instanceof ConstantObjectInspector){
+ String charSetName =
+ ((ConstantObjectInspector) arguments[1]).getWritableConstantValue().toString();
encoder = Charset.forName(charSetName).newEncoder().onMalformedInput(CodingErrorAction.REPORT).onUnmappableCharacter(CodingErrorAction.REPORT);
}
@@ -68,7 +74,7 @@ public class GenericUDFEncode extends Ge
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
- String value = stringOI.getPrimitiveJavaObject(arguments[0].get());
+ String value = PrimitiveObjectInspectorUtils.getString(arguments[0].get(), stringOI);
if (value == null) {
return null;
}
@@ -81,7 +87,8 @@ public class GenericUDFEncode extends Ge
throw new HiveException(e);
}
} else {
- encoded = Charset.forName(charsetOI.getPrimitiveJavaObject(arguments[1].get())).encode(value);
+ encoded = Charset.forName(
+ PrimitiveObjectInspectorUtils.getString(arguments[1].get(), charsetOI)).encode(value);
}
result.setSize(encoded.limit());
encoded.get(result.getBytes(), 0, encoded.limit());
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFToString.java Sun Sep 15 17:23:53 2013
@@ -20,6 +20,7 @@ package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.serde2.ByteStream;
+import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFComputeStats.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFComputeStats.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFComputeStats.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFComputeStats.java Sun Sep 15 17:23:53 2013
@@ -83,6 +83,7 @@ public class GenericUDAFComputeStats ext
case DOUBLE:
return new GenericUDAFDoubleStatsEvaluator();
case STRING:
+ case VARCHAR:
return new GenericUDAFStringStatsEvaluator();
case BINARY:
return new GenericUDAFBinaryStatsEvaluator();
@@ -102,12 +103,12 @@ public class GenericUDAFComputeStats ext
/* Object Inspector corresponding to the input parameter.
*/
- private PrimitiveObjectInspector inputOI;
+ private transient PrimitiveObjectInspector inputOI;
/* Partial aggregation result returned by TerminatePartial. Partial result is a struct
* containing a long field named "count".
*/
- private Object[] partialResult;
+ private transient Object[] partialResult;
/* Object Inspectors corresponding to the struct returned by TerminatePartial and the long
* field within the struct - "count"
@@ -115,17 +116,17 @@ public class GenericUDAFComputeStats ext
private transient StructObjectInspector soi;
private transient StructField countTruesField;
- private WritableLongObjectInspector countTruesFieldOI;
+ private transient WritableLongObjectInspector countTruesFieldOI;
private transient StructField countFalsesField;
- private WritableLongObjectInspector countFalsesFieldOI;
+ private transient WritableLongObjectInspector countFalsesFieldOI;
private transient StructField countNullsField;
- private WritableLongObjectInspector countNullsFieldOI;
+ private transient WritableLongObjectInspector countNullsFieldOI;
/* Output of final result of the aggregation
*/
- private Object[] result;
+ private transient Object[] result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters)
@@ -305,13 +306,13 @@ public class GenericUDAFComputeStats ext
/* Object Inspector corresponding to the input parameter.
*/
- private PrimitiveObjectInspector inputOI;
+ private transient PrimitiveObjectInspector inputOI;
private transient PrimitiveObjectInspector numVectorsOI;
/* Partial aggregation result returned by TerminatePartial. Partial result is a struct
* containing a long field named "count".
*/
- private Object[] partialResult;
+ private transient Object[] partialResult;
/* Object Inspectors corresponding to the struct returned by TerminatePartial and the long
* field within the struct - "count"
@@ -319,23 +320,23 @@ public class GenericUDAFComputeStats ext
private transient StructObjectInspector soi;
private transient StructField minField;
- private WritableLongObjectInspector minFieldOI;
+ private transient WritableLongObjectInspector minFieldOI;
private transient StructField maxField;
- private WritableLongObjectInspector maxFieldOI;
+ private transient WritableLongObjectInspector maxFieldOI;
private transient StructField countNullsField;
- private WritableLongObjectInspector countNullsFieldOI;
+ private transient WritableLongObjectInspector countNullsFieldOI;
private transient StructField ndvField;
- private WritableStringObjectInspector ndvFieldOI;
+ private transient WritableStringObjectInspector ndvFieldOI;
private transient StructField numBitVectorsField;
- private WritableIntObjectInspector numBitVectorsFieldOI;
+ private transient WritableIntObjectInspector numBitVectorsFieldOI;
/* Output of final result of the aggregation
*/
- private Object[] result;
+ private transient Object[] result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
@@ -601,13 +602,13 @@ public class GenericUDAFComputeStats ext
/* Object Inspector corresponding to the input parameter.
*/
- private PrimitiveObjectInspector inputOI;
+ private transient PrimitiveObjectInspector inputOI;
private transient PrimitiveObjectInspector numVectorsOI;
/* Partial aggregation result returned by TerminatePartial. Partial result is a struct
* containing a long field named "count".
*/
- private Object[] partialResult;
+ private transient Object[] partialResult;
/* Object Inspectors corresponding to the struct returned by TerminatePartial and the long
* field within the struct - "count"
@@ -615,23 +616,23 @@ public class GenericUDAFComputeStats ext
private transient StructObjectInspector soi;
private transient StructField minField;
- private WritableDoubleObjectInspector minFieldOI;
+ private transient WritableDoubleObjectInspector minFieldOI;
private transient StructField maxField;
- private WritableDoubleObjectInspector maxFieldOI;
+ private transient WritableDoubleObjectInspector maxFieldOI;
private transient StructField countNullsField;
- private WritableLongObjectInspector countNullsFieldOI;
+ private transient WritableLongObjectInspector countNullsFieldOI;
private transient StructField ndvField;
- private WritableStringObjectInspector ndvFieldOI;
+ private transient WritableStringObjectInspector ndvFieldOI;
private transient StructField numBitVectorsField;
- private WritableIntObjectInspector numBitVectorsFieldOI;
+ private transient WritableIntObjectInspector numBitVectorsFieldOI;
/* Output of final result of the aggregation
*/
- private Object[] result;
+ private transient Object[] result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
@@ -898,13 +899,13 @@ public class GenericUDAFComputeStats ext
/* Object Inspector corresponding to the input parameter.
*/
- private PrimitiveObjectInspector inputOI;
+ private transient PrimitiveObjectInspector inputOI;
private transient PrimitiveObjectInspector numVectorsOI;
/* Partial aggregation result returned by TerminatePartial. Partial result is a struct
* containing a long field named "count".
*/
- private Object[] partialResult;
+ private transient Object[] partialResult;
/* Object Inspectors corresponding to the struct returned by TerminatePartial and the
* fields within the struct - "maxLength", "sumLength", "count", "countNulls", "ndv"
@@ -912,26 +913,26 @@ public class GenericUDAFComputeStats ext
private transient StructObjectInspector soi;
private transient StructField maxLengthField;
- private WritableLongObjectInspector maxLengthFieldOI;
+ private transient WritableLongObjectInspector maxLengthFieldOI;
private transient StructField sumLengthField;
- private WritableLongObjectInspector sumLengthFieldOI;
+ private transient WritableLongObjectInspector sumLengthFieldOI;
private transient StructField countField;
- private WritableLongObjectInspector countFieldOI;
+ private transient WritableLongObjectInspector countFieldOI;
private transient StructField countNullsField;
- private WritableLongObjectInspector countNullsFieldOI;
+ private transient WritableLongObjectInspector countNullsFieldOI;
private transient StructField ndvField;
- private WritableStringObjectInspector ndvFieldOI;
+ private transient WritableStringObjectInspector ndvFieldOI;
private transient StructField numBitVectorsField;
- private WritableIntObjectInspector numBitVectorsFieldOI;
+ private transient WritableIntObjectInspector numBitVectorsFieldOI;
/* Output of final result of the aggregation
*/
- private Object[] result;
+ private transient Object[] result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
@@ -1217,12 +1218,12 @@ public class GenericUDAFComputeStats ext
/* Object Inspector corresponding to the input parameter.
*/
- private PrimitiveObjectInspector inputOI;
+ private transient PrimitiveObjectInspector inputOI;
/* Partial aggregation result returned by TerminatePartial. Partial result is a struct
* containing a long field named "count".
*/
- private Object[] partialResult;
+ private transient Object[] partialResult;
/* Object Inspectors corresponding to the struct returned by TerminatePartial and the
* fields within the struct - "maxLength", "sumLength", "count", "countNulls"
@@ -1230,20 +1231,20 @@ public class GenericUDAFComputeStats ext
private transient StructObjectInspector soi;
private transient StructField maxLengthField;
- private WritableLongObjectInspector maxLengthFieldOI;
+ private transient WritableLongObjectInspector maxLengthFieldOI;
private transient StructField sumLengthField;
- private WritableLongObjectInspector sumLengthFieldOI;
+ private transient WritableLongObjectInspector sumLengthFieldOI;
private transient StructField countField;
- private WritableLongObjectInspector countFieldOI;
+ private transient WritableLongObjectInspector countFieldOI;
private transient StructField countNullsField;
- private WritableLongObjectInspector countNullsFieldOI;
+ private transient WritableLongObjectInspector countNullsFieldOI;
/* Output of final result of the aggregation
*/
- private Object[] result;
+ private transient Object[] result;
@Override
public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException {
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java Sun Sep 15 17:23:53 2013
@@ -133,9 +133,14 @@ public abstract class GenericUDFBaseComp
TypeInfo oiTypeInfo0 = TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]);
TypeInfo oiTypeInfo1 = TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[1]);
- if (oiTypeInfo0 != oiTypeInfo1) {
+ if (oiTypeInfo0 == oiTypeInfo1
+ || TypeInfoUtils.doPrimitiveCategoriesMatch(oiTypeInfo0, oiTypeInfo1)) {
+ compareType = CompareType.SAME_TYPE;
+ } else {
compareType = CompareType.NEED_CONVERT;
- TypeInfo compareType = FunctionRegistry.getCommonClassForComparison(oiTypeInfo0, oiTypeInfo1);
+ TypeInfo compareType = FunctionRegistry.getCommonClassForComparison(
+ oiTypeInfo0, oiTypeInfo1);
+
// For now, we always convert to double if we can't find a common type
compareOI = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
(compareType == null) ?
@@ -143,8 +148,6 @@ public abstract class GenericUDFBaseComp
converter0 = ObjectInspectorConverters.getConverter(arguments[0], compareOI);
converter1 = ObjectInspectorConverters.getConverter(arguments[1], compareOI);
- } else {
- compareType = CompareType.SAME_TYPE;
}
}
return PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcatWS.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcatWS.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcatWS.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFConcatWS.java Sun Sep 15 17:23:53 2013
@@ -27,7 +27,11 @@ import org.apache.hadoop.hive.serde.serd
import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.io.Text;
@@ -61,15 +65,12 @@ public class GenericUDFConcatWS extends
for (int i = 0; i < arguments.length; i++) {
switch(arguments[i].getCategory()) {
case LIST:
- if (((ListObjectInspector)arguments[i]).getListElementObjectInspector()
- .getTypeName().equals(serdeConstants.STRING_TYPE_NAME)
- || ((ListObjectInspector)arguments[i]).getListElementObjectInspector()
- .getTypeName().equals(serdeConstants.VOID_TYPE_NAME)) {
- break;
+ if (isStringOrVoidType(
+ ((ListObjectInspector) arguments[i]).getListElementObjectInspector())) {
+ break;
}
case PRIMITIVE:
- if (arguments[i].getTypeName().equals(serdeConstants.STRING_TYPE_NAME)
- || arguments[i].getTypeName().equals(serdeConstants.VOID_TYPE_NAME)) {
+ if (isStringOrVoidType(arguments[i])) {
break;
}
default:
@@ -84,6 +85,18 @@ public class GenericUDFConcatWS extends
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
}
+ protected boolean isStringOrVoidType(ObjectInspector oi) {
+ if (oi.getCategory() == Category.PRIMITIVE) {
+ if (PrimitiveGrouping.STRING_GROUP
+ == PrimitiveObjectInspectorUtils.getPrimitiveGrouping(
+ ((PrimitiveObjectInspector) oi).getPrimitiveCategory())
+ || ((PrimitiveObjectInspector) oi).getPrimitiveCategory() == PrimitiveCategory.VOID) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private final Text resultText = new Text();
@Override
@@ -91,8 +104,8 @@ public class GenericUDFConcatWS extends
if (arguments[0].get() == null) {
return null;
}
- String separator = ((StringObjectInspector) argumentOIs[0])
- .getPrimitiveJavaObject(arguments[0].get());
+ String separator = PrimitiveObjectInspectorUtils.getString(
+ arguments[0].get(), (PrimitiveObjectInspector)argumentOIs[0]);
StringBuilder sb = new StringBuilder();
boolean first = true;
@@ -116,8 +129,8 @@ public class GenericUDFConcatWS extends
sb.append(strArrayOI.getListElement(strArray, j));
}
} else {
- sb.append(((StringObjectInspector) argumentOIs[i])
- .getPrimitiveJavaObject(arguments[i].get()));
+ sb.append(PrimitiveObjectInspectorUtils.getString(
+ arguments[i].get(), (PrimitiveObjectInspector)argumentOIs[i]));
}
}
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect2.java Sun Sep 15 17:23:53 2013
@@ -39,6 +39,7 @@ import org.apache.hadoop.hive.serde2.obj
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveTypeEntry;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.io.BooleanWritable;
import org.apache.hadoop.io.BytesWritable;
@@ -93,8 +94,12 @@ public class GenericUDFReflect2 extends
try {
method = findMethod(targetClass, methodName.toString(), null, true);
+ // While getTypeFor() returns a TypeEntry, we won't actually be able to get any
+ // type parameter information from this since the TypeEntry is derived from a return type.
+ PrimitiveTypeEntry typeEntry = getTypeFor(method.getReturnType());
returnOI = PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
- getTypeFor(method.getReturnType()).primitiveCategory);
+ PrimitiveObjectInspectorUtils.getTypeEntryFromTypeSpecs(
+ typeEntry.primitiveCategory, typeEntry.typeParams));
returnObj = (Writable) returnOI.getPrimitiveWritableClass().newInstance();
} catch (Exception e) {
throw new UDFArgumentException(e);
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStringToMap.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStringToMap.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStringToMap.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStringToMap.java Sun Sep 15 17:23:53 2013
@@ -24,9 +24,15 @@ import org.apache.hadoop.hive.ql.exec.De
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
@@ -41,30 +47,30 @@ import org.apache.hadoop.hive.serde2.typ
+ " delimiters are used: ',' as delimiter1 and '=' as delimiter2.")
public class GenericUDFStringToMap extends GenericUDF {
private final HashMap<Object, Object> ret = new HashMap<Object, Object>();
- private transient StringObjectInspector soi_text, soi_de1 = null, soi_de2 = null;
+ private transient Converter soi_text, soi_de1 = null, soi_de2 = null;
final static String default_de1 = ",";
final static String default_de2 = ":";
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
- if (!TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]).equals(
- TypeInfoFactory.stringTypeInfo)
- || (arguments.length > 1 &&
- !TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[1]).equals(
- TypeInfoFactory.stringTypeInfo))
- || (arguments.length > 2 &&
- !TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[2]).equals(
- TypeInfoFactory.stringTypeInfo))) {
- throw new UDFArgumentException("All argument should be string");
+ for (int idx = 0; idx < Math.min(arguments.length, 3); ++idx) {
+ if (arguments[idx].getCategory() != Category.PRIMITIVE
+ || PrimitiveObjectInspectorUtils.getPrimitiveGrouping(
+ ((PrimitiveObjectInspector) arguments[idx]).getPrimitiveCategory())
+ != PrimitiveGrouping.STRING_GROUP) {
+ throw new UDFArgumentException("All argument should be string/character type");
+ }
}
-
- soi_text = (StringObjectInspector) arguments[0];
+ soi_text = ObjectInspectorConverters.getConverter(arguments[0],
+ PrimitiveObjectInspectorFactory.javaStringObjectInspector);
if (arguments.length > 1) {
- soi_de1 = (StringObjectInspector) arguments[1];
+ soi_de1 = ObjectInspectorConverters.getConverter(arguments[1],
+ PrimitiveObjectInspectorFactory.javaStringObjectInspector);
}
if (arguments.length > 2) {
- soi_de2 = (StringObjectInspector) arguments[2];
+ soi_de2 = ObjectInspectorConverters.getConverter(arguments[2],
+ PrimitiveObjectInspectorFactory.javaStringObjectInspector);
}
return ObjectInspectorFactory.getStandardMapObjectInspector(
@@ -75,11 +81,11 @@ public class GenericUDFStringToMap exten
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
ret.clear();
- String text = soi_text.getPrimitiveJavaObject(arguments[0].get());
+ String text = (String) soi_text.convert(arguments[0].get());
String delimiter1 = (soi_de1 == null) ?
- default_de1 : soi_de1.getPrimitiveJavaObject(arguments[1].get());
+ default_de1 : (String) soi_de1.convert(arguments[1].get());
String delimiter2 = (soi_de2 == null) ?
- default_de2 : soi_de2.getPrimitiveJavaObject(arguments[2].get());
+ default_de2 : (String) soi_de2.convert(arguments[2].get());
String[] keyValuePairs = text.split(delimiter1);
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDate.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDate.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDate.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToDate.java Sun Sep 15 17:23:53 2013
@@ -25,6 +25,8 @@ import org.apache.hadoop.hive.serde2.obj
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter.DateConverter;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping;
/**
* GenericUDFToDate
@@ -49,10 +51,11 @@ public class GenericUDFToDate extends Ge
}
try {
argumentOI = (PrimitiveObjectInspector) arguments[0];
- switch (argumentOI.getPrimitiveCategory()) {
- case DATE:
- case STRING:
- case TIMESTAMP:
+ PrimitiveGrouping pg =
+ PrimitiveObjectInspectorUtils.getPrimitiveGrouping(argumentOI.getPrimitiveCategory());
+ switch (pg) {
+ case DATE_GROUP:
+ case STRING_GROUP:
break;
default:
throw new UDFArgumentException(
Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToVarchar.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToVarchar.java?rev=1523463&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToVarchar.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFToVarchar.java Sun Sep 15 17:23:53 2013
@@ -0,0 +1,132 @@
+/**
+ * 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.udf.generic;
+
+import java.io.Serializable;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.SettableUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter.HiveVarcharConverter;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveVarcharObjectInspector;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
+
+@Description(name = "varchar",
+value = "CAST(<value> as VARCHAR(length)) - Converts the argument to a varchar value.",
+extended = "Values will be truncated if the input value is too long to fit"
++ " within the varchar length."
++ "Example:\n "
++ " > SELECT CAST(1234 AS varchar(10)) FROM src LIMIT 1;\n"
++ " '1234'")
+public class GenericUDFToVarchar extends GenericUDF
+ implements SettableUDF, Serializable {
+ private static final Log LOG = LogFactory.getLog(GenericUDFToVarchar.class.getName());
+ private transient PrimitiveObjectInspector argumentOI;
+ private transient HiveVarcharConverter converter;
+
+ // The varchar type parameters need to be set prior to initialization,
+ // and must be preserved when the plan serialized to other processes.
+ private VarcharTypeParams typeParams;
+
+ public GenericUDFToVarchar() {
+ }
+
+ @Override
+ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+ if (arguments.length != 1) {
+ throw new UDFArgumentException("VARCHAR cast requires a value argument");
+ }
+ try {
+ argumentOI = (PrimitiveObjectInspector) arguments[0];
+ } catch (ClassCastException e) {
+ throw new UDFArgumentException(
+ "The function VARCHAR takes only primitive types");
+ }
+
+ // Check if this UDF has been provided with type params for the output varchar type
+ SettableHiveVarcharObjectInspector outputOI;
+ if (typeParams != null) {
+ outputOI = (SettableHiveVarcharObjectInspector)
+ PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(
+ PrimitiveObjectInspectorUtils.getTypeEntryFromTypeSpecs(
+ PrimitiveCategory.VARCHAR, typeParams));
+ } else {
+ outputOI = PrimitiveObjectInspectorFactory.writableHiveVarcharObjectInspector;
+ }
+
+ converter = new HiveVarcharConverter(argumentOI, outputOI);
+ return outputOI;
+ }
+
+ @Override
+ public Object evaluate(DeferredObject[] arguments) throws HiveException {
+ Object o0 = arguments[0].get();
+ if (o0 == null) {
+ return null;
+ }
+
+ return converter.convert(o0);
+ }
+
+ @Override
+ public String getDisplayString(String[] children) {
+ assert (children.length == 1);
+ StringBuilder sb = new StringBuilder();
+ sb.append("CAST( ");
+ sb.append(children[0]);
+ sb.append(" AS VARCHAR(");
+ String paramsStr = "";
+ if (typeParams != null) {
+ paramsStr = typeParams.toString();
+ }
+ sb.append(paramsStr);
+ sb.append(")");
+ return sb.toString();
+ }
+
+/**
+ * Provide varchar type parameters for the output object inspector.
+ * This should be done before the UDF is initialized.
+ */
+ @Override
+ public void setParams(Object typeParams) throws UDFArgumentException {
+ if (converter != null) {
+ LOG.warn("Type converter already initialized, setting type params now will not be useful");
+ }
+ if (typeParams instanceof VarcharTypeParams) {
+ this.typeParams = (VarcharTypeParams)typeParams;
+ } else {
+ throw new UDFArgumentException(
+ "Was expecting VarcharTypeParams, instead got " + typeParams.getClass().getName());
+ }
+ }
+
+ @Override
+ public Object getParams() {
+ return typeParams;
+ }
+
+}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFUtils.java Sun Sep 15 17:23:53 2013
@@ -29,17 +29,21 @@ import org.apache.hadoop.hive.ql.exec.Fu
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.IdentityConverter;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.VoidObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeParams;
import org.apache.hadoop.io.Text;
/**
@@ -350,6 +354,69 @@ public final class GenericUDFUtils {
};
/**
+ * Helper class for UDFs returning string/varchar/char
+ */
+ public static class StringHelper {
+
+ protected Object returnValue;
+ protected PrimitiveCategory type;
+
+ public StringHelper(PrimitiveCategory type) throws UDFArgumentException {
+ this.type = type;
+ switch (type) {
+ case STRING:
+ returnValue = new Text();
+ break;
+ case VARCHAR:
+ returnValue = new HiveVarcharWritable();
+ break;
+ default:
+ throw new UDFArgumentException("Unexpected non-string type " + type);
+ }
+ }
+
+ public Object setReturnValue(String val) throws UDFArgumentException {
+ if (val == null) {
+ return null;
+ }
+ switch (type) {
+ case STRING:
+ ((Text)returnValue).set(val);
+ return returnValue;
+ case VARCHAR:
+ ((HiveVarcharWritable)returnValue).set(val);
+ return returnValue;
+ default:
+ throw new UDFArgumentException("Bad return type " + type);
+ }
+ }
+
+ /**
+ * Helper function to help GenericUDFs determine the return type
+ * character length for char/varchar.
+ * @param poi PrimitiveObjectInspector representing the type
+ * @return character length of the type
+ * @throws UDFArgumentException
+ */
+ public static int getFixedStringSizeForType(PrimitiveObjectInspector poi)
+ throws UDFArgumentException {
+ // TODO: we can support date, int, .. any types which would have a fixed length value
+ switch (poi.getPrimitiveCategory()) {
+ case VARCHAR:
+ VarcharTypeParams varcharParams = null;
+ varcharParams = (VarcharTypeParams) poi.getTypeParams();
+ if (varcharParams == null || varcharParams.length < 0) {
+ throw new UDFArgumentException("varchar type used without type params");
+ }
+ return varcharParams.length;
+ default:
+ throw new UDFArgumentException("No fixed size for type " + poi.getTypeName());
+ }
+ }
+
+ }
+
+ /**
* Return an ordinal from an integer.
*/
public static String getOrdinal(int i) {
Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java?rev=1523463&r1=1523462&r2=1523463&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestFunctionRegistry.java Sun Sep 15 17:23:53 2013
@@ -18,7 +18,6 @@
package org.apache.hadoop.hive.ql.exec;
-import java.lang.reflect.Type;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedList;
@@ -27,6 +26,7 @@ import java.util.List;
import junit.framework.Assert;
import junit.framework.TestCase;
+import org.apache.hadoop.hive.common.type.HiveVarchar;
import org.apache.hadoop.hive.serde2.io.DateWritable;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
@@ -35,6 +35,7 @@ import org.apache.hadoop.hive.serde2.obj
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
@@ -44,6 +45,7 @@ public class TestFunctionRegistry extend
public class TestUDF {
public void same(DoubleWritable x, DoubleWritable y) {}
public void same(HiveDecimalWritable x, HiveDecimalWritable y) {}
+ public void same(Text x, Text y) {}
public void one(IntWritable x, HiveDecimalWritable y) {}
public void one(IntWritable x, DoubleWritable y) {}
public void one(IntWritable x, IntWritable y) {}
@@ -57,8 +59,16 @@ public class TestFunctionRegistry extend
public void typeaffinity2(DoubleWritable x) {}
}
+ TypeInfo varchar5;
+ TypeInfo varchar10;
+ TypeInfo maxVarchar;
+
@Override
protected void setUp() {
+ String maxVarcharTypeName = "varchar(" + HiveVarchar.MAX_VARCHAR_LENGTH + ")";
+ maxVarchar = TypeInfoFactory.getPrimitiveTypeInfo(maxVarcharTypeName);
+ varchar10 = TypeInfoFactory.getPrimitiveTypeInfo("varchar(10)");
+ varchar5 = TypeInfoFactory.getPrimitiveTypeInfo("varchar(5)");
}
private void implicit(TypeInfo a, TypeInfo b, boolean convertible) {
@@ -72,6 +82,21 @@ public class TestFunctionRegistry extend
implicit(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, true);
implicit(TypeInfoFactory.dateTypeInfo, TypeInfoFactory.decimalTypeInfo, false);
implicit(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.decimalTypeInfo, false);
+ implicit(varchar10, TypeInfoFactory.stringTypeInfo, true);
+ implicit(TypeInfoFactory.stringTypeInfo, varchar10, true);
+
+ // Try with parameterized varchar types
+ TypeInfo varchar10 = TypeInfoFactory.getPrimitiveTypeInfo("varchar(10)");
+ TypeInfo varchar20 = TypeInfoFactory.getPrimitiveTypeInfo("varchar(20)");
+
+ implicit(varchar10, TypeInfoFactory.stringTypeInfo, true);
+ implicit(varchar20, TypeInfoFactory.stringTypeInfo, true);
+ implicit(TypeInfoFactory.stringTypeInfo, varchar10, true);
+ implicit(TypeInfoFactory.stringTypeInfo, varchar20, true);
+ implicit(varchar20, varchar10, true);
+
+ implicit(TypeInfoFactory.intTypeInfo, varchar10, true);
+ implicit(TypeInfoFactory.intTypeInfo, TypeInfoFactory.stringTypeInfo, true);
}
private static List<Method> getMethods(Class<?> udfClass, String methodName) {
@@ -136,8 +161,8 @@ public class TestFunctionRegistry extend
}
assert(!throwException);
assertEquals(2, result.getParameterTypes().length);
- assertEquals(result.getParameterTypes()[0], a);
- assertEquals(result.getParameterTypes()[1], b);
+ assertEquals(a, result.getParameterTypes()[0]);
+ assertEquals(b, result.getParameterTypes()[1]);
}
public void testGetMethodInternal() {
@@ -166,12 +191,15 @@ public class TestFunctionRegistry extend
verify(TestUDF.class, "one", TypeInfoFactory.intTypeInfo, TypeInfoFactory.intTypeInfo,
IntWritable.class, IntWritable.class, false);
+ // Passing varchar arguments should prefer the version of evaluate() with Text args.
+ verify(TestUDF.class, "same", varchar5, varchar10, Text.class, Text.class, false);
+
verify(TestUDF.class, "mismatch", TypeInfoFactory.voidTypeInfo, TypeInfoFactory.intTypeInfo,
null, null, true);
}
private void common(TypeInfo a, TypeInfo b, TypeInfo result) {
- assertEquals(FunctionRegistry.getCommonClass(a,b), result);
+ assertEquals(result, FunctionRegistry.getCommonClass(a,b));
}
public void testCommonClass() {
@@ -183,10 +211,13 @@ public class TestFunctionRegistry extend
TypeInfoFactory.decimalTypeInfo);
common(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo,
TypeInfoFactory.stringTypeInfo);
+
+ common(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo);
+ common(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo);
}
private void comparison(TypeInfo a, TypeInfo b, TypeInfo result) {
- assertEquals(FunctionRegistry.getCommonClassForComparison(a,b), result);
+ assertEquals(result, FunctionRegistry.getCommonClassForComparison(a,b));
}
public void testCommonClassComparison() {
@@ -198,6 +229,61 @@ public class TestFunctionRegistry extend
TypeInfoFactory.decimalTypeInfo);
comparison(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo,
TypeInfoFactory.doubleTypeInfo);
+
+ comparison(TypeInfoFactory.dateTypeInfo, TypeInfoFactory.stringTypeInfo,
+ TypeInfoFactory.stringTypeInfo);
+ comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.dateTypeInfo,
+ TypeInfoFactory.stringTypeInfo);
+
+ comparison(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo);
+ comparison(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo);
+ comparison(varchar5, varchar10, varchar10);
+ }
+
+ /**
+ * Method to print out the comparison/conversion behavior for data types.
+ */
+ public void testPrintTypeCompatibility() {
+ if (true) {
+ return;
+ }
+
+ String[] typeStrings = {
+ "void", "boolean", "tinyint", "smallint", "int", "bigint", "float", "double",
+ "string", "timestamp", "date", "binary", "decimal", "varchar(10)", "varchar(5)",
+ };
+ for (String cat1 : typeStrings) {
+ TypeInfo ti1 = null;
+ try {
+ ti1 = TypeInfoUtils.getTypeInfoFromTypeString(cat1);
+ } catch (Exception err) {
+ System.out.println(err);
+ System.out.println("Unable to get TypeInfo for " + cat1 + ", skipping ...");
+ continue;
+ }
+
+ for (String cat2 : typeStrings) {
+ TypeInfo commonClass = null;
+ boolean implicitConvertable = false;
+ try {
+ TypeInfo ti2 = TypeInfoUtils.getTypeInfoFromTypeString(cat2);
+ try {
+ commonClass = FunctionRegistry.getCommonClassForComparison(ti1, ti2);
+ //implicitConvertable = FunctionRegistry.implicitConvertable(ti1, ti2);
+ } catch (Exception err) {
+ System.out.println("Failed to get common class for " + ti1 + ", " + ti2 + ": " + err);
+ err.printStackTrace();
+ //System.out.println("Unable to get TypeInfo for " + cat2 + ", skipping ...");
+ }
+ System.out.println(cat1 + " - " + cat2 + ": " + commonClass);
+ //System.out.println(cat1 + " - " + cat2 + ": " + implicitConvertable);
+ } catch (Exception err) {
+ System.out.println(err);
+ System.out.println("Unable to get TypeInfo for " + cat2 + ", skipping ...");
+ continue;
+ }
+ }
+ }
}
private void unionAll(TypeInfo a, TypeInfo b, TypeInfo result) {
@@ -213,11 +299,26 @@ public class TestFunctionRegistry extend
TypeInfoFactory.decimalTypeInfo);
unionAll(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo,
TypeInfoFactory.stringTypeInfo);
+
+ unionAll(varchar5, varchar10, varchar10);
+ unionAll(varchar10, varchar5, varchar10);
+ unionAll(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo);
+ unionAll(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo);
}
public void testGetTypeInfoForPrimitiveCategory() {
+ // varchar should take string length into account.
+ // varchar(5), varchar(10) => varchar(10)
+ assertEquals(varchar10, FunctionRegistry.getTypeInfoForPrimitiveCategory(
+ (PrimitiveTypeInfo) varchar5, (PrimitiveTypeInfo) varchar10, PrimitiveCategory.VARCHAR));
+ assertEquals(varchar10, FunctionRegistry.getTypeInfoForPrimitiveCategory(
+ (PrimitiveTypeInfo) varchar10, (PrimitiveTypeInfo) varchar5, PrimitiveCategory.VARCHAR));
+
// non-qualified types should simply return the TypeInfo associated with that type
assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory(
+ (PrimitiveTypeInfo) varchar10, (PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo,
+ PrimitiveCategory.STRING));
+ assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory(
(PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo,
(PrimitiveTypeInfo) TypeInfoFactory.stringTypeInfo,
PrimitiveCategory.STRING));
Added: hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_1.q?rev=1523463&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_1.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_1.q Sun Sep 15 17:23:53 2013
@@ -0,0 +1,2 @@
+drop table if exists invalid_varchar_length_1;
+create table invalid_varchar_length_1 (c1 varchar(1000000));
Added: hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_2.q?rev=1523463&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_2.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/invalid_varchar_length_2.q Sun Sep 15 17:23:53 2013
@@ -0,0 +1 @@
+select cast(value as varchar(100000)) from src limit 1;