You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by cw...@apache.org on 2012/03/06 21:19:00 UTC

svn commit: r1297677 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/exec/ java/org/apache/hadoop/hive/ql/parse/ java/org/apache/hadoop/hive/ql/udf/generic/ test/queries/clientpositive/ test/results/clientpositive/

Author: cws
Date: Tue Mar  6 20:19:00 2012
New Revision: 1297677

URL: http://svn.apache.org/viewvc?rev=1297677&view=rev
Log:
HIVE-2810 [jira] Implement NULL-safe equality operator <=>
(Navis Ryu via Carl Steinbach)

Summary:
DPAL-843 Implement NULL-safe equality operator <=>

Ref:
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

Test Plan: EMPTY

Reviewers: JIRA, cwsteinbach

Reviewed By: cwsteinbach

Differential Revision: https://reviews.facebook.net/D1791

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java   (with props)
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java
    hive/trunk/ql/src/test/queries/clientpositive/udf_equal.q
    hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
    hive/trunk/ql/src/test/results/clientpositive/udf_equal.q.out

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=1297677&r1=1297676&r2=1297677&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 Tue Mar  6 20:19:00 2012
@@ -177,6 +177,7 @@ import org.apache.hadoop.hive.ql.udf.gen
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFNamedStruct;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPAnd;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqual;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqualNS;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqualOrGreaterThan;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqualOrLessThan;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPGreaterThan;
@@ -357,6 +358,7 @@ public final class FunctionRegistry {
     registerGenericUDF("or", GenericUDFOPOr.class);
     registerGenericUDF("=", GenericUDFOPEqual.class);
     registerGenericUDF("==", GenericUDFOPEqual.class);
+    registerGenericUDF("<=>", GenericUDFOPEqualNS.class);
     registerGenericUDF("!=", GenericUDFOPNotEqual.class);
     registerGenericUDF("<>", GenericUDFOPNotEqual.class);
     registerGenericUDF("<", GenericUDFOPLessThan.class);

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g?rev=1297677&r1=1297676&r2=1297677&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g Tue Mar  6 20:19:00 2012
@@ -1988,7 +1988,7 @@ precedenceEqualNegatableOperator
 
 precedenceEqualOperator
     :
-    precedenceEqualNegatableOperator | EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN
+    precedenceEqualNegatableOperator | EQUAL | EQUAL_NS | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN
     ;
 
 precedenceEqualExpression
@@ -2092,6 +2092,7 @@ sysFuncNames
     | KW_STRUCT
     | KW_UNIONTYPE
     | EQUAL
+    | EQUAL_NS
     | NOTEQUAL
     | LESSTHANOREQUALTO
     | LESSTHAN
@@ -2361,6 +2362,7 @@ LCURLY : '{';
 RCURLY : '}';
 
 EQUAL : '=' | '==';
+EQUAL_NS : '<=>';
 NOTEQUAL : '<>' | '!=';
 LESSTHANOREQUALTO : '<=';
 LESSTHAN : '<';

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java?rev=1297677&r1=1297676&r2=1297677&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ParseDriver.java Tue Mar  6 20:19:00 2012
@@ -177,6 +177,7 @@ public class ParseDriver {
 
     xlateMap.put("EQUAL", "=");
     xlateMap.put("NOTEQUAL", "<>");
+    xlateMap.put("EQUAL_NS", "<=>");
     xlateMap.put("LESSTHANOREQUALTO", "<=");
     xlateMap.put("LESSTHAN", "<");
     xlateMap.put("GREATERTHANOREQUALTO", ">=");

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java?rev=1297677&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java Tue Mar  6 20:19:00 2012
@@ -0,0 +1,42 @@
+/**
+ * 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 org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+
+@Description(name = "<=>", value = "a _FUNC_ b - Returns same result with EQUAL(=) operator " +
+    "for non-null operands, but returns TRUE if both are NULL, FALSE if one of the them is NULL")
+public class GenericUDFOPEqualNS extends GenericUDFOPEqual {
+
+  @Override
+  public Object evaluate(DeferredObject[] arguments) throws HiveException {
+    Object o0 = arguments[0].get();
+    Object o1 = arguments[1].get();
+    if (o0 == null && o1 == null) {
+      result.set(true);
+      return result;
+    }
+    if (o0 == null || o1 == null) {
+      result.set(false);
+      return result;
+    }
+    return super.evaluate(arguments);
+  }
+}

Propchange: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFOPEqualNS.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: hive/trunk/ql/src/test/queries/clientpositive/udf_equal.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_equal.q?rev=1297677&r1=1297676&r2=1297677&view=diff
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_equal.q (original)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_equal.q Tue Mar  6 20:19:00 2012
@@ -4,4 +4,9 @@ DESCRIBE FUNCTION EXTENDED =;
 DESCRIBE FUNCTION ==;
 DESCRIBE FUNCTION EXTENDED ==;
 
-SELECT true=false, false=true, false=false, true=true FROM src LIMIT 1;
+SELECT true=false, false=true, false=false, true=true, NULL=NULL, true=NULL, NULL=true, false=NULL, NULL=false FROM src LIMIT 1;
+
+DESCRIBE FUNCTION <=>;
+DESCRIBE FUNCTION EXTENDED <=>;
+
+SELECT true<=>false, false<=>true, false<=>false, true<=>true, NULL<=>NULL, true<=>NULL, NULL<=>true, false<=>NULL, NULL<=>false FROM src LIMIT 1;

Modified: hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out?rev=1297677&r1=1297676&r2=1297677&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out Tue Mar  6 20:19:00 2012
@@ -12,6 +12,7 @@ POSTHOOK: type: SHOWFUNCTIONS
 /
 <
 <=
+<=>
 <>
 =
 ==

Modified: hive/trunk/ql/src/test/results/clientpositive/udf_equal.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_equal.q.out?rev=1297677&r1=1297676&r2=1297677&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_equal.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_equal.q.out Tue Mar  6 20:19:00 2012
@@ -20,12 +20,31 @@ POSTHOOK: query: DESCRIBE FUNCTION EXTEN
 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: query: SELECT true=false, false=true, false=false, true=true, NULL=NULL, true=NULL, NULL=true, false=NULL, NULL=false FROM src LIMIT 1
 PREHOOK: type: QUERY
 PREHOOK: Input: default@src
 #### A masked pattern was here ####
-POSTHOOK: query: SELECT true=false, false=true, false=false, true=true FROM src LIMIT 1
+POSTHOOK: query: SELECT true=false, false=true, false=false, true=true, NULL=NULL, true=NULL, NULL=true, false=NULL, NULL=false FROM src LIMIT 1
 POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
 #### A masked pattern was here ####
-false	false	true	true
+false	false	true	true	NULL	NULL	NULL	NULL	NULL
+PREHOOK: query: DESCRIBE FUNCTION <=>
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION <=>
+POSTHOOK: type: DESCFUNCTION
+a <=> b - Returns same result with EQUAL(=) operator for non-null operands, but returns TRUE if both are NULL, FALSE if one of the them is NULL
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED <=>
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED <=>
+POSTHOOK: type: DESCFUNCTION
+a <=> b - Returns same result with EQUAL(=) operator for non-null operands, but returns TRUE if both are NULL, FALSE if one of the them is NULL
+PREHOOK: query: SELECT true<=>false, false<=>true, false<=>false, true<=>true, NULL<=>NULL, true<=>NULL, NULL<=>true, false<=>NULL, NULL<=>false FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT true<=>false, false<=>true, false<=>false, true<=>true, NULL<=>NULL, true<=>NULL, NULL<=>true, false<=>NULL, NULL<=>false FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+false	false	true	true	true	false	false	false	false