This is an automated email from the ASF dual-hosted git repository.
sunchao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git
The following commit(s) were added to refs/heads/main by this push:
new 91f9fbed24 test: fix vacuous signed-zero coverage in SQL file tests
(#5393)
91f9fbed24 is described below
commit 91f9fbed24ee28f99b23ed559e80e818c9696044
Author: sam-1112 <[email protected]>
AuthorDate: Fri Aug 21 04:35:46 2026 +0800
test: fix vacuous signed-zero coverage in SQL file tests (#5393)
* test: fix vacuous signed-zero coverage in SQL file tests
Replace bare -0.0 literals and CAST(-0.0 AS DOUBLE/FLOAT) with
double('-0.0') / float('-0.0') so the sign bit is actually preserved
when values are inserted into parquet columns. Also document the
pitfall in the SQL file test contributor guide.
Fixes #5271
revert accidental string_replace.sql change
* test: make unseeded shuffle signed-zero comparison deterministic
Spark treats +0.0 and -0.0 as equal, so sort_array(shuffle(arr)) is
not unique across seeds. Sort the string forms instead so both signs
are preserved and the result is stable.
* test: exercise array_repeat signed zero with a positive count
Negative-zero float/double cells currently sit on rows with cnt <= 0,
so the result is an empty array. Repeat them with a literal count of 2
so the sign bit is actually observed.
* test: make signed-zero trig checks sign-sensitive
Tolerance compares infinities by isInfinity and finite values by
absolute difference, so it cannot detect csc(-0.0) becoming +Infinity
or tan(-0.0) becoming +0.0. Keep tolerance for ordinary values and add
plain queries for the zero column and literal cases. Apply the same
split to atan2, and document the comparator pitfall.
---------
Co-authored-by: Hung <[email protected]>
---
docs/source/contributor-guide/sql-file-tests.md | 18 ++++
.../aggregate/approx_count_distinct.sql | 2 +-
.../sql-tests/expressions/aggregate/avg.sql | 2 +-
.../expressions/aggregate/collect_list.sql | 4 +-
.../expressions/aggregate/collect_set.sql | 4 +-
.../sql-tests/expressions/aggregate/percentile.sql | 2 +-
.../sql-tests/expressions/array/array_compact.sql | 2 +-
.../sql-tests/expressions/array/array_distinct.sql | 6 +-
.../sql-tests/expressions/array/array_except.sql | 6 +-
.../sql-tests/expressions/array/array_insert.sql | 2 +-
.../expressions/array/array_intersect.sql | 4 +-
.../sql-tests/expressions/array/array_max.sql | 4 +-
.../sql-tests/expressions/array/array_min.sql | 26 +++++-
.../sql-tests/expressions/array/array_repeat.sql | 12 ++-
.../sql-tests/expressions/array/array_union.sql | 4 +-
.../sql-tests/expressions/array/arrays_overlap.sql | 2 +-
.../sql-tests/expressions/array/arrays_zip.sql | 2 +-
.../sql-tests/expressions/array/shuffle.sql | 13 ++-
.../expressions/array/shuffle_with_seed.sql | 4 +-
.../sql-tests/expressions/array/sort_array.sql | 103 ++++++++++++++++-----
.../expressions/array/sort_array_strict_fp.sql | 6 +-
.../expressions/cast/cast_array_to_string.sql | 4 +-
.../cast/cast_complex_types_to_string.sql | 6 +-
.../expressions/cast/cast_double_to_string.sql | 4 +-
.../sql-tests/expressions/conditional/boolean.sql | 4 +-
.../sql-tests/expressions/math/arithmetic_ansi.sql | 6 +-
.../resources/sql-tests/expressions/math/atan2.sql | 38 +++++---
.../resources/sql-tests/expressions/math/bin.sql | 2 +-
.../resources/sql-tests/expressions/math/csc.sql | 10 +-
.../resources/sql-tests/expressions/math/rint.sql | 2 +-
.../resources/sql-tests/expressions/math/sec.sql | 2 +-
.../resources/sql-tests/expressions/math/tan.sql | 12 ++-
32 files changed, 228 insertions(+), 90 deletions(-)
diff --git a/docs/source/contributor-guide/sql-file-tests.md
b/docs/source/contributor-guide/sql-file-tests.md
index 9b63dcf8ed..a92e0898d7 100644
--- a/docs/source/contributor-guide/sql-file-tests.md
+++ b/docs/source/contributor-guide/sql-file-tests.md
@@ -169,9 +169,17 @@ SELECT some_expression(v) FROM test_table
Checks results with a numeric tolerance. Useful for floating-point functions
where small
differences are acceptable.
+The comparison ignores the sign of zero (`+0.0` matches `-0.0`) and the sign
of infinity
+(`+Infinity` matches `-Infinity`). Keep tolerance for ordinary values and add
a plain
+`query` for cases whose expected result is signed zero or signed infinity.
+
```sql
query tolerance=0.0001
SELECT cos(v) FROM test_trig
+
+-- csc(-0.0) == -Infinity; a tolerance check would also accept +Infinity
+query
+SELECT csc(double('-0.0'))
```
#### `query expect_fallback(<reason>)`
@@ -294,6 +302,16 @@ common ones include:
- **Zero, negative, and very large numbers** -- for numeric functions
- **Boundary values** -- `INT_MIN`, `INT_MAX`, `NaN`, `Infinity`, `-Infinity`
for numeric
types
+- **Signed zero** -- Spark parses a bare `-0.0` as `decimal(1,1)`, which has
no signed
+ zero, so coercion to `float`/`double` yields `+0.0`. `CAST(-0.0 AS DOUBLE)`
and
+ `CAST(-0.0 AS FLOAT)` have the same problem because the cast source is still
the
+ decimal literal. Use `double('-0.0')` or `float('-0.0')` (equivalently
+ `CAST('-0.0' AS DOUBLE)`). Spark's array comparator also treats `+0.0` and
`-0.0` as
+ equal, so `sort_array(...)` is not a unique projection when both signs are
present
+ (the SQL test comparator distinguishes the bits). Prefer a sign-aware form
such as
+ `sort_array(transform(arr, x -> cast(x AS string)))`. A `query
tolerance=...` check
+ likewise treats the two zero signs as equal, and `+Infinity` / `-Infinity`
as equal,
+ so signed-zero and signed-infinity results need a separate plain `query`.
- **Special characters and multibyte UTF-8** -- for string functions (e.g.
`'é'`, `'中文'`,
`'\t'`)
- **Empty arrays/maps** -- for collection functions
diff --git
a/spark/src/test/resources/sql-tests/expressions/aggregate/approx_count_distinct.sql
b/spark/src/test/resources/sql-tests/expressions/aggregate/approx_count_distinct.sql
index c08a83da3f..9c24a31454 100644
---
a/spark/src/test/resources/sql-tests/expressions/aggregate/approx_count_distinct.sql
+++
b/spark/src/test/resources/sql-tests/expressions/aggregate/approx_count_distinct.sql
@@ -143,7 +143,7 @@ CREATE TABLE acd_float(d double) USING parquet
statement
INSERT INTO acd_float VALUES
- (0.0), (-0.0), (CAST('NaN' AS DOUBLE)), (CAST('NaN' AS DOUBLE)), (1.0)
+ (0.0), (double('-0.0')), (CAST('NaN' AS DOUBLE)), (CAST('NaN' AS DOUBLE)),
(1.0)
-- distinct values are {0.0, NaN, 1.0} = 3
query
diff --git a/spark/src/test/resources/sql-tests/expressions/aggregate/avg.sql
b/spark/src/test/resources/sql-tests/expressions/aggregate/avg.sql
index 9d41d86367..1f7a5a0876 100644
--- a/spark/src/test/resources/sql-tests/expressions/aggregate/avg.sql
+++ b/spark/src/test/resources/sql-tests/expressions/aggregate/avg.sql
@@ -103,7 +103,7 @@ statement
CREATE TABLE test_avg_negative(d double) USING parquet
statement
-INSERT INTO test_avg_negative VALUES (-1.5), (-2.5), (-3.5), (-0.0)
+INSERT INTO test_avg_negative VALUES (-1.5), (-2.5), (-3.5), (double('-0.0'))
query tolerance=1e-6
SELECT avg(d) FROM test_avg_negative
diff --git
a/spark/src/test/resources/sql-tests/expressions/aggregate/collect_list.sql
b/spark/src/test/resources/sql-tests/expressions/aggregate/collect_list.sql
index e00d2b1969..9ad4488410 100644
--- a/spark/src/test/resources/sql-tests/expressions/aggregate/collect_list.sql
+++ b/spark/src/test/resources/sql-tests/expressions/aggregate/collect_list.sql
@@ -163,7 +163,7 @@ INSERT INTO cl_src_float VALUES
(CAST('NaN' AS FLOAT), 'b'), (CAST('NaN' AS FLOAT), 'b'), (1.0, 'b'),
(CAST('Infinity' AS FLOAT), 'c'), (CAST('-Infinity' AS FLOAT), 'c'),
(CAST('Infinity' AS FLOAT), 'c'),
- (CAST(0.0 AS FLOAT), 'd'), (CAST(-0.0 AS FLOAT), 'd'), (1.0, 'd'), (NULL,
'd')
+ (CAST(0.0 AS FLOAT), 'd'), (float('-0.0'), 'd'), (1.0, 'd'), (NULL, 'd')
query
SELECT grp, sort_array(collect_list(v)) FROM cl_src_float GROUP BY grp ORDER
BY grp
@@ -181,7 +181,7 @@ INSERT INTO cl_src_double VALUES
(CAST('NaN' AS DOUBLE), 'b'), (CAST('NaN' AS DOUBLE), 'b'), (1.0, 'b'),
(CAST('Infinity' AS DOUBLE), 'c'), (CAST('-Infinity' AS DOUBLE), 'c'),
(CAST('Infinity' AS DOUBLE), 'c'),
- (0.0, 'd'), (-0.0, 'd'), (1.0, 'd'), (NULL, 'd')
+ (0.0, 'd'), (double('-0.0'), 'd'), (1.0, 'd'), (NULL, 'd')
query
SELECT grp, sort_array(collect_list(v)) FROM cl_src_double GROUP BY grp ORDER
BY grp
diff --git
a/spark/src/test/resources/sql-tests/expressions/aggregate/collect_set.sql
b/spark/src/test/resources/sql-tests/expressions/aggregate/collect_set.sql
index cd528272af..bf37b8a3b7 100644
--- a/spark/src/test/resources/sql-tests/expressions/aggregate/collect_set.sql
+++ b/spark/src/test/resources/sql-tests/expressions/aggregate/collect_set.sql
@@ -161,7 +161,7 @@ INSERT INTO cs_src_float VALUES
(1.5, 'a'), (2.5, 'a'), (1.5, 'a'), (NULL,
'a'),
(CAST('NaN' AS FLOAT), 'b'), (CAST('NaN' AS FLOAT), 'b'), (1.0, 'b'),
(CAST('Infinity' AS FLOAT), 'c'), (CAST('-Infinity' AS FLOAT), 'c'),
(CAST('Infinity' AS FLOAT), 'c'),
- (CAST(0.0 AS FLOAT), 'd'), (CAST(-0.0 AS FLOAT), 'd'), (1.0, 'd'), (NULL,
'd')
+ (CAST(0.0 AS FLOAT), 'd'), (float('-0.0'), 'd'), (1.0, 'd'), (NULL, 'd')
query expect_fallback(not fully compatible with Spark)
SELECT grp, sort_array(collect_set(v)) FROM cs_src_float GROUP BY grp ORDER BY
grp
@@ -178,7 +178,7 @@ INSERT INTO cs_src_double VALUES
(1.1, 'a'), (2.2, 'a'), (1.1, 'a'), (NULL, 'a'),
(CAST('NaN' AS DOUBLE), 'b'), (CAST('NaN' AS DOUBLE), 'b'), (1.0, 'b'),
(CAST('Infinity' AS DOUBLE), 'c'), (CAST('-Infinity' AS DOUBLE), 'c'),
(CAST('Infinity' AS DOUBLE), 'c'),
- (0.0, 'd'), (-0.0, 'd'), (1.0, 'd'), (NULL, 'd')
+ (0.0, 'd'), (double('-0.0'), 'd'), (1.0, 'd'), (NULL, 'd')
query expect_fallback(not fully compatible with Spark)
SELECT grp, sort_array(collect_set(v)) FROM cs_src_double GROUP BY grp ORDER
BY grp
diff --git
a/spark/src/test/resources/sql-tests/expressions/aggregate/percentile.sql
b/spark/src/test/resources/sql-tests/expressions/aggregate/percentile.sql
index 2a2306bf6f..4a21dd1e6d 100644
--- a/spark/src/test/resources/sql-tests/expressions/aggregate/percentile.sql
+++ b/spark/src/test/resources/sql-tests/expressions/aggregate/percentile.sql
@@ -100,7 +100,7 @@ CREATE TABLE test_percentile_special(v double) USING parquet
statement
INSERT INTO test_percentile_special VALUES
- (double('-Infinity')), (-0.0), (0.0), (1.0), (double('Infinity')),
(double('NaN'))
+ (double('-Infinity')), (double('-0.0')), (0.0), (1.0), (double('Infinity')),
(double('NaN'))
query
SELECT percentile(v, 0.0), percentile(v, 0.5), percentile(v, 0.8),
percentile(v, 1.0) FROM test_percentile_special
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_compact.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_compact.sql
index e66b65fa3e..a25eb709b4 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_compact.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_compact.sql
@@ -44,7 +44,7 @@ INSERT INTO test_array_compact VALUES
array(CAST(1 AS BIGINT), NULL, 9223372036854775807, NULL,
-9223372036854775808),
array(CAST(1 AS SMALLINT), NULL, CAST(32767 AS SMALLINT), NULL,
CAST(-32768 AS SMALLINT)),
array(CAST(1 AS TINYINT), NULL, CAST(127 AS TINYINT), NULL, CAST(-128 AS
TINYINT)),
- array(CAST(1.0 AS FLOAT), NULL, CAST('NaN' AS FLOAT), CAST('Infinity' AS
FLOAT), CAST(-0.0 AS FLOAT)),
+ array(CAST(1.0 AS FLOAT), NULL, CAST('NaN' AS FLOAT), CAST('Infinity' AS
FLOAT), float('-0.0')),
array(CAST(1.0 AS DOUBLE), NULL, CAST('NaN' AS DOUBLE), CAST('-Infinity'
AS DOUBLE), CAST(0.0 AS DOUBLE)),
array(CAST(1 AS DECIMAL(38, 0)), NULL,
CAST(99999999999999999999999999999999999999 AS DECIMAL(38, 0))),
array(true, NULL, false, NULL),
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_distinct.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_distinct.sql
index 5cbe0450db..566eb43e75 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_distinct.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_distinct.sql
@@ -120,7 +120,7 @@ INSERT INTO test_array_distinct_double VALUES
(array(CAST('NaN' AS DOUBLE), CAST('NaN' AS DOUBLE), 1.0, 1.0)),
(array(CAST('NaN' AS DOUBLE), NULL, CAST('NaN' AS DOUBLE), NULL, 1.0)),
(array(CAST('Infinity' AS DOUBLE), CAST('-Infinity' AS DOUBLE),
CAST('Infinity' AS DOUBLE), 0.0)),
- (array(0.0, -0.0, 1.0))
+ (array(0.0, double('-0.0'), 1.0))
query
SELECT array_distinct(arr) FROM test_array_distinct_double
@@ -139,7 +139,7 @@ SELECT array_distinct(array(CAST('Infinity' AS DOUBLE),
CAST('-Infinity' AS DOUB
-- negative zero
query
-SELECT array_distinct(array(0.0, -0.0, 1.0))
+SELECT array_distinct(array(0.0, double('-0.0'), 1.0))
-- ===== FLOAT arrays =====
@@ -155,7 +155,7 @@ INSERT INTO test_array_distinct_float VALUES
(array(CAST('NaN' AS FLOAT), CAST('NaN' AS FLOAT), CAST(1.0 AS FLOAT))),
(array(CAST('NaN' AS FLOAT), NULL, CAST('NaN' AS FLOAT), NULL, CAST(1.0 AS
FLOAT))),
(array(CAST('Infinity' AS FLOAT), CAST('-Infinity' AS FLOAT),
CAST('Infinity' AS FLOAT), CAST(0.0 AS FLOAT))),
- (array(CAST(0.0 AS FLOAT), CAST(-0.0 AS FLOAT), CAST(1.0 AS FLOAT)))
+ (array(CAST(0.0 AS FLOAT), float('-0.0'), CAST(1.0 AS FLOAT)))
query
SELECT array_distinct(arr) FROM test_array_distinct_float
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_except.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_except.sql
index 8f76b6bf72..451b65d365 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_except.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_except.sql
@@ -51,8 +51,8 @@ INSERT INTO test_except_dbl VALUES
(array(double('NaN'), 1.0), array(2.0)),
(array(double('Infinity'), 1.0, double('-Infinity')),
array(double('Infinity'))),
(array(double('Infinity'), double('-Infinity')), array(double('-Infinity'))),
- (array(0.0, -0.0, 1.0), array(0.0)),
- (array(0.0, 1.0), array(-0.0)),
+ (array(0.0, double('-0.0'), 1.0), array(0.0)),
+ (array(0.0, 1.0), array(double('-0.0'))),
(array(1.0, 2.0, NULL), array(2.0, NULL)),
(array(double('NaN'), NULL), array(NULL))
@@ -69,7 +69,7 @@ INSERT INTO test_except_float VALUES
(array(float('NaN'), float('NaN'), cast(1.0 as float)), array(float('NaN'))),
(array(cast(1.0 as float), cast(2.0 as float)), array(float('NaN'))),
(array(float('Infinity'), cast(1.0 as float), float('-Infinity')),
array(float('Infinity'))),
- (array(cast(0.0 as float), cast(-0.0 as float), cast(1.0 as float)),
array(cast(0.0 as float))),
+ (array(cast(0.0 as float), float('-0.0'), cast(1.0 as float)),
array(cast(0.0 as float))),
(array(cast(1.0 as float), cast(2.0 as float), NULL), array(cast(2.0 as
float), NULL))
query
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_insert.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_insert.sql
index d80cc16e1e..c00dd82fff 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_insert.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_insert.sql
@@ -251,7 +251,7 @@ SELECT array_insert(array(CAST(1.0 AS DOUBLE), CAST(2.0 AS
DOUBLE)), 2, CAST('-I
-- negative zero
query
-SELECT array_insert(array(CAST(1.0 AS DOUBLE), CAST(2.0 AS DOUBLE)), 1,
CAST(-0.0 AS DOUBLE))
+SELECT array_insert(array(CAST(1.0 AS DOUBLE), CAST(2.0 AS DOUBLE)), 1,
double('-0.0'))
-- ============================================================
-- Long arrays
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_intersect.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_intersect.sql
index a83d6632e2..fd69be93af 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_intersect.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_intersect.sql
@@ -133,7 +133,7 @@ INSERT INTO test_intersect_float VALUES
(array(1.0, 2.0), array(float('NaN'))),
(array(float('NaN'), NULL), array(float('NaN'), NULL)),
(array(float('Infinity'), 1.0, float('-Infinity')), array(float('Infinity'),
float('-Infinity'))),
- (array(cast(0.0 as float), cast(-0.0 as float)), array(cast(0.0 as float)))
+ (array(cast(0.0 as float), float('-0.0')), array(cast(0.0 as float)))
query
SELECT a, b, array_intersect(a, b) FROM test_intersect_float
@@ -151,7 +151,7 @@ INSERT INTO test_intersect_dbl VALUES
(array(1.0, 2.0), array(double('NaN'))),
(array(double('NaN'), NULL), array(double('NaN'), NULL)),
(array(double('Infinity'), 1.0, double('-Infinity')),
array(double('Infinity'), double('-Infinity'))),
- (array(0.0, -0.0), array(0.0)),
+ (array(0.0, double('-0.0')), array(0.0)),
(array(1.0, 2.0, NULL), array(1.0, NULL))
query
diff --git a/spark/src/test/resources/sql-tests/expressions/array/array_max.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_max.sql
index fb72f2d44f..e5f9db3e8a 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_max.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_max.sql
@@ -43,7 +43,7 @@ INSERT INTO test_array_max_double VALUES
(array(CAST('Infinity' AS DOUBLE), 1.0, 2.0)),
(array(CAST('-Infinity' AS DOUBLE), 1.0, 2.0)),
(array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE))),
- (array(0.0, -0.0, 1.0)),
+ (array(0.0, double('-0.0'), 1.0)),
(NULL),
(array())
@@ -62,7 +62,7 @@ INSERT INTO test_array_max_float VALUES
(array(CAST('NaN' AS FLOAT), NULL, CAST(1.0 AS FLOAT))),
(array(CAST('Infinity' AS FLOAT), CAST(1.0 AS FLOAT))),
(array(CAST('-Infinity' AS FLOAT), CAST(1.0 AS FLOAT))),
- (array(CAST(0.0 AS FLOAT), CAST(-0.0 AS FLOAT))),
+ (array(CAST(0.0 AS FLOAT), float('-0.0'))),
(NULL),
(array())
diff --git a/spark/src/test/resources/sql-tests/expressions/array/array_min.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_min.sql
index bf8f72ad62..f3efb870ab 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_min.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_min.sql
@@ -43,13 +43,24 @@ INSERT INTO test_array_min_double VALUES
(array(CAST('Infinity' AS DOUBLE), 1.0, 2.0)),
(array(CAST('-Infinity' AS DOUBLE), 1.0, 2.0)),
(array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE))),
- (array(0.0, -0.0, 1.0)),
(NULL),
(array())
query
SELECT array_min(arr) FROM test_array_min_double
+-- Spark treats +0.0 and -0.0 as equal and returns +0.0; Comet returns -0.0.
+-- Surfaced by https://github.com/apache/datafusion-comet/issues/5271
+statement
+CREATE TABLE test_array_min_dbl_negzero(arr array<double>) USING parquet
+
+statement
+INSERT INTO test_array_min_dbl_negzero VALUES
+ (array(0.0, double('-0.0'), 1.0))
+
+query ignore(array_min signed-zero: Spark +0.0, Comet -0.0)
+SELECT array_min(arr) FROM test_array_min_dbl_negzero
+
-- ===== FLOAT arrays with NaN/Infinity/-0.0 =====
statement
@@ -62,9 +73,20 @@ INSERT INTO test_array_min_float VALUES
(array(CAST('NaN' AS FLOAT), NULL, CAST(1.0 AS FLOAT))),
(array(CAST('Infinity' AS FLOAT), CAST(1.0 AS FLOAT))),
(array(CAST('-Infinity' AS FLOAT), CAST(1.0 AS FLOAT))),
- (array(CAST(0.0 AS FLOAT), CAST(-0.0 AS FLOAT))),
(NULL),
(array())
query
SELECT array_min(arr) FROM test_array_min_float
+
+-- Spark treats +0.0 and -0.0 as equal and returns +0.0; Comet returns -0.0.
+-- Surfaced by https://github.com/apache/datafusion-comet/issues/5271
+statement
+CREATE TABLE test_array_min_flt_negzero(arr array<float>) USING parquet
+
+statement
+INSERT INTO test_array_min_flt_negzero VALUES
+ (array(CAST(0.0 AS FLOAT), float('-0.0')))
+
+query ignore(array_min signed-zero: Spark +0.0, Comet -0.0)
+SELECT array_min(arr) FROM test_array_min_flt_negzero
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_repeat.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_repeat.sql
index f682a167ba..58272d164f 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_repeat.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_repeat.sql
@@ -39,8 +39,8 @@ INSERT INTO test_array_repeat VALUES
(CAST(127 AS TINYINT), CAST(32767 AS SMALLINT), 2147483647,
9223372036854775807, CAST('Infinity' AS FLOAT), CAST('Infinity' AS DOUBLE),
CAST(99999999999999999999999999999999999999 AS DECIMAL(38, 0)), true, 'a',
X'01', DATE '1970-01-01', TIMESTAMP '1970-01-01 00:00:00', array(1, 2, 3), 3),
(CAST(-128 AS TINYINT), CAST(-32768 AS SMALLINT), -2147483648,
-9223372036854775808, CAST('-Infinity' AS FLOAT), CAST('-Infinity' AS DOUBLE),
CAST(-99999999999999999999999999999999999999 AS DECIMAL(38, 0)), false, 'é',
X'02FF', DATE '9999-12-31', TIMESTAMP '9999-12-31 23:59:59', array(), 2),
(CAST(0 AS TINYINT), CAST(0 AS SMALLINT), 0, 0, CAST('NaN' AS FLOAT),
CAST('NaN' AS DOUBLE), CAST(0 AS DECIMAL(38, 0)), false, '', X'', DATE
'2024-02-29', TIMESTAMP '2024-02-29 12:34:56', array(NULL, 1, NULL), 1),
- (NULL, NULL, NULL, NULL, CAST(0.0 AS FLOAT), CAST(-0.0 AS DOUBLE), NULL,
NULL, '日本', X'00', NULL, NULL, NULL, 0),
- (CAST(1 AS TINYINT), CAST(1 AS SMALLINT), 1, 1, CAST(-0.0 AS FLOAT),
CAST(0.0 AS DOUBLE), CAST(1 AS DECIMAL(38, 0)), true, NULL, NULL, DATE
'2000-01-01', TIMESTAMP '2000-01-01 00:00:00', array(7), -1),
+ (NULL, NULL, NULL, NULL, CAST(0.0 AS FLOAT), double('-0.0'), NULL, NULL,
'日本', X'00', NULL, NULL, NULL, 0),
+ (CAST(1 AS TINYINT), CAST(1 AS SMALLINT), 1, 1, float('-0.0'), CAST(0.0 AS
DOUBLE), CAST(1 AS DECIMAL(38, 0)), true, NULL, NULL, DATE '2000-01-01',
TIMESTAMP '2000-01-01 00:00:00', array(7), -1),
(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL)
-- per-type column repeated with a column count
@@ -97,6 +97,14 @@ SELECT array_repeat(int_v, -5) FROM test_array_repeat
query
SELECT array_repeat(int_v, CAST(NULL AS INT)) FROM test_array_repeat
+-- signed-zero elements currently sit on rows with cnt <= 0, which yield empty
+-- arrays. Repeat them with a positive literal count so the sign bit is
observed.
+query
+SELECT array_repeat(float_v, 2) FROM test_array_repeat
+
+query
+SELECT array_repeat(double_v, 2) FROM test_array_repeat
+
-- literal element + column count
query
SELECT array_repeat(42, cnt) FROM test_array_repeat
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/array_union.sql
b/spark/src/test/resources/sql-tests/expressions/array/array_union.sql
index 3280f0d98b..d43338c001 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/array_union.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/array_union.sql
@@ -129,7 +129,7 @@ statement
CREATE TABLE test_union_dbl(a array<double>, b array<double>) USING parquet
statement
-INSERT INTO test_union_dbl VALUES (array(1.0, 2.0), array(2.0, 3.0)),
(array(1.0, double('NaN')), array(double('NaN'), 2.0)), (array(double('NaN'),
1.0), array(2.0, 3.0)), (array(1.0, 2.0), array(double('NaN'), 3.0)),
(array(double('NaN'), double('NaN')), array(double('NaN'))),
(array(double('Infinity'), 1.0), array(double('Infinity'))),
(array(double('-Infinity')), array(double('Infinity'))), (array(0.0),
array(-0.0)), (array(1.0, NULL), array(2.0, NULL))
+INSERT INTO test_union_dbl VALUES (array(1.0, 2.0), array(2.0, 3.0)),
(array(1.0, double('NaN')), array(double('NaN'), 2.0)), (array(double('NaN'),
1.0), array(2.0, 3.0)), (array(1.0, 2.0), array(double('NaN'), 3.0)),
(array(double('NaN'), double('NaN')), array(double('NaN'))),
(array(double('Infinity'), 1.0), array(double('Infinity'))),
(array(double('-Infinity')), array(double('Infinity'))), (array(0.0),
array(double('-0.0'))), (array(1.0, NULL), array(2.0, NULL))
query
SELECT a, b, array_union(a, b) FROM test_union_dbl
@@ -139,7 +139,7 @@ statement
CREATE TABLE test_union_float(a array<float>, b array<float>) USING parquet
statement
-INSERT INTO test_union_float VALUES (array(cast(1.0 as float), cast(2.0 as
float)), array(cast(2.0 as float), cast(3.0 as float))), (array(cast(1.0 as
float), float('NaN')), array(float('NaN'), cast(2.0 as float))),
(array(float('NaN'), float('NaN')), array(float('NaN'))),
(array(float('Infinity'), cast(1.0 as float)), array(float('Infinity'))),
(array(float('-Infinity')), array(float('Infinity'))), (array(cast(0.0 as
float)), array(cast(-0.0 as float))), (array(cast(1.0 as float), NULL) [...]
+INSERT INTO test_union_float VALUES (array(cast(1.0 as float), cast(2.0 as
float)), array(cast(2.0 as float), cast(3.0 as float))), (array(cast(1.0 as
float), float('NaN')), array(float('NaN'), cast(2.0 as float))),
(array(float('NaN'), float('NaN')), array(float('NaN'))),
(array(float('Infinity'), cast(1.0 as float)), array(float('Infinity'))),
(array(float('-Infinity')), array(float('Infinity'))), (array(cast(0.0 as
float)), array(float('-0.0'))), (array(cast(1.0 as float), NULL), arra [...]
query
SELECT a, b, array_union(a, b) FROM test_union_float
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/arrays_overlap.sql
b/spark/src/test/resources/sql-tests/expressions/array/arrays_overlap.sql
index 0b3d55366e..b7859a1092 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/arrays_overlap.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/arrays_overlap.sql
@@ -117,7 +117,7 @@ statement
CREATE TABLE test_overlap_dbl(a array<double>, b array<double>) USING parquet
statement
-INSERT INTO test_overlap_dbl VALUES (array(1.0, 2.0), array(2.0, 3.0)),
(array(1.0, double('NaN')), array(double('NaN'), 2.0)),
(array(double('Infinity'), 1.0), array(double('Infinity'))),
(array(double('-Infinity')), array(double('Infinity'))), (array(0.0),
array(-0.0)), (array(1.0, NULL), array(2.0, NULL))
+INSERT INTO test_overlap_dbl VALUES (array(1.0, 2.0), array(2.0, 3.0)),
(array(1.0, double('NaN')), array(double('NaN'), 2.0)),
(array(double('Infinity'), 1.0), array(double('Infinity'))),
(array(double('-Infinity')), array(double('Infinity'))), (array(0.0),
array(double('-0.0'))), (array(1.0, NULL), array(2.0, NULL))
query
SELECT a, b, arrays_overlap(a, b) FROM test_overlap_dbl
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/arrays_zip.sql
b/spark/src/test/resources/sql-tests/expressions/array/arrays_zip.sql
index 09829ca5e6..56c252df2d 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/arrays_zip.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/arrays_zip.sql
@@ -27,7 +27,7 @@ SELECT arrays_zip(array(1, 2, 3), array('a', 'b'));
-- With floating points
query
-SELECT arrays_zip(array(-.1234567E+2BD, CAST('-Infinity' AS DOUBLE),
CAST('NaN' AS DOUBLE)), array(CAST('Infinity' AS FLOAT), -0.0, -0.1234567f,
CAST('NaN' AS FLOAT)));
+SELECT arrays_zip(array(-.1234567E+2BD, CAST('-Infinity' AS DOUBLE),
CAST('NaN' AS DOUBLE)), array(CAST('Infinity' AS FLOAT), float('-0.0'),
-0.1234567f, CAST('NaN' AS FLOAT)));
-- basic: two integer arrays of equal length
query
diff --git a/spark/src/test/resources/sql-tests/expressions/array/shuffle.sql
b/spark/src/test/resources/sql-tests/expressions/array/shuffle.sql
index 96c3f81264..c8a9da7339 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/shuffle.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/shuffle.sql
@@ -19,8 +19,11 @@
-- Comet runs use different seeds and their raw output cannot be compared
directly. These queries
-- therefore either assert only that shuffle runs natively while preserving
array size (size is
-- deterministic), or compare seed independent projections (sort_array over
the shuffled result).
--- Exact permutation equality with a fixed seed lives in shuffle_with_seed.sql
(Spark 4.0+, where
--- the two argument shuffle(array, seed) form exists).
+-- Spark's nullable-array comparator treats +0.0 and -0.0 as equal, so a plain
sort_array is not a
+-- unique projection when both signs are present: a stable sort keeps the
shuffled order, while the
+-- SQL test comparator distinguishes the bits. Float/double rows therefore
sort the string forms
+-- instead. Exact permutation equality with a fixed seed lives in
shuffle_with_seed.sql (Spark 4.0+,
+-- where the two argument shuffle(array, seed) form exists).
-- ===== INT arrays =====
@@ -124,13 +127,15 @@ statement
INSERT INTO test_shuffle_double VALUES
(array(1.1, 2.2, 3.3, 4.4, 5.5)),
(NULL),
- (array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE), 0.0, -0.0))
+ (array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE), 0.0, double('-0.0')))
query
SELECT size(shuffle(arr)) FROM test_shuffle_double
+-- Spark treats +0.0 and -0.0 as equal, so sort_array(shuffle(arr)) is not
unique across seeds.
+-- Casting to string keeps both signs and yields one canonical multiset order.
query spark_answer_only
-SELECT sort_array(shuffle(arr)) FROM test_shuffle_double
+SELECT sort_array(transform(shuffle(arr), x -> cast(x AS string))) FROM
test_shuffle_double
-- ===== DECIMAL arrays =====
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/shuffle_with_seed.sql
b/spark/src/test/resources/sql-tests/expressions/array/shuffle_with_seed.sql
index 5d9832fda9..a0637a1891 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/shuffle_with_seed.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/shuffle_with_seed.sql
@@ -138,13 +138,13 @@ statement
INSERT INTO test_shuffle_seed_double VALUES
(array(1.1, 2.2, 3.3, 4.4, 5.5)),
(NULL),
- (array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE), 0.0, -0.0))
+ (array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE), CAST('-Infinity'
AS DOUBLE), 0.0, double('-0.0')))
query
SELECT shuffle(arr, 42) FROM test_shuffle_seed_double
query
-SELECT shuffle(array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE),
CAST('-Infinity' AS DOUBLE), 0.0, -0.0), 8)
+SELECT shuffle(array(CAST('NaN' AS DOUBLE), CAST('Infinity' AS DOUBLE),
CAST('-Infinity' AS DOUBLE), 0.0, double('-0.0')), 8)
-- ===== DECIMAL arrays =====
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/sort_array.sql
b/spark/src/test/resources/sql-tests/expressions/array/sort_array.sql
index ceb29e5a39..024c6be5d3 100644
--- a/spark/src/test/resources/sql-tests/expressions/array/sort_array.sql
+++ b/spark/src/test/resources/sql-tests/expressions/array/sort_array.sql
@@ -67,7 +67,6 @@ INSERT INTO test_sort_array_double VALUES
3.0,
1.0,
NULL,
- -0.0,
0.0)),
(array(
CAST('NaN' AS DOUBLE),
@@ -88,6 +87,32 @@ SELECT sort_array(arr, true) FROM test_sort_array_double
query
SELECT sort_array(arr, false) FROM test_sort_array_double
+-- Spark descending sort keeps +0.0 after -0.0; Comet reverses them.
+-- Surfaced by https://github.com/apache/datafusion-comet/issues/5271
+statement
+CREATE TABLE test_sort_array_dbl_negzero(arr array<double>) USING parquet
+
+statement
+INSERT INTO test_sort_array_dbl_negzero VALUES
+ (array(
+ CAST('Infinity' AS DOUBLE),
+ CAST('-Infinity' AS DOUBLE),
+ CAST('NaN' AS DOUBLE),
+ 3.0,
+ 1.0,
+ NULL,
+ double('-0.0'),
+ 0.0))
+
+query
+SELECT sort_array(arr) FROM test_sort_array_dbl_negzero
+
+query
+SELECT sort_array(arr, true) FROM test_sort_array_dbl_negzero
+
+query ignore(sort_array descending signed-zero: Spark [-0.0, 0.0], Comet [0.0,
-0.0])
+SELECT sort_array(arr, false) FROM test_sort_array_dbl_negzero
+
statement
CREATE TABLE test_sort_array_float(arr array<float>) USING parquet
@@ -100,7 +125,6 @@ INSERT INTO test_sort_array_float VALUES
CAST(3.0 AS FLOAT),
CAST(1.0 AS FLOAT),
CAST(NULL AS FLOAT),
- CAST(-0.0 AS FLOAT),
CAST(0.0 AS FLOAT))),
(array(
CAST('NaN' AS FLOAT),
@@ -120,6 +144,32 @@ SELECT sort_array(arr, true) FROM test_sort_array_float
query
SELECT sort_array(arr, false) FROM test_sort_array_float
+-- Spark descending sort keeps +0.0 after -0.0; Comet reverses them.
+-- Surfaced by https://github.com/apache/datafusion-comet/issues/5271
+statement
+CREATE TABLE test_sort_array_flt_negzero(arr array<float>) USING parquet
+
+statement
+INSERT INTO test_sort_array_flt_negzero VALUES
+ (array(
+ CAST('Infinity' AS FLOAT),
+ CAST('-Infinity' AS FLOAT),
+ CAST('NaN' AS FLOAT),
+ CAST(3.0 AS FLOAT),
+ CAST(1.0 AS FLOAT),
+ CAST(NULL AS FLOAT),
+ float('-0.0'),
+ CAST(0.0 AS FLOAT)))
+
+query
+SELECT sort_array(arr) FROM test_sort_array_flt_negzero
+
+query
+SELECT sort_array(arr, true) FROM test_sort_array_flt_negzero
+
+query ignore(sort_array descending signed-zero: Spark [-0.0, 0.0], Comet [0.0,
-0.0])
+SELECT sort_array(arr, false) FROM test_sort_array_flt_negzero
+
statement
CREATE TABLE test_sort_array_decimal(arr array<decimal(12, 3)>) USING parquet
@@ -318,18 +368,8 @@ SELECT
CAST('NaN' AS DOUBLE),
1.0,
NULL,
- -0.0,
+ double('-0.0'),
0.0)),
- sort_array(
- array(
- CAST('Infinity' AS DOUBLE),
- CAST('-Infinity' AS DOUBLE),
- CAST('NaN' AS DOUBLE),
- 1.0,
- NULL,
- -0.0,
- 0.0),
- false),
sort_array(
array(
CAST('Infinity' AS FLOAT),
@@ -337,18 +377,8 @@ SELECT
CAST('NaN' AS FLOAT),
CAST(1.0 AS FLOAT),
CAST(NULL AS FLOAT),
- CAST(-0.0 AS FLOAT),
+ float('-0.0'),
CAST(0.0 AS FLOAT))),
- sort_array(
- array(
- CAST('Infinity' AS FLOAT),
- CAST('-Infinity' AS FLOAT),
- CAST('NaN' AS FLOAT),
- CAST(1.0 AS FLOAT),
- CAST(NULL AS FLOAT),
- CAST(-0.0 AS FLOAT),
- CAST(0.0 AS FLOAT)),
- false),
sort_array(
CAST(array(
CAST(100 AS DECIMAL(10, 0)),
@@ -394,6 +424,31 @@ SELECT
sort_array(array(NULL, NULL)),
sort_array(cast(NULL as array<int>))
+-- Spark descending sort keeps +0.0 after -0.0; Comet reverses them.
+-- Surfaced by https://github.com/apache/datafusion-comet/issues/5271
+query ignore(sort_array descending signed-zero: Spark [-0.0, 0.0], Comet [0.0,
-0.0])
+SELECT
+ sort_array(
+ array(
+ CAST('Infinity' AS DOUBLE),
+ CAST('-Infinity' AS DOUBLE),
+ CAST('NaN' AS DOUBLE),
+ 1.0,
+ NULL,
+ double('-0.0'),
+ 0.0),
+ false),
+ sort_array(
+ array(
+ CAST('Infinity' AS FLOAT),
+ CAST('-Infinity' AS FLOAT),
+ CAST('NaN' AS FLOAT),
+ CAST(1.0 AS FLOAT),
+ CAST(NULL AS FLOAT),
+ float('-0.0'),
+ CAST(0.0 AS FLOAT)),
+ false)
+
query
SELECT sort_array(
array(
diff --git
a/spark/src/test/resources/sql-tests/expressions/array/sort_array_strict_fp.sql
b/spark/src/test/resources/sql-tests/expressions/array/sort_array_strict_fp.sql
index 29e27a7422..db3453bd23 100644
---
a/spark/src/test/resources/sql-tests/expressions/array/sort_array_strict_fp.sql
+++
b/spark/src/test/resources/sql-tests/expressions/array/sort_array_strict_fp.sql
@@ -26,7 +26,7 @@ CREATE TABLE test_sort_array_strict_double(arr array<double>)
USING parquet
statement
INSERT INTO test_sort_array_strict_double VALUES
- (array(CAST('Infinity' AS DOUBLE), CAST('-Infinity' AS DOUBLE), CAST('NaN'
AS DOUBLE), 3.0, 1.0, NULL, -0.0, 0.0)),
+ (array(CAST('Infinity' AS DOUBLE), CAST('-Infinity' AS DOUBLE), CAST('NaN'
AS DOUBLE), 3.0, 1.0, NULL, double('-0.0'), 0.0)),
(array(CAST('NaN' AS DOUBLE), CAST('NaN' AS DOUBLE), -5.0, 2.0)),
(array()),
(NULL)
@@ -42,7 +42,7 @@ CREATE TABLE test_sort_array_strict_float(arr array<float>)
USING parquet
statement
INSERT INTO test_sort_array_strict_float VALUES
- (array(CAST('Infinity' AS FLOAT), CAST('-Infinity' AS FLOAT), CAST('NaN' AS
FLOAT), CAST(3.0 AS FLOAT), CAST(NULL AS FLOAT), CAST(-0.0 AS FLOAT), CAST(0.0
AS FLOAT))),
+ (array(CAST('Infinity' AS FLOAT), CAST('-Infinity' AS FLOAT), CAST('NaN' AS
FLOAT), CAST(3.0 AS FLOAT), CAST(NULL AS FLOAT), float('-0.0'), CAST(0.0 AS
FLOAT))),
(array()),
(NULL)
@@ -54,4 +54,4 @@ SELECT sort_array(arr, false) FROM
test_sort_array_strict_float
-- nested float arrays also dispatch
query
-SELECT sort_array(array(CAST('NaN' AS DOUBLE), -0.0, 0.0, 1.0,
CAST('-Infinity' AS DOUBLE)))
+SELECT sort_array(array(CAST('NaN' AS DOUBLE), double('-0.0'), 0.0, 1.0,
CAST('-Infinity' AS DOUBLE)))
diff --git
a/spark/src/test/resources/sql-tests/expressions/cast/cast_array_to_string.sql
b/spark/src/test/resources/sql-tests/expressions/cast/cast_array_to_string.sql
index 94ca1854b8..dc6dea78a2 100644
---
a/spark/src/test/resources/sql-tests/expressions/cast/cast_array_to_string.sql
+++
b/spark/src/test/resources/sql-tests/expressions/cast/cast_array_to_string.sql
@@ -39,8 +39,8 @@ INSERT INTO test_cast_array_to_string VALUES
),
(
3,
- array(cast(null as float), cast(-0.0 as float), cast(0.0 as float)),
- array(cast(null as double), cast(-0.0 as double), cast(0.0 as double)),
+ array(cast(null as float), float('-0.0'), cast(0.0 as float)),
+ array(cast(null as double), double('-0.0'), cast(0.0 as double)),
null
),
(
diff --git
a/spark/src/test/resources/sql-tests/expressions/cast/cast_complex_types_to_string.sql
b/spark/src/test/resources/sql-tests/expressions/cast/cast_complex_types_to_string.sql
index c9c1dc8ff6..dd42db8e08 100644
---
a/spark/src/test/resources/sql-tests/expressions/cast/cast_complex_types_to_string.sql
+++
b/spark/src/test/resources/sql-tests/expressions/cast/cast_complex_types_to_string.sql
@@ -83,7 +83,7 @@ INSERT INTO test_cast_struct_to_string VALUES
4,
named_struct('col1', cast(null as int), 'col2', cast(null as string)),
named_struct('a', cast(null as int), 'b', cast(null as string), 'c',
cast(null as boolean)),
- named_struct('f', cast(-0.0 as float), 'd', cast(-0.0 as double)),
+ named_struct('f', float('-0.0'), 'd', double('-0.0')),
named_struct('b', cast(null as tinyint), 's', cast(null as smallint), 'i',
cast(null as int), 'l', cast(null as bigint)),
named_struct('d1', cast(null as decimal(10, 2)), 'd2', cast(null as
decimal(38, 18))),
named_struct('dt', cast(null as date), 'ts', cast(null as timestamp)),
@@ -260,7 +260,7 @@ SELECT cast(a_nested as string), id FROM
test_cast_array_to_string ORDER BY id
-- Array of floats / doubles with NaN / ±0 / ±Infinity / NULL.
query
-SELECT cast(array(cast(1.5 as float), cast('NaN' as float), cast(-0.0 as
float), cast(null as float)) as string)
+SELECT cast(array(cast(1.5 as float), cast('NaN' as float), float('-0.0'),
cast(null as float)) as string)
query
SELECT cast(array(cast(1.5 as double), cast('NaN' as double), cast('-Infinity'
as double), cast(null as double)) as string)
@@ -318,7 +318,7 @@ SELECT cast(map('a', X'616263', 'b', X'', 'c', cast(null as
binary)) as string)
-- Map with float / double values: NaN / ±0 / ±Infinity / NULL.
query
-SELECT cast(map('nan', cast('NaN' as float), 'neg0', cast(-0.0 as float),
'null', cast(null as float)) as string)
+SELECT cast(map('nan', cast('NaN' as float), 'neg0', float('-0.0'), 'null',
cast(null as float)) as string)
query
SELECT cast(map('nan', cast('NaN' as double), 'inf', cast('Infinity' as
double), 'ninf', cast('-Infinity' as double), 'null', cast(null as double)) as
string)
diff --git
a/spark/src/test/resources/sql-tests/expressions/cast/cast_double_to_string.sql
b/spark/src/test/resources/sql-tests/expressions/cast/cast_double_to_string.sql
index b2c7cf94b9..7113b6e596 100644
---
a/spark/src/test/resources/sql-tests/expressions/cast/cast_double_to_string.sql
+++
b/spark/src/test/resources/sql-tests/expressions/cast/cast_double_to_string.sql
@@ -20,7 +20,7 @@ CREATE TABLE test_double_to_string(d double, id int) USING
parquet
statement
INSERT INTO test_double_to_string VALUES
- (-0.0, 1),
+ (double('-0.0'), 1),
(0.0, 2),
(1.5, 3),
(-1.5, 4),
@@ -39,4 +39,4 @@ query
SELECT cast(d as string), id FROM test_double_to_string ORDER BY id
query
-SELECT cast(-0.0 as string), cast(0.0 as string)
+SELECT cast(double('-0.0') as string), cast(0.0 as string)
diff --git
a/spark/src/test/resources/sql-tests/expressions/conditional/boolean.sql
b/spark/src/test/resources/sql-tests/expressions/conditional/boolean.sql
index 3d2e2f8109..f861f40cc6 100644
--- a/spark/src/test/resources/sql-tests/expressions/conditional/boolean.sql
+++ b/spark/src/test/resources/sql-tests/expressions/conditional/boolean.sql
@@ -20,10 +20,10 @@ statement
CREATE TABLE test(col1 boolean, col2 float) USING parquet
statement
-INSERT INTO test VALUES(true, -0.0)
+INSERT INTO test VALUES(true, float('-0.0'))
statement
-INSERT INTO test VALUES(false, -0.0)
+INSERT INTO test VALUES(false, float('-0.0'))
query
SELECT col1, negative(col2), cast(col1 as float), col1 = negative(col2) FROM
test
diff --git
a/spark/src/test/resources/sql-tests/expressions/math/arithmetic_ansi.sql
b/spark/src/test/resources/sql-tests/expressions/math/arithmetic_ansi.sql
index 76263fab95..5ab442d3ed 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/arithmetic_ansi.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/arithmetic_ansi.sql
@@ -181,7 +181,7 @@ statement
CREATE TABLE ansi_float_div_zero(a float, b float, c double, d double) USING
parquet
statement
-INSERT INTO ansi_float_div_zero VALUES (3.0, 0.0, 3.0, 0.0), (1.0, -0.0, 1.0,
-0.0)
+INSERT INTO ansi_float_div_zero VALUES (3.0, 0.0, 3.0, 0.0), (1.0,
float('-0.0'), 1.0, double('-0.0'))
-- float column % 0 should throw
query expect_error(BY_ZERO)
@@ -204,7 +204,7 @@ SELECT c % CAST(0.0 AS DOUBLE) FROM ansi_float_div_zero
-- double column % literal -0.0 should also throw (IEEE 754: -0.0 == 0.0)
query expect_error(BY_ZERO)
-SELECT c % CAST(-0.0 AS DOUBLE) FROM ansi_float_div_zero
+SELECT c % double('-0.0') FROM ansi_float_div_zero
-- literal double % double column should throw
query expect_error(BY_ZERO)
@@ -223,7 +223,7 @@ SELECT CAST(1.0 AS DOUBLE) % CAST(0.0 AS DOUBLE)
-- literal double % -0.0 should also throw (IEEE 754: -0.0 == 0.0)
query expect_error(BY_ZERO)
-SELECT CAST(1.0 AS DOUBLE) % CAST(-0.0 AS DOUBLE)
+SELECT CAST(1.0 AS DOUBLE) % double('-0.0')
-- literal float % 0.0 should throw
query expect_error(BY_ZERO)
diff --git a/spark/src/test/resources/sql-tests/expressions/math/atan2.sql
b/spark/src/test/resources/sql-tests/expressions/math/atan2.sql
index 9394462de1..af54289adf 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/atan2.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/atan2.sql
@@ -20,14 +20,14 @@ CREATE TABLE test_atan2(y double, x double) USING parquet
statement
INSERT INTO test_atan2 VALUES
- (0.0, 0.0), (0.0, -0.0), (0.0, 1.0), (0.0, -1.0), (0.0, NULL), (0.0,
cast('NaN' as double)), (0.0, cast('Infinity' as double)), (0.0,
cast('-Infinity' as double)),
- (-0.0, 0.0), (-0.0, -0.0), (-0.0, 1.0), (-0.0, -1.0), (-0.0, NULL), (-0.0,
cast('NaN' as double)), (-0.0, cast('Infinity' as double)), (-0.0,
cast('-Infinity' as double)),
- (1.0, 0.0), (1.0, -0.0), (1.0, 1.0), (1.0, -1.0), (1.0, NULL), (1.0,
cast('NaN' as double)), (1.0, cast('Infinity' as double)), (1.0,
cast('-Infinity' as double)),
- (-1.0, 0.0), (-1.0, -0.0), (-1.0, 1.0), (-1.0, -1.0), (-1.0, NULL), (-1.0,
cast('NaN' as double)), (-1.0, cast('Infinity' as double)), (-1.0,
cast('-Infinity' as double)),
- (NULL, 0.0), (NULL, -0.0), (NULL, 1.0), (NULL, -1.0), (NULL, NULL), (NULL,
cast('NaN' as double)), (NULL, cast('Infinity' as double)), (NULL,
cast('-Infinity' as double)),
- (cast('NaN' as double), 0.0), (cast('NaN' as double), -0.0), (cast('NaN' as
double), 1.0), (cast('NaN' as double), -1.0), (cast('NaN' as double), NULL),
(cast('NaN' as double), cast('NaN' as double)), (cast('NaN' as double),
cast('Infinity' as double)), (cast('NaN' as double), cast('-Infinity' as
double)),
- (cast('Infinity' as double), 0.0), (cast('Infinity' as double), -0.0),
(cast('Infinity' as double), 1.0), (cast('Infinity' as double), -1.0),
(cast('Infinity' as double), NULL), (cast('Infinity' as double), cast('NaN' as
double)), (cast('Infinity' as double), cast('Infinity' as double)),
(cast('Infinity' as double), cast('-Infinity' as double)),
- (cast('-Infinity' as double), 0.0), (cast('-Infinity' as double), -0.0),
(cast('-Infinity' as double), 1.0), (cast('-Infinity' as double), -1.0),
(cast('-Infinity' as double), NULL), (cast('-Infinity' as double), cast('NaN'
as double)), (cast('-Infinity' as double), cast('Infinity' as double)),
(cast('-Infinity' as double), cast('-Infinity' as double))
+ (0.0, 0.0), (0.0, double('-0.0')), (0.0, 1.0), (0.0, -1.0), (0.0, NULL),
(0.0, cast('NaN' as double)), (0.0, cast('Infinity' as double)), (0.0,
cast('-Infinity' as double)),
+ (double('-0.0'), 0.0), (double('-0.0'), double('-0.0')), (double('-0.0'),
1.0), (double('-0.0'), -1.0), (double('-0.0'), NULL), (double('-0.0'),
cast('NaN' as double)), (double('-0.0'), cast('Infinity' as double)),
(double('-0.0'), cast('-Infinity' as double)),
+ (1.0, 0.0), (1.0, double('-0.0')), (1.0, 1.0), (1.0, -1.0), (1.0, NULL),
(1.0, cast('NaN' as double)), (1.0, cast('Infinity' as double)), (1.0,
cast('-Infinity' as double)),
+ (-1.0, 0.0), (-1.0, double('-0.0')), (-1.0, 1.0), (-1.0, -1.0), (-1.0,
NULL), (-1.0, cast('NaN' as double)), (-1.0, cast('Infinity' as double)),
(-1.0, cast('-Infinity' as double)),
+ (NULL, 0.0), (NULL, double('-0.0')), (NULL, 1.0), (NULL, -1.0), (NULL,
NULL), (NULL, cast('NaN' as double)), (NULL, cast('Infinity' as double)),
(NULL, cast('-Infinity' as double)),
+ (cast('NaN' as double), 0.0), (cast('NaN' as double), double('-0.0')),
(cast('NaN' as double), 1.0), (cast('NaN' as double), -1.0), (cast('NaN' as
double), NULL), (cast('NaN' as double), cast('NaN' as double)), (cast('NaN' as
double), cast('Infinity' as double)), (cast('NaN' as double), cast('-Infinity'
as double)),
+ (cast('Infinity' as double), 0.0), (cast('Infinity' as double),
double('-0.0')), (cast('Infinity' as double), 1.0), (cast('Infinity' as
double), -1.0), (cast('Infinity' as double), NULL), (cast('Infinity' as
double), cast('NaN' as double)), (cast('Infinity' as double), cast('Infinity'
as double)), (cast('Infinity' as double), cast('-Infinity' as double)),
+ (cast('-Infinity' as double), 0.0), (cast('-Infinity' as double),
double('-0.0')), (cast('-Infinity' as double), 1.0), (cast('-Infinity' as
double), -1.0), (cast('-Infinity' as double), NULL), (cast('-Infinity' as
double), cast('NaN' as double)), (cast('-Infinity' as double), cast('Infinity'
as double)), (cast('-Infinity' as double), cast('-Infinity' as double))
query tolerance=1e-6
SELECT atan2(y, x) FROM test_atan2
@@ -42,7 +42,21 @@ SELECT atan2(1.0, x) FROM test_atan2
-- literal permutations
query tolerance=1e-6
-SELECT atan2(0.0, 0.0), atan2(0.0, -0.0), atan2(0.0, 1.0), atan2(0.0, -1.0),
- atan2(-0.0, 0.0), atan2(-0.0, -0.0), atan2(-0.0, 1.0), atan2(-0.0, -1.0),
- atan2(1.0, 0.0), atan2(1.0, -0.0), atan2(1.0, 1.0), atan2(1.0, -1.0),
- atan2(-1.0, 0.0), atan2(-1.0, -0.0), atan2(-1.0, 1.0), atan2(-1.0, -1.0)
+SELECT atan2(0.0, 0.0), atan2(0.0, double('-0.0')), atan2(0.0, 1.0),
atan2(0.0, -1.0),
+ atan2(double('-0.0'), 0.0), atan2(double('-0.0'), double('-0.0')),
atan2(double('-0.0'), 1.0), atan2(double('-0.0'), -1.0),
+ atan2(1.0, 0.0), atan2(1.0, double('-0.0')), atan2(1.0, 1.0), atan2(1.0,
-1.0),
+ atan2(-1.0, 0.0), atan2(-1.0, double('-0.0')), atan2(-1.0, 1.0), atan2(-1.0,
-1.0)
+
+-- signed-zero: Spark adds +0.0 to both args, so these are all +0.0.
+-- Exact comparison so a leftover -0.0 is distinguished (tolerance uses
+-- absolute difference). ±π cases stay on the tolerance queries above.
+query
+SELECT atan2(y, x) FROM test_atan2 WHERE y = 0.0 AND x = 0.0
+
+query
+SELECT atan2(y, 1.0) FROM test_atan2 WHERE y = 0.0
+
+query
+SELECT atan2(0.0, 0.0), atan2(0.0, double('-0.0')),
+ atan2(double('-0.0'), 0.0), atan2(double('-0.0'), double('-0.0')),
+ atan2(0.0, 1.0), atan2(double('-0.0'), 1.0)
diff --git a/spark/src/test/resources/sql-tests/expressions/math/bin.sql
b/spark/src/test/resources/sql-tests/expressions/math/bin.sql
index 6e18ae5819..2e9666b7d5 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/bin.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/bin.sql
@@ -29,7 +29,7 @@ INSERT INTO test_bin VALUES
(-100, -100, -99.99, -99.99),
(-255, -255, -255.255, -255.255),
(0, 0, 0.0, 0.0),
-(0, 0, -0.0, -0.0),
+(0, 0, float('-0.0'), double('-0.0')),
(NULL, NULL, NULL, NULL),
(2147483647, 9223372036854775807, cast('Infinity' as float), cast('Infinity'
as double)),
(-2147483648, -9223372036854775808, cast('-Infinity' as float),
cast('-Infinity' as double)),
diff --git a/spark/src/test/resources/sql-tests/expressions/math/csc.sql
b/spark/src/test/resources/sql-tests/expressions/math/csc.sql
index 1b786c6c0b..e5c0cdb02a 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/csc.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/csc.sql
@@ -19,7 +19,15 @@ statement
CREATE TABLE test_csc(d double) USING parquet
statement
-INSERT INTO test_csc VALUES (0.0), (-0.0), (1.5707963267948966),
(-1.5707963267948966), (3.141592653589793), (NULL), (cast('NaN' as double)),
(cast('Infinity' as double)), (cast('-Infinity' as double))
+INSERT INTO test_csc VALUES (0.0), (double('-0.0')), (1.5707963267948966),
(-1.5707963267948966), (3.141592653589793), (NULL), (cast('NaN' as double)),
(cast('Infinity' as double)), (cast('-Infinity' as double))
query tolerance=1e-6
SELECT csc(d) FROM test_csc
+
+-- signed-zero: exact comparison so csc(-0.0) == -Infinity is distinguished
+-- from +Infinity (tolerance only checks isInfinity).
+query
+SELECT csc(d) FROM test_csc WHERE d = 0.0
+
+query
+SELECT csc(0.0), csc(double('-0.0'))
diff --git a/spark/src/test/resources/sql-tests/expressions/math/rint.sql
b/spark/src/test/resources/sql-tests/expressions/math/rint.sql
index 7af2d1e7e0..8d0e729ff3 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/rint.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/rint.sql
@@ -27,7 +27,7 @@ CREATE TABLE test_rint(v double) USING parquet
statement
INSERT INTO test_rint VALUES
(0.0),
- (-0.0),
+ (double('-0.0')),
(1.0),
(-1.0),
(0.4),
diff --git a/spark/src/test/resources/sql-tests/expressions/math/sec.sql
b/spark/src/test/resources/sql-tests/expressions/math/sec.sql
index 4a9494fe09..dde16b06b0 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/sec.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/sec.sql
@@ -19,7 +19,7 @@ statement
CREATE TABLE test_sec(d double) USING parquet
statement
-INSERT INTO test_sec VALUES (0.0), (-0.0), (1.5707963267948966),
(-1.5707963267948966), (3.141592653589793), (NULL), (cast('NaN' as double)),
(cast('Infinity' as double)), (cast('-Infinity' as double))
+INSERT INTO test_sec VALUES (0.0), (double('-0.0')), (1.5707963267948966),
(-1.5707963267948966), (3.141592653589793), (NULL), (cast('NaN' as double)),
(cast('Infinity' as double)), (cast('-Infinity' as double))
query tolerance=1e-6
SELECT sec(d) FROM test_sec
diff --git a/spark/src/test/resources/sql-tests/expressions/math/tan.sql
b/spark/src/test/resources/sql-tests/expressions/math/tan.sql
index 1cc3d2ae6d..6210f7247a 100644
--- a/spark/src/test/resources/sql-tests/expressions/math/tan.sql
+++ b/spark/src/test/resources/sql-tests/expressions/math/tan.sql
@@ -21,11 +21,19 @@ statement
CREATE TABLE test_tan(d double) USING parquet
statement
-INSERT INTO test_tan VALUES (0.0), (-0.0), (0.7853981633974483),
(-0.7853981633974483), (1.0), (NULL), (cast('NaN' as double)), (cast('Infinity'
as double))
+INSERT INTO test_tan VALUES (0.0), (double('-0.0')), (0.7853981633974483),
(-0.7853981633974483), (1.0), (NULL), (cast('NaN' as double)), (cast('Infinity'
as double))
query tolerance=1e-6
SELECT tan(d) FROM test_tan
-- literal arguments
query tolerance=1e-6
-SELECT tan(0.0), tan(-0.0), tan(0.7853981633974483), tan(NULL)
+SELECT tan(0.0), tan(double('-0.0')), tan(0.7853981633974483), tan(NULL)
+
+-- signed-zero: exact comparison so tan(-0.0) == -0.0 is distinguished from
+-- +0.0 (tolerance uses absolute difference).
+query
+SELECT tan(d) FROM test_tan WHERE d = 0.0
+
+query
+SELECT tan(0.0), tan(double('-0.0'))
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]