Index: ql/src/test/results/clientpositive/udf_equal.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_equal.q.out (revision 5838) +++ ql/src/test/results/clientpositive/udf_equal.q.out (working copy) @@ -20,3 +20,12 @@ POSTHOOK: type: DESCFUNCTION a == b - Returns TRUE if a equals b and false otherwise Synonyms: = +PREHOOK: query: SELECT true=false, false=true, false=false, true=true FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/data/users/pyang/mstore/trunk/VENDOR.hive/trunk/build/ql/scratchdir/hive_2010-04-14_14-02-03_248_2636646596000796300/10000 +POSTHOOK: query: SELECT true=false, false=true, false=false, true=true FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/data/users/pyang/mstore/trunk/VENDOR.hive/trunk/build/ql/scratchdir/hive_2010-04-14_14-02-03_248_2636646596000796300/10000 +false false true true Index: ql/src/test/queries/clientpositive/udf_equal.q =================================================================== --- ql/src/test/queries/clientpositive/udf_equal.q (revision 5838) +++ ql/src/test/queries/clientpositive/udf_equal.q (working copy) @@ -4,3 +4,4 @@ DESCRIBE FUNCTION ==; DESCRIBE FUNCTION EXTENDED ==; +SELECT true=false, false=true, false=false, true=true FROM src LIMIT 1; Index: ql/src/java/org/apache/hadoop/hive/ql/exec/ComparisonOpMethodResolver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/ComparisonOpMethodResolver.java (revision 5838) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ComparisonOpMethodResolver.java (working copy) @@ -50,13 +50,13 @@ /* * (non-Javadoc) - * + * * @see * org.apache.hadoop.hive.ql.exec.UDFMethodResolver#getEvalMethod(java.util * .List) */ @Override - public Method getEvalMethod(List argTypeInfos) throws AmbiguousMethodException { + public Method getEvalMethod(List argTypeInfos) throws UDFArgumentException { assert (argTypeInfos.size() == 2); List pTypeInfos = null; @@ -75,9 +75,12 @@ Method udfMethod = null; + List evaluateMethods = new ArrayList(); + for (Method m : Arrays.asList(udfClass.getMethods())) { if (m.getName().equals("evaluate")) { + evaluateMethods.add(m); List acceptedTypeInfos = TypeInfoUtils.getParameterTypeInfos( m, pTypeInfos.size()); if (acceptedTypeInfos == null) { @@ -104,6 +107,11 @@ } } } + + if (udfMethod == null) { + throw new NoMatchingMethodException(udfClass, argTypeInfos, evaluateMethods); + } + return udfMethod; } Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPEqual.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPEqual.java (revision 5838) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFOPEqual.java (working copy) @@ -35,7 +35,7 @@ */ @Description(name = "=,==", value = "a _FUNC_ b - Returns TRUE if a equals b and false otherwise") public class UDFOPEqual extends UDFBaseCompare { - private BooleanWritable resultCache; + private final BooleanWritable resultCache; public UDFOPEqual() { resultCache = new BooleanWritable(); @@ -119,4 +119,14 @@ return r; } + public BooleanWritable evaluate(BooleanWritable a, BooleanWritable b) { + BooleanWritable r = resultCache; + if ((a == null) || (b == null)) { + r = null; + } else { + r.set(a.get() == b.get()); + } + // LOG.info("evaluate(" + a + "," + b + ")=" + r); + return r; + } }