diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFEvaluator.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFEvaluator.java index 3a982768e3..6472f76efa 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFEvaluator.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFEvaluator.java @@ -132,6 +132,7 @@ public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveExc // This function should be overriden in every sub class // And the sub class should call super.init(m, parameters) to get mode set. mode = m; + partitionEvaluator = null; return null; } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDAFEvaluator.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDAFEvaluator.java new file mode 100644 index 0000000000..0b59a6fc82 --- /dev/null +++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDAFEvaluator.java @@ -0,0 +1,61 @@ +package org.apache.hadoop.hive.ql.udf.generic; + +import org.apache.hadoop.hive.ql.exec.PTFPartition; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.plan.ptf.PTFExpressionDef; +import org.apache.hadoop.hive.ql.plan.ptf.WindowFrameDef; +import org.apache.hadoop.hive.ql.udf.ptf.BasePartitionEvaluator; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Collections; +import java.util.List; + +@RunWith(MockitoJUnitRunner.class) +public class TestGenericUDAFEvaluator { + + @Mock(answer = Answers.CALLS_REAL_METHODS) + private GenericUDAFEvaluator udafEvaluator; + + @Mock + private WindowFrameDef winFrame; + + @Mock + private PTFPartition partition1; + + @Mock + private ObjectInspector outputOI; + + private List parameters = Collections.emptyList(); + + @Test + public void testGetPartitionWindowingEvaluatorWithoutInitCall() { + BasePartitionEvaluator partition1Evaluator1 = udafEvaluator.getPartitionWindowingEvaluator( + winFrame, partition1, parameters, outputOI); + + BasePartitionEvaluator partition1Evaluator2 = udafEvaluator.getPartitionWindowingEvaluator( + winFrame, partition1, parameters, outputOI); + + Assert.assertEquals(partition1Evaluator1, partition1Evaluator2); + } + + @Test + public void testGetPartitionWindowingEvaluatorWithInitCall() throws HiveException { + BasePartitionEvaluator partition1Evaluator1 = udafEvaluator.getPartitionWindowingEvaluator( + winFrame, partition1, parameters, outputOI); + + udafEvaluator.init(GenericUDAFEvaluator.Mode.COMPLETE, null); + + BasePartitionEvaluator newPartitionEvaluator = udafEvaluator.getPartitionWindowingEvaluator( + winFrame, partition1, parameters, outputOI); + + Assert.assertNotEquals(partition1Evaluator1, newPartitionEvaluator); + } + +}