You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kr...@apache.org on 2023/01/16 07:44:24 UTC

[hive] branch master updated: HIVE-26936: Floating point zero and signed zero comparison as a part of join predicate is considered as not equal. (Dayakar M, reviewed by Krisztian Kasa)

This is an automated email from the ASF dual-hosted git repository.

krisztiankasa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f57814ed74 HIVE-26936: Floating point zero and signed zero comparison as a part of join predicate is considered as not equal. (Dayakar M, reviewed by Krisztian Kasa)
5f57814ed74 is described below

commit 5f57814ed743a411c8fa7c647c24c98461271fe3
Author: Dayakar M <59...@users.noreply.github.com>
AuthorDate: Mon Jan 16 13:14:15 2023 +0530

    HIVE-26936: Floating point zero and signed zero comparison as a part of join predicate is considered as not equal. (Dayakar M, reviewed by Krisztian Kasa)
---
 .../hive/ql/exec/HiveWritableComparator.java       | 11 +++
 .../join_cond_zero_comp_negativezero.q             | 13 ++++
 .../llap/join_cond_zero_comp_negativezero.q.out    | 84 ++++++++++++++++++++++
 3 files changed, 108 insertions(+)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/HiveWritableComparator.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/HiveWritableComparator.java
index 5a09a29eb98..d6f51f1a590 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/HiveWritableComparator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/HiveWritableComparator.java
@@ -18,6 +18,8 @@
 package org.apache.hadoop.hive.ql.exec;
 
 import org.apache.hadoop.hive.ql.util.NullOrdering;
+import org.apache.hadoop.io.DoubleWritable;
+import org.apache.hadoop.io.FloatWritable;
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
 
@@ -54,6 +56,15 @@ class HiveWritableComparator extends WritableComparator {
             return result;
         }
 
+        // The IEEE 754 floating point spec specifies that signed -0.0 and 0.0 should be treated as equal.
+        // Double.compare() and Float.compare() treats -0.0 and 0.0 as different
+        if ((key1 instanceof DoubleWritable && key2 instanceof DoubleWritable &&
+            ((DoubleWritable) key1).get() == 0.0d && ((DoubleWritable) key2).get() == 0.0d) ||
+            (key1 instanceof FloatWritable && key2 instanceof FloatWritable &&
+                ((FloatWritable) key1).get() == 0.0f && ((FloatWritable) key2).get() == 0.0f)) {
+            return 0;
+        }
+
         if (comparator == null) {
             comparator = WritableComparator.get(((WritableComparable) key1).getClass());
         }
diff --git a/ql/src/test/queries/clientpositive/join_cond_zero_comp_negativezero.q b/ql/src/test/queries/clientpositive/join_cond_zero_comp_negativezero.q
new file mode 100644
index 00000000000..9e266339fbc
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/join_cond_zero_comp_negativezero.q
@@ -0,0 +1,13 @@
+DROP TABLE IF EXISTS selfjoin1;
+DROP TABLE IF EXISTS t1;
+DROP TABLE IF EXISTS t2;
+
+CREATE TABLE selfjoin1(c1 int, c2 double);
+INSERT INTO selfjoin1 VALUES(0, '-0');
+SELECT * FROM selfjoin1 sj1, selfjoin1 sj2 WHERE sj1.c1 = sj2.c2;
+
+CREATE TABLE t0(c0 int);
+CREATE TABLE t1(c0 double);
+INSERT INTO t0 VALUES(0);
+INSERT INTO t1 VALUES('-0');
+SELECT * FROM t0, t1 WHERE t0.c0 = t1.c0;
\ No newline at end of file
diff --git a/ql/src/test/results/clientpositive/llap/join_cond_zero_comp_negativezero.q.out b/ql/src/test/results/clientpositive/llap/join_cond_zero_comp_negativezero.q.out
new file mode 100644
index 00000000000..f64eecd6420
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/join_cond_zero_comp_negativezero.q.out
@@ -0,0 +1,84 @@
+PREHOOK: query: DROP TABLE IF EXISTS selfjoin1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS selfjoin1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE IF EXISTS t1
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS t1
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE IF EXISTS t2
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS t2
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE selfjoin1(c1 int, c2 double)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@selfjoin1
+POSTHOOK: query: CREATE TABLE selfjoin1(c1 int, c2 double)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@selfjoin1
+PREHOOK: query: INSERT INTO selfjoin1 VALUES(0, '-0')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@selfjoin1
+POSTHOOK: query: INSERT INTO selfjoin1 VALUES(0, '-0')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@selfjoin1
+POSTHOOK: Lineage: selfjoin1.c1 SCRIPT []
+POSTHOOK: Lineage: selfjoin1.c2 SCRIPT []
+PREHOOK: query: SELECT * FROM selfjoin1 sj1, selfjoin1 sj2 WHERE sj1.c1 = sj2.c2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@selfjoin1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM selfjoin1 sj1, selfjoin1 sj2 WHERE sj1.c1 = sj2.c2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@selfjoin1
+#### A masked pattern was here ####
+0	-0.0	0	-0.0
+PREHOOK: query: CREATE TABLE t0(c0 int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@t0
+POSTHOOK: query: CREATE TABLE t0(c0 int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@t0
+PREHOOK: query: CREATE TABLE t1(c0 double)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@t1
+POSTHOOK: query: CREATE TABLE t1(c0 double)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@t1
+PREHOOK: query: INSERT INTO t0 VALUES(0)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@t0
+POSTHOOK: query: INSERT INTO t0 VALUES(0)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@t0
+POSTHOOK: Lineage: t0.c0 SCRIPT []
+PREHOOK: query: INSERT INTO t1 VALUES('-0')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@t1
+POSTHOOK: query: INSERT INTO t1 VALUES('-0')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@t1
+POSTHOOK: Lineage: t1.c0 SCRIPT []
+PREHOOK: query: SELECT * FROM t0, t1 WHERE t0.c0 = t1.c0
+PREHOOK: type: QUERY
+PREHOOK: Input: default@t0
+PREHOOK: Input: default@t1
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * FROM t0, t1 WHERE t0.c0 = t1.c0
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@t0
+POSTHOOK: Input: default@t1
+#### A masked pattern was here ####
+0	-0.0