diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFType.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFType.java index 56575c3..c320e78 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFType.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFType.java @@ -23,16 +23,51 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apache.hadoop.hive.common.classification.InterfaceAudience.Public; +import org.apache.hadoop.hive.common.classification.InterfaceStability.Evolving; + /** - * UDFType. + * UDFType annotations are used to describe properties of a UDF. This gives + * important information to the optimizer. + * If the UDF is not deterministic, or if it is stateful, it is necessary to + * annotate it as such for correctness. * */ +@Public +@Evolving @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface UDFType { + /** + * Certain optimizations should not be applied if UDF is not deterministic + * Deterministic UDF returns same result each time it is invoked with a + * particular input. This determinism just needs to hold within the context of + * a query. + * + * @return true if the udf is deterministic + */ boolean deterministic() default true; + + /** + * If a UDF stores state based on the sequence of records it has processed, it + * is stateful. A stateful UDF cannot be used in certain expressions such as + * case statement and certain optimizations such as AND/OR short circuiting + * don't apply for such UDFS, as they need to be invoked for each record. + * row_sequence is an example of stateful UDF. A stateful UDF is considered to + * be non deterministic, irrespective of what deterministic() returns. + * + * @return true + */ boolean stateful() default false; + + /** + * A UDF is considered distinctLike if the udf can be evaluated on just the + * distinct values of a column. Examples include min and max UDFs. This + * information is used by metadata-only optimizer. + * + * @return true if UDF is distinctLike + */ boolean distinctLike() default false; /**