diff --git ql/src/test/queries/clientpositive/udf_substr.q ql/src/test/queries/clientpositive/udf_substr.q index f5cf197..b81dc08 100644 --- ql/src/test/queries/clientpositive/udf_substr.q +++ ql/src/test/queries/clientpositive/udf_substr.q @@ -2,7 +2,7 @@ DESCRIBE FUNCTION substr; DESCRIBE FUNCTION EXTENDED substr; SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS string), 1), substr(CAST(null AS string), 1, 1), substr('ABC', null), substr('ABC', null, 1), substr('ABC', 1, null) FROM src LIMIT 1; @@ -50,7 +50,7 @@ FROM src LIMIT 1; -- test for binary substr SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS binary), 1), substr(CAST(null AS binary), 1, 1), substr(ABC, null), substr(ABC, null, 1), substr(ABC, 1, null), substr(ABC, 0, 1), substr(ABC, 0, 2), substr(ABC, 0, 3), substr(ABC, 0, 4), diff --git ql/src/test/results/clientpositive/udf_substr.q.out ql/src/test/results/clientpositive/udf_substr.q.out index 24cc40c..1789e95 100644 --- ql/src/test/results/clientpositive/udf_substr.q.out +++ ql/src/test/results/clientpositive/udf_substr.q.out @@ -18,7 +18,7 @@ Example: > SELECT substr('Facebook', 5, 1) FROM src LIMIT 1; 'b' PREHOOK: query: SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS string), 1), substr(CAST(null AS string), 1, 1), substr('ABC', null), substr('ABC', null, 1), substr('ABC', 1, null) FROM src LIMIT 1 @@ -26,7 +26,7 @@ PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS string), 1), substr(CAST(null AS string), 1, 1), substr('ABC', null), substr('ABC', null, 1), substr('ABC', 1, null) FROM src LIMIT 1 @@ -143,7 +143,7 @@ POSTHOOK: Input: default@src CDEF CDEF CDEFG CDEFG ABC ABC BC C ABC BC A A A PREHOOK: query: -- test for binary substr SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS binary), 1), substr(CAST(null AS binary), 1, 1), substr(ABC, null), substr(ABC, null, 1), substr(ABC, 1, null), substr(ABC, 0, 1), substr(ABC, 0, 2), substr(ABC, 0, 3), substr(ABC, 0, 4), @@ -163,7 +163,7 @@ PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: -- test for binary substr SELECT - substr(null, 1), substr(null, 1, 1), + substr(CAST(null AS binary), 1), substr(CAST(null AS binary), 1, 1), substr(ABC, null), substr(ABC, null, 1), substr(ABC, 1, null), substr(ABC, 0, 1), substr(ABC, 0, 2), substr(ABC, 0, 3), substr(ABC, 0, 4), @@ -181,4 +181,4 @@ FROM ( POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -NULL NULL null null null A AB ABC ABC A AB ABC ABC B BC BC BC C C C C C C C C B BC BC BC A AB ABC ABC +null null null null null A AB ABC ABC A AB ABC ABC B BC BC BC C C C C C C C C B BC BC BC A AB ABC ABC diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java index 4da3723..5c07eca 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java @@ -275,6 +275,10 @@ public class PrimitiveObjectInspectorConverter { @Override public Object convert(Object input) { + if (input == null) { + return null; + } + return outputOI.set(r, PrimitiveObjectInspectorUtils.getBinary(input, inputOI)); } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java index 94849e2..3a5a8fc 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorFactory.java @@ -28,6 +28,7 @@ import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.BooleanWritable; import org.apache.hadoop.hive.serde2.io.ByteWritable; import org.apache.hadoop.hive.serde2.io.ShortWritable; +import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.FloatWritable; @@ -174,6 +175,8 @@ public final class PrimitiveObjectInspectorFactory { switch (primitiveCategory) { case BOOLEAN: return new WritableConstantBooleanObjectInspector((BooleanWritable)value); + case BINARY: + return new WritableConstantBinaryObjectInspector((BytesWritable)value); case BYTE: return new WritableConstantByteObjectInspector((ByteWritable)value); case SHORT: diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantBinaryObjectInspector.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantBinaryObjectInspector.java new file mode 100644 index 0000000..ec9c07f --- /dev/null +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/WritableConstantBinaryObjectInspector.java @@ -0,0 +1,43 @@ +/** + * 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.serde2.objectinspector.primitive; + +import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; + +import org.apache.hadoop.io.BytesWritable; + +/** + * A WritableConstantBinaryObjectInspector is a WritableBinaryObjectInspector + * that implements ConstantObjectInspector. + */ +public class WritableConstantBinaryObjectInspector extends + WritableBinaryObjectInspector implements + ConstantObjectInspector { + + private BytesWritable value; + + WritableConstantBinaryObjectInspector(BytesWritable value) { + super(); + this.value = value; + } + + @Override + public BytesWritable getWritableConstantValue() { + return value; + } +}