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